引言
在开发对话式问答应用程序时,允许用户进行往返对话非常重要,这意味着应用程序需要某种形式的“记忆”功能,用于储存过去的问答,并能够在当前会话中合理应用这些信息。本篇文章将深入探讨如何在应用程序中整合对话历史,主要涵盖以下两种方法:通过链执行检索步骤,以及通过代理决定是否以及如何执行检索步骤。
主要内容
1. 设置
在本教程中,我们将使用OpenAI嵌入和Chroma向量存储。在实施前,请确保安装以下依赖包:
%%capture --no-stderr
%pip install --upgrade --quiet langchain langchain-community langchain-chroma bs4
此外,您需要设置OPENAI_API_KEY
环境变量,可以直接设置,也可以从.env
文件加载:
import getpass
import os
if not os.environ.get("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = getpass.getpass()
2. 使用 Chains 实现历史记忆
在对话式RAG(检索增强生成)应用中,查询应根据对话的上下文进行。LangChain提供了create_history_aware_retriever
构造器来简化这个过程。
2.1 构建历史感知检索器
from langchain.chains import create_history_aware_retriever
from langchain_core.prompts import MessagesPlaceholder
contextualize_q_system_prompt = (
"给定聊天历史和用户最新问题,"
"如果问题引用了聊天历史中的上下文,"
"则制定一个独立的问题,不需要聊天历史也能理解。"
"不要回答问题,只需重述或按原样返回。"
)
contextualize_q_prompt = ChatPromptTemplate.from_messages(
[
("system", conte