如何在LangChain的ConversationChain中传入自定义JSON上下文实现多轮对话?
解决方案
1. 保留原有数据读取逻辑
先完成Excel到JSON数据集的转换,这部分代码可直接复用:
import boto3 import pandas as pd import io from langchain.chat_models import ChatOpenAI from langchain.chains import ConversationChain from langchain.memory import ConversationBufferMemory from langchain.prompts import PromptTemplate # 读取S3中的Excel文件并转为JSON格式 s3 = boto3.client('s3') obj = s3.get_object(Bucket='bucketname', Key='sample.xlsx') data = obj['Body'].read() df = pd.read_excel(io.BytesIO(data), sheet_name='randomsheetname') json_data = df.to_dict("records") # 获取自定义JSON数据集
2. 定义包含JSON数据的对话模板
将JSON数据集作为固定上下文嵌入prompt模板,同时预留对话历史和用户输入的占位:
# 构建对话模板,把JSON数据作为核心上下文传入 prompt_template = PromptTemplate( input_variables=["history", "input"], template="""请基于以下JSON数据集回答用户问题: {json_data} 对话历史: {history} 用户当前问题:{input} 请给出精准回答:""" ) # 提前填充模板中的固定JSON数据(若数据量过大,建议改用向量存储方案) prompt = prompt_template.partial(json_data=str(json_data))
3. 配置对话记忆组件
使用ConversationBufferMemory保存对话历史,确保多轮交互时上下文连贯:
# 初始化对话记忆,指定输入和历史的key对应模板变量 memory = ConversationBufferMemory(input_key="input", memory_key="history")
4. 创建对话链条并执行多轮交互
整合LLM、模板和记忆组件,实现带上下文的多轮查询:
# 初始化ChatOpenAI实例 llm = ChatOpenAI(temperature=0.5, openai_api_key="your_api_key", model="gpt-4") # 创建对话链条 conversation = ConversationChain( llm=llm, prompt=prompt, verbose=True, memory=memory ) # 多轮交互示例 response1 = conversation.predict(input="数据总共有多少条记录?") print(response1) response2 = conversation.predict(input="其中status字段为success的记录有多少?") print(response2)
关键注意事项
- 数据量适配:如果JSON数据集过大,直接嵌入prompt会消耗大量token,此时建议用LangChain的向量存储(如FAISS)将数据向量化,结合
RetrievalQA和对话链条实现检索增强交互,避免token超限。 - 记忆组件选型:若需要限制记忆长度,可改用
ConversationBufferWindowMemory;若需要压缩对话历史,可使用ConversationSummaryMemory。
内容的提问来源于stack exchange,提问作者Mahesh Manjunath
相关产品推荐
相关产品推荐

