如何编辑Langchain Agent对话并解决OpenAI token超限问题?
解决Langchain Agent查询MySQL时的4k Token限制问题
一、移除对话历史中的冗余表结构
- 自定义内存过滤逻辑:重写
BufferMemory或ConversationBufferMemory的save_context方法,在保存对话前检测消息内容,直接过滤掉schema_sql_db返回的全量表结构内容(比如包含大量CREATE TABLE语句或字段明细的消息),只保留用户查询、Agent的SQL执行结果和最终回答。 - 使用过滤型内存组件:基于Langchain现有内存类扩展实现
FilteredConversationMemory,添加规则剔除所有与表结构查询相关的冗余响应,避免无效内容占用token。
二、对话历史过长时自动总结
- 直接启用
ConversationSummaryMemory:替换原有内存组件,它会自动将早期对话压缩为关键摘要,大幅减少token占用。示例代码:
from langchain.memory import ConversationSummaryMemory from langchain.llms import OpenAI memory = ConversationSummaryMemory(llm=OpenAI(temperature=0))
- 自定义阈值触发总结:用
tiktoken库计算对话历史的token数,当接近4k阈值时,调用大模型对历史内容做精简总结,替换原有历史。示例代码:
import tiktoken def count_tokens(text, model="gpt-3.5-turbo"): encoder = tiktoken.encoding_for_model(model) return len(encoder.encode(text)) # 内存保存前检查token量,超过阈值则执行总结 if count_tokens(memory.buffer) > 3000: summary = llm.predict("总结以下对话,保留关键查询和核心结果:" + memory.buffer) memory.clear() memory.save_context({"input": "对话历史总结"}, {"output": summary})
三、从根源减少表结构查询冗余
- 预存精简表结构:提前获取MySQL表结构并做精简(只保留字段名、类型、核心注释),将其作为工具的固定参数,避免Agent每次都全量查询schema。
- 约束Agent的schema查询行为:在system prompt中明确规则,比如:"仅当完全不清楚表结构时才查询schema,已获取过的结构无需重复调用",减少不必要的schema查询触发。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

