Большие языковые модели, такие как GPT-3, ChatGPT, Bing AI и Google Bard, недавно продемонстрировали впечатляющие достижения в диалоговых возможностях, текстовой сводке, переводе, создании кода и многих других приложениях. Новый поисковый помощник Microsoft Bing на основе искусственного интеллекта показал, как эти возможности можно расширить, предоставив агенту искусственного интеллекта доступ к обычным поисковым системам и чтение веб-страниц. В этом посте мы более подробно рассмотрим пакет Python langchain, который позволяет нам легко комбинировать LLM, такой как GPT-3, с другими функциями, такими как веб-поиск, интерпретатор Python и терминал. сессия для выполнения кода. Всего с помощью 50 строк кода вы можете создать собственного персонализированного агента ИИ, который извлекает информацию из Интернета, реализует алгоритмы на языке Python и запускает код для решения задач.

Примечание. Модель ИИ, описанная в этом сообщении блога, способна выполнять произвольный код Python и системные команды! Выполняйте фрагменты кода из этой записи блога в тестовой среде, такой как Replit.com, чтобы избежать потери данных или другого ущерба из-за выполнения потенциально опасных команд.

Взгляните на вывод консоли, показанный ниже. Он показывает ответ пользовательского ИИ на вопрос "Какое 11-е простое число?" ИИ основан на GPT-3 (text-davinci-003 ) от OpenAI, и он сочетается с возможностями поиска в Google, выполнения кода Python и выполнения команд терминала.

Подытожим, что здесь произошло: после запроса 11-го прайма агент ИИ сначала решает, что попытается решить эту задачу с помощью Python. Затем он использует свои возможности для поиска в Google, чтобы узнать, как вычислять простые числа в Python. К сожалению, он не находит код Python, а вместо этого находит описание простого алгоритма, определяющего, является ли заданное число простым. Он решает, что этой информации достаточно для следующего шага, и приступает к написанию и выполнению кода Python, реализующего этот алгоритм. Сам код не очень эффективен, и он не выводит только 11-е простое число, а вместо этого создает список всех простых чисел до 100. Затем агент ИИ заключает, что он получил список простых чисел, и переходит к (довольно глупо) извлеките 11-е простое число, выполнив строку кода Python print(11-е простое число). Это не работает по нескольким причинам: во-первых, в коде есть синтаксические ошибки, а во-вторых, агент ИИ не предоставляет интерпретатору Python полученный ранее список простых чисел. Однако, получив SyntaxError, он пересматривает свой код и предоставляет список простых чисел, которые он получил ранее, и использует правильный синтаксис индексации для доступа к 11-му простому числу. Наконец, агент ИИ приходит к выводу, что это окончательный ответ, и возвращает короткое предложение, в котором правильно указано, что 11-е простое число равно 31.

Довольно впечатляюще, не так ли? Хотя это пошаговое рассуждение с применением нескольких различных инструментов, по общему признанию, не работает так хорошо для любого заданного вопроса, оно представляет собой мощную иллюстрацию последних достижений в области ИИ в целом и больших языковых моделей в частности. Кроме того, этот пример показывает, что модели больших языков можно легко улучшить, подключив их к поиску Google, или дав им возможность писать собственный код, или разрешив им устанавливать отсутствующее программное обеспечение через сеанс терминала (последнее не показано). в примере выше). Если вы думаете, что создание такого индивидуального агента ИИ требует детального знания внутренней работы больших языковых моделей, вы ошибаетесь! Благодаря пакету Python langchain мы можем воспроизвести пример, показанный выше, менее чем в 50 строках кода. Давайте начнем!

Во-первых, нам нужно указать модель большого языка, которая будет служить основой нашего настроенного агента ИИ. langchain поддерживает модели от многих разных поставщиков, но мы придерживаемся наиболее широко известной в настоящее время модели: модель на основе GPT от OpenAI. Его можно указать с помощью следующего фрагмента кода:

from langchain.llms import OpenAI

llm = OpenAI(temperature=0.0)

Обратите внимание, что мы указываем temperature=0,0 для получения более воспроизводимых результатов. По умолчанию класс OpenAI будет использовать самую мощную модель text-davinci-003. Далее мы укажем дополнительные инструменты, которые мы позволим агенту ИИ использовать для ответов на наши вопросы. Самый простой способ указать инструмент — напрямую загрузить его с помощью удобных функций langchain. Здесь мы загружаем инструмент терминала, который позволяет агенту ИИ выполнять произвольные системные команды, например, для установки новых пакетов Python, необходимых для выполнения кода:

from langchain.agents import load_tools

terminal = load_tools(["terminal"], llm=llm)[0]

Обратите внимание, что функция всегда возвращает список инструментов, но мы используем ее только для загрузки одного инструмента. Полный список предопределенных инструментов можно найти в документации langchain здесь. Далее мы хотим определить возможность проведения поиска в Google. Поскольку условия использования Google не позволяют очищать их результаты поиска, нам необходимо прибегнуть к стороннему (платному) сервису API. serper.dev предлагает большое количество бесплатных запросов после создания бесплатной учетной записи, поэтому мы будем использовать этот сервис в нашем примере. Мы могли бы просто загрузить интерфейс в Serper, загрузив инструмент google-serper в langchain, но в этом случае мы хотим немного настроить инструмент. Вот код, который мы используем для определения инструмента поиска Google:

from langchain.agents.tools import Tool
from langchain.utilities import GoogleSerperAPIWrapper

search = Tool(
    "Google Search",
    GoogleSerperAPIWrapper().run,
    "Access to google search. Use this to obtain information about current events, or to get info on how to write code."
)

