如何为LangChain SQL聊天应用实现会话上下文关联?
基于LangChain实现SQL聊天应用的会话上下文理解
核心逻辑
要解决用户提问中的指代(比如“这个”)关联问题,关键是让LangChain Agent能读取并利用完整会话历史,先解析指代内容对应的具体实体(如订单ID XYZ),再生成正确的SQL查询。
具体代码实现步骤
1. 初始化会话存储与基础组件
用ConversationBufferMemory维护对话记录,确保每轮对话的上下文都被留存,同时完成数据库和大模型的初始化:
from langchain.memory import ConversationBufferMemory from langchain.chat_models import ChatOpenAI from langchain.agents import create_sql_agent from langchain.agents.agent_toolkits import SQLDatabaseToolkit from langchain.sql_database import SQLDatabase # 连接目标数据库 db = SQLDatabase.from_uri("sqlite:///your_order_db.db") # 初始化大语言模型(推荐用GPT-3.5/4类模型,指代解析能力更强) llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo") # 配置会话内存,指定内存键为chat_history,返回完整对话消息 memory = ConversationBufferMemory( memory_key="chat_history", return_messages=True, output_key="output" )
2. 创建带会话内存的SQL Agent
将内存传入Agent,让Agent在生成响应时自动加载历史对话:
# 构建SQL工具包 toolkit = SQLDatabaseToolkit(db=db, llm=llm) # 创建带内存的SQL Agent agent = create_sql_agent( llm=llm, toolkit=toolkit, memory=memory, verbose=True, agent_type="chat-zero-shot-react-description" )
3. 优化Prompt增强指代解析
如果默认Prompt对指代的处理不够理想,可以自定义Prompt,明确告知LLM优先解析指代内容:
from langchain.prompts import ChatPromptTemplate # 自定义Prompt模板,强调上下文解析 custom_template = """ 你是处理订单数据库的SQL助手,请严格按照以下流程处理问题: 1. 先查看对话历史,解析当前问题中的指代词汇(如“这个”“它”),确定具体对应的实体(比如订单ID、用户ID等) 2. 根据解析后的完整问题,生成正确的SQL查询语句 3. 执行查询并返回清晰的结果 对话历史:{chat_history} 当前用户问题:{input} 可用工具:{tools} 工具说明:{tool_names} = {tools} 输出格式要求: 思考:说明你如何解析指代、生成SQL的逻辑 工具调用:工具名称,参数(如果需要) 最终回答:[查询结果] """ # 生成Prompt并替换Agent的默认Prompt prompt = ChatPromptTemplate.from_template(custom_template) agent.agent.llm_chain.prompt = prompt
4. 多轮对话测试
运行多轮对话验证效果:
# 第一轮对话:询问最高订单 first_response = agent.run("最近产生的最高订单是哪个?") print(first_response) # 预期输出:订单ID:XYZ # 第二轮对话:测试指代解析 second_response = agent.run("这个是什么时候下单的?") print(second_response) # 预期输出:订单XYZ的下单时间(如2024-05-20 14:30:00)
额外优化建议
- 若对话历史过长,可改用
ConversationSummaryMemory压缩历史内容,避免超出LLM上下文窗口 - 可以在内存中单独存储上一轮的关键实体(如记录last_order_id),让Agent直接读取,进一步提升解析准确率
- 测试时优先用能力较强的大模型,GPT-3.5及以上版本对指代的理解更可靠
内容的提问来源于stack exchange,提问作者matvi
相关产品推荐
相关产品推荐

