baodan/scripts/upload_kb_docs.py

245 lines
9.9 KiB
Python
Raw Normal View History

"""向知识库上传示例保险产品文档。"""
import requests
import base64
import json
import sys
import time
# ============ 保险产品数据 ============
PRODUCTS = [
{
"name": "康乐一生重疾险",
"company": "复星联合健康",
"type": "重疾险",
"coverage": ["30万", "50万", "100万"],
"premium": {"30岁男": "4500元/年", "30岁女": "4200元/年", "35岁男": "5800元/年", "35岁女": "5400元/年"},
"coverage_period": "终身",
"waiting_period": "90天",
"diseases": "110种重疾 + 25种中症 + 50种轻症",
"features": "重疾不分组赔付3次中症赔付60%保额轻症赔付30%保额,自带被保人豁免",
"age_range": "0-55岁",
},
{
"name": "达尔文6号重疾险",
"company": "国富人寿",
"type": "重疾险",
"coverage": ["30万", "40万", "50万"],
"premium": {"30岁男": "5200元/年", "30岁女": "4800元/年", "35岁男": "6800元/年", "35岁女": "6300元/年"},
"coverage_period": "终身",
"waiting_period": "180天",
"diseases": "110种重疾 + 25种中症 + 50种轻症",
"features": "60岁前首次重疾额外赔付80%保额癌症二次赔付间隔期3年",
"age_range": "0-55岁",
},
{
"name": "超级玛丽7号重疾险",
"company": "和泰人寿",
"type": "重疾险",
"coverage": ["30万", "50万", "60万"],
"premium": {"30岁男": "5500元/年", "30岁女": "5100元/年", "35岁男": "7200元/年", "35岁女": "6700元/年"},
"coverage_period": "终身",
"waiting_period": "180天",
"diseases": "110种重疾 + 25种中症 + 55种轻症",
"features": "癌症二次赔付间隔期仅1年赔付比例120%保额,心脑血管二次赔付",
"age_range": "0-55岁",
},
{
"name": "e享护-医享无忧百万医疗险",
"company": "太平洋健康",
"type": "医疗险",
"coverage": ["400万"],
"premium": {"30岁男": "268元/年", "30岁女": "288元/年", "35岁男": "358元/年", "35岁女": "388元/年"},
"coverage_period": "1年保证续保20年",
"waiting_period": "30天",
"diseases": "住院医疗、特殊门诊、门诊手术、住院前后门急诊",
"features": "保证续保20年涵盖外购药、质子重离子治疗100%报销",
"age_range": "0-65岁",
"deductible": "1万元",
},
{
"name": "蓝医保长期医疗险",
"company": "太平洋健康",
"type": "医疗险",
"coverage": ["400万"],
"premium": {"30岁男": "298元/年", "30岁女": "318元/年", "35岁男": "398元/年", "35岁女": "428元/年"},
"coverage_period": "1年保证续保20年",
"waiting_period": "30天",
"diseases": "住院医疗、特殊门诊、门诊手术、住院前后门急诊、重疾住院津贴",
"features": "保证续保20年重疾0免赔涵盖外购药、质子重离子含重疾住院津贴100元/天",
"age_range": "0-65岁",
"deductible": "1万元重疾0免赔",
},
{
"name": "平安e生保长期医疗险",
"company": "平安健康",
"type": "医疗险",
"coverage": ["200万", "400万"],
"premium": {"30岁男": "320元/年", "30岁女": "340元/年", "35岁男": "420元/年", "35岁女": "450元/年"},
"coverage_period": "1年保证续保20年",
"waiting_period": "30天",
"diseases": "住院医疗、特殊门诊、门诊手术、住院前后门急诊",
"features": "保证续保20年平安品牌服务体系完善支持垫付医疗费",
"age_range": "0-65岁",
"deductible": "1万元",
},
{
"name": "小蜜蜂3号意外险",
"company": "鼎和保险",
"type": "意外险",
"coverage": ["50万", "100万"],
"premium": {"30岁男": "158元/年", "30岁女": "158元/年", "35岁男": "158元/年", "35岁女": "158元/年"},
"coverage_period": "1年",
"waiting_period": "",
"diseases": "意外身故/伤残、意外医疗、意外住院津贴、猝死保障",
"features": "含猝死保障50万意外医疗0免赔100%报销,不限社保",
"age_range": "18-60岁",
},
{
"name": "大护甲5号意外险",
"company": "人保财险",
"type": "意外险",
"coverage": ["50万", "100万"],
"premium": {"30岁男": "168元/年", "30岁女": "168元/年", "35岁男": "168元/年", "35岁女": "168元/年"},
"coverage_period": "1年",
"waiting_period": "",
"diseases": "意外身故/伤残、意外医疗、意外住院津贴、交通意外额外赔付",
"features": "交通意外额外赔付意外医疗0免赔不限社保含住院津贴150元/天",
"age_range": "18-60岁",
},
{
"name": "华贵大麦2024定期寿险",
"company": "华贵人寿",
"type": "寿险",
"coverage": ["50万", "100万", "200万"],
"premium": {"30岁男": "590元/年", "30岁女": "310元/年", "35岁男": "810元/年", "35岁女": "450元/年"},
"coverage_period": "20年/30年/至60岁/至65岁/至70岁",
"waiting_period": "90天",
"diseases": "身故/全残保障",
"features": "免责条款仅3条健康告知宽松最高可投保300万支持减保",
"age_range": "18-60岁",
},
{
"name": "擎天柱9号定期寿险",
"company": "横琴人寿",
"type": "寿险",
"coverage": ["50万", "100万", "300万"],
"premium": {"30岁男": "620元/年", "30岁女": "330元/年", "35岁男": "850元/年", "35岁女": "480元/年"},
"coverage_period": "20年/30年/至60岁/至65岁/至70岁",
"waiting_period": "90天",
"diseases": "身故/全残保障,可选猝死额外赔付",
"features": "可选猝死额外赔付50%保额,健康告知宽松,支持月缴",
"age_range": "18-60岁",
},
{
"name": "增多多3号增额终身寿险",
"company": "弘康人寿",
"type": "储蓄险",
"coverage": ["按保费确定保额"],
"premium": {"趸交": "10万起", "3年交": "3万/年起", "5年交": "2万/年起", "10年交": "1万/年起"},
"coverage_period": "终身",
"waiting_period": "",
"diseases": "身故/全残保障",
"features": "保额每年递增3.5%,现金价值高,支持减保取现,可作为养老储备",
"age_range": "0-70岁",
},
{
"name": "年金险-如意享",
"company": "信泰人寿",
"type": "年金险",
"coverage": ["按缴费确定"],
"premium": {"趸交": "5万起", "3年交": "2万/年起", "5年交": "1万/年起", "10年交": "5000元/年起"},
"coverage_period": "终身",
"waiting_period": "",
"diseases": "身故保障 + 年金领取",
"features": "55岁/60岁/65岁开始领取年金保证领取20年活多久领多久可附加万能账户",
"age_range": "0-60岁",
},
]
def build_document(product: dict) -> str:
"""将产品信息转为文档文本。"""
lines = [
f"# {product['name']}",
f"",
f"## 基本信息",
f"- 产品名称:{product['name']}",
f"- 所属保险公司:{product['company']}",
f"- 险种类型:{product['type']}",
f"- 投保年龄:{product['age_range']}",
f"- 保障期限:{product['coverage_period']}",
f"- 等待期:{product['waiting_period']}",
f"",
f"## 保额选择",
f"可选保额:{''.join(product['coverage'])}",
f"",
f"## 费率表",
]
for age, premium in product['premium'].items():
lines.append(f"- {age}{premium}")
lines.extend([
f"",
f"## 保障内容",
f"- 保障范围:{product['diseases']}",
f"",
f"## 产品特色",
f"{product['features']}",
])
if 'deductible' in product:
lines.extend([f"", f"## 免赔额", f"{product['deductible']}"])
return "\n".join(lines)
def main():
session = requests.Session()
# Login
password_b64 = base64.b64encode('taiyi1224'.encode()).decode()
resp = session.post('http://localhost:5001/console/api/login', json={
'email': 'taiyi@baodan.com',
'password': password_b64
})
if resp.status_code != 200:
sys.stdout.buffer.write(f'Login failed: {resp.status_code}\n'.encode('utf-8'))
return
csrf_token = session.cookies.get('csrf_token')
sys.stdout.buffer.write(b'Login OK\n')
DATASET_ID = 'ec920b75-758a-4fa1-9132-22cb5e22126e'
# Build documents
docs = []
for p in PRODUCTS:
docs.append({
"name": f"{p['name']}{p['company']}",
"text": build_document(p),
})
# Upload as one batch via create_by_text
# Dify API: POST /console/api/datasets/{dataset_id}/documents/create-by-text
for doc in docs:
resp = session.post(
f'http://localhost:5001/console/api/datasets/{DATASET_ID}/document/create-by-text',
json={
"name": doc["name"],
"text": doc["text"],
"indexing_technique": "high_quality",
"process_rule": {
"mode": "automatic",
},
},
headers={'X-CSRF-Token': csrf_token},
)
status = resp.status_code
if status in (200, 201):
sys.stdout.buffer.write(f"{doc['name']} uploaded\n".encode('utf-8'))
else:
sys.stdout.buffer.write(f"{doc['name']} failed ({status}): {resp.text[:200]}\n".encode('utf-8'))
time.sleep(0.5) # rate limit
sys.stdout.buffer.write(b'\nDone!\n')
if __name__ == "__main__":
main()