6.6 KiB
6.6 KiB
BaoDan Workflow 配置指南
本文档指导你在 BaoDan 后台创建"产品推荐方案生成"Workflow 应用。
前置条件
- BaoDan 已运行:
http://localhost:3000 - 管理员账号已创建(首次访问时设置)
步骤 1:创建 Workflow 应用
- 打开
http://localhost:3000 - 点击左上角 "创建应用" → 选择 "工作流"
- 名称填写:
产品推荐方案生成 - 描述填写:
根据客户信息生成三套保险产品推荐方案
步骤 2:添加节点
在工作流编辑器中,按以下顺序添加 6 个节点:
节点 1:参数校验(Code 节点)
- 类型:代码执行
- 输入变量:
age(string)gender(string)occupation(string)income(string)budget(string)insurance_types(array[string])coverage_amount(string)coverage_period(string)
- 代码:
def main(age: str, gender: str, occupation: str, income: str, budget: str,
insurance_types: list, coverage_amount: str, coverage_period: str) -> dict:
errors = []
try:
age_int = int(age)
if age_int < 1 or age_int > 150:
errors.append("年龄应在 1-150 之间")
except (ValueError, TypeError):
errors.append("年龄必须是数字")
if gender not in ("male", "female"):
errors.append("性别无效")
if not occupation or not occupation.strip():
errors.append("职业不能为空")
try:
budget_int = int(budget)
if budget_int < 1:
errors.append("月预算必须大于 0")
except (ValueError, TypeError):
errors.append("月预算必须是数字")
try:
coverage_int = int(coverage_amount)
if coverage_int < 1:
errors.append("保额必须大于 0")
except (ValueError, TypeError):
errors.append("保额必须是数字")
if not insurance_types:
errors.append("请至少选择一个险种")
return {
"is_valid": len(errors) == 0,
"error_msg": "; ".join(errors) if errors else "",
"validated_age": age,
"validated_gender": gender,
"validated_occupation": occupation,
"validated_income": income,
"validated_budget": budget,
"validated_types": insurance_types,
"validated_coverage": coverage_amount,
"validated_period": coverage_period,
}
- 输出变量:
is_valid,error_msg,validated_*系列
节点 2:条件分支
- 条件:
node_1.is_valid == true - True 分支 → 节点 3(检索策略)
- False 分支 → 节点 5(异常处理)
节点 3:检索策略生成(Code 节点)
def main(validated_types: list, validated_age: str, **kwargs) -> dict:
queries = []
for t in validated_types:
queries.append(f"{t} 产品条款 保额 费率 {validated_age}岁")
return {"search_queries": queries}
节点 4:知识库检索 + LLM 方案生成
4a. 知识库检索节点:
- 关联你创建的知识库(各险种文档)
- 检索模式:混合检索
- Top-K = 5
4b. LLM 节点:
- 模型:选择你配置的 LLM(如 deepseek-chat)
- Temperature = 0.7
- Prompt 模板:
你是一位专业的保险规划师。请根据以下客户信息和检索到的产品资料,生成三套保险推荐方案。
## 客户信息
- 年龄:{{node_1.validated_age}}岁
- 性别:{{node_1.validated_gender}}
- 职业:{{node_1.validated_occupation}}
- 年收入:{{node_1.validated_income}}万
- 月预算:{{node_1.validated_budget}}元
- 关注险种:{{node_1.validated_types}}
- 保额目标:{{node_1.validated_coverage}}万
- 保障期限:{{node_1.validated_period}}
## 检索到的产品资料
{{node_4a.text}}
## 输出要求
请生成三套方案(基础型/均衡型/全面型),每套方案包含:
1. 方案名称
2. 年保费合计
3. 产品明细表格(产品名称、保额、年保费、推荐理由)
4. 方案总结
重要规则:
- 保费必须来自检索结果,不得编造
- 总保费不得超过月预算 × 12
- 末尾添加免责声明
节点 5:异常处理(Code 节点)
def main(is_valid: bool, error_msg: str, recommendation: str = "") -> dict:
if not is_valid:
return {"final_output": f"参数校验失败:{error_msg}", "is_success": False}
if not recommendation:
return {"final_output": "未能生成推荐方案,请稍后重试", "is_success": False}
return {"final_output": recommendation, "is_success": True}
节点 6:格式化输出(Code 节点)
def main(final_output: str) -> dict:
# 去除多余空行
lines = [l for l in final_output.split("\n") if l.strip()]
return {"result": "\n".join(lines)}
步骤 3:连接节点
按以下顺序连接:
开始 → 节点1(参数校验) → 节点2(条件分支)
├─ True → 节点3(检索策略) → 节点4a(知识库检索) → 节点4b(LLM生成) → 节点6(格式化) → 结束
└─ False → 节点5(异常处理) → 节点6(格式化) → 结束
步骤 4:测试
- 点击右上角 "运行" 按钮
- 输入测试数据:
{
"age": "35",
"gender": "male",
"occupation": "软件工程师",
"income": "30",
"budget": "2000",
"insurance_types": ["重疾险", "医疗险"],
"coverage_amount": "50",
"coverage_period": "终身"
}
- 预期:生成三套方案(基础/均衡/全面)
步骤 5:获取 API Key
- 点击应用右上角 "发布"
- 进入 "访问 API" 页面
- 复制 API Key(格式:
app-xxxxxxxxxxxx)
步骤 6:配置到项目
运行配置脚本:
cd d:/work/code/python/coding/baodanagent
python scripts/setup_baodan_api_keys.py
按提示输入 API Key 即可自动更新 docker-compose 配置。
常见问题
Q: 没有知识库怎么办? A: 先在 BaoDan 后台 → 知识库 → 创建知识库 → 上传保险产品文档。如果没有文档,可以跳过知识库检索节点,直接让 LLM 生成方案(但方案中的保费数据可能不准确)。
Q: 没有配置 LLM 模型怎么办? A: 在 BaoDan 后台 → 设置 → 模型供应商 → 添加模型(如 OpenAI/DeepSeek)。需要有效的 API Key。
Q: Workflow 测试通过但 API 调用失败?
A: 检查 docker-compose.baodan.yml 中的 BAODAN_WORKFLOW_APP_API_KEY 是否填入了正确的 API Key,然后重启容器:
docker compose -f docker-compose.baodan.yml restart baodan-api