背景描述

本文介绍了一个复杂的知识检索和处理流程,包括:

  • 使用 Wikipedia 搜索插件(WikipediaQueryRun 配合 WikipediaAPIWrapper)
  • AgentExecutor 执行机制作为中央控制器
  • 通过 token 计算控制上下文长度(num_tokens)
  • 超过阈值时的内容压缩策略(通常为 2048 或 4096 tokens)

安装依赖

pip install --upgrade --quiet langchain langchain-openai wikipedia

主要代码实现

  • 使用 top_k_results=5doc_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 的压缩来控制上下文长度的实用代码。