智契通项目开发周记(第七周):Prompt模板版本化、RAG知识库与合同优化闭环
一、本周工作概述
第六周完成后,系统已经具备合同台账、版本管理、风险审查、摘要提取、风险驱动修订和 AI 调用日志等基础能力。但继续向智能合同平台推进时,可以明显发现一个问题:很多 AI 能力仍然停留在“把用户输入拼成一段文本交给大模型”的阶段。这样的实现可以完成演示,却不够稳定,也不方便后续迭代。
尤其是合同生成、合同优化、风险审查和摘要提取这几类任务,对输出格式、法律表达、事实约束和知识参考都有较高要求。如果提示词散落在业务代码中,后续调整 Prompt 就必须改 Java 代码、重新编译部署,也无法比较不同版本的效果。因此第七周的重点是补齐 AI 项目的基础工程能力:Prompt 模板版本化管理和真实 RAG 知识库召回。
本周主要完成了 Prompt 模板表、Prompt 管理接口、本地知识库表、知识导入接口、知识召回接口,以及合同优化功能升级。合同优化不再只是简单的文本改写入口,而是能够选择已有合同、选择历史版本、填写额外优化要求、选择优化方向、召回知识库片段、生成优化稿,并由用户人工编辑后再保存为新版本。
二、Prompt模板版本化管理
原先的风险审查、摘要提取和合同生成都不同程度地存在硬编码 Prompt 的情况。硬编码实现快,但后期维护困难:修改提示词需要改代码,无法保留历史版本,也无法在 AI 调用日志中准确追踪某次任务到底使用了哪一版 Prompt。
因此本周新增了 ai_prompt_template 表,用来保存 Prompt 编码、名称、任务类型、版本号、系统提示词、用户提示词模板、输出 Schema、状态和备注。每一个 AI 任务都有独立的 promptCode,例如 generate_contract、polish_contract、risk_analyze、summary_extract。
业务调用时不再直接拼最终 Prompt,而是通过 AiPromptTemplateService.render(...) 读取当前启用版本,再把变量替换进去。核心代码如下:
public PromptRenderResult render(String promptCode, Map<String, String> variables) { AiPromptTemplate template = repository .findFirstByPromptCodeAndStatusOrderByVersionNoDesc(promptCode, ACTIVE) .or(() -> repository.findFirstByPromptCodeOrderByVersionNoDesc(promptCode)) .orElseThrow(() -> new IllegalArgumentException("Prompt模板不存在:" + promptCode)); String systemPrompt = renderText(template.getSystemPrompt(), variables); String userPrompt = renderText(template.getUserPromptTemplate(), variables); return new PromptRenderResult( blankToDefault(systemPrompt, "你是专业合同助手。"), blankToDefault(userPrompt, ""), template.getPromptCode() + "-v" + template.getVersionNo() ); }
这个方法的价值不只在于变量替换,而在于把 Prompt 版本变成了可管理的数据。业务模块只需要知道 promptCode,不用关心当前启用的是第几版。模型调用时传入 prompt.promptVersion(),AI 日志就能记录真实版本。
为了让默认 Prompt 不依赖人工初始化,本周还新增了 PromptBootstrapService。服务启动后会检查数据库中是否已经存在默认模板,如果没有就写入。合同优化默认使用 polish_contract-v2,系统提示词明确要求模型在不改变交易事实的前提下优化合同,并且必须结合用户额外要求和知识库片段。
三、本地RAG知识库设计
在本周之前,合同生成中的 knowledgeText 更像是“用户手动粘贴参考材料”,还不是真正的知识库召回。为了让系统具备 RAG 的基本形态,本周新增了两个核心表:knowledge_document 和 knowledge_chunk。
knowledge_document 保存知识来源,例如某个示范文本、某类合同知识要点或后续导入的文件;knowledge_chunk 保存具体可召回的片段,包括标题、合同分类、条款类型、关键词和正文。这样知识既可以按文档管理,也可以按切片召回。
当前召回服务采用轻量级实现,没有立即引入向量数据库。原因是项目目前是课程展示场景,优先目标是让 RAG 流程真实存在、可解释、可落库,而不是一开始就引入复杂基础设施。RagRetrievalService 会根据查询文本、合同分类、条款类型、指定文档 ID 等条件过滤知识片段,并按关键词命中和文本相关度排序,取 TopK 注入 Prompt。
核心调用形式如下:
List<RetrievedChunk> chunks = ragRetrievalService.retrieve( query, contractCategory, clauseType, knowledgeDocumentIds, 8 ); String ragContext = ragRetrievalService.formatForPrompt(chunks);
为了避免知识库只存在于某个开发者的本地数据库,本周新增了 knowledge-seeds.json。默认知识库内容放在资源文件中,包括通用合同完整性、买卖合同、租赁合同、建设工程、软件开发、保密协议、劳动合同、借款合同等知识要点。后端启动时由 KnowledgeBootstrapService 读取资源文件并写入数据库。这样队友拉取代码后,只要启动后端,就可以自动获得默认知识库,而不会出现“代码有了但知识库为空”的情况。

