关于重复造轮子这件事,做政务 AI 的朋友应该都深有体会——在开发环境调好的智能体,到了生产环境就得重新摆节点、填提示词,错了还不容易找。我最近在 12345 热线分拨项目里试了一把 openJiuwen 的导出导入,把整个工作流打成 JSON 模板,换个环境直接导入就能用,确实少了那种'在我这儿能跑,到你那儿就卡'的尴尬。下面按实际过程整理一遍,算是个参考。
痛点:为什么政务智能体特别需要导入导出
这几年各地 12345 都上了大模型,但几个坑几乎每个项目都会踩:
- 环境割裂:云上调好的分拨模型,到了政务外网或物理隔离的生产环境,经常得手动重建,漏一个条件分支查半天。
- 协作原始:A 区做了一个识别率 95% 的分拨助手,B 区想用,只能截图照着搭,不光慢,还容易抄错提示词。
- 无法追溯:工作流改过十几版,想回退到上个月的逻辑,只能凭记忆重连。
国家这两年一直在推'一地创新、多地复用',智能体要能跨科室、跨区县快速复制,导入导出就是落地这个想法的关键一步。openJiuwen 的思路是把整个智能体配置打包成一幅独立于机器和网络的'数字图纸',接收方导入就能得到一模一样的能力。
从零搭建一个分拨助手
我做的场景是 12345 热线智能分拨:话务员输入市民描述,系统自动推荐责任部门,确认后派单。逻辑很清晰——输入文本 → 大模型理解 → 映射到预定义类别 → 分部门处理。下面一步步拆开,有些细节是调出来的,我会特别提一下。
准备工作:市局开发人员在 openJiuwen Studio 里搭模板,区县同事在另一套环境导入。账号、服务器不同,但导入导出不挑这些。
进入 Studio,新建工作流 Government_Hotline_Dispatch。

开始节点
定义一个 query 变量,类型 String,用来接收市民提问。样例:'你好,房产证在哪里办理。'

意图识别与部门匹配(大模型节点)
这是整个工作流的核心。模型用的 deepseekR1,通过 API 接入。系统提示词我反复测了几版,最后稳定成这样:
你是一个政务业务分类专家。请分析用户咨询,判断其主要涉及以下哪个或哪几个科室:1. 住建局,2. 公安局,3. 人社局 4. 水务局,5. 环保局 6 市场监督局 请输出格式为 JSON: {"departments": ["科室 A", "科室 B"]}。若无明确对应,则为 ["其他科室"]。
用户提示词直接传入开始节点的 query 变量:{{query}}。输出字段叫 output。

这里要注意,{{query}} 必须用变量选择器插入,手动敲的话导入后会当成普通字符串,不会解析成变量——后面常见问题里会再提。
分流处理(代码节点)
大模型返回的是一个 JSON 字符串,比如 {"departments":["住建","人社"]}。我需要把 departments 数组提取出来,传递给后续分支。写了段 Python:
def main(args: Args):
import json
try:
data = json.loads(args.params['input'])
return {'result': data['departments']}
except ValueError:
return {'result': ['其他部门']}
这个节点输出 result 字段,存着数组。

部门选择器
根据 result 数组的内容,将流程导向不同分支。因为我演示的部门有城管、住建、人社、医保等,所以设了多个选择器,每个检查是否包含对应关键词。比如包含'人社'就进人社业务模型分支,否则走其他分支。条件用 contains 或 eq。

部门业务模型
每个分支接一个大模型节点,扮演该科室的政策专家。提示词里用了变量 {{depart}} 动态填入部门名,这样一套模板可以复用。
系统提示词:你是一个{{depart}}的部门专家,这个是用户的需求{{input}},请给出解决方案
用户输入还是开始节点的 query,department 变量取自上游节点。

结束节点
最后把所有分支的输出汇总,用结束节点的模板拼接展示。输出变量必须从变量选择器里选,变成绿色高亮才算绑定成功——这一点我会再强调,因为最容易踩坑。

