O processo descrito acima funciona bem quando os usuários podem fazer apenas uma única pergunta. Mas este aplicativo também permite perguntas de acompanhamento, o que introduz algumas complicações adicionais. Por exemplo, é necessário armazenar todas as perguntas e respostas anteriores para que possam ser incluídas como contexto adicional ao enviar a nova pergunta ao LLM.
O histórico de bate-papo neste aplicativo é gerenciado por meio da classe ElasticsearchChatMessageHistory , outra classe que faz parte da integração do Elasticsearch com o Langchain. Cada grupo de perguntas e respostas relacionadas é gravado em um índice do Elasticsearch com uma referência ao ID da sessão utilizada.
Você deve ter notado na seção anterior que, embora a resposta do LLM seja transmitida ao cliente em partes, uma variável answer é gerada com a resposta completa. Isso permite que a resposta, juntamente com a pergunta, seja adicionada ao histórico após cada interação:
Se o cliente enviar um argumento session_id na string de consulta do URL da solicitação, presume-se que a pergunta seja feita no contexto de quaisquer perguntas anteriores na mesma sessão.
A abordagem adotada por este aplicativo para perguntas de acompanhamento é usar o LLM para criar uma pergunta concisa que resuma toda a conversa, a ser usada na fase de recuperação. O objetivo disso é evitar a execução de uma busca vetorial em um histórico potencialmente extenso de perguntas e respostas. Segue a lógica que executa essa tarefa:
Isso tem muitas semelhanças com a forma como as perguntas principais são tratadas, mas neste caso não há necessidade de usar a interface de streaming do LLM, então o método invoke() é usado em vez disso.
Para condensar a pergunta, utiliza-se um prompt diferente, armazenado no arquivo **api/templates/condense_question_prompt.txt**:
Este prompt exibe todas as perguntas e respostas da sessão, além de uma nova pergunta de acompanhamento no final. O profissional com mestrado em Direito (LLM) deve elaborar uma pergunta simplificada que resuma todas as informações.
Para permitir que o LLM tenha o máximo de contexto possível na fase de geração, o histórico completo da conversa é adicionado ao prompt principal, juntamente com os documentos recuperados e a pergunta de acompanhamento. Segue a versão final do prompt, conforme utilizado no aplicativo de exemplo:
Note que a forma como a pergunta condensada é utilizada pode ser adaptada às suas necessidades. Você pode descobrir que, para algumas aplicações, enviar a pergunta condensada também na fase de geração funciona melhor, reduzindo também a quantidade de tokens. Ou talvez não usar uma pergunta resumida e enviar sempre todo o histórico da conversa traga melhores resultados. Esperamos que agora você tenha uma boa compreensão de como este aplicativo funciona e possa experimentar diferentes opções para descobrir o que funciona melhor para o seu caso de uso.
Anteriormente
Fase de geraçãoPróximo
Observabilidade