如何在LangChain的agent中记录对话历史

  在前两篇文章中,我分别实现了可以抓取并总结网页的agent和一个可以管理日程的agent,里面演示了基本agent创建和使用流程,也为agent添加了特殊的功能。但你仔细观察就会发现,我们的两个agent都是只支持单轮对话,也就是你之前和它说过什么,它不知道。 有些时候其实多轮对话的能力还是很重要的,比如在网页总结的agent中,如果它总结的格式不是我们想要的,我们就可以重新让他汇总整理下,显然这个功能在这里是不支持的。所以我们今天就来看下,如何让agent具备记忆的功能。

  LangChain在早期曾推迟过Memory模块,但Memory模块目前被官方标记为beta版本,说是并为这边好投入生产,而且也不支持最新的LCEL语法,但是ChatMessageHistory这个功能是个例外,它已经支持LCEL并且基本可以用在生产上了,所以我们今天说下如何使用ChatMessageHistory让我们的agent记录下对话历史,实现多轮对话。

  首先还是来创建基本的agent,这里我们就创建一个简单的对话agent,如果你想创建具备某些功能的复杂agent,可以参考我之前两篇实践文章 抓取并总结网页的agent管理日程的agent

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.runnables.history import RunnableWithMessageHistory,BaseChatMessageHistory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai.chat_models import ChatOpenAI

llm = ChatOpenAI(model="gpt-3.5-turbo", max_tokens=4096)
prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "你是一个智能聊天机器人,名字叫二狗,请用markdown格式回答任何问题",
        ),
        MessagesPlaceholder(variable_name="history"),  
        ("human", "{input}"),
    ]
)
chain = prompt | llm

  要注意的是,上面的prompt中必须要留下历史消息history的占位符,这样agent才能在每次调用llm的时候将历史消息传递过去。

  然后就是创建agent了,当然这里和普通的agent创是有区别的,需要通过RunnableWithMessageHistory()来创建,其中有个特殊的参数,就是需要传入一个能根据session_id获取历史信息的方法,这里我们就先用最简单纯内存的实现方式,完整的创建代码如下:

store = {}
def get_session_history(session_id: str) -> BaseChatMessageHistory:
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    return store[session_id]
    
with_message_history = RunnableWithMessageHistory(
    chain,
    get_session_history,
    input_messages_key="input",
    history_messages_key="history",
)

  当然调用的agent时候,也需要新增一个config参数。


res = with_message_history.invoke(
    {"input": "我刚说过什么??"},
    config={"configurable": {"session_id": "你的session_id"}}   # 主要是用来不同的聊天上下文 
)
res

  其中ChatMessageHistory是最基本的聊天历史记录实现,LangChain也提供很多具备持久化能力的实现,比如基于Redis的RedisChatMessageHistory……,具体可以看下官方文档https://python.langchain.com/v0.1/docs/integrations/memory/

完整示例代码我已经放在github https://github.com/xindoo/langchain-examples/blob/main/history.ipynb,后续其他LangChain相关实践我会第一时间更新到github上,有兴趣可以关注下。

为了在Windows上安装ADB工具,你可以按照以下步骤进行操作: 1. 首先,下载ADB工具包并解压缩到你自定义的安装目录。你可以选择将其解压缩到任何你喜欢的位置。 2. 打开运行窗口,可以通过按下Win+R键来快速打开。在运行窗口中输入"sysdm.cpl"并按下回车键。 3. 在系统属性窗口中,选择"高级"选项卡,然后点击"环境变量"按钮。 4. 在环境变量窗口中,选择"系统变量"部分,并找到名为"Path"的变量。点击"编辑"按钮。 5. 在编辑环境变量窗口中,点击"新建"按钮,并将ADB工具的安装路径添加到新建的路径中。确保路径正确无误后,点击"确定"按钮。 6. 返回到桌面,打开命令提示符窗口。你可以通过按下Win+R键,然后输入"cmd"并按下回车键来快速打开命令提示符窗口。 7. 在命令提示符窗口中,输入"adb version"命令来验证ADB工具是否成功安装。如果显示版本信息,则表示安装成功。 这样,你就成功在Windows上安装了ADB工具。你可以使用ADB工具来执行各种操作,如枚举设备、进入/退出ADB终端、文件传输、运行命令、查看系统日志等。具体的操作方法可以参考ADB工具的官方文档或其他相关教程。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [windows环境安装adb驱动](https://blog.csdn.net/zx54633089/article/details/128533343)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Windows下安装使用ADB,简单易懂教程](https://blog.csdn.net/m0_37777700/article/details/129836351)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xindoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值