В этой главе мы официально выходим на уровень приложения.,Давайте поговорим о том, как объединить цепочку мышления и использование инструментов для получения агентов искусственного интеллекта.
Чтобы ответить, зачем нам нужны агенты ИИ? Какие проблемы может решить агент? Есть две возможные точки зрения:
Во-первых, это наша модель расширения прав и возможностей.,Если мы скажемLLM — это мозг, а Агент обеспечивает руки, ноги и чувства.
Во-вторых, модель дает нам возможность,Большая модель, поддерживаемая агентом как лучшим посредником/агентом данных и задач, дает нам возможность взаимодействовать с любым типом данных.,Большие модели меняют способы обработки данных и информации. Переход от структурированных данных к более неструктурированным данным.
OpenAIприложение Директор по исследованиямLilianWengнаписаноLLM Powered Autonomous Agentsагент искусственного интеллекта(AI Агент) разделен на следующие три части: модуль планирования, модуль вызова инструмента и модуль памяти.
В следующих нескольких главах мы поговорим об основных различиях агентских решений ИИ в этих трех направлениях.
В первой статье мы объединяем langchain, чтобы представить необходимость тонких настроек, Предложить сгенерировать шаблоны рассуждений и вызовов инструментов для двух решений ReAct и SelfASk. Лично у меня отношения любви и ненависти к langchain.,Что мне нравится, так это то, что он объединяет множество передовых приложений для больших моделей.,Ненавижу, что это кажется слишком инкапсулированным,Это похоже на сложный дизайн для простой проблемы. Поэтому рекомендуется использовать langchain, чтобы понять реализацию каждого принципа решения.,Тогда оторвитесь от langchain и напишите это сами,Или просто используйте базовые компоненты langchain для достижения,Не используйте его API высокого уровня.
Self-ask: MEASURING AND NARROWING THE COMPOSITIONALITY GAP IN LANGUAGE MODELS https://ofir.io/Self-ask-prompting/
Self Ask предлагает оперативную парадигму, которая разлагает проблему на подзадачи.,На каждом этапе модель будетСпросите себяМожно ли перефразировать вопрос?/Разбейте задачу на простую подзадачу,и ответь,При ответе вы можете использовать инструмент поиска, чтобы получить ответ,Затем верните результаты в соответствии с инструментом,Продолжить Спросите себя, пока не получишь окончательный ответ. На самом деле Спросите Инференциальная форма себя не является центральной,Суть заключается в том, чтобы направить модель на разборку проблемы.,Это способность планирования, упомянутая в начале.
В статье предлагается причина, по которой необходимо преобразовать исходную цепочку размышлений в пошаговую Спросите. себяформа,Это потому, что модель оказалась более эффективной при ответе на сложные вопросы.,Хотя модель может правильно ответить на подвопросы,Но он не может ответить на сложные вопросы, состоящие из подвопросов.,Автор называет этоCompositionality Gap。Дайте каштан:Модель может правильно ответить, в каком году родился Джастин Бибер? А кто был чемпионом Мастерса 1994 года? Но модель не смогла ответить, кто стал победителем «Мастерса» в год рождения Джастина Бибера? Эту проблему можно очень хорошо решить, внедрив метод рассуждения при разборе проблемы.
Давайте посмотрим на Self langchain Askвыполнить,Официальный сайт ДемоОн используется непосредственноinitialize_agentинициализировать прокси,Здесь мы разберем промежуточные этапы。Используется следующееSerpAPIизgoogleинструменты поиска иGPT3.5,Сначала вам необходимо зайти на официальный сайт, чтобы подать заявку на получение ключа.
import os
from langchain.agents.loading import AGENT_TO_CLASS
from langchain.agents.agent import AgentExecutor
from langchain.agents import AgentType, Tool
from langchain import OpenAI, SerpAPIWrapper
## Нужно выйти в интернет с научной точки зрения
os.environ["http_proxy"] = "http://127.0.0.1:7890"
os.environ["https_proxy"] = "http://127.0.0.1:7890"
## Определить большие модели и инструменты поиска
llm = OpenAI(temperature=0, openai_api_key=$yourKey)
search = SerpAPIWrapper(params={
"engine": "google",
"gl": "us",
"hl": "zh-cn",
}, serpapi_api_key=$yourKey)
“”“
Следующий метод инициализации инструмента выравнивает Self Ask Шаблон запроса
”“”
tools = [
Tool(
name="Intermediate Answer",
func=search.run,
description="useful for when you need to ask with search"
)
]
## Сборка: инициализация агента и цепочки
agent_cls = AGENT_TO_CLASS[AgentType.SELF_ASK_WITH_SEARCH]
agent = agent_cls.from_llm_and_tools(llm, tools)
chain = AgentExecutor.from_agent_and_tools(agent, tools, return_intermediate_steps=True)
AGENT_TO_CLASS определяет все типы агентов, среди которых SelfAskWithSearchAgent является реализацией Self Ask. Однако на самом деле разница между разными агентами заключается в основном в следующем кратком приглашении и соответствующем анализаторе.
from langchain.agents.self_ask_with_search.output_parser import SelfAskOutputParser
from langchain.agents.self_ask_with_search.prompt import PROMPT
Подсказка Self Ask в нескольких кадрах выглядит следующим образом. Помимо предоставления формата декодирования, несколько кадров также предлагают модели разобрать проблему.
_DEFAULT_TEMPLATE = """Question: Who lived longer, Muhammad Ali or Alan Turing?
Are follow up questions needed here: Yes.
Follow up: How old was Muhammad Ali when he died?
Intermediate answer: Muhammad Ali was 74 years old when he died.
Follow up: How old was Alan Turing when he died?
Intermediate answer: Alan Turing was 41 years old when he died.
So the final answer is: Muhammad Ali
Question: When was the founder of craigslist born?
Are follow up questions needed here: Yes.
Follow up: Who was the founder of craigslist?
Intermediate answer: Craigslist was founded by Craig Newmark.
Follow up: When was Craig Newmark born?
Intermediate answer: Craig Newmark was born on December 6, 1952.
So the final answer is: December 6, 1952
Пропустить 2 кадра
Question: {input}
Are followup questions needed here:{agent_scratchpad}"""
После построения цепочки давайте зададим вопрос, чтобы увидеть промежуточные результаты возврата модели.
# Chain.run используется для прямого возврата конечного результата. Непосредственный вызов callable может вернуть промежуточный процесс.
output = Chain("Какой вчера был объем торгов в секторе с наибольшим ростом на рынке акций А?")
Ниже приводится возвращаемое значение с промежуточными результатами. Можно обнаружить, что модель подсказки с несколькими выстрелами разделяет вопрос «Каков объем торгов в секторе с самым высоким вчерашним ростом на рынке акций А» на «. В каком секторе вчера наблюдался самый высокий рост на рынке акций А?» После поиска в Google, чтобы найти брокерский сектор, продолжайте спрашивать «вчерашний объем торгов брокерского сектора», чтобы получить окончательный результат.
Здесь показан только один хороший случай, потому что плохих слишком много, ха-ха~ Две основные причины плохих результатов SelfAsk:
Self Ask — это самый простой тип шаблона вызова инструментов, который поддерживает использование только одного инструмента поиска и не поддерживает выбор инструмента. Давайте посмотрим на парадигму ReAct, которая поддерживает вызовы нескольких инструментов~
ReAct: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS https://tsmatz.wordpress.com/2023/03/07/react-with-openai-gpt-and-langchain/
Как следует из названия, рассуждения модели ReAct разделены на две части: Причина и Действие. Reason генерирует шаги анализа, а Action генерирует запросы на вызов инструментов. Эти два действия выполняются поочередно до получения окончательного результата. По сравнению с Self Ask, ReAct еще больше отделяет рассуждения и вызов инструмента. В Self Ask самоанализ является одновременно шагом вывода и запросом для инструмента поиска. В ReAct запрос на вызов инструмента приходит после шага вывода, который может быть. более точный. Хорошая поддержка других инструментов, кроме поиска.
Шаблон рассуждения с несколькими выстрелами, предоставленный ReAct в документе «Вопросы и ответы», выглядит следующим образом.
То же самое и AGENT_TO_CLASS,ReActDocstoreAgent и ZeroShotAgent разработаны на основе ReAct. Для последовательности,Мы инициализируем следующих двух агентов так же, как и SelfAsk выше.,Более краткийизинициализациякод Подробности смотрите на официальном сайтеReAct, ReAct Document Store
Список инструментов, которые можно использовать, и описание каждого инструмента должны быть предоставлены. LLM полностью основан на контексте и выбирает инструменты на основе описания инструмента. Он подходит для сценариев, в которых нет фиксированной процедуры рассуждения. Чтобы сравнить с SelfAsk, здесь мы по-прежнему используем поиск Google и добавляем инструмент Wolfram Alpha. В части кода мы заменяем только часть, определенную инструментом и классом агента, а все остальное точно такое же.
"""
Необходимо предоставить описание инструмента: используется для выбора инструмента и формирования запроса на инструмент.
В то же время имя инструмента унифицировано с selfAsk на Intermediate. Ответьте, подкорректируйте имя самого инструмента, чтобы сгенерировать префикс для вызовов инструмента.
"""
import os
from langchain.agents.loading import AGENT_TO_CLASS
from langchain.agents.agent import AgentExecutor
from langchain.agents import AgentType, Tool
from langchain import OpenAI, SerpAPIWrapper
from langchain.utilities.wolfram_alpha import WolframAlphaAPIWrapper
## Нужно выйти в интернет с научной точки зрения
os.environ["http_proxy"] = "http://127.0.0.1:7890"
os.environ["https_proxy"] = "http://127.0.0.1:7890"
os.environ["WOLFRAM_ALPHA_APPID"] = «твой ключ»
## Определить большие модели и инструменты поиска
llm = OpenAI(temperature=0, openai_api_key=$ваш ключ)
search = SerpAPIWrapper(params={
"engine": "google",
"gl": "us",
"hl": "zh-cn",
}, serpapi_api_key=$вашключ)
wolfram = WolframAlphaAPIWrapper()
tools = [
Tool(
имя="Поиск",
описание="Поисковая система, вызывается, когда нужно ответить на текущий вопрос, входными данными является поисковый запрос",
func=search.run
),
Tool(
name="Wolfram",
description="Wolfram «Альфа», вызываемая, когда вам нужно ответить на вопросы, связанные с математикой, наукой, технологиями, культурой, обществом и повседневной жизнью, входными данными является поисковый запрос»,
func=wolfram.run
),
]
agent_cls = AGENT_TO_CLASS[AgentType.ZERO_SHOT_REACT_DESCRIPTION ]
agent = agent_cls.from_llm_and_tools(llm, tools)
chain = AgentExecutor.from_agent_and_tools(agent, tools, return_intermediate_steps=True)
output = Chain("Сколько вчера был объем торгов сектора с наибольшим ростом на рынке акций А") #chain.run не может возвращать промежуточные результаты. Прямые вызовы могут возвращать промежуточные процессы.
После добавления инструментов поиска Google и Wolfram нулевой запрос выглядит следующим образом, включая описание инструмента и список инструментов, которые можно вызвать в части «Действие».
Продолжайте спрашивать: каков был вчера объем торгов в секторе с самым высоким ростом на рынке акций А? Поскольку не существует рекомендаций по разборке проблемы с помощью нескольких кадров, только приведенный выше нулевой снимок описывает выбор инструмента, поэтому модель не разбирает проблему правильно, но инструмент поиска выбран правильно.
Когда мы спрашиваем о проблемных областях, которые может решить Wolfram, например, о решении геометрических областей, большие модели предпочитают вызывать Wolfram для решения математических задач.
Фиксированный шаблон рассуждения + использование фиксированного инструмента, подходящего для вопросов и ответов по документу. В документе определены два инструмента: поиск и поиск для поиска предложений, содержащих ключевые слова в документах. Поскольку шаблон вывода DocStore фиксирован, а доступные сценарии относительно ограничены, мы не будем его тестировать. Вы можете перейти непосредственно к демо-версии, представленной на официальном сайте.
Хотя сам ReAct можно использовать напрямую, без тонкой настройки инструкций модели, в статье также предполагается, что эффект будет улучшен после тонкой настройки инструкций, но решение для тонкой настройки мы поместим в отдельную главу.
Прочитав реализацию SelfAsk и React, нетрудно обнаружить, что в обоих есть некоторые ограничения.
Для более сложных и разнообразных вызовов комбинаций инструментов и более целенаправленных/сложных возможностей планирования модели в нашей следующей главе представлено решение для вызова инструментов, основанное на точной настройке инструкций.
Если вы хотите увидеть более полный обзор статей, связанных с большими моделями · Точная настройка и предварительное обучение данных и фреймворков · Приложение AIGC, перейдите на Github. >> DecryPrompt