1. 多跳问答的痛点与现有方案局限
多跳问答(Multi-hop QA)是自然语言处理领域的一个经典难题,它要求模型能够像人类一样进行多步骤推理。比如回答"青霉素发现者的出生地"这个问题,需要先识别出"亚历山大·弗莱明"这个关键人物,再查找他的出生信息。这种跨文档的推理能力,正是当前大语言模型(LLM)应用中的关键挑战。
传统迭代式RAG方案(如Self-Ask、IRCoT)采用"检索-推理-再检索"的循环模式,每跳都需要调用LLM,导致三个显著问题:
1.1 成本随跳数线性增长
在典型的迭代式RAG中:
- 2跳问题需要2次LLM调用
- 4跳问题就需要4次调用
- 每次调用都涉及prompt构造、上下文拼接和结果解析
以GPT-4-32k模型为例,按官方定价:
- 输入token:$0.06/1k tokens
- 输出token:$0.12/1k tokens
假设每次调用平均消耗2k tokens,4跳问题就需要8k tokens,单次查询成本就高达$0.48。对于企业级应用每天处理数万次查询的场景,月成本可能突破六位数。
1.2 实体漂移问题
在多跳推理过程中,子问题往往包含隐式指代。例如:
- 初始问题:"谁发现了青霉素?" → 答案:"亚历山大·弗莱明"
- 生成子问题:"他出生在哪里?"
这里的"他"需要正确关联到弗莱明,但传统方法在检索时:
- 缺乏显式的实体绑定机制
- 容易受上下文相似词干扰(如其他科学家名字)
- 最终导致检索结果偏离真实目标
1.3 原始文档的检索效率低下
原始知识库通常存在:
- 段落冗长(包含无关细节)
- 信息密度低(关键事实被埋没)
- 表述形式与查询不匹配(文档用叙述体,用户用问答体)
例如查询"《Lilli的婚姻》的导演是谁",可能需要检索包含该电影完整介绍的段落,而真正需要的只是"Jaap Speyer"这个名字。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. CompactRAG架构设计精要
南京大学团队提出的CompactRAG采用"离线预处理+在线轻量推理"的双阶段架构,其核心创新在于将计算密集型任务前移,使在线查询时的LLM调用次数恒定为2次。
2.1 离线预处理阶段
2.1.1 原子化QA知识库构建
使用LLM(如GPT-4或LLaMA-3.1-8B)将原始文档转化为细粒度QA对:
python复制def generate_qa_pairs(text):
prompt = f"""将以下文本转化为问答对列表:
要求:
1. 每个事实生成独立的Q&A
2. 使用SpaCy提取的实体作为问题主语
3. 答案保持简洁
文本:{text}"""
response = llm.generate(prompt)
return parse_qa_pairs(r