测试一下再导出
跑几个典型 Case:
- '小区门口有游商占道卖菜,堵路' → 城管 + 办理流程
- '房产证如何办理' → 住建 + 办理流程
- '公司拖欠我三个月工资' → 人社 + 办理流程
测试截图如下,确认逻辑没问题后就可以导出了。


导出模板
点画布右上角的「导出」按钮,选「导出为模板 (.jiuwen_template)」。系统会生成一个 JSON 文件。我把这个文件内容贴出来,里面就是工作流的全部配置细节:节点位置、连线、提示词、变量引用、模型参数,一个不少。
{
"nodes": [
{
"id": "start_rUWFU",
"type": "1",
"meta": {
"position": {
"x": 180,
"y": 418
}
},
"data": {
"title": "开始",
"outputs": {
"type": "object",
"properties": {
"query": {
"type": "string",
"default": "你好,请帮我分析一下这个问题。"
}
}
}
}
},
{
"id": "end_rUWFU",
"type": "2",
"meta": {
"position": {
"x": 2480,
"y": 418
}
},
"data": {
"title": "结束",
"inputs": {
"inputParameters": {
"城管": {
"type": "ref",
"content": [
"llm_GDALL",
"output"
],
"extra": {
"index": 0
}
},
"住建": {
"type": "ref",
"content": [
"llm_jdHP1",
"output"
],
"extra": {
"index": 1
}
},
"人社": {
"type": "ref",
"content": [
"llm_NgZdl",
"output"
],
"extra": {
"index": 2
}
},
"医保": {
"type": "ref",
"content": [
"llm_hDY1k",
"output"
],
"extra": {
"index": 3
}
}
},
"content": {
"type": "template",
"content": "{{城管}}\n{{住建}}\n{{人社}}\n{{医保}}"
}
},
"streaming": false
}
},
{
"id": "llm_1HcNN",
"type": "3",
"meta": {
"position": {
"x": 640,
"y": 386
}
},
"data": {
"title": "用户意图—部门分类模型",
"output_format": "text",
"inputs": {
"llmParam": {
"systemPrompt": {
"type": "template",
"content": "你是一个 12345 热线专家,需要根据市民描述,在 30 秒内判断应由城管、住建、水务、人社、市场监管、生态环境等 20 多个部门中的哪一个负责处理。\n请输出格式为 JSON: {\"departments\": [\"部门 A\", \"部门 B\"]}。若无明确对应,则为 [\"其他部门\"]。"
},
"prompt": {
"type": "template",
"content": "{{input}}"
},
"model": {
"id": "1",
"name": "deepseek",
"type": "deepseek-ai/DeepSeek-R1"
}
},
"inputParameters": {
"input": {
"type": "ref",
"content": [
"start_rUWFU",
"query"
],
"extra": {
"index": 0
}
}
}
},
"outputs": {
"type": "object",
"properties": {
"output": {
"type": "string",
"extra": {
"index": 1
}
}
},
"required": [
"output"
]
}
}
},
{
"id": "code_GWWz8",
"type": "10",
"meta": {
"position": {
"x": 1100,
"y": 401
}
},
"data": {
"title": "部门分类",
"inputs": {
"inputParameters": {
"input": {
"type": "ref",
"content": [
"llm_1HcNN",
"output"
],
"extra": {
"index": 0
}
}
},
"language": "python",
"code": "def main(args: Args):\n import json\n try:\n data= json.loads(args.params['input'])\n return {\"result\" :data['departments']}\n except ValueError\n return {'result': ['其他部门']]}"
},
"outputs": {
"type": "object",
"properties": {
"result": {
"type": "string",
"description": "代码执行结果"
}
},
"required": [
"result"
]
},
"exceptionConfig": {
"retryTimes": 3,
"timeoutSeconds": 30,
"processType": "break",
"executeStep": {
"defaultStep": "0",
"errorStep": "1"
}
}
}
},
{
"id": "condition__YRg9",
"type": "4",
"meta": {
"position": {
"x": 1560,
"y": 0
}
},
"data": {
"title": "选择器",
"branches": [
{
"conditions": [
{
"left": {
"type": "ref",
"content": [
"code_GWWz8",
"result"
]
},
"operator": "contains",
"right": {
"type": "constant",
"content": "城管",
"schema": {
"type": "string",
"extra": {
"weak": true
}
}
}
}
],
"logic": 2,
"branchId": "branch_oo3cw"
},
{
"conditions": [],
"logic": 2,
"branchId": "branch_Vf6wz"
}
]
}
},
{
"id": "condition_HSDv4",
"type": "4",
"meta": {
"position": {
"x": 1560,
"y": 264
}
},
"data": {
"title": "选择器",
"branches": [
{
"conditions": [
{
"left": {
"type": "ref",
"content": [
"code_GWWz8",
"result"
]
},
"operator": "contains",
"right": {
"type": "constant",
"content": "住建",
"schema": {
"type": "string",
"extra": {
"weak": true
}
}
}
}
],
"logic": 2,
"branchId": "branch_RLFWq"
},
{
"conditions": [],
"logic": 2,
"branchId": "branch_y8V9W"
}
]
}
},
{
"id": "condition_WKHtY",
"type": "4",
"meta": {
"position": {
"x": 1560,
"y": 792
}
},
"data": {
"title": "选择器",
"branches": [
{
"conditions": [
{
"left": {
"type": "ref",
"content": [
"code_GWWz8",
"result"
]
},
"operator": "eq",
"right": {
"type": "constant",
"content": "医保",
"schema": {
"type": "string",
"extra": {
"weak": true
}
}
}
}
],
"logic": 2,
"branchId": "branch_BXwWU"
},
{
"conditions": [],
"logic": 2,
"branchId": "branch_wtEFo"
}
]
}
},
{
"id": "llm_GDALL",
"type": "3",
"meta": {
"position": {
"x": 2020,
"y": 56
}
},
"data": {
"title": "城管业务办理模型",
"output_format": "text",
"inputs": {
"llmParam": {
"systemPrompt": {
"type": "template",
"content": "你是一个{{depart}}的部门专家,这个是用户的需求{{input}}}},请给出解决方案"
},
"prompt": {
"type": "template",
"content": "{{input}}"
},
"model": {
"id": "1",
"name": "deepseek",
"type": "deepseek-ai/DeepSeek-R1"
}
},
"inputParameters": {
"input": {
"type": "ref",
"content": [
"start_rUWFU",
"query"
],
"extra": {
"index": 0
}
},
"depart": {
"type": "ref",
"content": [
"llm_1HcNN",
"output"
],
"extra": {
"index": 1
}
}
}
},
"outputs": {
"type": "object",
"properties": {
"output": {
"type": "string",
"extra": {
"index": 1
}
}
},
"required": [
"output"
]
}
}
},
{
"id": "condition_gP4Nb",
"type": "4",
"meta": {
"position": {
"x": 1560,
"y": 528
}
},
"data": {
"title": "选择器",
"branches": [
{
"conditions": [
{
"left": {
"type": "ref",
"content": [
"code_GWWz8",
"result"
]
},
"operator": "contains",
"right": {
"type": "constant",
"content": "人社",
"schema": {
"type": "string",
"extra": {
"weak": true
}
}
}
}
],
"logic": 2,
"branchId": "branch_jHWdM"
},
{
"conditions": [],
"logic": 2,
"branchId": "branch_1MTlv"
}
]
}
},
{
"id": "llm_jdHP1",
"type": "3",
"meta": {
"position": {
"x": 2020,
"y": 320
}
},
"data": {
"title": "住建业务办理大模型",
"output_format": "text",
"inputs": {
"llmParam": {
"systemPrompt": {
"type": "template",
"content": "你是一个{{depart}}的部门专家,这个是用户的需求{{input}}}},请给出解决方案"
},
"prompt": {
"type": "template",
"content": "{{input}}"
},
"model": {
"id": "1",
"name": "deepseek",
"type": "deepseek-ai/DeepSeek-R1"
}
},
"inputParameters": {
"input": {
"type": "ref",
"content": [
"start_rUWFU",
"query"
],
"extra": {
"index": 0
}
},
"depart": {
"type": "ref",
"content": [
"llm_1HcNN",
"output"
],
"extra": {
"index": 1
}
}
}
},
"outputs": {
"type": "object",
"properties": {
"output": {
"type": "string",
"extra": {
"index": 1
}
}
},
"required": [
"output"
]
}
}
},
{
"id": "llm_hDY1k",
"type": "3",
"meta": {
"position": {
"x": 2020,
"y": 848
}
},
"data": {
"title": "医保业务办理模型",
"output_format": "text",
"inputs": {
"llmParam": {
"systemPrompt": {
"type": "template",
"content": "你是一个{{depart}}的部门专家,这个是用户的需求{{input}}}},请给出解决方案"
},
"prompt": {
"type": "template",
"content": "{{input}}"
},
"model": {
"id": "1",
"name": "deepseek",
"type": "deepseek-ai/DeepSeek-R1"
}
},
"inputParameters": {
"input": {
"type": "ref",
"content": [
"start_rUWFU",
"query"
],
"extra": {
"index": 0
}
},
"depart": {
"type": "ref",
"content": [
"llm_1HcNN",
"output"
],
"extra": {
"index": 1
}
}
}
},
"outputs": {
"type": "object",
"properties": {
"output": {
"type": "string",
"extra": {
"index": 1
}
}
},
"required": [
"output"
]
}
}
},
{
"id": "llm_NgZdl",
"type": "3",
"meta": {
"position": {
"x": 2020,
"y": 584
}
},
"data": {
"title": "人社业务办理大模型",
"output_format": "text",
"inputs": {
"llmParam": {
"systemPrompt": {
"type": "template",
"content": "你是一个{{depart}}的部门专家,这个是用户的需求{{input}}}},请给出解决方案"
},
"prompt": {
"type": "template",
"content": "{{input}}"
},
"model": {
"id": "1",
"name": "deepseek",
"type": "deepseek-ai/DeepSeek-R1"
}
},
"inputParameters": {
"input": {
"type": "ref",
"content": [
"start_rUWFU",
"query"
],
"extra": {
"index": 0
}
},
"depart": {
"type": "ref",
"content": [
"llm_1HcNN",
"output"
],
"extra": {
"index": 1
}
}
}
},
"outputs": {
"type": "object",
"properties": {
"output": {
"type": "string",
"extra": {
"index": 1
}
}
},
"required": [
"output"
]
}
}
}
],
"edges": [
{
"sourceNodeID": "start_rUWFU",
"targetNodeID": "llm_1HcNN"
},
{
"sourceNodeID": "llm_GDALL",
"targetNodeID": "end_rUWFU"
},
{
"sourceNodeID": "condition__YRg9",
"targetNodeID": "end_rUWFU",
"sourcePortID": "branch_Vf6wz"
},
{
"sourceNodeID": "condition_HSDv4",
"targetNodeID": "end_rUWFU",
"sourcePortID": "branch_y8V9W"
},
{
"sourceNodeID": "condition_gP4Nb",
"targetNodeID": "end_rUWFU",
"sourcePortID": "branch_1MTlv"
},
{
"sourceNodeID": "condition_WKHtY",
"targetNodeID": "end_rUWFU",
"sourcePortID": "branch_wtEFo"
},
{
"sourceNodeID": "llm_jdHP1",
"targetNodeID": "end_rUWFU"
},
{
"sourceNodeID": "llm_NgZdl",
"targetNodeID": "end_rUWFU"
},
{
"sourceNodeID": "llm_hDY1k",
"targetNodeID": "end_rUWFU"
},
{
"sourceNodeID": "llm_1HcNN",
"targetNodeID": "code_GWWz8"
},
{
"sourceNodeID": "code_GWWz8",
"targetNodeID": "condition__YRg9",
"sourcePortID": "0"
},
{
"sourceNodeID": "code_GWWz8",
"targetNodeID": "condition_HSDv4",
"sourcePortID": "0"
},
{
"sourceNodeID": "code_GWWz8",
"targetNodeID": "condition_gP4Nb",
"sourcePortID": "0"
},
{
"sourceNodeID": "code_GWWz8",
"targetNodeID": "condition_WKHtY",
"sourcePortID": "0"
},
{
"sourceNodeID": "condition__YRg9",
"targetNodeID": "llm_GDALL",
"sourcePortID": "branch_oo3cw"
},
{
"sourceNodeID": "condition_HSDv4",
"targetNodeID": "llm_jdHP1",
"sourcePortID": "branch_RLFWq"
},
{
"sourceNodeID": "condition_WKHtY",
"targetNodeID": "llm_hDY1k",
"sourcePortID": "branch_BXwWU"
},
{
"sourceNodeID": "condition_gP4Nb",
"targetNodeID": "llm_NgZdl",
"sourcePortID": "branch_jHWdM"
}
]
}
这份 JSON 就是整个工作流的'核心配置'——包含所有节点、连线、提示词、模型选择、变量传递关系。只要有了它,任何 openJiuwen 环境都能一键复原。
导入到区县环境
把导出的 JSON 文件发给区县同事,他们登录自己的 Studio,新建一个工作流,点「导入」选择文件。