Как видите, класс Tool позволяет нам вручную указать инструмент, который может использовать агент ИИ. Инструмент определяется именем, выполняемой функцией и описанием того, для чего этот инструмент следует использовать. Обратите внимание, что мы не пишем никакого кода для связи с Serper Google API, мы просто полагаемся на класс GoogleSerperAPIWrapper, предоставляемый langchain. Однако мы предоставляем конкретное описание того, что поиск Google предоставляет информацию о двух вещах: текущие события и информацию о том, как писать код. Это описание очень важно, так как позже агент ИИ читает его, чтобы решить, следует ли ему использовать поиск Google на определенном этапе своих рассуждений. Хотя описания инструментов по умолчанию, загружаемые с помощью функции load_tools в langchain, достаточно хороши для большинства случаев использования, безусловно, стоит потратить время на их изменение и эксперименты с их, чтобы увидеть, как эти изменения влияют на рабочий процесс решения проблем агента ИИ. Модуль langchain.utilities содержит ряд полезных классов, которые, например, позволяют агентам ИИ читать набор документов и отвечать на вопросы о них.

Наконец, мы добавляем третий инструмент, оболочку Python (также называемую REPL — «цикл чтения-оценки-печати»). langchain предоставляет готовый инструмент Python REPL, но вместо этого мы решили определить пользовательскую версию с помощью следующего фрагмента кода:

import traceback

class PythonREPL:
    def __init__(self):
        pass        

    def run(self, command):
        old_stdout = sys.stdout
        sys.stdout = mystdout = StringIO()

        try:
            exec(command, globals())
            sys.stdout = old_stdout
            output = mystdout.getvalue()
        except Exception:
            sys.stdout = old_stdout
            output = traceback.format_exc()

        return output

python_repl = Tool(
    "Python REPL",
    PythonREPL().run,
    "A Python shell. Use this to execute python commands. Input should be a valid python command. If you expect output it should be printed out."
)

Как вы можете видеть выше, создать новый инструмент для langchain довольно просто, вам просто нужно определить класс с методом run, который возвращает выходные данные инструмента в виде строки для Large Language. Модель для чтения. В нашем случае метод run выполняет код Python, предоставленный через строковую переменную command, захватывает вывод выполненного кода и возвращает результат. До этого момента реализация практически идентична встроенной реализации langchain. Однако, если во время выполнения кода что-то пойдет не так, мы хотим предоставить модели как можно больше информации об ошибке. Вместо того, чтобы просто возвращать имя ошибки, как в реализации по умолчанию, мы используем трассировку пакета Python, чтобы вернуть полную трассировку ошибки. Это помогает агенту ИИ легче отлаживать свой написанный код в случае, если код не выполняется должным образом с первой попытки.

Определив все компоненты нашего агента ИИ, теперь нам нужно объединить их в функциональную единицу, которой мы можем передавать вопросы. В langchain это делается путем инициализации агента следующей строкой кода:

from langchain.agents import initialize_agent

agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)

Как и ожидалось, мы должны указать набор инструментов, которые сможет использовать наш агент ИИ, и экземпляр большой языковой модели, который служит основой агента. Кроме того, мы должны указать тип агента, который мы хотим создать. Мы выбираем zero-shot-react-description, который, согласно документации langchain, использует структуру ReAct, чтобы решить, какой инструмент использовать на основе описания, которое мы указать для каждого инструмента. Подробное описание фреймворка ReAct можно найти здесь, а полный список доступных агентов в langchain (включая диалоговых чат-ботов) — здесь.

Теперь мы можем, наконец, воспроизвести первоначально показанный ответ на вопрос об 11-м простом числе, задав следующий вопрос:

agent.run("What is the 11th prime number?")

Но что именно происходит за кулисами? Как платформа ReAct помогает агенту ИИ использовать различные инструменты для ответа на этот вопрос. Какие подсказки он использует, чтобы направить агента ИИ в правильном направлении? Хотя все подсказки, лежащие в основе структуры ReAct, можно найти в приложении к документу ReAct, мы также можем лучше понять рассуждения нашего агента ИИ, визуализируя его рабочий процесс для нашего конкретного случая запроса 11-го простого числа. число. langchain оснащен встроенным инструментом отслеживания, но я выбрал сторонний инструмент под названием langchain-visualizer от Amos Ng, который предоставляет визуально очень привлекательное глубокое погружение во внутреннюю работу нашего агента ИИ. На следующем снимке экрана показан пользовательский интерфейс с отдельными шагами в виде сворачиваемых элементов с аннотированной информацией, такой как стоимость запроса, и боковой панелью, которая содержит полное приглашение, проанализированное Большой языковой моделью, чтобы сделать еще один шаг к ответу:

Как вы можете видеть на снимке экрана, ReAct использует сложные подсказки, чтобы вовлечь агента в рабочий процесс пошагового обдумывания и повторения между задаванием промежуточных вопросов, использованием инструментов, интерпретацией ответа и постановкой следующего промежуточного вопроса. Пользовательский интерфейс для визуализации рабочих процессов агента ИИ можно запустить всего с несколькими дополнительными строками кода Python, см. здесь. Вооружившись фрагментами кода из этого поста, вы теперь готовы создавать свои собственные настраиваемые агенты ИИ, которые получают доступ к любой информации через специально созданные интерфейсы для веб-поисковиков, баз данных, документов и т. д. Удачного кодирования!

Узнавайте о новых сообщениях в блогах и бесплатном контенте, подписавшись на меня в Твиттере @christophmark_ или подписавшись на нашу новостную рассылку в Artifact Research!

Первоначально опубликовано на https://artifact-research.com 28 февраля 2023 г.