工程实践:模板化 Prompt + 动态上下文拼接 + JSON 强格式约束
2026/7/17 15:25:35 网站建设 项目流程

目录

一、整体业务背景

二、第一部分:模板化 Prompt 工程实践

1. 什么是模板化 Prompt

2. 模板分层标准(企业通用分层规范)

模板存储方案(工程选型)

3. 模板变量插值规范(避坑要点)

4. 模板化带来的工程收益

三、第二部分:动态拼接上下文(核心工程难点)

1. 上下文组成标准拼接顺序(权重从低到高)

2. 多轮对话历史动态拼接方案

格式统一规范(固定对话结构,避免混乱)

超长上下文截断策略(Token 超限必做)

代码层拼接流程示例(伪代码)

3. 知识库动态拼接避坑点

4. 安全防护:防 Prompt 注入

四、第三部分:输出格式约束 —— 固定 JSON 返回(工程落地核心)

1. Prompt 内强制 JSON 约束写法(两种方案)

方案 1:简单固定 JSON 模板(字段少场景)

方案 2:JSON Schema 标准约束(复杂业务推荐)

2. 解决 LLM 不遵守 JSON 的常见问题

兜底 1:代码预处理清洗(通用)

兜底 2:异常重传机制

兜底 3:工具层强制校验(JSON Schema 校验)

3. 业务异常统一 JSON 规范

4. JSON 约束工程收益

五、完整端到端工程示例(Python 可运行简化版)

1. 统一 Prompt 模板

2. 动态上下文拼接函数

3. JSON 清洗 + 解析工具

4. 调用主流程

六、线上生产环境落地优化要点

七、三大技术组合核心价值总结


一、整体业务背景

在企业级 LLM 落地(知识库问答、数据抽取、智能工单、代码生成、内容审核)中,直接写零散 Prompt 会出现三大痛点:

  1. Prompt 硬编码散落在代码各处,改规则要全项目搜字符串,维护成本极高;
  2. 用户输入、知识库片段、历史对话、业务参数混杂拼接,极易出现注入、上下文越界、格式错乱;
  3. LLM 自由文本输出,后续解析逻辑复杂,正则 / 字符串分割容错差,极易抛异常。

解决方案三层标准化架构:模板层(固定 Prompt 骨架) + 动态变量层(实时上下文插值) + 输出约束层(强制 JSON 返回)

二、第一部分:模板化 Prompt 工程实践

1. 什么是模板化 Prompt

把 Prompt 拆分为固定静态模板+可替换变量插槽,将业务规则、角色设定、任务要求、输出规范统一托管,代码只负责传入变量,不手写大段文本。 类比前端 Vue/React 模板、SQL 预编译语句,核心目的:解耦、统一管控、版本可追溯。

2. 模板分层标准(企业通用分层规范)

一套标准 Prompt 模板分为 5 段,固定顺序不可打乱:

【角色定义】固定不变,描述LLM身份、能力、立场、禁忌 【全局约束】业务通用规则(如禁止幻觉、数据来源仅限给定材料、字数限制) 【任务指令】当前单次要完成的核心任务 【动态变量插槽】{{user_query}}、{{knowledge_chunks}}、{{history_msg}}、{{biz_params}} 【输出格式强制规则】JSON结构、字段类型、必填项、错误返回规范
模板存储方案(工程选型)
  1. 轻量项目:常量文件(Python/Java 枚举)统一存放prompt_template.py/PromptTemplate.java,所有模板集中管理,支持注释、版本标记。 示例 Python:

    python

    EXTRACT_DATA_TEMPLATE = """ # 角色定义 你是专业数据抽取专家,仅根据提供的参考文本提取信息,禁止编造不存在内容。 # 全局约束 1. 所有数据必须来源于【参考材料】,无对应信息填空字符串"" 2. 禁止输出解释、思考、多余文字,只返回指定JSON # 任务指令 根据用户问题,从参考材料中抽取目标字段信息 # 输入变量 用户问题:{{query}} 参考材料:{{docs}} # 输出格式要求 {{json_schema}} """
  2. 中大型项目:配置中心(Nacos/Apollo/Redis)模板存入配置中心,支持热更新,无需重启服务即可修改 Prompt 规则,适合运营频繁调优场景(客服、审核)。 优势:区分环境(测试 / 生产)、灰度下发、操作日志记录谁修改了模板。

  3. LLM 平台化项目:独立 Prompt 管理后台可视化编辑模板、内置变量校验、在线调试插值效果、绑定模型版本、A/B 测试多套模板。

