Os produtos de perguntas e respostas, como o ChatGPT e o Kimi, estão usando o Agent Dialogues (a capacidade de invocar diferentes ferramentas para interagir com o usuário), como as ferramentas do Kimi para LLM Dialogues, Link Dialogues, File Dialogues e Networking Dialogues. Por exemplo, o ChatGPT, o Wenxin Yiyin e o Xunfei Starfire também foram ampliados com ferramentas como o Wensheng Diagram, o Code Writer e a Maths Calculator.
A estrutura dominante para obter a capacidade de diálogo do agente atualmente é o ReAct (proposto pela Universidade de Princeton e pelo Google em 2022). O ReAct [1] é uma abordagem de palavras com dicas que combina pensamento e ação. Sua evolução histórica é mostrada abaixo:
Os três métodos no gráfico acima são:
Somente por esse motivo:Use a Cadeia de pensamento para o pensamento em várias etapas, adicione o prompt "Vamos pensar passo a passo" antes de inserir a pergunta no Prompt para orientar o pensamento em várias etapas, não dê a resposta diretamente, mas a desvantagem é óbvia: Razão Somente a porta fechada apenas pensa em não fazer, não sairá para ver o mundo exterior para entender o mundo antes de pensar, portanto, produzirá alucinações, a mudança de dinastias não sabe;
Somente para ações:Obtenção de observação por meio de ActionObservation em uma única etapa, Desvantagem: ao fazer isso imediatamente sem pensar, a resposta que obtenho no final pode não ser a mesma que eu quero;
ReAct:Uma combinação de pensar e agir, ou seja, pensar antes de agir, retornar os resultados da ação e pensar no que fazer em seguida, agir e repetir o processo várias vezes, sabendo que a resposta final foi produzida.
Extensão: há também uma autorreflexão lançada em 2023 (Reflexão) da estrutura, juntou-se à reflexão, como mostrado abaixo, não em profundidade aqui. Além disso, os amigos interessados podem dar uma olhada no grande número público de tecnologia Taobao de "Pesquisa de agente - 19 tipos de comparação de estrutura de agente", essa peça para enviar um documento é realmente quanto mais você joga, mais flores.
A apresentação dos exemplos mencionados no documento do ReAct ilustra melhor a lógica, as vantagens e as desvantagens acima:
O prompt do ReAct é:
"""
Explicação das variáveis de entrada para o Agent Prompt:
- tools: Descrição do conjunto de ferramentas, no formato "{tool.name}: {tool.description}".
- toool_names: lista de nomes de ferramentas
- histórico: o histórico do diálogo entre o usuário e o agente (observe que as várias rodadas de ReAct no meio de um bate-papo com o agente não são contadas no histórico do diálogo)
- entrada: perguntas do usuário
- agent_scratchpad: processos intermediários de ação e observação.
seria formatado como "\nObservation: {observation}\nThought:{action}".
Em seguida, passe o agent_scratchpad (registro de pensamentos do agente)
"""
agent_prompt = """
Responda às seguintes perguntas da melhor forma possível. Se estiver em ordem, você poderá usar algumas ferramentas adequadamente. Você tem acesso às seguintes ferramentas.{ferramentas}
Use o seguinte formato.
Pergunta: a pergunta de entrada que você deve responder1
Pensamento: você deve sempre pensar no que fazer e em quais ferramentas usar.
Ação: a ação a ser tomada, deve ser uma das {toool_names}
Entrada de ação: a entrada para a ação
Observação: o resultado da ação
... (essa Entrada/Observação de Pensamento/Ação/Ação pode ser repetida zero ou mais vezes)
Agora eu sei a resposta final
Resposta final: a resposta final à pergunta de entrada original
Comece!história: {história}
Pergunta: {input}
Pensamento: {agent_scratchpad}""""
O fluxograma do aplicativo ReAct é mostrado abaixo:
Há um bom exemplo na Internet, que é mencionado aqui para fins ilustrativos [2]:
Suponhamos que tenhamos:
Perguntas do usuário"Qual é o preço médio das rosas no mercado atualmente? Como devo precificá-la se, além disso, eu a vender por 151 TP3T?"
Ferramentas:: {'bing web search': uma ferramenta para pesquisar informações de código aberto na Web usando o Bing Search; 'llm-math': uma ferramenta para fazer cálculos matemáticos com modelos grandes e Python}
Então, a entrada para a primeira rodada de diálogo é:
Responda às seguintes perguntas da melhor forma possível. Se estiver em ordem, você poderá usar algumas ferramentas adequadamente. Você tem acesso às seguintes ferramentas.
bing-web-search: ferramenta de pesquisa na Web de código aberto do Bing Search
llm-math: ferramentas para fazer cálculos com modelos grandes e Python
Use o seguinte formato.
Pergunta: a pergunta de entrada que você deve responder1
Pensamento: você deve sempre pensar no que fazer e em quais ferramentas usar.
Ação: a ação a ser tomada, deve ser uma das seguintes [bing-web-search, llm-math]
Entrada de ação: a entrada para a ação
Observação: o resultado da ação
... (essa Entrada/Observação de Pensamento/Ação/Ação pode ser repetida zero ou mais vezes)
Agora eu sei a resposta final
Resposta final: a resposta final à pergunta de entrada original
Comece!
história.
Pergunta: Qual é o preço médio das rosas no mercado atual? Como devo precificar as rosas se eu as vender com uma margem de lucro de 15%?
Pensamento.
Obtenha o resultado e analise-o para obter Thought, Action e Action Input:
Pensamento: Eu deveria usar a ferramenta de pesquisa para encontrar respostas, para que eu possa encontrar rapidamente as informações de que preciso.
Ação: bing-web-search
Entrada de ação: preço médio das rosas
Acesse a ferramenta de pesquisa do bing-web, digite "average price of roses" (preço médio das rosas) e obtenha o conteúdo de retorno Observação: "De acordo com a web, cada buquê de rosas nos Estados Unidos custa US$ 80,16." Depois disso, coloque o conteúdo acima, organize-o e coloque-o no site. Depois disso, coloque o conteúdo acima no modelo de palavra de prompt do ReAct e inicie a segunda rodada de entrada de diálogo:
Responda às seguintes perguntas da melhor forma possível. Se estiver em ordem, você poderá usar algumas ferramentas adequadamente. Você tem acesso às seguintes ferramentas.
bing-web-search: ferramenta de pesquisa na Web de código aberto do Bing Search
llm-math: ferramentas para fazer cálculos com modelos grandes e Python
Use o seguinte formato.
Pergunta: a pergunta de entrada que você deve responder1
Pensamento: você deve sempre pensar no que fazer e em quais ferramentas usar.
Ação: a ação a ser tomada, deve ser uma das seguintes [bing-web-search, llm-math]
Entrada de ação: a entrada para a ação
Observação: o resultado da ação
... (essa Entrada/Observação de Pensamento/Ação/Ação pode ser repetida zero ou mais vezes)
Agora eu sei a resposta final
Resposta final: a resposta final à pergunta de entrada original
Comece!
história.
Pergunta: Qual é o preço médio das rosas no mercado atual? Como devo precificar as rosas se eu as vender com uma margem de lucro de 15%?
Pensamento: Eu deveria usar a ferramenta de pesquisa para encontrar respostas, para que eu possa encontrar rapidamente as informações de que preciso.
Ação: bing-web-search
Entrada de ação: preço médio das rosas
Observação: De acordo com fontes on-line, cada buquê de rosas nos EUA custa US$ 80,16.
Pensamento.
Obtenha o resultado e analise-o para obter Thought, Action e Action Input:
Pensamento: Preciso de matemática para calcular o que seria uma marcação de 15% em cima disso.
Ação: llm-math
Entrada de ação: 80,16*1,15
Chame a ferramenta llm-math, insira "80.16*1.15" e obtenha o conteúdo de retorno Observation: "92.184". Depois disso, coloque o conteúdo acima no modelo de palavra de prompt do ReAct e abra a terceira rodada de entrada de diálogo:
Responda às seguintes perguntas da melhor forma possível. Se estiver em ordem, você poderá usar algumas ferramentas adequadamente. Você tem acesso às seguintes ferramentas.
bing-web-search: ferramenta de pesquisa na Web de código aberto do Bing Search
llm-math: ferramentas para fazer cálculos com modelos grandes e Python
Use o seguinte formato.
Pergunta: a pergunta de entrada que você deve responder1
Pensamento: você deve sempre pensar no que fazer e em quais ferramentas usar.
Ação: a ação a ser tomada, deve ser uma das seguintes [bing-web-search, llm-math]
Entrada de ação: a entrada para a ação
Observação: o resultado da ação
... (essa Entrada/Observação de Pensamento/Ação/Ação pode ser repetida zero ou mais vezes)
Agora eu sei a resposta final
Resposta final: a resposta final à pergunta de entrada original
Comece!
história.
Pergunta: Qual é o preço médio das rosas no mercado atual? Como devo precificar as rosas se eu as vender com uma margem de lucro de 15%?
Pensamento: Eu deveria usar a ferramenta de pesquisa para encontrar respostas, para que eu possa encontrar rapidamente as informações de que preciso.
Ação: bing-web-search
Entrada de ação: preço médio das rosas
Observação: De acordo com fontes on-line, cada buquê de rosas nos EUA custa US$ 80,16.
Pensamento: Preciso de dados para calcular qual seria o preço com uma margem de lucro de 15 por cento.
Ação: llm-math
Entrada de ação: 80,16*1,15
Observação: 92,184
Pensamento.
Obtenha o resultado e analise-o para obter Thought, Action e Action Input:
Pensamento: Eu sei a resposta final.
Resposta final: Se você quiser adicionar o 15% para vender, ele deverá ser cotado a US$ 92,184.
A Langchain implementou a invocação do ReAct [3], que requer a criação do ReAct Agent, do AgentExecutor e de ferramentas. Por meio do ReAct Agent, podemos realizar o que mencionamos anteriormente, conectar-nos a diferentes ferramentas e chamar diferentes ferramentas de acordo com as necessidades do usuário e com o pensamento do LLM para melhorar o desempenho do Q&A. Se você reescrever o Chat do agente baseado em ReAct por conta própria, precisará prestar atenção especial a algumas condições de limite, como selecionar uma ferramenta que não existe, deixar de invocar uma ferramenta ou a invocação da ferramenta ficar presa em um loop morto etc., pois isso afetará a eficácia da interação. Pessoalmente, tenho algumas percepções quando pratico o efeito do ReAct Agent Chat:
- Escolha LLMs que tenham feito o alinhamento do recurso de diálogo do agente e, de preferência, que o ReAct Prompt possa ser adaptado aos LLMs;
- A descrição clara de boas introduções de ferramentas reduz a ambiguidade da descrição entre as ferramentas e evita o uso da ferramenta errada;
- Cuidado com as várias rodadas de pensar-agir-observar que levam a um excesso de contexto de entrada, e muitos LLMs se tornam ruins na compreensão de entradas contextuais longas.
- Se houver apenas uma única rodada de pensar-agir-observar, então um conjunto de processos será interrompido, você precisará passar duas vezes pelo LLM e uma vez pela chamada da ferramenta, o que afetará o tempo de resposta. Se você quiser simplificar o processo desse ReAct, poderá usar diretamente o reconhecimento de intenção + chamada da ferramenta, pela ferramenta para gerar diretamente o resultado final, não precisará retornar ao LLM para fazer uma resposta resumida.
A LangChain fornece vários kits iniciais que podem ser encontrados em [4].
Pela frente, podemos ver que Action e Action Input são o nome da ferramenta e a entrada da ferramenta. Se quisermos ter um diálogo com o arquivo de upload temporário, podemos simplesmente adicionar as ferramentas diretamente? Na verdade, isso não é tão bom, porque Action Input é a entrada da ferramenta com base na análise da consulta pelo LLM, enquanto a função "Dialogue on temporary uploaded file" precisa do local ou do conteúdo do arquivo. Por esse motivo, na verdade, você pode seguir meu desenho abaixo para colocar "Dialogue on temporary uploaded file" somente na função "Action Input". Por esse motivo, podemos separar a função "dialogue with temporary uploaded files" da função "dialogue with temporary uploaded files", conforme desenhei na figura abaixo.
O processo de cooperação específico de front-end e back-end é o seguinte:
1) Depois que o usuário carrega um arquivo, o front-end primeiro cria uma base de conhecimento temporária e, em seguida, carrega o arquivo para essa base de conhecimento, inicializando o número de rodadas de diálogo para o arquivo como 0 e registrando o nome da variável dessa base de conhecimento temporária;
2, a cada rodada subsequente de diálogo, o nome da base de conhecimento é passado para o Agent Chat, de acordo com o fluxo acima, após cada rodada de diálogo, são atualizados com o número de rodadas de diálogo no documento;
3、Quando o número de rodadas de diálogo de documentos for maior que o número de rodadas de retenção de documentos ou o usuário limpar manualmente o contexto, o front-end excluirá a base de conhecimentos temporária e limpará o nome da variável da base de conhecimentos temporária.
bibliografia
[1] ReAct: Synergising Reasoning and Acting in Language Models, apresentação oficial: https://react-lm.github.io/
[2] LangChain dry run (1): Como exatamente o AgentExecutor aciona modelos e ferramentas para concluir tarefas? - Artigo de Huang Jia - 知乎https://zhuanlan.zhihu.com/p/661244337
[3] ReAct, documentação da Langchain: https://python.langchain.com/docs/modules/agents/agent_types/react/
[4] Kit de ferramentas do agente, documentação do Langchain: https://python.langchain.com/docs/integrations/toolkits/
[5] "LLM+Search Rewrite" 10 Papers at a Glance - Essays by Obsessed with Searching and Pushing - Conhecimento: https://zhuanlan.zhihu.com/p/672357196
[6] MultiQueryRetriever, documentação da Langchain: https://python.langchain.com/docs/modules/data_connection/retrievers/MultiQueryRetriever/
[7] HypotheticalDocumentEmbedder, documentação Langchain: https://github.com/langchain-ai/langchain/blob/master/cookbook/hypothetical_document_ embeddings.ipynb
[8] Desenvolvimento de aplicativos de modelo grande, dicas avançadas obrigatórias do RAG - Artigos do Rainfly - Conhecimento: https://zhuanlan.zhihu.com/p/680232507