Grok 4.5 做文档问答、做表格抽取,两套提示词要分开写

文章导读
同一份材料上既做问答又做字段抽取,如果压到一条提示词里,常见的结果是两边互相污染:问答部分被要求“顺便输出表格”,回答开始丢句子、拼字段;抽取部分被要求“顺便解释一下”,列名跟着语气漂移,同一份材料跑两次列名都不一样。问题通常不在模型本身,而在两类任务的输出目标不同。建议把问答和抽取拆成两套提示词,各自定义输出目标、输入组织方式和校验步骤,再分别存成模板,后续复用时不混用。
📋 目录
  1. 壹 把两类任务的输出目标分别写清楚
  2. 贰 为问答任务组织带定位信息的输入
  3. 叁 为抽取任务固定列名和空值写法
  4. 肆 两类任务各跑一轮并逐条核对
  5. 伍 把两类提示词分别存成模板
A A

同一份材料上既做问答又做字段抽取,如果压到一条提示词里,常见的结果是两边互相污染:问答部分被要求“顺便输出表格”,回答开始丢句子、拼字段;抽取部分被要求“顺便解释一下”,列名跟着语气漂移,同一份材料跑两次列名都不一样。问题通常不在模型本身,而在两类任务的输出目标不同。建议把问答和抽取拆成两套提示词,各自定义输出目标、输入组织方式和校验步骤,再分别存成模板,后续复用时不混用。

把问答和抽取分成两个模板,通常比在一条提示词里写条件分支更可控。问答模板要求用完整句子回答并带上段落编号或章节名,抽取模板固定列名清单、缺失值写法和多值分隔符,然后各跑一轮逐条核对,确认差异来自提示词而不是材料。这套做法适合文档结构相对稳定、字段边界清楚的场景;如果原文口径本身混乱或字段需要跨段落推理,优先调整材料切分,而不是继续加提示词约束。模型的具体表现需要结合实际环境和所用版本确认。

把两类任务的输出目标分别写清楚

输出目标写混,是两类任务互相拖累的主要来源。问答要的是可读句子,抽取要的是可机读结构。把“解释一下你的判断”塞进抽取提示词,列名容易被解释语言带偏;把“只输出 JSON”塞进问答提示词,回答会碎成一堆键值对,读的人还得自己拼回句子。先把两类任务的输出形态定下来,再去写任务描述,顺序反了就容易反复改。

任务任务目标期望输出形态是否允许附加解释
文档问答回答材料里的具体问题,并且能指回原文位置完整句子,句首或句尾带段落编号、章节名允许,但要求与答案分开,例如另起一行写“依据:”
表格抽取把指定字段从材料中取出并结构化固定列名的表格行,CSV 或 JSON 皆可,列顺序固定默认不允许;确需说明时写在表格之外的固定字段

对照表定下来之后,提示词里的第一条约束应该是输出形态,而不是任务背景。先约束形态,模型就不容易在两个任务之间来回切换。

为问答任务组织带定位信息的输入

问答最容易出的问题不是答错,而是“答得对但找不到出处”,核对时只能把整篇材料重读一遍。建议在输入阶段就给材料加定位信息:要么按段落编号,要么按章节名加原文,两种都可以,但同一批材料里要统一。定位信息建议在切分阶段就生成并保留,不要等提问时临时编号,否则模板里约定的“依据”字段会对不上。

[P001] (章节:3.2 结算周期)
结算周期为自然月,每月最后一个工作日生成账单。

[P002] (章节:3.3 逾期处理)
逾期超过 15 个自然日的,按合同第 8 条处理。

问题:逾期超过多少个自然日会触发合同第 8 条的处理?

输入带着定位信息,提示词里还要明确引用要求,否则模型仍然可能只给答案不给位置。一个可用的约束骨架如下,{{}} 内是每次使用前替换的变量:

Grok 4.5 做文档问答、做表格抽取,两套提示词要分开写
你是文档问答助手。
1. 只依据下面给出的材料回答,材料中没有的信息直接写“材料中未提及”。
2. 用完整句子回答,不要输出表格,不要输出键值对。
3. 回答结束后另起一行写“依据:”,列出用到的段落编号或章节名。
4. 不要整段抄回原文,只引用必要的短句。

材料:
{{doc_with_locators}}

问题:{{question}}