几秒钟后,整个工作流就出现在画布上了,节点位置、连线、提示词、分支条件、输出变量全部和源环境一样。

区县同事马上就能运行测试。比如输入'工地夜间施工噪声扰民',如果本地部门划分不同,把提示词里的'生态环境'改成'城管',其他完全不用动。整个定制不超过两分钟。
常见踩坑记录
说几个实际项目里最容易卡住的点,每个都有对应的解决思路。
变量解析成字符串
现象:大模型收到的输入是字符串 {{query}} 而不是真正的变量值。
原因:提示词里手动打了 {{query}},没用右侧的变量选择器插入。
解决办法:养成只用变量选择器的习惯。在输入框里,变量如果是绿色高亮背景,说明绑定成功;黑色字体表示它是文本。导入后可以重点检查【结束】节点的输出,如果出现 {{department}} 原样,就删掉重新选。
导入后报'Tool not found'或插件不存在
现象:明明没用到工具,却提示函数找不到。
原因:源环境的自定义代码节点里硬编码了绝对路径(比如 C:/Users/admin/data.xlsx),导入后目标环境没有这个路径。
解决办法:代码里尽量用相对路径或环境变量;如果有依赖文件,导出时一并打包,导入后放到对应位置,修改代码节点中的路径。
不只是 12345:这类模板可以直接复用
12345 分拨助手的内核是'文本输入 → 大模型分类 → 映射到预定义类别 → 分部门处理',这个骨架在信访件分类、企业诉求派单、网格事件分拨等场景里完全一样。复用时只需要三步:
- 导出 12345 分拨模板;
- 在新项目导入;
- 修改大模型提示词中的类别定义,调整分支条件。
不需要重新拖节点、连线条。一个业务人员五分钟就能'改装'出一个新场景的助手。
很多低代码平台也能导出流程图,但经常丢掉提示词、变量绑定、模型参数这些'认知层'的东西。openJiuwen 的导出把这些全保留了,这是它真正实用化的地方。
最后
政务 AI 要摆脱'重复造轮子',光有模型不够,还得让模型配置能像代码一样版本化、可移植。openJiuwen 的导入导出解决的就是这个'最后一公里'的问题——它让智能体的交付脱离特定环境,让一个科室的调试成果能直接变成另一个科室的起点。
| 操作步骤 | 关键动作 | 常见误区 | 避坑要点 |
|---|---|---|---|
| 配置变量 | 用变量选择器 | 手动输入 {{变量}} | 绿色高亮才可靠 |
| 导出模板 | 点击导出,选 .jiuwen_template | 忽略模型映射 | 文件名包含场景、版本、日期 |
| 导入模板 | 选择文件,确认模型可用 | 不检查目标环境模型差异 | 先确认目标环境已配置相同模型 |
| 测试 | 输入典型 Case | 只测一条 | 至少覆盖主要类别和边缘情况 |
| 定制修改 | 改提示词、分支条件 | 改乱无法回退 | 修改前复制一份工作流 |