3. 模板变量插值规范(避坑要点)

  1. 统一占位符语法:使用{{变量名}},和业务文本区分,避免和普通括号冲突;
  2. 变量命名规范:user_query用户输入、history_context历史对话、knowledge_list检索知识库、biz_config业务参数;
  3. 转义防护:动态内容自动转义{{}}、换行符、引号,防止变量内容破坏模板结构(Prompt 注入防护);
  4. 模板校验机制:启动 / 调用前校验模板内所有占位符是否都有入参,缺失直接抛参数异常,不送入 LLM。

4. 模板化带来的工程收益

  • 可维护:所有业务规则一处修改,全服务生效;
  • 可迭代:多套模板并存(标准版 / 高精度版 / 低成本版),快速切换对比效果;
  • 可审计:模板变更留痕,定位输出异常不用翻业务代码;
  • 可复用:抽取、总结、分类等通用模板跨模块复用。

三、第二部分:动态拼接上下文(核心工程难点)

动态上下文 = 所有运行时可变输入:用户实时提问、向量库召回知识库、多轮对话历史、业务标签、时间参数、用户权限等。 拼接核心目标:信息完整、长度可控、顺序规范、防污染、防超限截断

1. 上下文组成标准拼接顺序(权重从低到高)

固定拼接顺序,保证 LLM 优先关注最新、最核心信息:

  1. 静态 Prompt 模板(角色 / 规则,最高优先级,放最前)
  2. 业务固定参数(用户等级、行业、时间范围)
  3. 检索知识库片段(参考资料,历史静态数据)
  4. 多轮对话历史(按时间从旧→新排序)
  5. 当前用户最新提问(放在最后,LLM 重点处理)

2. 多轮对话历史动态拼接方案

格式统一规范(固定对话结构,避免混乱)

每条历史消息强制结构化:

【用户】:xxx 【助手】:xxx

示例拼接结果:

# 历史对话 【用户】:充电桩收费标准是什么? 【助手】:峰时1.2元/度,谷时0.5元/度 【用户】:谷时时间段? 【助手】:23:00-次日7:00 # 当前用户问题 【用户】:充电一小时多少钱?
超长上下文截断策略(Token 超限必做)

LLM 有输入 token 上限(如 GPT4 128k、通义千问 8k),动态拼接必须做窗口滑动:

  1. 滑动窗口策略(主流)保留最新 N 轮对话,丢弃最久远历史;优先保留知识库内容,次要丢弃老旧对话。
  2. 摘要压缩策略(长文档场景)知识库片段过多时,先调用小模型对召回文档做摘要,压缩 token 再拼接;
  3. 优先级权重截断权重排序:当前提问 > 最新 3 轮对话 > 知识库 > 老旧历史,超限按权重从低到高删除。
代码层拼接流程示例(伪代码)

python

def build_prompt(query, history, knowledge_chunks, biz_params): # 1. 加载静态模板 template = EXTRACT_DATA_TEMPLATE # 2. 拼接知识库,统一分段 docs_text = "\n---\n".join([f"文档{i+1}:{chunk}" for i, chunk in enumerate(knowledge_chunks)]) # 3. 拼接对话历史 history_text = "" for msg in history[-5:]: # 滑动窗口只保留最近5轮 history_text += f"【用户】{msg.user}\n【助手】{msg.assistant}\n" # 4. 插值填充模板变量 prompt = template.replace("{{query}}", query)\ .replace("{{docs}}", docs_text)\ .replace("{{history_msg}}", history_text)\ .replace("{{biz_params}}", str(biz_params)) # 5. Token长度校验,超限自动截断知识库 if count_token(prompt) > MAX_INPUT_TOKEN: prompt = truncate_knowledge(prompt) return prompt