四、合同优化功能升级
本周另一个重点是合同优化功能。原来的优化功能只能输入原始合同,生成优化后合同,缺少三个关键能力:不能选择已有合同,不能提出额外要求,不能明确优化方向。同时,AI 输出后如果直接覆盖合同正文,也不符合合同业务中“人工确认”的基本要求。
因此本周将合同优化调整为一个更完整的流程:用户选择已有合同和历史版本,系统载入对应版本正文;用户填写额外优化要求,并选择一个或多个优化方向;后端根据合同正文和优化方向召回知识库;使用 polish_contract-v2 渲染 Prompt;AI 返回优化后完整合同、修改摘要和知识库引用;前端允许用户继续手动修改优化结果;只有点击保存后,才调用保存接口创建新版本。
优化方向扩展为 10 个以上,包括付款结算、交付验收、违约责任、解除终止、保密条款、知识产权、争议解决、合规性、公平性、完整性、语言规范等。系统也保留了“自动”选项,选择自动时由模型结合合同内容自行判断重点方向。
后端请求对象如下:
public record PolishRequest( Long contractId, Long versionId, String originalText, String extraRequirement, String polishType, List<String> optimizationDirections, List<Long> knowledgeDocumentIds ) { }
Prompt 渲染时,系统会把合同元信息、额外要求、优化方向、RAG 片段和原始合同一起传入模板:
PromptRenderResult prompt = promptTemplateService.render("polish_contract", Map.of( "contractMeta", contractMeta, "extraRequirement", extraRequirement, "optimizationDirections", directionsText, "retrievedKnowledge", ragContext, "originalText", originalText ));
这段代码体现了本周 Prompt 工程的核心思路:业务层不再只把一段正文扔给模型,而是把任务目标、约束条件、用户意图、知识来源和原始事实明确分层。模型可以发挥语言组织能力,但不能随意改变主体、金额、日期和交易事实。
五、本周总结
第七周的工作重点不是单纯增加几个页面按钮,而是把智能合同系统的 AI 基础能力向前推进了一层。Prompt 模板版本化解决的是“提示词如何维护和追踪”的问题;RAG 知识库解决的是“模型参考什么知识”的问题;合同优化流程升级解决的是“AI 结果如何进入合同生命周期”的问题。
从技术理解上看,本周最大的收获有三点。第一,Prompt 不是普通字符串,而是 AI 应用的业务规则载体。它需要版本、状态、输出 Schema 和调用日志,否则后期无法评估效果。第二,RAG 的关键不是把知识塞给模型,而是让知识来源可管理、切片可检索、召回结果可追踪。第三,合同类 AI 功能必须保留人工确认环节。AI 可以帮助生成、优化和审查,但最终进入台账和版本的数据应该由用户确认保存。
经过本周开发,系统已经从“有 AI 调用的合同管理系统”进一步升级为“具备 Prompt 管理、知识库召回和人工确认闭环的智能合同系统”
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)