![[Bug]: Citation Query Engine Refine Templates are missing "existing answer" and "new answer" verbiage.](https://www.chat-gpts.plus/wp-content/uploads/2026/07/22218-01e9a1d1.jpg)
[Bug]: Citation Query Engine Refine Templates are missing “existing answer” and “new answer” verbiage.
快速结论:该问题出现在使用 LlamaIndex 的 Citation Query Engine 进行文档精炼(Refine)时。报错提示精炼模板(Citation Refine Template)的结构与其他标准的 Refine 模板不一致,缺少了明确的“原始答案”(existing_answer)和“新答案”的标签分隔,导致 LLM 可能无法有效区分新旧答案。优先排查并修改模板中末尾的标签命名。
问题场景
在使用 LlamaIndex 的 CitationQueryEngine 进行检索增强生成时,当系统需要基于已有的答案和新的文档上下文进行精炼时触发。该问题并非运行时报错,而是一个逻辑结构问题,导致输出的答案质量可能不如预期的“精炼”效果。
报错原文
Issue in CITATION_REFINE_TEMPLATE structure:
Template ends with "Answer: " instead of "Refined Answer: " or "New Answer: ".
Compare to standard templates like CHAT_REFINE_PROMPT:
"Original Answer: {existing_answer}"
"New Answer:"
原因分析
这是 LlamaIndex 核心库中的一个模板设计缺陷。在 CITATION_REFINE_TEMPLATE 中,虽然模板变量 {existing_answer} 被包含在文本中,但它被嵌入在指令块内部,而非像其他标准 Refine 模板(如 DEFAULT_REFINE_PROMPT 或 CHAT_REFINE_PROMPT)那样,在末尾使用清晰的结构标签(如 "New Answer:" 或 "Refined Answer:")来明确提示 LLM。这种模糊的标签使得 LLM 难以理解模型应当基于旧答案进行修改,而更像是在从头生成一个新答案,从而违反了“精炼”的核心逻辑。
环境排查
- 确认使用的 LlamaIndex 版本:
llama-index-core 0.14.23 - 检查
citation_query_engine.py文件中的CITATION_REFINE_TEMPLATE定义。 - 对比
default_prompts.py中的DEFAULT_REFINE_PROMPT和chat_prompts.py中的CHAT_REFINE_PROMPT的标签结构。
解决步骤
- 定位到
llama_index/core/query_engine/citation_query_engine.py文件中CITATION_REFINE_TEMPLATE的定义。 - 找到模板字符串的末尾部分,当前写法为:
"Query: {query_str}\n""Answer: " - (可优先尝试)将末尾的
"Answer: "修改为更明确的"Refined Answer: "或"New Answer: ",以确保与existing_answer变量形成结构性区分。 - (可选)将
{existing_answer}在其自己的独立行中展示,以确保标签的清晰度,例如:"Original Answer: {existing_answer}\n""Refined Answer: "
注意:此修改属于代码级调整,如果使用包管理器安装,可能需要手动修补或等待官方修复。
验证方法
在调整模板后,使用 CitationQueryEngine 对同一问题执行两次精炼操作:第一次生成初始答案,第二次通过 retrieve 和 refine 流程检查输出。观察输出的末尾是否明确包含“Refined Answer: ”或“New Answer: ”标签,并且答案内容确实基于上一次的 existing_answer 进行优化,而非完全独立生成。



