做提示工程这么久,在垂直领域里法律算是最难啃的骨头之一。原因不复杂:法律条文对措辞的敏感度极高,同一个概念在不同场景下解释可能完全不同,模型一个不小心就会把“可以”理解成“应当”。我之前接过一个法律领域模型的准确性提升项目,团队一开始直接套通用提示模板,结果法条引用错误率一度超过三成,当事人信息抽取也经常缺胳膊少腿。后来转向提示适配的思路,把任务拆细、给模型限定输出结构、把法条检索结果和生成强绑定,准确率才有了质的提升。这套方案里踩过的坑、摸索出来的模板、还有配套的数据集设计,我完整写出来,希望能给正在做垂直领域提示工程的朋友一些参考。
适合谁看?如果你在做法务系统、智能合同审查、法规问答,或者任何对输出准确性要求极高的领域,这篇文章里的思路和模板可以直接拿来改。如果你是刚接触提示工程,想看一个完整案例是怎么从需求拆解走到数据构建再到评测收敛的,这篇也能帮你把流程串起来。
1. 法律领域提示适配的整体设计思路
1.1 为什么通用提示词在法律场景会失效
通用提示词可以理解为给模型讲“大概要做什么”,比如“你是法律助手,请回答用户问题”。这个粒度在法律场景下远远不够。我实测的体会是,法律任务要的是“确定性行为”——输入一段纠纷描述,模型得稳定输出争议焦点、法律依据、结论推导,每一步都不能跑偏。通用提示词没有给模型定义这个输出骨架,模型只能靠自己的语言习惯自由发挥,结果就是:同一个问题问十次,格式能给你变出十种花样。
更深层的原因是,法律语言本身带有很强的“条件-后果”结构。一个合格的回答必须满足三个约束:法律依据准确、逻辑链条完整、结论与依据之间经得起推敲。通用提示词根本没办法承载这种约束,它只是给了一个角色设定,没有给推理路径。模型在自由生成模式下,很容易出现“看着像法律意见、其实逻辑断链”的输出。
所以我在这个项目里定的第一条原则就是:法律场景的提示工程,本质上是给模型设计一套“行为契约”。让模型明确知道它面对的是哪类任务、必须走完哪个推理链路,以及输出长什么样。这是我做法律提示适配和通用提示工程最大的区别。
1.2 法律任务的核心变量拆解
要做提示适配,得先知道法律任务有哪些变量在影响输出质量。我拆解下来,法律领域场景中的高影响变量主要有这么几个:
第一个是任务类型。法律问答、合同审查、文书起草、类案检索这几个任务对推理路径的要求完全不同。比如合同审查,模型要按条款扫描并给出风险等级;而法律问答,模型要按“事实-争议-依据-结论”的结构来组织回答。如果不先把任务类型识别出来,后面所有提示设计都是空转。
第二个是法条知识的时效性。法律条文会修订、废止,模型内部的知识存在截断时间。这意味着不管提示写得多好,模型都有可能引用旧法条。针对这个问题,我在提示设计里加入了一个关键机制:强制模型只能基于检索到的材料回答问题。等于让模型从一个“凭记忆作答”的选手变成了“查了资料再作答”的选手。这一层适配带来的准确率提升比任何技巧都明显。
第三个是输出结构的稳定性。法律场景下游往往还要接结构化后处理,比如把结论填进业务系统。如果输出格式飘忽不定,后处理解析就非常痛苦。我把所有任务的输出都定义成固定的结构框架,并且给了完整的填入示例。模型看到示例后,格式遵循度会显著提高,这属于提示工程里效果最稳定的一招。
这三个变量其实是每个垂直领域都要回答的问题:我的业务有哪些不同任务?哪些关键知识依靠外部供给?输出要不要被结构化?想清楚这三件事,提示适配的基本盘就立住了。
1.3 提示适配方案的总体架构
整个方案我分成了四层:任务路由层、要素抽取层、知识引导层、输出规整层。接下来顺着每一层往下拆的时候,你会发现其实每一层都可以对应一组具体的提示设计,它们组合在一起才是完整方案。
任务路由层解决的是“模型该用哪套推理路径”。我在系统前面加了一个意图分类提示,让模型先对输入作归类判断,到底是咨询问答、文书起草还是合同审查,再进入对应的处理提示。这一步用很小的成本,大幅降低了任务类型混乱导致的答非所问。
要素抽取层解决的是“模型该怎么读取信息”。法律文本信息密度高,当事人是谁、诉讼请求是什么、争议事实有哪些,全混在段落里。我设计了一个抽取专用的提示,让模型把原始输入整理成槽位化字段,像“甲方:XXX;争议事项:XXX;标的额:XXX”。整理完再送给下游生成,解决长文本上下文漂移问题。
知识引导层解决的是“模型该用什么知识来回答”。模型内部记忆不可靠,我让它在回答前先经过外部检索系统获取相关法条,再把法条原文注入上下文作为依据。提示中明确写了“仅依据给定的法条材料作答”,这会极大减少凭空发挥。
输出规整层解决的是“模型该怎么表达”。我针对每个任务都定义了输出结构,比如文书起草要求分标题和正文,法律问答要求分依据和结论。在提示里附上至少一个完整例子。这层是最见效果的,模型输出格式的稳定性提升是肉眼可见的。
2. 核心细节解析与实操要点
2.1 任务分类的原理解与决策边界
在搭任务路由层的时候,我先梳理了高频法律任务清单。作为参考,法律领域常见的提示任务包括:法律咨询问答、合同风险审查、起诉状起草、答辩思路生成、类案要素提取、法规效力查询。这些任务之间并非完全互斥,但它们的推理路径差异很大,所以我按“需不需要检索法条”和“输出要不要进业务系统”两个维度做了一次分类。
分类结果直接影响后续提示模板的选择。需要检索法条的,知识引导层的权重就高;不需要检索的,比如纯粹解释一个法律概念,那就靠模型内部知识就行。输出要进业务系统的,必须在提示里规定严格的槽位格式;只是给人看的,要求就可以放宽到段落化。
这里有一个需要重点关注的地方:分类提示写的分类定义,往往决定整个系统对输入的第一印象。如果分类定义写得含糊,比如“判断以下内容是提问还是请求”,给不出具体判别条件,分类的准确率会非常不稳定。我最终在分类提示里写上了每个类别的判别特征,还配了两个代表性例子。改完之后分类准确率从七成出头的水平直接追到接近九成。
2.2 要素抽取的字段规范与容错设计
要素抽取是这个方案里最容易被低估的一层。很多人会想,直接让模型去读原始输入然后生成答案不就行了,为什么要多抽一道?我实际试验下来,原始输入里当事人信息经常被表达成“他的公司”“我方”“原告”这类代词,如果不先把这些代词还原成明确的实体标签,后续生成法律意见时很可能发生指代混乱,影响最终结论的指向。
要素抽取层的提示设计核心是定义字段规范。我定义抽取字段包括:当事人、相对方、争议标的、事实描述、争议焦点、请求事项。每个字段明确了抽取来源和保存格式。比如“争议标的”要求给出金额数字和币种,“请求事项”要求逐条列出并保留原始表述。
容错设计同样重要。抽取是生成式行为,可能有抽取缺失或字段错位的现象,我把抽取提示做成“尽量填充所有字段,如果不确定,标记为待确认”,并加了一段说明引导模型把拿不准的内容单独列出来而不是硬填。这样下游生成器收到的噪声会少很多。后来我在评测时发现,加上这一层后,裁判文书风格的结论生成质量有明显改善,因为关键信息都已经结构化,模型只需集中精力组织逻辑。
2.3 法条知识引导的注入位置与使用边界
知识引导层是全套方案里我最想提醒大家注意的地方。很多人在提示工程里会自然地想到“把法条塞给模型”,但塞在哪、以什么格式塞、要不要在回答中强制引用,这里的讲究特别多。
我的做法是,在提示中划分出“知识区”。知识区放在任务指令之前,与任务指令明确分隔。在调用外部检索时返回的相关法条,会按“编号-名称-条文内容-关联要点”的结构摆进知识区。为什么要摆在这个位置?因为模型对上下文不同位置的记忆强度有差异,放在离任务指令较近的位置,模型在生成回答时更容易回望到它。顺序不对,效果会衰减,这个细节是我调了几版之后才发现的。
还有一个关键操作是:明确要求模型“不能使用给定材料以外的法律依据”。这不是简单说“不要用内部知识”,而是要给模型一个检查清单式的指令,比如“如果给定的材料中不涉及相关法律,请明确说‘现有检索材料不足以支撑结论’”。这条约束让模型在面对知识盲区时放弃胡编,转而诚实承认,整体可信度提升非常明显。
2.4 输出结构定义与后处理友好性设计
输出规整层里,我最常强调的提示设计习惯是:永远在提示里放“填表示例”。法律场景尤其如此,因为输出结果通常还要做后处理,可能是写入案件管理系统,也可能是生成合同的批注列表。格式不稳定,后处理代码就会变成一场灾难。
我给不同任务设计输出结构时都遵守一个原则:字段之间逻辑关系清晰,且可以机械解析。比如法律问答的输出结构定义成:先输出“法律依据”,列出法规识别号和条文要点;再输出“事实分析”,对照输入事实逐项分析;最后输出“结论意见”,给出明确的建议。在这个结构里,每个部分的标题都固定,便于下游用正则表达式去切块。
示例样本的数量和质量也同样影响格式遵循度。我试过在提示里不放例子、放一个例子和放两个例子,效果有差别。放一个例子比不放的格式符合率高一大截,放两个例子提高相对有限,所以我最终默认每个任务放两个例子,一个常规难度,一个稍微复杂一点。例子尽量贴业务真实场景,不要为了好看编造跟实际输入差异特别大的样例,否则模型反而不容易对齐。
3. 实操过程:从数据集构建到效果收敛
3.1 模拟业务数据集的构建思路与方法
标题里提到“附数据集”,我得坦白讲一下这套数据集是怎么造出来的。因为垂直领域标注成本高,我采用的是一种“模拟+人工修正”的组合笔记路线,在真实性、成本和可控性之间取得了平衡。
首先,我梳理了法律问答场景常见的高频问题类别,包括合同违约、劳动争议、婚姻家庭、借款纠纷、侵权赔偿这几个方向。针对每个方向,整理了场景要素,比如当事人的身份类型、争议行为、金额范围等。基于这些要素组合,生成了一批模拟咨询文本,文本尽量模拟真人咨询的口气,带有信息冗余和口语化表达,避免看起来像教科书例句。
第二遍是人工修正。这部分拉了几位有法律背景的朋友做帮手,让他们对模拟文本里的法律表述进行纠偏,确保文本中出现的事实描述和对应的法律概念是匹配的,比如“定金”和“订金”的表达不会用混。这步修正最花时间,但也是数据集质量的重要保障。
数据集最终分为训练集、验证集和测试集三部分。测试集是从不同渠道收集的近两百条真实环境下脱敏后的提问文本,这些文本和训练集的风格有明显差异,专门用来检验提示方案在遇到陌生表达时的表现。数据集的构建流程和字段说明会直接打包好,方便其他项目复用。
3.2 提示模板的迭代步骤与版本管理
我在清点提示工程经验时发现,很多从业者不太重视提示模板的版本管理。轻量场景也就算了,像法律这种严肃场景,改了一版提示之后效果是变好还是变坏,没有版本记录很难说清楚。所以我在这次项目里做了一个提示模板迭代的检查表。
第一轮迭代先跑通“骨架版”。就是最简单的那一版:角色设定加任务描述,不加任何约束结构,目的是看模型的原始行为基线。我拿测试集跑了一遍,记录下准确率、格式符合率和错误类型分布。这一版确实是“什么都敢答,什么都敢编”,但它告诉了我后续优化的起点在哪儿。
第二轮迭代加入“结构约束版”。在上一步的基础上依次加入任务路由、要素抽取、知识引导和输出规整四层设计。每加一层都在同样的测试集上跑一轮,记录变化量。有一点要特别注意:只改变一个变量,不要同时改多个地方,否则出了问题根本不知道该甩锅给谁。
第三轮迭代是做参数微调。重点观察温度、top-p四个参数范围的变化。我在几个提示模板里对模型进行批量测试,对比不同参数组合下的准确率和格式稳定性。最终选了一个输出多样性和事实准确度平衡较好的组合,这个组合成为正式上线版本。整个迭代过程有四版主要提示版本,每版的评测结果都记录在一个对照表上,方便后续回归验证。
3.3 评测指标设计与准确性提升数据
法律模型提示优化的评测必须有专门设计的指标,不能只用一个“感觉回答变好了”来糊弄事。我在这套方案里用了三个核心衡量指标:法条引用准确率、要素覆盖完整度、格式规范符合率。
法条引用准确率的计算方式比较直接:比较模型回答中引用的法规编号、条文内容与标准答案是否一致。它既考核识别正确法条的能力,也检查会不会张冠李戴。要素覆盖完整度则是考察回答是否包含了抽取阶段定义的核心字段信息,缺一个就算扣分。格式规范符合率是一个硬性指标,只要回答没有按照指定结构输出,该条直接判失败。
整体效果方面,以实验测试集为基准,原始通用模板跑出来的法条引用准确率在六成上下;加入知识引导明确约束之后,这个指标提升到八成以上;再叠加输出规整和任务路由,最终稳定在九成左右。要素覆盖完整度也从七成出头追到了九成以上,格式规范符合率的提升更明显,从不到五成拉到了接近九成五的水平。这些提升数据不是我凑出来的,确实是一层层提示结构叠上去之后的真实结果。
值得注意的是,准确性提升不只是因为提示模板写得多了,更关键的其实是每一层都在压缩模型的自由发挥空间。任务路由层限制了任务路径,知识引导层限制了知识来源,输出规整层限制了表达方式,三层约束下来,模型能做对的事自然变多了。这和“写更多提示词”完全是两回事。
3.4 参数调优的实测经验
在参数调优这件事上,我踩过不少坑。很多刚入门提示工程的人有个误区,觉得提示写好了参数就无所谓了。实际上,提示和参数是共同决定输出的两个变量,尤其在法律领域这种追求精确的场景里,参数的影响会被放大。
温度直接控制输出的随机性。法律意见生成如果温度过高,模型可能会用不同的措辞表达同一个法律观点,表面上看多样性强了,但很多情况下这种多样性是危险的。比如同一份证据分析,温度高的时候模型可能写出两种逻辑路径,其中一种可能基于不完全的推理链。所以我在正式方案中,把温度设置得偏低,让模型倾向于保守、直接的表达。
top-p采样策略也有讲究,它背后的含义是只在累积概率达到某个阈值的结果中做筛选。对法律场景来说,阈值适中即可,阈值太低容易丢掉长尾但必要的表述,阈值太高则又陷入过度活跃的输出。在这个项目里,我实测后发现中等偏保守的top-p结合低温度,能把格式符合率稳定在一个较高水平,同时不牺牲回答的信息量。
我还建议在调参时每次都记录完整的输出样例,不要只看指标数字。因为指标有时候会“骗人”——准确率没下降,但生成的文本表述质量已经在肉眼可见地退化。这种问题只有靠人工阅读输出样本发现。所以凡是涉及法律内容的项目,我至少会保底安排一轮人工看样环节。
4. 常见问题与排查技巧实录
4.1 模型输出格式不稳定的分析与修正
格式不稳定是我在这个项目里接触最多的使用反馈之一。用户的直接感受就是“结构对不上”,而这个问题的根子往往不在生成阶段,而在提示结构本身。我处理这类问题的一般次序是:先检查示例与任务定义是否足够一致。如果任务的指令部分描述了要输出“理由-依据-结论”三段结构,示例里却给出了“结论-依据-理由”的顺序,模型很容易被例子误导。这种冲突会大幅干扰格式遵循效果。
接下来需要确认的是输出规范里有没有覆盖到边界情况。比如用户输入里夹带了一些不相关的话,模型是否应该忽略?标点符号和行文是否需要规范化?这些都是格式不稳定隐藏很深的影响因素。我会在提示里补充“忽略与法律咨询无关的内容”这类边界约束,效果立竿见影。
还有一种情况是,格式不稳定来自输入长度增长后的注意力漂移。长文本输入会让模型在执行输出结构时慢慢地“走神”。应对办法是把要素抽取层做好,把原始长文本压缩成结构化字段,生成阶段就只需基于精简字段展开,模型走神的概率自然下降。本质上,这是在输入进入模型之前就完成了一次信息压缩。
4.2 法条引用不准确或引用旧法条的处理
法条引用不准确是这个领域里最让人头疼的问题。有一次我测试一个关于租赁合同的问答,模型给出了一条看起来很合理但实际上是旧版本的条文依据,内容与新法规定相悖。这说明模型在利用内部记忆时,对法规版本的识别能力有限。
解决这个问题的核心是知识引导层的强制约束。我让系统在问答流程里先执行一次检索调用,把匹配到的法条连同效力说明一起注入上下文。提示里明确写了“仅有依据给定的法条作答,不得自行补充未经提供的法律条文”。这个思路看起来简单,实现之后的效果却极其显著。
另一个补充的保险措施是,在输出结构里加入“法规效力核查项”。即使模型识别到法条,也要求它标注该法条是现行有效还是已经修订。如果检索结果中有“本法已于某年修订”的提示,模型在回答时会同步引用修订后的条文。这个细节在很多真实业务中是直接决定答复是否可用的关键。
4.3 多轮对话场景下的指令冲突与解决
多轮对话对提示工程来说是一个经典难题,法律场景也不例外。用户在第二轮问“那如果对方不给钱怎么办”时,模型到底应该延续上一轮的事实背景,还是当成一个全新问题处理?如果提示里没有明确这一点,模型很容易混乱。
我在设计多轮提示时,采用了一种策略:把上一轮抽取的要素字段拼接在每一轮的上下文里,同时给模型一个状态确认步骤。也就是说,每轮回答前,模型先判断“用户是否在上文描述过的案件背景下提问”,并将判断结果作为生成回答的前置内容。排查中发现,这样处理之后,对话上下文漂移的情况明显减少。
多轮指令冲突的另一个来源是用户会在对话过程中修改事实要素。比如前面说“合同金额是十万元”,后面说“其实合同金额是二十万”。模型如果沿用旧信息,回答就会出错。针对这个场景,我在提示里加入了“事实更新检测”的要求,当检测到用户可以用于变更案情的新信息时,它需要覆盖旧字段并重新生成事实摘要,而不是继续沿用旧的事实框架。
4.4 全流程实战问题速查表
我把整个项目实施过程中遇到的高频问题整理成了一张速查表,表格适合在方案搭建和评审时对照自查。它是我项目复盘时的核心材料,也是团队内部后续培训的必用资料,省去了大量重复沟通成本。
| 问题表现 | 可能原因 | 排查方向 | 解决建议 |
|---|---|---|---|
| 输出结构混乱 | 提示中指令与示例不一致 | 核对任务指令与示例结构 | 统一指令与示例的字段顺序 |
| 回答引用旧法条 | 模型过度依赖内部知识 | 检查知识引导层是否生效 | 强制要求仅依据给定法条作答 |
| 多轮对话丢失上文 | 上下文衔接缺少状态维护 | 检查要素抽取结果是否回传 | 每轮拼接事实摘要并更新状态 |
| 抽取字段缺失 | 要素抽取提示覆盖不全 | 检查字段定义与输入类型 | 增加待确认标记,引导模型输出 |
| 输出过于冗长 | 缺少长度约束与粒度控制 | 检查提示中字数或结构限定 | 设置输出段落数量上限,规定摘要优先 |
| 调用外部检索结果不稳定 | 知识区格式不统一 | 检查法条注入格式是否结构化 | 对检索结果做统一的文本清洗和转换 |
| 格式符合率下降 | 示例质量或数量不足 | 检查示例是否覆盖复杂场景 | 补充一版复杂样例,提供对照范式 |
这张表里的每一个问题我都实际踩过。快排的时候,可以优先看“可能原因”这一列,按频率排序去做验证,能省下不少往返调试验证的时间。
5. 个人实操中的一些体会
整套方案做下来,我最大的一个感触是:提示工程在法律领域的核心,不在于把提示词写得多“漂亮”,而在于把模型的自由度控制在一个业务可接受的范围里。你给模型讲清楚任务类型是什么、依据的知识是什么、输出结构是什么,再加上外部检索做知识兜底,准确率的提升就是水到渠成的事。
数据集这一块,我一直建议想做垂直领域提示优化的朋友,宁可多花时间在半自动标注上,也别急着省事而完全依赖模型生成。模型生成的数据经常带着它自己的偏好,如果训练集阶段就埋进这种偏好,后面做评测会把问题放大。人工修正环节再繁琐,在严肃场景下也是值得的。
最后再分享一个小技巧:每次迭代提示模板时,把旧版本的输出结果和新版本放在一起做对比,别只看评测分数。评测分数反映的是平均水平,样本对比反映的是具体缺陷。经常看具体样本,你会发现自己对提示问题的直觉会敏感很多,这个能力在提示工程上比任何技巧都更值钱。