Как не трудно догадаться из названия, сегодня пойдет речь о перспективном фреймворке для работы с языковыми моделями LangChain. Если вы хотите создать свой собственный ChatGPT, то этот инструмент поможет сильно ускорить процесс разработки вашего AI приложения. Langchain работает по принципу лего и позволяет собрать как заправку, так и Звезду Смерти – все детальки заботливо предоставлены разработчиками.
Основные компоненты
- Модели: универсальный интерфейс для работы с различными языковыми моделями. Можно использовать API OpenAI, Cohere, Hugging Face и других. Также есть возможность работать с локальными моделями.
- Промпты: LangChain предоставляет ряд функции для работы с промптами – представление промпта согласно типу модели, формировани шаблона на основе внешних данных, форматирование вывода модели.
- Индексы: Индексы структурируют документы для оптимального взаимодействия с языковыми моделями. Модуль включает функции для работы с документами, индексами и их использования в цепочках. В том числе поддерживает индексы, основанные на векторных базах данных.
- Цепочки: С помощью цепочек можно объединять разные языковые модели и запросы в многоступенчатые конвееры. Цепочки могут быть применены для разговоров, ответов на вопросы, суммаризаций и других сценариев.
- Агенты: С помощью агентов модель может получить доступ к различным источникам информации, таким как Google, Wikipedia итд.
- Память: позволяет сохраняет состояния в цепочках. Например, для создания чат-бота можно сохранять предыдущие вопросы и ответы. Существует два типа памяти: краткосрочная и долгосрочная. Краткосрочная память передает данные в рамках одного разговора. Долгосрочная память отвечает за доступ и обновление информации между разговорами.
Готовим окружение и данные
Посмотрим как этот инструмент работает на практике. В своей прошлой статье я рассказывал про плагин-ретривер к ChatGPT. Плагин позволяет подключить свою базу данных к LLM и использовать эти знания для формирования ответов. Почему бы не попытаться воспроизвести его самостоятельно на LangChain, тем более, что OpenAI так и не открыл мне доступ. Что нам понадобится:
Адаптация к будущему с AI. Что нас ждет?
- Векторная база данных. За это будет отвечать модуль Indexes
- LLM для генерации ответа — блок Models. Здесь можно будет попробовать ChatGPT и какой-нибудь клон альпаки.
- Передать знания из нашей базы в LLM. На помощь придет модуль Prompts
Настраиваем окружение для проекта
- Создаем директорию mkdir langchain и переходим в нее cd langchain
- Создаем виртуальное окружение. Я буду использовать conda и python 3.11
conda create —name langchain conda activate langchain
- Также зарегистрируем наш кернел в jupyter
conda install pip pip install jupyterlab pip install —user ipykernel python -m ipykernel install —name langchain —user
- Устанавливаем LangChain и сопутствующие библиотеки
pip install langchain pandas tiktoken huggingface_hub
Готовим данные для нашего векторного хранилища
Как и в прошлый раз, попробуем автоматизировать службу поддержки и научим бота отвечать на вопросы пользователей. Сгенерируем синтетические данные с помощью следующего запроса:
Создаю ИИ феминистку на Python
Сгенерируй набор из 10 примеров документов, которые далее будут добавлены в векторное хранилище. В документах содержится информаци о запросах в службу поддержки компании. Каждый документ должен иметь следующую структуру: 1. id: int (уникальный идентификатор документа) 2. question: str(вопрос пользователя) 3. answer: str(ответ службы поддержки) 4. url: str (ссылка на источник информации, предпочтительно страницу confluence) Обрати внимание, что тексты документов должны быть разнообразными и содержательными. Результат должен быть реализован в виде python кода
ChatGPT выдал нам следующие варианты:
documents = [ , , , . ]
Индексируем документы в FAISS
Перед индексацией нужно будет подумать над моделью векторизации. Можно использовать разные опции: обучить собственный векторайзер(например на базе моделей из SentenceTransformers), либо взять что-то из коробки. Я воспользуюсь решением от OpenAI(в этом случае нужно будет также добавить ключ доступа к API).
В качестве векторной БД буду использовать FAISS — сейчас это самое шустрое решение для поиска ближайших соседей. В LangChain также есть реализации для множества других хранилищ(ElasticSearch, Redis, Pinecone итд.)
# грузим фрейм в лоадер, выделив колонку для векторизации (здесь может быть место для дискуссий) loader = DataFrameLoader(df, page_content_column=’question’) documents = loader.load()
# создаем сплиттер документов, чтобы уложиться в лимит по токенам, в нашем случае это не очень полезный шаг text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0) texts = text_splitter.split_documents(documents) # задаем векторайзер embeddings = OpenAIEmbeddings(openai_api_key=YOUR_API_KEY) # создаем хранилище db = FAISS.from_documents(texts, embeddings) db.as_retriever() # также можно сохранить хранилище локально db.save_local(‘faiss_index’) # тестируем ретривер db.similarity_search_with_score(‘не знаю как прикрепить сотрудника’)
Вроде все работает.
Добавляем силу ChatGPT
Как создать искусственный интеллект?
На этой неделе вы могли прочитать крайне мотивирующей кейс от Валерия Турова, где он рассказал об одной из своих целей, которая привела в профессию – желанию познать принцип работы и научиться создавать самому игровых ботов.
А ведь действительно, именно желание создать совершенный искусственный интеллект, будь то игровая модель или мобильная программа, сподвигла на путь программиста многих из нас. Проблема в том, что за тоннами учебного материала и суровой действительностью заказчиков, это самое желание было заменено простым стремлением к саморазвитию. Для тех, кто так и не приступил к исполнению детской мечты, далее краткий путеводитель по созданию настоящего искусственного разума.
Стадия 1. Разочарование
Когда мы говорим о создании хотя бы простых ботов, глаза наполняются блеском, а в голове мелькают сотни идей, что он должен уметь делать. Однако, когда дело доходит до реализации, оказывается, что ключом к разгадке реальной модели поведения является. математика. Если быть немного конкретнее, то вот список её разделов, которые необходимо проштудировать хотя бы в формате университетского образования:
- Линейная алгебра;
- Логика;
- Теория графов;
- Теория вероятностей и математическая статистика.
Это тот научный плацдарм, на котором будут строится ваше дальнейшее программирование. Без знания и понимания этой теории все задумки быстро разобьются о взаимодействие с человеком, ведь искусственный разум на самом деле не больше, чем набор формул.
Стадия 2. Принятие
Когда спесь немного сбита студенческой литературой, можно приступать к изучению языков. Бросаться на LISP или другие функциональные языки пока не стоит, для начала надо научиться работать с переменными и однозначными состояниями. Как для быстрого изучения, так и дальнейшего развития прекрасно подойдёт Python, но в целом можно взять за основу любой язык, имеющий соответствующие библиотеки.
Стадия 3. Развитие
Теперь переходим непосредственно к теории ИИ. Их условно можно разделить на 3 категории:
- Слабый ИИ – боты, которых мы видим в компьютерных играх, или простые подручные помощники, вроде Siri. Они или выполняют узкоспециализированные задачи или являются незначительным комплексом таковых, а любая непредсказуемость взаимодействия ставит их в тупик.
- Сильный ИИ – это машины, интеллект которых сопоставим с человеческим мозгом. На сегодняшний день нет реальных представителей этого класса, но компьютеры, вроде Watson очень близки к достижению этой цели.
- Совершенные ИИ – будущее, машинный мозг, который превзойдёт наши возможности. Именно об опасности таких разработок предупреждают Стивен Хоккинг, Элон Маск и кинофраншиза «Терминатор».
Естественно, начинать следует с самых простых ботов. Для этого вспомните старую-добрую игру «Крестики-нолики» при использовании поля 3х3 и постарайтесь выяснить для себя основные алгоритмы действий: вероятность победы при безошибочных действиях, наиболее удачные места на поле для расположения фигуры, необходимость сводить игру к ничьей и так далее.
Сыграв несколько десятков партий и анализируя собственные действия, вы наверняка сможете выделить все важные аспекты и переписать их в машинный код. Если нет, то продолжайте думать, а эта ссылка здесь полежит на всякий случай.
К слову, если вы всё-таки взялись за язык Python, то создать довольно простого бота можно обратившись к этому подробному мануалу. Для других языков, таких как C++ или Java, вам также не составит труда найти пошаговые материалы. Почувствовав, что за созданием ИИ нет ничего сверхъестественного, вы сможете смело закрыть браузер и приступить к личным экспериментам.
Стадия 4. Азарт
Теперь, когда дело сдвинулось с мёртвой точки, вам наверняка хочется создать что-то более серьёзное. В этом вам поможет ряд следующих ресурсов:
Как вы поняли даже из названий, это API, которые позволят без лишних затрат времени создать некоторое подобие серьёзного ИИ.
Стадия 5. Работа
Теперь же, когда вы уже вполне ясно представляете, как ИИ создавать и чем при этом пользоваться, пора выводить свои знания на новый уровень. Во-первых, для этого потребуется изучение дисциплины, которое носит название «Машинное обучение». Во-вторых, необходимо научиться работать с соответствующими библиотеками выбранного языка программирования. Для рассматриваемого нами Python это Scikit-learn, NLTK, SciPy, PyBrain и Nump. В-третьих, в развитии никуда не обойтись от функционального программирования. Ну и самое главное, вы теперь сможете читать литературу о ИИ с полным пониманием дела:
- Artificial Intelligence for Games, Ян Миллингтон;
- Game Programming Patterns, Роберт Найсторм;
- AI Algorithms, Data Structures, and Idioms in Prolog, Lisp, and Java, Джордж Люгер, Уильям Стбалфилд;
- Computational Cognitive Neuroscience, Рэнделл О’Рейли, Юко Мунаката;
- Artificial Intelligence: A Modern Approach, Стюарт Рассел, Питер Норвиг.
И да, вся или почти вся литература по данной тематике представлена на иностранном языке, поэтому если хотите заниматься созданием ИИ профессионально необходимо подтянуть свой английский до технического уровня. Если вы только начинаете путь к мечте, советуем записаться на бесплатный двухчасовой интенсив по основам программирования.
В остальном, ваше дальнейшее развитие будет зависеть лишь от практики и желания усложнять алгоритмы. Но будьте осторожны: возможно совершенный искусственный разум опасен для человечества?
Освоить востребованную профессию в Data Science можно всего за полтора года на курсах GeekBrains. После учёбы вы сможете работать по специальностям Data Scientist, Data Analyst, Machine Learning, Engineer Computer Vision-специалист или NLP-специалист.
Источник: gb.ru
Создаем программу искусственного интеллекта, которая воспринимает человеческую речь с Python и OpenAI
Создать программу искусственного интеллекта, которая воспринимает человеческую речь и отвечает на вопросы, не так сложно, как кажется. Такое чудо можно сотворить за один день с помощью нескольких пакетов Python и API.
Вот ответы бота на некоторые вопросы.
Я: КАКОВА ЧИСЛЕННОСТЬ НАСЕЛЕНИЯ БРАЗИЛИИ?
БОТ: ПО ОЦЕНКАМ, НАСЕЛЕНИЕ БРАЗИЛИИ СОСТАВЛЯЕТ БОЛЕЕ 209 МИЛЛИОНОВ ЧЕЛОВЕК.
БОТ: БОЛЬШИНСТВО ВИДОВ МОРОЖЕНОГО НА ВКУС СЛАДКИЕ И СЛИВОЧНЫЕ.
БОТ: ЧТОБЫ ИСПОЛЬЗОВАТЬ ПАЛОЧКИ ДЛЯ ЕДЫ, НУЖНО ДЕРЖАТЬ ПО ОДНОЙ В КАЖДОЙ РУКЕ. ПОМЕСТИТЕ ПАЛОЧКУ ДЛЯ ЕДЫ В ДОМИНИРУЮЩУЮ РУКУ МЕЖДУ БОЛЬШИМ И УКАЗАТЕЛЬНЫМ ПАЛЬЦАМИ И УДЕРЖИВАЙТЕ ЕЕ СРЕДНИМ ПАЛЬЦЕМ. ПОМЕСТИТЕ ПАЛОЧКУ ДЛЯ ЕДЫ В НЕДОМИНИРУЮЩУЮ РУКУ МЕЖДУ БОЛЬШИМ И УКАЗАТЕЛЬНЫМ ПАЛЬЦАМИ И УДЕРЖИВАЙТЕ ЕЕ БЕЗЫМЯННЫМ ПАЛЬЦЕМ И МИЗИНЦЕМ. ЧТОБЫ ВЗЯТЬ ЕДУ, ИСПОЛЬЗУЙТЕ ПАЛОЧКУ ДЛЯ ЕДЫ В ДОМИНИРУЮЩЕЙ РУКЕ, ЧТОБЫ УДЕРЖИВАТЬ ЕДУ, А ЗАТЕМ ИСПОЛЬЗУЙТЕ ЭТУ ПАЛОЧКУ ДЛЯ ЕДЫ.
Конечно, это не самые содержательные ответы. А концовка ответа про палочки для еды и вовсе довольно странная. Однако тот факт, что подобное приложение может интерпретировать речь и отвечать на вопросы, какими бы ограниченными ни казались ответы, довольно поразителен. К тому же мы можем посмотреть, как устроен виртуальный ассистент и поэкспериментировать с ним.
Что делает эта программа
- Файл запускается через командную строку, когда пользователь готов задать вопрос.
- PyAudio позволяет микрофону компьютера улавливать речевые данные.
- Аудиоданные хранятся в переменной под названием stream , затем кодируются и преобразуются в JSON-данные.
- JSON-данные поступают в API AssemblyAI для преобразования в текст, после чего текстовые данные отправляются обратно.
- Текстовые данные поступают в API OpenAI, а затем направляются в движок text-davinci-002 для обработки.
- Ответ на вопрос извлекается и отображается на консоли под заданным вопросом.
API и высокоуровневый дизайн
В этом руководстве используются два базовых API:
- AssemblyAI для преобразования аудио в текст.
- OpenAI для интерпретации вопроса и получения ответа.
Дизайн (высокий уровень)
Этот проект содержит два файла: main и openai_helper .
Скрипт main используется в основном для API-соединения “голос-текст”. Он включает в себя настройку сервера WebSockets, заполнение всех параметров, необходимых для PyAudio, и создание асинхронных функций, необходимых для одновременной отправки и получения речевых данных между приложением и сервером AssemblyAI.
openai_helper — файл с коротким именем, используемый исключительно для подключения к OpenAI-движку text-davinci-002 . Это соединение обеспечивает получение ответов на вопросы.
Разбор кода
main. py
Сначала импортируем все библиотеки, которые будут использованы приложением. Для некоторых из них может потребоваться Pip-установка (в зависимости от того, использовали ли вы их). Обратите внимание на комментарии к коду ниже:
#PyAudio предоставляет привязку к Python для PortAudio v19, кроссплатформенной библиотеки ввода-вывода аудио. Позволяет микрофону компьютера взаимодействовать с Python import pyaudio #Библиотека Python для создания сервера Websocket — двустороннего интерактивного сеанса связи между браузером пользователя и сервером import websockets #asyncio — это библиотека для написания параллельного кода с использованием синтаксиса async/await import asyncio #Этот модуль предоставляет функции для кодирования двоичных данных в печатаемые символы ASCII и декодирования таких кодировок обратно в двоичные данные import base64 #В Python есть встроенный пакет json, который можно использовать для работы с данными JSON import json #»Подтягивание» функции из другого файла from openai_helper import ask_computer
Теперь устанавливаем параметры PyAudio. Эти параметры являются настройками по умолчанию, найденными в интернете. Вы можете поэкспериментировать с ними по мере необходимости, но мне параметры по умолчанию подошли отлично. Устанавливаем переменную stream в качестве начального контейнера для аудиоданных, а затем выводим параметры устройства ввода по умолчанию в виде словаря. Ключи словаря отражают поля данных в структуре PortAudio . Вот код:
#Настройка параметров микрофона #Сколько байт данных приходится на каждый обработанный фрагмент звука FRAMES_PER_BUFFER = 3200 #Битовый целочисленный формат аудиовхода/выхода порта по умолчанию FORMAT = pyaudio.paInt16 #Моноформатный канал (то есть нам нужен только входной аудиосигнал, поступающий с одного направления) CHANNELS = 1 #Желаемая частота в Гц входящего аудиосигнала RATE = 16000 p = pyaudio.PyAudio() #Начинает запись, создает переменную stream, присваивает параметры stream = p.open( format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=FRAMES_PER_BUFFER ) print(p.get_default_input_device_info())
Далее создаем несколько асинхронных функций для отправки и получения данных, необходимых для преобразования голосовых вопросов в текст. Эти функции выполняются параллельно, что позволяет преобразовывать речевые данные в формат base64, конвертировать их в JSON, отправлять на сервер через API, а затем получать обратно в читаемом формате. Сервер WebSockets также является важной частью приведенного ниже скрипта, поскольку именно он делает прямой поток бесшовным.
#Необходимая нам конечная точка AssemblyAI
URL = «wss://api.assemblyai.com/v2/realtime/ws?sample_rate=16000»
auth_key = «enter key here»
#Создание асинхронной функции, чтобы она могла продолжать работать и отправлять поток речевых данных в API до тех пор, пока это необходимо
async def send_receive():
print(f’Connecting websocket to url $’)
async with websockets.connect(
URL,
extra_headers=((«Authorization», auth_key),),
ping_interval=5,
ping_timeout=20
) as _ws:
await asyncio.sleep(0.1)
print(«Receiving SessionBegins . «)
session_begins = await _ws.recv()
print(session_begins)
print(«Sending messages . «)
async def send():
while True:
try:
data = stream.read(FRAMES_PER_BUFFER, exception_on_overflow=False)
data = base64.b64encode(data).decode(«utf-8»)
json_data = json.dumps()
await _ws.send(json_data)
except websockets.exceptions.ConnectionClosedError as e:
print(e)
assert e.code == 4008
break
except Exception as e:
assert False, «Not a websocket 4008 error»
await asyncio.sleep(0.01)
return True
async def receive():
while True:
try:
result_str = await _ws.recv()
result = json.loads(result_str)
prompt = result[‘text’] if prompt and result[‘message_type’] == ‘FinalTranscript’:
print(«Me:», prompt)
answer = ask_computer(prompt)
print(«Bot», answer)
except websockets.exceptions.ConnectionClosedError as e:
print(e)
assert e.code == 4008
break
except Exception as e:
assert False, «Not a websocket 4008 error»
send_result, receive_result = await asyncio.gather(send(), receive())
asyncio.run(send_receive())
Теперь у нас есть простое API-соединение с OpenAI. Если вы посмотрите на строку 44 приведенного выше кода ( main3.py ), то увидите, что мы извлекаем функцию ask_computer из этого другого файла и используем ее результаты в качестве ответов на вопросы.
Это отличный проект для всех, кто не прочь взять на вооружение ту самую технологию, благодаря которой функционируют Siri и Alexa. Его реализация не требует большого опыта в программировании, потому что для обработки данных используется API.
Весь код хранится в этом репозитории.
Источник: uproger.com