背景描述
本文介绍了一个复杂的知识检索和处理流程,包括:
- 使用 Wikipedia 搜索插件(WikipediaQueryRun 配合 WikipediaAPIWrapper)
- AgentExecutor 执行机制作为中央控制器
- 通过 token 计算控制上下文长度(num_tokens)
- 超过阈值时的内容压缩策略(通常为 2048 或 4096 tokens)
安装依赖
pip install --upgrade --quiet langchain langchain-openai wikipedia
主要代码实现
- 使用
top_k_results=5和doc_content_chars_max=10_000初始化 Wikipedia 工具 - 创建包含 system、user 和 agent_scratchpad 的 prompt 模板
- 使用 GPT-4-Turbo 以获得更好的准确性
- 构建 OpenAIFunctionsAgentOutputParser agent
上下文 Token 控制实现
def condense_prompt(prompt: ChatPromptValue) -> ChatPromptValue:
messages = prompt.to_messages()
num_tokens = llm.get_num_tokens_from_messages(messages)
ai_function_messages = messages[2:]
while num_tokens > 4_000:
ai_function_messages = ai_function_messages[2:]
num_tokens = llm.get_num_tokens_from_messages(
messages[:2] + ai_function_messages
)
messages = messages[:2] + ai_function_messages
return ChatPromptValue(messages=messages)
这个函数实现了滑动窗口方法:
- 保持最近的对话轮次
- 当 token 数量超过 4000 时删除较早的消息
- 保留开头的 system 和 user 消息
关键应用场景
- 开放域问答系统
- 信息补充的知识图谱构建
- 需要在信息完整性和处理效率之间取得平衡的场景
核心要点
文章强调,过多的上下文会导致高 API 费用,并提供了通过基于 token 的压缩来控制上下文长度的实用代码。