为什么这个新闻值得你关注
NBC一锤子新闻里夹了一条容易被忽略的技术信号:New concerns over use of A.I. to draft police reports。说白了,美国舆论开始担心AI写警情报告会瞎编、会泄露隐私。这不是新闻,而是第一波产品合规大考来了。
对开发者来说,这意味着:谁先做出能生成结构化、可溯源、带审核的报告系统,谁就拿到了政府/企业客户的门票。
下面我直接给一个能跑起来的Demo,包含:
- 输入口语化对话片段 → 输出JSON格式的标准化报告
- 流式输出,前端实时显示
- 内置幻觉过滤+敏感信息脱敏(核心)
产品Demo:警情报告生成器
用户粘贴一段对话(比如报警录音转文本),点击生成,页面流式输出结构化报告:
json
1
2
3
4
5
6
7
8
9
10
11
{
"case_id": "20260524-001",
"incident_type": "噪声扰民",
"location": { "address": "123 Main St", "gps": [40.7128, -74.0060] },
"summary": "报警人称邻居凌晨2点开派对,影响休息",
"involved_persons": [
{ "role": "报案人", "name": "张三", "id_number": "***1234" }
],
"action_taken": "警员已到场调解,派对已于3:15结束",
"confidence": 0.87
}
技术选型
| 组件 | 选择 | 理由 |
|---|---|---|
| 模型 | GPT-4o-mini | 响应快、便宜,单次调用约$0.002,对结构化任务足够 |
| 前端 | Streamlit | 3行代码可交互,适合MVP验证 |
| 流式 | OpenAI SSE | 用户体验好,减少等待焦虑 |
| 脱敏 | 正则+实体识别 | 手机号、身份证、地址自动打码 |
| 幻觉校验 | 强制JSON Schema + 后处理 | 防止AI编造不存在的人物或事件 |
核心代码实现(关键片段)
1. 流式生成结构化JSON
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import json
from openai import OpenAI
client = OpenAI()
def stream_report(transcript: str):
system_prompt = """你是一个警情报告生成器。根据用户输入的对话,输出严格遵循以下JSON Schema的报告:
{
"case_id": "YYYYMMDD-序号",
"incident_type": "类别",
"location": {"address": str, "gps": [float, float]},
"summary": "50字以内",
"involved_persons": [{"role": str, "name": str, "id_number": "***后4位"}],
"action_taken": str,
"confidence": float
}
重要规则:
- 如果对话中没有明确的人名,用"未知",绝不虚构。
- 身份证号只保留最后4位,其余打码为*。
- 地址必须包含粗略GPS坐标(可基于城市估算)。
不要输出任何解释,仅输出JSON。"""
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": transcript}
],
stream=True,
response_format={"type": "json_object"}
)
full_content = ""
for chunk in response:
if chunk.choices[0].delta.content:
delta = chunk.choices[0].delta.content
full_content += delta
yield delta
# 后处理:校验JSON并脱敏
yield from validate_and_sanitize(full_content)
2. 幻觉过滤+脱敏函数
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import re
def validate_and_sanitize(raw_json_str: str):
try:
report = json.loads(raw_json_str)
except json.JSONDecodeError as e:
yield "\n\n[ERROR]输出不是合法JSON,请重试"
return
# 规则1:confidence必须在0到1之间
if not (0 <= report.get("confidence", 0) <= 1):
report["confidence"] = 0.5
# 规则2:身份证号码脱敏
for person in report.get("involved_persons", []):
id_raw = person.get("id_number", "")
if len(id_raw) == 18:
person["id_number"] = "**************" + id_raw[-4:]
# 规则3:地址中若出现具体门牌号,替换为模糊位置
address = report.get("location", {}).get("address", "")
if re.search(r'\d+号', address):
address = re.sub(r'\d+号', 'XX号', address)
report["location"]["address"] = address
yield f"\n\n### 审核后报告\n```json\n{json.dumps(report, ensure_ascii=False, indent=2)}\n```"
3. Streamlit前端(关键部分)
python
1
2
3
4
5
6
7
8
9
10
11
12
import streamlit as st
st.title("AI警情报告生成器")
transcript = st.text_area("粘贴对话文本", height=200)
if st.button("生成报告"):
with st.spinner("正在生成..."):
# 流式输出
response_placeholder = st.empty()
full_text = ""
for delta in stream_report(transcript):
full_text += delta
response_placeholder.markdown(full_text)
项目结构
text
1
2
3
4
5
6
police-report-gen/
├── app.py # Streamlit入口
├── stream_report.py # 核心生成逻辑
├── sanitizer.py # 脱敏+校验
├── requirements.txt
└── .env # OPENAI_API_KEY
requirements.txt 就三行:
text
1
2
3
streamlit
openai
python-dotenv
上线要特别注意的坑
幻觉无法100%消除:即使有JSON Schema,模型还是可能编造地址或人物。建议加一个人工确认步骤:前端输出报告后,要求警员修改并签名。这是合规底线。
敏感信息脱敏要彻底:除了身份证,还有电话号码、车牌号、社保号。用
spaCy的实体识别 + 正则双重保护。计费限制:GPT-4o-mini 虽便宜,但如果每天10万次调用,月费约6000元。考虑用小模型(如 Llama 3.1 8B)本地部署,通过ollama+流式。代码几乎不改,只需换
openai客户端为ollama。记录的不可否认性:必须对每次生成记录日志(原始输入+输出+模型版本+时间戳),防止滥用。
我的看法
“AI起草警察报告”这件事,技术上已经成熟到可以上线MVP。真正卡脖子的不是模型能力,而是信任机制 —— 你怎么让执法人员相信AI不会胡编?我的方案是:AI只做初稿,所有输出必须经人工审核并留痕。这不是退步,而是AI落地的正确姿势。开发者现在就应该把“审核链路”写进产品的核心代码里,否则等到合规找上门就晚了。
