用 Qwen 处理超长文档:在聚合站 /chat/completions 上做 Map-Reduce 分段
介绍如何在 LLM API 聚合站上使用统一的 /chat/completions 接口,通过 Map-Reduce 模式处理超长文档。步骤包括文档分块、逐段摘要(Map)、二次汇总(Reduce),全程使用一个 API key,并说明聚合站按官方价 ×1.3 扣费、贡献 key 可获得 USDC 返还的计费方式。
处理超长文档时,直接塞进模型的上下文窗口往往不可行——要么超出长度限制,要么成本过高。一个实用的策略是 Map-Reduce:先把文档切分成多个块,分别处理(Map),再把结果汇总(Reduce)。本文以 Qwen 模型为例,展示如何在聚合站上用统一的 /chat/completions 接口实现这一流程。
为什么选择 Map-Reduce
Map-Reduce 把长文档拆成独立片段处理,适合以下场景:
- 文档长度远超模型单次上下文限制;
- 需要对每个片段做相同操作(如摘要、抽取、翻译);
- 希望控制单次请求的成本和延迟。
它的代价是丢失跨片段的全局信息,因此 Reduce 阶段需要精心设计提示词来弥补。
准备工作:一个 key 调用 Qwen
聚合站提供统一的 OpenAI 兼容接口,一个 API key 即可调用 Qwen 及其他模型。你只需要:
- 在聚合站注册并获取 API key(支持 Base 链上的 USDC 充值,无 KYC)。
- 将 base_url 指向聚合站的
/v1端点。 - 在请求中指定 Qwen 模型名称(具体名称请查阅聚合站文档)。
请求示例(curl):
curl https://your-aggregator.com/v1/chat/completions \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-max",
"messages": [{"role": "user", "content": "你好"}]
}'
计费按官方价 ×1.3 扣费;如果你贡献自己的 key,可获得官方价 ×1.1(优质 key ×1.2)的 USDC 返还。
第一步:文档分块
把长文档切成语义相对完整的块。常用策略:
- 按段落或标题切分:优先在段落边界、章节标题处断开,保持语义完整。
- 固定 token 数 + 重叠:每块约 1000-2000 token,相邻块重叠 100-200 token,避免上下文断裂。
- 按标点切分:在句号、问号等标点后断开,适合无结构文本。
分块后得到 chunks 列表,每块是一个字符串。
第二步:Map 阶段——逐段处理
对每个 chunk 调用一次 /chat/completions,使用统一的提示模板。例如摘要任务:
import openai
client = openai.OpenAI(
base_url="https://your-aggregator.com/v1",
api_key="YOUR_API_KEY"
)
PROMPT_TEMPLATE = """请阅读以下文档片段,提取关键信息并生成简洁摘要。
只输出摘要内容,不要添加额外解释。
片段:
{chunk}
"""
def map_chunk(chunk):
response = client.chat.completions.create(
model="qwen-max",
messages=[{"role": "user", "content": PROMPT_TEMPLATE.format(chunk=chunk)}],
temperature=0.3
)
return response.choices[0].message.content
summaries = [map_chunk(c) for c in chunks]
要点:
- 提示模板保持一致,便于后续拼接。
- 温度调低(如 0.2-0.4),让输出更稳定。
- 可并发请求以缩短总耗时,但注意控制速率,避免触发限流(具体限制请参考聚合站文档)。
第三步:Reduce 阶段——二次汇总
把所有片段摘要合并,再调用一次模型进行最终汇总。如果摘要总长度仍然超出上下文,可以递归 Reduce:先分组汇总,再汇总各组结果。
def reduce_summaries(summaries):
combined = "\n\n".join(summaries)
prompt = f"""以下是一份长文档各部分的摘要。请基于这些摘要,生成一份完整、连贯的全文摘要。
保留重要细节和逻辑关系,避免重复。
各部分摘要:
{combined}
"""
response = client.chat.completions.create(
model="qwen-max",
messages=[{"role": "user", "content": prompt}],
temperature=0.3
)
return response.choices[0].message.content
final_summary = reduce_summaries(summaries)
Reduce 阶段可以要求模型融合信息、消除矛盾,并保留原文的层次结构。
实践建议
- 块大小要适中:太小会丢失上下文,太大会增加单次成本。根据任务调整。
- 重叠区域有助于连贯:重叠部分能让模型看到跨块边界的信息。
- 错误处理:对失败的请求重试,避免因单个块失败导致整体失败。
- 成本估算:Map-Reduce 会产生多次调用,总 token 数可能高于原文。利用聚合站的统一计费(官方价 ×1.3)可预估开销。
- 模型选择:Qwen 系列有不同尺寸的模型,可根据任务复杂度和成本选择。
总结
Map-Reduce 是在有限上下文下处理超长文档的通用模式。通过聚合站的统一接口,你可以用同一个 key 调用 Qwen,完成分块、逐段处理和汇总的全流程。结合 USDC 充值和按量计费,无需 KYC 即可开始。