这套输入方式适合材料结构相对规整、段落边界清楚的文档。如果原文本身是一大段没有分节的连续文本,先做切分和编号,再进问答模板,否则“依据”只能给到整篇,核对价值有限。

为抽取任务固定列名和空值写法

抽取的稳定性来自约定,而不是来自模型。列名、缺失值写法、多值分隔符这三项,每次抽表前都要固定下来并写进提示词,否则同一份材料跑两次,列名可能从“签署日期”变成“签订时间”,缺失字段一次写“无”、一次留空,后续做解析和比对都很麻烦。

列名清单建议按文档类型单独维护一份,抽取提示词只引用不内嵌,新增字段时改一处即可。约定文本可以参考下面这种写法:

columns:
  - 合同编号
  - 签署日期
  - 结算周期
  - 逾期阈值_自然日
  - 涉及条款编号
  - 备注

空值写法:字段在材料中找不到时写 null,不要写“无”“未提及”“N/A”。
多值分隔:同一字段有多个值时,用分号加空格分隔,例如 A; B。
日期格式:统一写成 YYYY-MM-DD;材料中只有“次月”这类相对表述时写 null,并在备注中说明。

抽取提示词部分只保留引用和输出约束:

Grok 4.5 做文档问答、做表格抽取,两套提示词要分开写
你是表格抽取助手,只做抽取,不做总结,不做解释。
1. 严格按给定的列名和顺序输出,列名不得改写,不得增删。
2. 缺失值写 null;多值用分号加空格分隔。
3. 每条记录独占一行,输出 CSV,第一行为表头。
4. 不要输出表格之外的任何说明文字。

列定义:
{{columns_spec}}

材料:
{{doc_plain}}

多值分隔方式特别容易反复,比如“涉及条款编号”出现多个条款时,有人用逗号、有人用顿号,解析时就会出错。约定一次写进模板,后面不再改。空值写法同理,null 和“无”混用会让本可以自动比对的结果变成人工整理。

两类任务各跑一轮并逐条核对

分开跑的目的是让结果可归因:结果不对时,能判断是提示词的问题,还是材料本身的问题。跑的时候用同一份材料、同一套切分,只改变提示词,不要同时改分块和提示词,否则对不上账。

问答的核对方式:先看问题指向的段落或章节,逐条确认回答是否只用了这些内容;再看“依据”列出的编号是否真的包含答案句。回答正确但依据列错,通常是引用约束没生效;回答里出现材料之外的补充,通常是“只用材料回答”的约束需要加强。

抽取的核对方式分三步:先比对列数和列名是否与列名清单完全一致;再扫一遍空值位置,确认缺失字段是否统一写成 null,没有出现“无”“未提及”这类自由写法;最后检查多值字段的分隔符是否统一。三步都过了,再去看具体内容抽得准不准。

Grok 4.5 做文档问答、做表格抽取,两套提示词要分开写

如果两轮结果都不稳定,先检查切分是否把同一个字段拆到了两个片段,再检查定位编号有没有重复或跳号。提示词只是一层,材料切分同样会影响结果,两边都要看。若核对下来是材料本身口径不一致,改提示词的收益通常有限,应该先回到文档切分和字段定义。

把两类提示词分别存成模板

模板分开存,是防止后续复用时又把两类约束混回一条提示词。命名上建议体现任务类型和版本,存放上建议一个目录下分两类,文件名不要写成无法区分的 prompt.txt。列名清单作为独立文件维护,抽取模板只引用路径。

prompts/
  qa_doc_answer_v1.md            文档问答模板
  extract_table_v1.md            表格抽取模板
  columns/contract_columns.yaml  列名清单,按文档类型分文件

每次使用前要替换的变量,建议在模板头部列清楚,避免漏替换导致结果串味:

  • 问答模板:{{doc_with_locators}}(带段落编号或章节名的材料)、{{question}}(本次问题)
  • 抽取模板:{{doc_plain}}(用于抽取的纯文本材料)、{{columns_spec}}(列名与空值、分隔符约定)

两个模板只要有一处改动,就建议各跑一轮核对,确认定位编号和列名仍然对得上,再投入使用。上面给的是通用骨架,字段内容、输出格式和约束强度可以按实际文档调整,接入方式和模型版本不同时,效果需要结合环境确认。