第7周 提示词工程(政务合规+产业场景)详细学习指南
一、知识点讲解
知识点1:提示词工程核心原则(政务合规导向)
1.1 作用说明
政务场景下的提示词工程核心是在保证AI生成内容精准性、实用性的同时,严格遵循数据合规要求,过滤敏感信息、规避涉密风险,确保输出内容符合政务公文规范,同时提升文本处理效率与准确率。
1.2 核心参数详解(以主流大模型API为例,如通义千问、文心一言)
| 参数 | 说明 | 常用可选择值及说明 | 传参示例 |
|---|---|---|---|
| temperature | 控制生成内容的随机性,值越低越严谨、越贴合事实,适合政务文本 | 0.1-0.3(政务场景推荐):严谨规范,低幻觉;0.4-0.6:平衡灵活与严谨;0.7以上:随机性强,不适合政务 | temperature=0.2 |
| top_p | 通过累积概率控制生成内容的多样性,与temperature互补,政务场景需精准性 | 0.7-0.8(政务场景推荐):聚焦核心信息;0.9以上:多样性提升,易出现偏差 | top_p=0.75 |
| stop | 设置停止符,用于终止生成冗余内容,适配政务公文固定格式 | 可自定义字符串,如“(全文完)”“抄送:”等公文常用结尾 | stop=["(全文完)"] |
| output_format | 指定输出格式,便于后续文本分类、解析,提升处理效率 | json(推荐,便于结构化解析)、text(纯文本)、markdown | output_format="json" |
| sensitive_filter | 开启敏感信息过滤,政务场景必选,规避涉密、隐私风险 | true(开启,默认推荐)、false(关闭,禁止在政务场景使用) | sensitive_filter=true |
1.3 典型用法示例(政务文本分类提示词)
提示词模板:
"请你作为政务文本分类助手,严格遵循以下要求:
1. 对提供的政务公文进行分类,类别包括:通知、通告、决定、批复、请示、报告、函、意见。
2. 分类过程中严格过滤敏感信息(含涉密数据、个人隐私、未公开事项),对敏感内容标注[已脱敏]。
3. 输出格式为JSON,包含字段:文档名称、分类结果、脱敏说明、分类依据。
4. 保持分类准确率≥95%,避免幻觉内容。
待分类文本:{公文内容}
输出结果:"1.4 常见陷阱提醒
- 陷阱1:temperature值过高导致分类偏差,政务场景需控制在0.3以下,避免AI主观臆断分类结果。
- 陷阱2:未明确脱敏范围,仅依赖模型自带过滤,需手动补充政务敏感信息清单(如涉密单位名称、未公开数据)。
- 陷阱3:输出格式不统一,后续难以批量解析,需强制指定JSON格式,明确字段含义。
知识点2:政务场景提示词模板设计(含敏感信息过滤)
2.1 作用说明
针对济南政务公文场景设计标准化提示词模板,实现敏感信息自动过滤、文本结构化解析、内容优化等功能,提升政务文本处理的规范性与效率,同时满足合规要求。
2.2 核心参数详解(模板内置关键要素)
| 参数(模板要素) | 说明 | 常用可选择值及说明 | 传参示例(模板占位符) |
|---|---|---|---|
| scene_type | 指定政务场景类型,适配不同公文处理需求 | 文本分类、公文改写、信息提取、合规审核 | scene_type="文本分类" |
| sensitive_type | 明确需过滤的敏感信息类型,精准脱敏 | 涉密数据、个人隐私、未公开事项、敏感称谓 | sensitive_type=["涉密数据","个人隐私"] |
| accuracy_requirement | 设定准确率阈值,约束AI输出质量 | ≥95%(政务文本分类推荐)、≥90%(信息提取推荐) | accuracy_requirement="≥95%" |
| illusion_reduction | 设定幻觉率降低目标,提升内容真实性 | 降低50%以上(推荐)、降低30%-50%(基础要求) | illusion_reduction="降低50%以上" |
2.3 典型用法示例(3个场景化模板)
模板1:政务公文分类+敏感信息过滤模板
"""
场景:济南政务公文批量分类,需脱敏处理
提示词模板:
请你作为济南政务文本处理助手,严格遵守政务合规要求,完成以下任务:
1. 任务:对提供的济南政务公文进行分类,同时过滤敏感信息。
2. 分类类别:通知、通告、决定、批复、请示、报告、函、意见。
3. 敏感信息过滤范围:
- 涉密数据:标注[涉密已脱敏];
- 个人隐私(姓名、联系方式、身份证号):标注[隐私已脱敏];
- 未公开事项:标注[未公开已脱敏]。
4. 输出要求:
- 格式:JSON,字段包括:文档ID、分类结果、脱敏位置及说明、分类依据、是否合规(合规/不合规);
- 准确率:分类准确率≥95%,无幻觉分类;
- 幻觉控制:基于公文原文分类,幻觉率较优化前降低50%以上。
待处理公文:{document_content}
文档ID:{document_id}
输出结果:
"""模板2:济南政务公文信息提取模板
"""
场景:从济南政务公文中提取核心信息,用于归档统计
提示词模板:
请你作为济南政务信息提取助手,遵循以下规则完成信息提取:
1. 提取内容:发文单位、发文日期、主送单位、核心事项、实施要求、联系方式(联系方式需脱敏处理)。
2. 敏感处理:联系方式仅保留单位座机前3位+[已脱敏],无单位座机则标注“无公开联系方式”。
3. 输出要求:
- 格式:结构化文本(分点列出,清晰明了);
- 准确性:提取信息与原文一致,无遗漏、无添加,幻觉率降低50%以上;
- 合规性:不泄露任何未公开信息,提取内容可直接用于政务归档。
待提取公文:{document_content}
输出结果:
"""模板3:政务提示词优化模板(对比效果用)
"""
场景:优化已有的政务提示词,提升准确率、降低幻觉率、强化脱敏效果
提示词模板:
请你作为提示词优化专家,针对济南政务场景,优化以下原始提示词,满足以下要求:
1. 优化目标:
- 分类/提取准确率提升至≥95%;
- 幻觉率较原始提示词降低50%以上;
- 强化敏感信息过滤,补充济南政务专属敏感项(如区县涉密单位名称)。
2. 输出要求:
- 分三部分呈现:原始提示词、优化后提示词、优化说明(含参数调整、话术优化、脱敏强化点);
- 优化说明需明确每处修改对应的效果提升逻辑;
- 适配济南政务公文风格,语言严谨、规范。
原始提示词:{original_prompt}
待测试公文(用于效果对比):{test_document}
输出结果:
"""2.4 常见陷阱提醒
- 陷阱1:模板未适配地域特性,济南政务有专属区县划分、单位名称,需补充本地敏感信息清单,避免脱敏不彻底。
- 陷阱2:仅追求脱敏效果忽略公文核心信息,导致提取内容不完整,需平衡脱敏与信息有效性。
- 陷阱3:优化提示词时过度堆砌规则,导致模型理解偏差,需精简话术,突出核心要求。
知识点3:提示词优化方法(政务场景适配)
3.1 作用说明
针对政务场景提示词进行迭代优化,通过调整话术、参数、规则约束等方式,提升文本处理准确率、降低AI幻觉率,同时强化敏感信息过滤效果,满足“准确率≥95%、幻觉率降低50%以上”的目标。
3.2 核心参数详解(优化关联参数)
| 参数 | 说明 | 常用可选择值及说明 | 优化前后对比示例 |
|---|---|---|---|
| temperature | 优化核心参数,降低随机性以减少幻觉 | 优化前:0.5;优化后:0.2(政务场景最优) | 优化前:幻觉率30%;优化后:幻觉率12%(降低60%) |
| max_tokens | 控制输出长度,避免冗余内容,聚焦核心信息 | 优化前:无限制;优化后:500(根据政务公文长度调整) | 优化前:输出冗余说明;优化后:仅保留结构化核心内容 |
| system_prompt | 系统提示词,强化模型角色定位,约束行为 | 优化前:无明确角色;优化后:“你是专业济南政务文本处理助手,严格遵循《政务信息公开条例》” | 优化前:分类偏差率6%;优化后:偏差率3%(准确率97%) |
3.3 典型用法示例(提示词优化对比)
"""
原始提示词:
“对下面的公文进行分类,过滤敏感信息,输出结果。
公文内容:{content}”
优化后提示词:
“请你作为专业济南政务文本分类助手,严格遵循《政务信息公开条例》及济南政务合规要求,完成以下任务:
1. 分类任务:将公文归入以下类别之一:通知、通告、决定、批复、请示、报告、函、意见,分类准确率≥95%。
2. 脱敏要求:过滤涉密数据、个人隐私、济南区县未公开事项,敏感内容标注对应脱敏标识,确保无涉密信息流出。
3. 输出规范:JSON格式,含文档名称、分类结果、脱敏说明、分类依据,幻觉率较原始提示词降低50%以上。
4. 约束条件:仅基于原文内容分类,不添加主观臆断信息,拒绝生成与公文无关内容。
公文内容:{content}
输出结果:”
优化说明:
1. 增加角色定位与合规依据,强化模型约束;
2. 明确分类类别、准确率、幻觉率目标,量化要求;
3. 细化脱敏范围,适配济南本地政务特性;
4. 指定输出格式,提升实用性。
"""3.4 常见陷阱提醒
- 陷阱1:优化仅调整话术未修改参数,幻觉率降低不明显,需同步下调temperature值(≤0.3)。
- 陷阱2:优化后提示词规则冲突(如同时要求“详细说明”与“精简输出”),导致模型输出混乱,需梳理规则逻辑,避免矛盾。
- 陷阱3:未通过实际公文测试优化效果,需用济南政务公文样本验证,确保准确率与幻觉率达标。
二、实战场景
实战主题:济南政务公文分类+敏感信息过滤(含提示词优化对比)
实战目标
- 解析济南政务公文,实现文本分类,准确率≥95%;2. 过滤敏感信息,确保无涉密内容;3. 优化提示词,对比优化前后幻觉率、准确率差异,实现幻觉率降低50%以上。
实战代码(基于通义千问API,适配济南政务场景)
实战代码(适配文心一言/GPT,FastAPI封装版,适配济南政务场景)
import json
import requests
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional, Dict, Any
# 初始化FastAPI应用
app = FastAPI(title="济南政务公文处理API", description="基于FastAPI封装,适配文心一言/GPT,实现公文分类、脱敏及提示词优化对比", version="1.0")
# 配置大模型密钥(替换为个人实际密钥)
MODEL_CONFIG = {
"ernie": { # 文心一言
"api_key": "your_ernie_api_key",
"secret_key": "your_ernie_secret_key",
"api_url": "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro"
},
"gpt": { # GPT
"api_key": "your_gpt_api_key",
"api_url": "https://api.openai.com/v1/chat/completions"
}
}
# Pydantic模型定义(请求体校验)
class DocumentRequest(BaseModel):
model_type: str # 模型类型:ernie/gpt
document_content: str # 待处理公文内容
doc_id: Optional[str] = None # 公文ID,可选
# 1. 读取济南政务公文样本(模拟从济南市政府官网获取,已做初步处理)
def get_jinan_government_document() -> str:
"""获取济南政务公文样本,模拟真实场景"""
document = """
济南市人民政府办公厅关于印发济南市2026年政务公开工作要点的通知
济政办发〔2026〕XX号
各区县人民政府,市政府各部门、各直属机构:
为深入贯彻落实《中华人民共和国政府信息公开条例》,全面提升我市政务公开工作水平,结合我市实际,制定本工作要点。现印发给你们,请认真贯彻执行。
一、总体要求
以习近平新时代中国特色社会主义思想为指导,坚持以人民为中心的发展思想,聚焦群众需求,强化政务公开规范化、标准化建设,为济南高质量发展提供有力支撑。
二、重点任务
(一)推进重点领域信息公开。主动公开国民经济和社会发展规划、财政预决算、重大项目批准和实施、公共资源配置等信息。各区县政府需于2026年6月30日前报送本地区重点领域公开清单(联系人:张XX,联系电话:0531-XXXXXXX)。
(二)强化政策解读回应。围绕市政府重大决策部署,开展多角度、深层次政策解读,及时回应社会关切。
(三)提升公开平台建设水平。优化济南市人民政府官网公开专栏,完善信息检索功能。
三、工作要求
(一)加强组织领导。各单位要高度重视政务公开工作,明确责任分工,细化工作措施。
(二)强化监督考核。将政务公开工作纳入年度绩效考核,对工作不力的单位进行通报批评。
济南市人民政府办公厅
2026年1月10日
"""
return document
# 2. 定义原始提示词与优化后提示词
original_prompt = """
对下面的济南政务公文进行分类,过滤敏感信息,输出结果。
公文内容:{content}
"""
optimized_prompt = """
请你作为专业济南政务文本分类助手,严格遵循《政务信息公开条例》及济南政务合规要求,完成以下任务:
1. 分类任务:将公文归入以下类别之一:通知、通告、决定、批复、请示、报告、函、意见,分类准确率≥95%。
2. 脱敏要求:
- 个人信息(姓名、联系方式):姓名标注[隐私已脱敏],联系电话保留区号+[已脱敏];
- 涉密数据、未公开事项:标注[涉密/未公开已脱敏];
- 确保脱敏后无任何涉密信息流出。
3. 输出规范:
- 格式:JSON,包含字段:document_name(文档名称)、classification(分类结果)、desensitization_info(脱敏信息及说明)、classification_basis(分类依据)、illusion_evaluation(幻觉评估,是否存在幻觉内容);
- 幻觉控制:仅基于原文内容输出,无主观添加信息,幻觉率较原始提示词降低50%以上。
公文内容:{content}
输出结果:
"""
# 3. 调用大模型API(适配文心一言/GPT)
def call_llm_api(model_type: str, prompt: str, content: str) -> Optional[Dict[str, Any]]:
"""
调用大模型API处理政务公文,适配文心一言与GPT
:param model_type: 模型类型(ernie/gpt)
:param prompt: 提示词模板
:param content: 待处理公文内容
:return: 模型输出结果(JSON格式解析后)
"""
if model_type not in MODEL_CONFIG:
raise ValueError(f"不支持的模型类型:{model_type},仅支持ernie(文心一言)、gpt")
# 填充提示词内容
final_prompt = prompt.format(content=content)
config = MODEL_CONFIG[model_type]
try:
if model_type == "ernie": # 文心一言调用逻辑
# 先获取access_token
token_url = f"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={config['api_key']}&client_secret={config['secret_key']}"
token_response = requests.post(token_url)
token_response.raise_for_status()
access_token = token_response.json()["access_token"]
# 调用文心一言聊天接口
headers = {"Content-Type": "application/json"}
payload = {
"messages": [{"role": "user", "content": final_prompt}],
"temperature": 0.2,
"top_p": 0.75,
"max_tokens": 1024,
"stream": False
}
api_url = f"{config['api_url']}?access_token={access_token}"
response = requests.post(api_url, headers=headers, json=payload)
else: # GPT调用逻辑
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {config['api_key']}"
}
payload = {
"model": "gpt-3.5-turbo", # 可替换为gpt-4
"messages": [{"role": "user", "content": final_prompt}],
"temperature": 0.2,
"top_p": 0.75,
"max_tokens": 1024
}
response = requests.post(config["api_url"], headers=headers, json=payload)
response.raise_for_status()
result = response.json()
# 提取模型输出内容(文心一言与GPT返回格式差异处理)
if model_type == "ernie":
output_content = result["result"]
else:
output_content = result["choices"][0]["message"]["content"]
# 解析JSON格式(处理可能的格式异常)
return json.loads(output_content.strip())
except Exception as e:
print(f"API调用失败:{str(e)}")
raise HTTPException(status_code=500, detail=f"模型调用失败:{str(e)}")
# 4. 对比优化前后效果
def compare_optimization_effects(original_result: Dict[str, Any], optimized_result: Dict[str, Any], original_content: str) -> Dict[str, Any]:
"""
对比原始提示词与优化后提示词的处理效果
:param original_result: 原始提示词处理结果
:param optimized_result: 优化后提示词处理结果
:param original_content: 原始公文内容
:return: 效果对比报告
"""
# 模拟幻觉率计算(基于输出内容与原文一致性评估)
def calculate_illusion_rate(result: Dict[str, Any], content: str) -> float:
"""计算幻觉率(简单评估:输出中与原文无关内容占比)"""
result_str = json.dumps(result)
# 提取原文核心关键词
original_keywords = ["济南市", "政务公开", "工作要点", "通知", "各区县政府"]
# 统计输出中无关内容数量(简化逻辑,实际可优化)
irrelevant_count = 0
if "幻觉评估" in result and result["幻觉评估"] == "存在幻觉内容":
irrelevant_count += 1
# 简单计算幻觉率(示例逻辑,实际需更精准评估)
return irrelevant_count / len(original_keywords) * 100
# 计算幻觉率
original_illusion_rate = calculate_illusion_rate(original_result, original_content)
optimized_illusion_rate = calculate_illusion_rate(optimized_result, original_content)
# 准确率评估(基于分类结果是否正确)
correct_classification = "通知"
original_accuracy = 100 if original_result["classification"] == correct_classification else 80
optimized_accuracy = 100 if optimized_result["classification"] == correct_classification else 80
# 生成对比报告
return {
"幻觉率对比": f"原始提示词:{original_illusion_rate:.1f}%,优化后:{optimized_illusion_rate:.1f}%,降低比例:{((original_illusion_rate - optimized_illusion_rate)/original_illusion_rate*100):.1f}%",
"准确率对比": f"原始提示词:{original_accuracy}%,优化后:{optimized_accuracy}%",
"脱敏效果对比": {
"原始提示词": "脱敏不彻底,可能保留个人完整信息",
"优化后提示词": "精准脱敏,个人信息、联系方式均按规则处理,无涉密信息"
},
"输出规范性对比": {
"原始提示词": "格式混乱,无固定字段",
"优化后提示词": "JSON结构化输出,字段完整,便于后续处理"
}
}
# 5. FastAPI接口:单篇公文处理(含提示词优化对比)
@app.post("/process_document", summary="单篇济南政务公文处理(分类+脱敏+优化对比)")
async def process_document(req: DocumentRequest) -> Dict[str, Any]:
"""
处理单篇济南政务公文,返回原始提示词与优化后提示词的处理结果及对比报告
- **model_type**: 模型类型,可选值为ernie(文心一言)、gpt
- **document_content**: 待处理的政务公文内容
- **doc_id**: 公文ID(可选)
"""
# 若未传入公文内容,使用默认样本
content = req.document_content if req.document_content.strip() else get_jinan_government_document()
# 调用模型处理(原始提示词+优化后提示词)
original_result = call_llm_api(req.model_type, original_prompt, content)
optimized_result = call_llm_api(req.model_type, optimized_prompt, content)
# 生成对比报告
comparison_report = compare_optimization_effects(original_result, optimized_result, content)
return {
"doc_id": req.doc_id or "JNZW_SAMPLE_001",
"original_prompt_result": original_result,
"optimized_prompt_result": optimized_result,
"optimization_comparison": comparison_report
}
# 6. 运行FastAPI服务(本地调试用)
if __name__ == "__main__":
import uvicorn
# 本地运行:http://127.0.0.1:8000/docs 可查看接口文档并调试
uvicorn.run(app="__main__:app", host="0.0.0.0", port=8000, reload=True)
实战技巧与参数总结
- 参数技巧:政务场景下,temperature固定为0.1-0.2,top_p为0.7-0.8,确保输出严谨;开启sensitive_filter=True,叠加手动脱敏规则,双重保障合规。
- 提示词设计技巧:明确角色定位(如“济南政务文本处理助手”)、量化指标(准确率≥95%)、细化脱敏规则,避免模型模糊处理。
- 格式规范技巧:强制指定JSON输出格式,明确字段含义,便于后续批量解析、归档,提升政务文本处理效率。
- 幻觉控制技巧:通过“仅基于原文输出”“禁止主观添加信息”等规则约束,结合低temperature值,实现幻觉率降低目标。
- 本地场景适配技巧:针对济南政务,补充区县划分、本地敏感信息清单,让脱敏与分类更贴合本地业务需求。
三、练习题
练习题1:济南政务公文信息提取(含脱敏)
题目场景
从济南市政府官网获取一份“批复”类公文,提取发文单位、发文日期、主送单位、核心批复事项、执行期限,同时对公文内的个人联系方式、未公开事项进行脱敏处理,输出结构化JSON结果,确保提取准确率≥95%,无幻觉内容。
实现思路
- 设计信息提取提示词模板,明确提取字段、脱敏规则、输出格式;
- 模拟获取济南政务批复类公文内容,作为输入;
- 调用大模型API,设置合适参数(temperature=0.2,开启敏感过滤);
- 解析模型输出,验证提取内容准确性与脱敏效果。
实现代码
练习题2:政务提示词优化(幻觉率降低目标)
题目场景
import json
import requests
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional, Dict, Any
# 初始化FastAPI应用
app = FastAPI(title="济南政务公文信息提取API", description="基于FastAPI封装,适配文心一言/GPT,实现公文信息提取与脱敏", version="1.0")
# 配置大模型密钥(替换为个人实际密钥)
MODEL_CONFIG = {
"ernie": { # 文心一言
"api_key": "your_ernie_api_key",
"secret_key": "your_ernie_secret_key",
"api_url": "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro"
},
"gpt": { # GPT
"api_key": "your_gpt_api_key",
"api_url": "https://api.openai.com/v1/chat/completions"
}
}
# Pydantic模型定义(请求体校验)
class ExtractRequest(BaseModel):
model_type: str # 模型类型:ernie/gpt
document_content: Optional[str] = None # 待提取公文内容,可选(默认使用样本)
# 模拟济南政务批复类公文
def get_approval_document() -> str:
document = """
济南市人民政府关于同意济南市历城区2026年城市更新项目实施方案的批复
济政复〔2026〕XX号
历城区人民政府:
你区《关于报请审批济南市历城区2026年城市更新项目实施方案的请示》(历城政请〔2026〕XX号)收悉。经研究,现批复如下:
一、同意你区制定的《济南市历城区2026年城市更新项目实施方案》(以下简称《方案》)。
二、《方案》实施范围为历城区洪家楼街道、唐冶街道部分区域,总投资约50亿元,涉及征收户数800户,具体范围以规划红线为准。
三、请你区严格按照《方案》推进项目实施,加强资金管理,严控工程质量,确保项目于2028年12月31日前竣工。
四、项目实施过程中,要做好群众工作,及时回应社会关切,重大问题及时向市政府报告。
联系人:李XX,联系电话:0531-XXXXXXX;市住建局联系人:王XX,联系电话:0531-XXXXXXX。
济南市人民政府
2026年1月15日
"""
return document
# 信息提取提示词模板
extract_prompt = """
请你作为济南政务信息提取助手,完成以下任务:
1. 提取字段:发文单位、发文日期、主送单位、核心批复事项、执行期限;
2. 脱敏规则:
- 个人姓名标注[隐私已脱敏],联系电话保留区号+[已脱敏];
- 未公开事项(如具体文号、未公示投资细节)标注[未公开已脱敏];
3. 输出要求:
- 格式:JSON,字段清晰,无冗余内容;
- 准确率≥95%,仅基于原文提取,无幻觉内容;
- 脱敏后无涉密、隐私信息泄露。
公文内容:{content}
输出结果:
"""
# 调用大模型API(适配文心一言/GPT)
def call_llm_api(model_type: str, prompt: str, content: str) -> Dict[str, Any]:
"""适配文心一言与GPT的API调用逻辑"""
if model_type not in MODEL_CONFIG:
raise HTTPException(status_code=400, detail="不支持的模型类型,仅支持ernie(文心一言)、gpt")
final_prompt = prompt.format(content=content)
config = MODEL_CONFIG[model_type]
try:
if model_type == "ernie": # 文心一言调用
# 获取access_token
token_url = f"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={config['api_key']}&client_secret={config['secret_key']}"
token_res = requests.post(token_url)
token_res.raise_for_status()
access_token = token_res.json()["access_token"]
headers = {"Content-Type": "application/json"}
payload = {
"messages": [{"role": "user", "content": final_prompt}],
"temperature": 0.2,
"top_p": 0.75,
"max_tokens": 512,
"stream": False
}
api_url = f"{config['api_url']}?access_token={access_token}"
response = requests.post(api_url, headers=headers, json=payload)
output_content = response.json()["result"]
else: # GPT调用
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {config['api_key']}"
}
payload = {
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": final_prompt}],
"temperature": 0.2,
"top_p": 0.75,
"max_tokens": 512
}
response = requests.post(config["api_url"], headers=headers, json=payload)
output_content = response.json()["choices"][0]["message"]["content"]
return json.loads(output_content.strip())
except Exception as e:
raise HTTPException(status_code=500, detail=f"模型调用失败:{str(e)}")
# FastAPI接口:政务公文信息提取与脱敏
@app.post("/extract_government_info", summary="济南政务公文信息提取(含脱敏)")
async def extract_government_info(req: ExtractRequest) -> Dict[str, Any]:
"""
提取济南政务批复类公文核心信息并脱敏
- **model_type**: 模型类型,可选ernie(文心一言)、gpt
- **document_content**: 待提取公文内容(可选,默认使用历城区城市更新项目批复样本)
"""
# 选择公文内容(传入内容优先,否则用样本)
content = req.document_content if req.document_content and req.document_content.strip() else get_approval_document()
# 调用模型提取信息
extract_result = call_llm_api(req.model_type, extract_prompt, content)
return {
"status": "success",
"document_sample": "自定义内容" if req.document_content else "历城区2026年城市更新项目批复",
"extract_result": extract_result
}
# 本地运行调试
if __name__ == "__main__":
import uvicorn
uvicorn.run(app="__main__:app", host="127.0.0.1", port=8001, reload=True)
实现代码(FastAPI+文心一言/GPT适配版)
现有一份针对济南政务“通告”类公文的提示词,用于公文改写(适配公开发布场景),但存在幻觉率高(约40%)、改写后偏离原文核心意思、未做脱敏处理等问题。请优化该提示词,使改写后幻觉率降低至20%以下,保留原文核心信息,完成敏感信息脱敏,同时符合政务通告规范。
实现思路
- 分析原始提示词缺陷:无角色约束、无幻觉控制规则、无脱敏要求、无改写规范;
- 优化方向:补充角色定位、明确幻觉控制目标、添加脱敏规则、限定改写范围(保留核心信息);
- 用济南政务通告样本测试优化前后效果,验证幻觉率、脱敏效果、改写准确性。
实现代码
练习题3:批量政务公文分类(适配济南本地场景)
题目场景
import json
import requests
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional, Dict, Any
# 初始化FastAPI应用
app = FastAPI(title="政务提示词优化API", description="基于FastAPI封装,适配文心一言/GPT,实现提示词优化与幻觉率控制", version="1.0")
# 配置大模型密钥(替换为个人实际密钥)
MODEL_CONFIG = {
"ernie": { # 文心一言
"api_key": "your_ernie_api_key",
"secret_key": "your_ernie_secret_key",
"api_url": "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro"
},
"gpt": { # GPT
"api_key": "your_gpt_api_key",
"api_url": "https://api.openai.com/v1/chat/completions"
}
}
# Pydantic模型定义(请求体校验)
class RewriteOptRequest(BaseModel):
model_type: str # 模型类型:ernie/gpt
original_prompt: Optional[str] = None # 原始提示词(可选,默认使用缺陷提示词)
document_content: Optional[str] = None # 待改写公文(可选,默认使用大气污染防治通告样本)
# 原始提示词(存在缺陷)
default_original_prompt = """
改写下面的政务通告,让内容更通顺,适合公开发布。
公文内容:{content}
"""
# 优化后提示词
optimized_rewrite_prompt = """
请你作为济南政务通告改写助手,严格遵循以下要求改写公文:
1. 改写目标:
- 语言通顺、规范,符合政务通告公开发布要求;
- 保留原文核心信息(发布目的、实施范围、要求、期限),无核心内容遗漏;
- 幻觉率≤20%,仅基于原文改写,不添加主观信息、不扩展未提及内容。
2. 脱敏要求:
- 敏感信息(含个人隐私、涉密数据、未公开事项)全部脱敏,标注对应标识;
- 确保改写后内容可直接公开,无合规风险。
3. 输出要求:
- 分两部分输出:改写后通告内容、优化说明(含幻觉控制措施、脱敏处理细节);
- 改写后内容格式与原文一致,保持政务公文严谨风格。
公文内容:{content}
输出结果:
"""
# 模拟济南政务通告样本
def get_notice_document() -> str:
document = """
济南市人民政府关于加强济南市历下区冬季大气污染防治工作的通告
济政通〔2026〕XX号
各相关单位、广大市民:
为有效应对冬季大气污染,改善空气质量,保障群众身体健康,根据《中华人民共和国大气污染防治法》,现就加强历下区冬季大气污染防治工作有关事项通告如下:
一、管控时间:2026年1月20日至2026年3月15日。
二、管控范围:历下区全域,重点管控区域为泉城广场周边、大明湖周边及主要交通干道两侧。
三、管控要求:
(一)禁止露天焚烧秸秆、落叶、垃圾等杂物;
(二)施工工地暂停土方作业,确需作业的需报备市生态环境局(联系人:赵XX,电话:0531-XXXXXXX);
(三)机动车限行政策按市公安局交通管理支队相关规定执行。
四、违反本通告规定的,由相关部门依法予以处罚。
济南市人民政府
2026年1月12日
"""
return document
# 调用大模型API(适配文心一言/GPT)
def call_llm_api(model_type: str, prompt: str, content: str) -> str:
"""适配双模型的API调用,返回原始文本结果"""
if model_type not in MODEL_CONFIG:
raise HTTPException(status_code=400, detail="不支持的模型类型,仅支持ernie(文心一言)、gpt")
final_prompt = prompt.format(content=content)
config = MODEL_CONFIG[model_type]
try:
if model_type == "ernie":
# 获取access_token
token_url = f"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={config['api_key']}&client_secret={config['secret_key']}"
token_res = requests.post(token_url)
token_res.raise_for_status()
access_token = token_res.json()["access_token"]
headers = {"Content-Type": "application/json"}
payload = {
"messages": [{"role": "user", "content": final_prompt}],
"temperature": 0.25,
"top_p": 0.8,
"max_tokens": 1024,
"stream": False
}
api_url = f"{config['api_url']}?access_token={access_token}"
response = requests.post(api_url, headers=headers, json=payload)
return response.json()["result"]
else:
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {config['api_key']}"
}
payload = {
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": final_prompt}],
"temperature": 0.25,
"top_p": 0.8,
"max_tokens": 1024
}
response = requests.post(config["api_url"], headers=headers, json=payload)
return response.json()["choices"][0]["message"]["content"]
except Exception as e:
raise HTTPException(status_code=500, detail=f"模型调用失败:{str(e)}")
# 幻觉率评估函数
def evaluate_illusion(result: str, original_content: str) -> float:
"""简化幻觉率评估:统计与原文核心关键词无关的有效行数占比"""
original_keywords = ["历下区", "冬季大气污染防治", "2026年1月20日至3月15日", "露天焚烧", "施工工地"]
illusion_count = 0
result_lines = [line.strip() for line in result.split("\n") if line.strip()]
for line in result_lines:
if not any(keyword in line for keyword in original_keywords):
illusion_count += 1
return (illusion_count / len(result_lines)) * 100 if result_lines else 0.0
# FastAPI接口:提示词优化与改写效果对比
@app.post("/optimize_rewrite_prompt", summary="政务提示词优化+通告改写效果对比")
async def optimize_rewrite_prompt(req: RewriteOptRequest) -> Dict[str, Any]:
"""
优化政务通告改写提示词,对比优化前后效果(幻觉率、脱敏、准确性)
- **model_type**: 模型类型,可选ernie(文心一言)、gpt
- **original_prompt**: 原始缺陷提示词(可选,默认使用预设缺陷提示词)
- **document_content**: 待改写公文(可选,默认使用历下区大气污染防治通告样本)
"""
# 初始化参数
original_prompt = req.original_prompt.strip() if req.original_prompt else default_original_prompt
content = req.document_content.strip() if req.document_content else get_notice_document()
# 调用模型获取改写结果
original_result = call_llm_api(req.model_type, original_prompt, content)
optimized_result = call_llm_api(req.model_type, optimized_rewrite_prompt, content)
# 评估幻觉率
original_illusion = evaluate_illusion(original_result, content)
optimized_illusion = evaluate_illusion(optimized_result, content)
reduction_rate = ((original_illusion - optimized_illusion) / original_illusion) * 100 if original_illusion != 0 else 0.0
# 整理结果
return {
"status": "success",
"prompt_info": {
"original_prompt": original_prompt,
"optimized_prompt": optimized_rewrite_prompt
},
"rewrite_results": {
"original_prompt_result": original_result,
"optimized_prompt_result": optimized_result
},
"illusion_evaluation": {
"original_illusion_rate": f"{original_illusion:.1f}%",
"optimized_illusion_rate": f"{optimized_illusion:.1f}%",
"reduction_rate": f"{reduction_rate:.1f}%",
"is_target_achieved": "是" if optimized_illusion ≤ 20 else "否" # 目标幻觉率≤20%
}
}
# 本地运行调试
if __name__ == "__main__":
import uvicorn
uvicorn.run(app="__main__:app", host="127.0.0.1", port=8002, reload=True)
实现代码(FastAPI+文心一言/GPT适配版)
批量获取5份济南政务公文(涵盖通知、通告、批复、报告、函5类),使用设计的提示词模板实现批量分类,过滤敏感信息,统计分类准确率,确保整体准确率≥95%,批量处理后输出结构化统计报告。
实现思路
- 构建批量公文列表,包含5类济南政务公文样本;
- 调用之前设计的政务公文分类+脱敏模板,批量处理每份公文;
- 验证分类结果准确性,统计整体准确率;
- 生成批量处理统计报告,包含每份公文处理结果、准确率、脱敏情况汇总。
实现代码
实现代码(FastAPI+文心一言/GPT适配版,批量处理)
import json
import requests
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Dict, Any, Optional
# 初始化FastAPI应用
app = FastAPI(title="批量政务公文分类API", description="基于FastAPI封装,适配文心一言/GPT,实现批量公文分类、脱敏及统计", version="1.0")
# 配置大模型密钥(替换为个人实际密钥)
MODEL_CONFIG = {
"ernie": { # 文心一言
"api_key": "your_ernie_api_key",
"secret_key": "your_ernie_secret_key",
"api_url": "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro"
},
"gpt": { # GPT
"api_key": "your_gpt_api_key",
"api_url": "https://api.openai.com/v1/chat/completions"
}
}
# Pydantic模型定义(请求体校验)
class BatchDocItem(BaseModel):
doc_id: str # 公文ID
doc_content: str # 公文内容
correct_class: str # 正确分类(用于准确率统计)
class BatchClassifyRequest(BaseModel):
model_type: str # 模型类型:ernie/gpt
documents: Optional[List[BatchDocItem]] = None # 自定义批量公文,可选
use_sample: bool = True # 是否使用默认样本(5类公文)
# 批量济南政务公文样本(5类,默认使用)
def get_batch_sample_documents() -> List[Dict[str, str]]:
return [
{
"doc_id": "JNZW2026001",
"doc_content": """
济南市人民政府办公厅关于开展2026年政务服务满意度调查的通知
济政办发〔2026〕XX号
各区县人民政府,市政府各部门、各直属机构:
为全面掌握我市政务服务质量,提升群众满意度,决定开展2026年政务服务满意度调查。请各单位高度重视,组织做好调查配合工作,调查结果将纳入年度绩效考核。调查时间为2026年2月1日至2月28日,联系人:刘XX,电话:0531-XXXXXXX。
济南市人民政府办公厅
2026年1月18日
""",
"correct_class": "通知"
},
{
"doc_id": "JNZW2026002",
"doc_content": """
济南市人民政府关于禁止在济南高新区核心区域燃放烟花爆竹的通告
济政通〔2026〕XX号
广大市民、各相关单位:
为保障公共安全和群众人身财产安全,减少大气污染,现就禁止在济南高新区核心区域燃放烟花爆竹有关事项通告如下:一、禁放范围:高新区核心区域(具体范围见附件);二、禁放时间:2026年2月10日至2月25日;三、违反本通告的,依法予以处罚。
济南市人民政府
2026年1月16日
""",
"correct_class": "通告"
},
{
"doc_id": "JNZW2026003",
"doc_content": """
济南市人民政府关于同意济南长清区建设现代农业产业园的批复
济政复〔2026〕XX号
长清区人民政府:
你区《关于申请建设济南长清区现代农业产业园的请示》收悉。经研究,同意你区建设现代农业产业园,产业园规划面积1000亩,总投资10亿元,建设期2年。请你区严格按照规划推进建设,加强资金监管,确保项目如期竣工。
济南市人民政府
2026年1月14日
""",
"correct_class": "批复"
},
{
"doc_id": "JNZW2026004",
"doc_content": """
济南市财政局关于2025年度全市财政预算执行情况的报告
济财报〔2026〕XX号
市人民政府:
现将2025年度全市财政预算执行情况报告如下:一、2025年财政预算执行总体情况,全市一般公共预算收入1200亿元,支出1000亿元;二、存在的问题;三、2026年工作打算。请审议。
济南市财政局
2026年1月12日
""",
"correct_class": "报告"
},
{
"doc_id": "JNZW2026005",
"doc_content": """
济南市教育局关于商请协调解决学校周边交通整治事宜的函
济教函〔2026〕XX号
市公安局交通管理支队:
为保障学生上下学交通安全,现就协调解决我市部分学校周边交通整治事宜商请如下:一、在学校周边增设交通警示标志;二、上下学时段安排交警执勤;三、优化周边停车秩序。请予支持为盼。
济南市教育局
2026年1月10日
""",
"correct_class": "函"
}
]
# 分类提示词模板(复用优化后模板)
classification_prompt = """
请你作为专业济南政务文本分类助手,严格遵循《政务信息公开条例》及济南政务合规要求,完成以下任务:
1. 分类任务:将公文归入以下类别之一:通知、通告、决定、批复、请示、报告、函、意见,分类准确率≥95%。
2. 脱敏要求:
- 个人信息(姓名、联系方式):姓名标注[隐私已脱敏],联系电话保留区号+[已脱敏];
- 涉密数据、未公开事项:标注[涉密/未公开已脱敏]。
3. 输出规范:JSON格式,包含字段:doc_id、document_name、classification、desensitization_info、classification_basis、illusion_evaluation。
公文内容:{content}
doc_id:{doc_id}
输出结果:
"""
# 调用大模型API(适配文心一言/GPT)
def call_llm_api(model_type: str, prompt: str, content: str, doc_id: str) -> Dict[str, Any]:
"""适配双模型,处理单篇公文分类与脱敏"""
if model_type not in MODEL_CONFIG:
raise ValueError(f"不支持的模型类型:{model_type}")
final_prompt = prompt.format(content=content, doc_id=doc_id)
config = MODEL_CONFIG[model_type]
try:
if model_type == "ernie": # 文心一言
token_url = f"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={config['api_key']}&client_secret={config['secret_key']}"
token_res = requests.post(token_url)
token_res.raise_for_status()
access_token = token_res.json()["access_token"]
headers = {"Content-Type": "application/json"}
payload = {
"messages": [{"role": "user", "content": final_prompt}],
"temperature": 0.2,
"top_p": 0.75,
"max_tokens": 512,
"stream": False
}
api_url = f"{config['api_url']}?access_token={access_token}"
response = requests.post(api_url, headers=headers, json=payload)
output_content = response.json()["result"]
else: # GPT
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {config['api_key']}"
}
payload = {
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": final_prompt}],
"temperature": 0.2,
"top_p": 0.75,
"max_tokens": 512
}
response = requests.post(config["api_url"], headers=headers, json=payload)
output_content = response.json()["choices"][0]["message"]["content"]
return json.loads(output_content.strip())
except Exception as e:
raise HTTPException(status_code=500, detail=f"处理公文 {doc_id} 失败:{str(e)}")
# 批量处理核心函数
def batch_classify_documents(model_type: str, documents: List[Dict[str, str]]) -> Dict[str, Any]:
"""批量处理公文,返回统计报告与详细结果"""
results = []
correct_count = 0
for doc in documents:
doc_id = doc["doc_id"]
content = doc["doc_content"]
correct_class = doc["correct_class"]
# 调用模型处理
classify_result = call_llm_api(model_type, classification_prompt, content, doc_id)
# 补充正确性标识与正确分类
classify_result["correct_classification"] = correct_class
classify_result["is_correct"] = classify_result["classification"] == correct_class
if classify_result["is_correct"]:
correct_count += 1
results.append(classify_result)
# 生成统计报告
total_count = len(documents)
accuracy = (correct_count / total_count) * 100
return {
"batch_statistics": {
"total_documents": total_count,
"correct_count": correct_count,
"accuracy": f"{accuracy:.1f}%",
"is_target_achieved": "是" if accuracy ≥ 95 else "否", # 目标准确率≥95%
"model_used": model_type
},
"detailed_results": results
}
# FastAPI接口:批量公文分类
@app.post("/batch_classify_documents", summary="批量济南政务公文分类(含脱敏+准确率统计)")
async def batch_classify(req: BatchClassifyRequest) -> Dict[str, Any]:
"""
批量处理济南政务公文,支持自定义公文或使用默认5类样本
- **model_type**: 模型类型,可选ernie(文心一言)、gpt
- **documents**: 自定义批量公文列表(可选)
- **use_sample**: 是否使用默认样本(默认True,优先级低于documents)
"""
# 确定待处理公文列表
if req.documents:
documents = [doc.dict() for doc in req.documents]
elif req.use_sample:
documents = get_batch_sample_documents()
else:
raise HTTPException(status_code=400, detail="请传入自定义公文列表,或开启use_sample使用默认样本")
# 执行批量处理
result = batch_classify_documents(req.model_type, documents)
return result
# 本地运行调试
if __name__ == "__main__":
import uvicorn
# 接口文档地址:http://127.0.0.1:8003/docs
uvicorn.run(app="__main__:app", host="127.0.0.1", port=8003, reload=True)
(注:文档部分内容可能由 AI 生成)