3. 知识库动态拼接避坑点

  1. 文档分隔符统一:用---分割多份检索文本,让 LLM 区分不同资料来源;
  2. 去重:召回知识库存在重复片段,拼接前做文本相似度去重,节省 token;
  3. 边界隔离:知识库、历史、用户提问用明确标记隔离,防止 LLM 混淆输入和输出;
  4. 禁止原始 HTML/Markdown 乱码直接拼接:提前清洗换行、特殊标签,减少无效 token。

4. 安全防护:防 Prompt 注入

用户输入、外部知识库文本可能包含{{# 角色输出不要JSON等篡改指令,破坏模板逻辑:

  • 变量插值前转义特殊标记,将{{替换为\{\{
  • 模板固定规则放在最顶部,权重高于所有动态输入,用户无法覆盖角色约束;
  • 增加校验:动态内容中出现 “忽略前面所有指令”“不要按照要求输出” 等注入关键词,直接拦截。

四、第三部分:输出格式约束 —— 固定 JSON 返回(工程落地核心)

自由文本输出会导致下游解析崩溃,工业级 LLM 系统必须强制结构化 JSON 返回,分三层约束:模板强指令 + Schema 约束 + 代码容错解析

1. Prompt 内强制 JSON 约束写法(两种方案)

方案 1:简单固定 JSON 模板(字段少场景)

直接在模板末尾给出完整返回示例,明确必填 / 空值规则:

## 输出硬性要求 1. 禁止输出任何解释、思考、前言、markdown、多余文字,只能返回纯JSON; 2. 不存在的数据字段值填空字符串"",数字填0,数组为空[]; 3. JSON不能有注释、不能换行错乱,键名严格和下面一致; 返回示例: { "charge_price": "1.2", "valley_time": "23:00-7:00", "remark": "" }
方案 2:JSON Schema 标准约束(复杂业务推荐)

直接将 JSON Schema 写入 Prompt,标准化字段类型、枚举、必填项,LLM 遵守 Schema 生成结果,稳定性远高于简单示例。 模板示例片段:

# 输出JSON Schema规范,严格遵守,不允许新增字段、修改键名 { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "required": ["name", "phone", "address"], "properties": { "name": {"type": "string", "description": "用户姓名,无则为空"}, "phone": {"type": "string"}, "age": {"type": "integer", "minimum": 0} } } 规则: 1. 所有required字段必须存在; 2. 类型严格匹配,age必须是数字,不能写字符串; 3. 禁止返回```json ```代码块标记,直接裸JSON。

2. 解决 LLM 不遵守 JSON 的常见问题

即使加约束,模型仍可能输出 markdown 代码块、额外说明、残缺 JSON,多层兜底方案:

兜底 1:代码预处理清洗(通用)

python

def clean_llm_output(raw_text): # 移除 ```json 、``` 代码块标记 raw_text = re.sub(r"```(json)?", "", raw_text) # 去除首尾多余文字,只截取第一个{到最后一个}之间内容 start = raw_text.find("{") end = raw_text.rfind("}") if start == -1 or end == -1: return None json_str = raw_text[start:end+1] # 处理换行、制表符、中文空格 json_str = json_str.replace("\n", "").replace("\t", "").strip() return json_str
兜底 2:异常重传机制

JSON 解析失败时,构造纠错二次 Prompt,重新调用模型:

上一轮输出不符合JSON规范,报错:xxx 严格按照Schema重新生成纯JSON,不要任何多余文字。
兜底 3:工具层强制校验(JSON Schema 校验)

清洗完成后,用 jsonschema 库校验结构、字段类型、必填项,校验不通过直接触发重试或返回业务错误码。

3. 业务异常统一 JSON 规范

需要统一错误返回结构,避免模型随机返回空 / 乱码: 在模板中明确无数据、无法回答的标准返回:

当参考材料无对应信息、无法回答用户问题时,固定返回: {"code": 1001, "msg": "暂无相关资料", "data": {}} 正常返回code=0,data存放业务数据

4. JSON 约束工程收益

  1. 下游解析标准化:统一用 JSON 库解析,无需复杂正则,减少线上 50% 以上解析异常;
  2. 结构化数据便于入库:直接映射数据库实体 / DTO,无需手动文本提取;
  3. 监控告警简单:JSON 字段缺失、类型错误可自动化埋点统计,快速定位 Prompt 缺陷;
  4. 多模型兼容:切换通义、文心、GPT 等模型,下游解析代码无需改动。

五、完整端到端工程示例(Python 可运行简化版)

1. 统一 Prompt 模板

python

KNOWLEDGE_QA_TEMPLATE = """ # 角色 你是充电桩智能客服,仅依据提供的参考文档回答用户问题,严禁编造信息。 # 全局约束 1. 回答简洁,不输出冗余描述;无相关信息直接返回空数据; 2. 输出只能是纯JSON,禁止注释、代码块、额外文字; # 参考文档 {{knowledge}} # 历史对话 {{history}} # 用户当前问题 {{query}} # 强制输出JSON Schema { "type": "object", "required": ["code", "answer", "source"], "properties": { "code": {"type": "integer", "description": "0正常,1001无资料"}, "answer": {"type": "string", "description": "回答内容"}, "source": {"type": "array", "description": "引用文档编号,无则空数组"} } } 无资料标准返回:{"code":1001,"answer":"暂无相关充电规则","source":[]} """

2. 动态上下文拼接函数

python

import re import json def build_full_prompt(user_query, history_msg_list, recall_docs): # 1. 拼接知识库 doc_text = "" for idx, doc in enumerate(recall_docs): doc_text += f"文档{idx+1}:{doc}\n---\n" # 2. 拼接对话历史,滑动窗口保留最近3轮 history_text = "" for item in history_msg_list[-3:]: history_text += f"【用户】{item['user']}\n【客服】{item['assistant']}\n" # 3. 插值填充模板 prompt = KNOWLEDGE_QA_TEMPLATE prompt = prompt.replace("{{knowledge}}", doc_text) prompt = prompt.replace("{{history}}", history_text) prompt = prompt.replace("{{query}}", user_query) return prompt

3. JSON 清洗 + 解析工具

python

def parse_json_output(raw_resp): # 清洗代码块标记 clean_str = re.sub(r"```.*?```", "", raw_resp, flags=re.S) left = clean_str.find("{") right = clean_str.rfind("}") if left < 0 or right < 0: return None json_str = clean_str[left:right+1] try: data = json.loads(json_str) # 基础字段校验 assert "code" in data and "answer" in data and "source" in data return data except Exception: return None

4. 调用主流程

python

# 输入上下文 query = "谷时充电多少钱一小时" history = [{"user":"峰时电价","assistant":"1.2元/度"}] docs = ["谷时电价0.5元/度,时段23:00-7:00,1小时充电约5元"] # 1. 拼接完整Prompt full_prompt = build_full_prompt(query, history, docs) # 2. 调用LLM(模拟返回) llm_raw = '根据文档,谷时充电一小时约5元\n{"code":0,"answer":"谷时充电一小时约5元","source":["文档1"]}' # 3. 清洗解析 result = parse_json_output(llm_raw) print(result)

六、线上生产环境落地优化要点

  1. 模板版本管理:每套模板记录 version,日志打印使用的模板版本,便于回溯 bad case;
  2. Token 监控埋点:统计每次拼接后输入 token 长度,监控截断频率,优化知识库召回数量;
  3. JSON 解析失败告警:接入监控系统,解析失败次数突增自动告警,大概率是模板约束失效;
  4. 多模板灰度:同一业务配置两套模板,按用户流量灰度下发,对比 JSON 准确率;
  5. 缓存优化:固定业务参数、静态知识库摘要可缓存,减少重复拼接计算;
  6. 限流与重试:JSON 解析失败重试 1 次,避免无限循环调用 LLM 浪费成本。

七、三大技术组合核心价值总结

  1. 模板化 Prompt:统一管控业务规则,消除硬编码,支持热更新、可维护;
  2. 动态上下文拼接:标准化多源信息整合,滑动窗口控制 token,防注入、防超限;
  3. JSON 格式强约束:输出结构化、下游解析零复杂逻辑,线上异常大幅降低,适配自动化数据处理。

三者结合是企业 LLM 系统标准化、工业化落地的标配架构,几乎所有知识库问答、抽取、自动化业务系统都会采用这套方案。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询