Skip to content

应用介绍

  1. 和用户进行聊天
  2. 记住用户的历史问题,并根据历史上下文进行回答

用到的LangChain模块

组件功能作用关键部分
模型(Models)智能大脑ChatGPT/DeepSeek
提示词模板(PromptTemplate)定义对话结构框架ChatPromptTemplate
历史管理器(Memory)对话记忆管家ChatMessageHistory
会话存储器多对话隔离存储字典+Session ID
链(chain)组合prompt/model/historyprompt/model/history

环境搭建

pip install -q langchain langchain_experimental openai python-dotenv langchain_openai
python
import os

from langchain_core.runnables import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

from utils.conf_util import openai_config

# 设置API Key
openai_config = openai_config()
os.environ["OPENAI_API_KEY"] = openai_config.get("api_key")

构建聊天历史存储器

python
# 创建内存存储字典
session_store = {}

def get_chat_history(session_id: str):
    return session_store.setdefault(session_id, ChatMessageHistory())

设计对话结构模板

python
# 构建三级对话模板
conversation_blueprint = ChatPromptTemplate([
    ("system", "你是一个专业的人工智能助手"),  # 角色定义
    MessagesPlaceholder(variable_name="history"),  # 历史记忆
    ("human", "{input}"),  # 用户输入
])

组装对话处理流水线

python
# 初始化大预言模型
llm_engine = ChatOpenAI(model="gpt-40-mini", max_tokens=1000, temperature=0.9)

# 构建处理链
processing_pipeline = conversation_blueprint | llm_engine

# 添加历史管理模块
smart_agent = RunnableWithMessageHistory(
    processing_pipeline,
    get_chat_history,
    input_messages_key="input",
    history_messages_key="history"
)

启动对话

python
user_session = "user_001"
first_response = smart_agent.invoke(
    {"input": "你好,可以写一个冒泡排序算法吗?"},
    config={"configurable": {"session_id": user_session}},
)
print(f"AI回复:{first_response}")

# 延续对话
followup_response = smart_agent.invoke(
    {"input": "我刚才问的问题是什么?"},
    config={"configurable": {"session_id": user_session}},
)
print(f"AI回复:{followup_response}")

查看对话历史

python
# 查看对话历史
print("\n完整对话记录:")
for message in session_store[user_session].messages:
    print(f"[{message.type.upper()}]  {message.content}")

进阶优化

  1. 记忆压缩:使用ConversationSummaryMemory减少token消耗
  2. 长期记忆:集成Redis实现持久化存储
  3. 上下文窗口:采用滑动窗口机制控制历史长度