73 lines
2.2 KiB
Python
73 lines
2.2 KiB
Python
"""保司小册子解析 — 调用 LLM 提取产品规则。"""
|
||
import json
|
||
import logging
|
||
from insurance.ppt.llm_client import llm_client
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
MANUAL_PARSE_PROMPT = """请从以下保险产品手册中提取产品规则和卖点信息。
|
||
|
||
要求输出 JSON 格式(不要包含 markdown 代码块标记):
|
||
{
|
||
"product_name": "产品名称",
|
||
"features": [
|
||
{"code": "唯一编码", "title": "卖点标题", "summary": "一句话描述"}
|
||
],
|
||
"currency_options": ["USD", "HKD"],
|
||
"coverage_highlights": ["保障亮点1", "保障亮点2"]
|
||
}
|
||
|
||
注意:
|
||
- features 列表提取 3-8 个核心卖点
|
||
- currency_options 提取支持的货币选项
|
||
- coverage_highlights 提取 3-5 个保障亮点
|
||
- 所有内容必须基于原文,不得虚构
|
||
"""
|
||
|
||
|
||
async def parse_manual_pdf(filepath: str) -> dict:
|
||
"""解析小册子 PDF,提取产品规则。
|
||
|
||
参数:
|
||
filepath: PDF 文件路径
|
||
|
||
返回:
|
||
解析后的结构化 JSON
|
||
"""
|
||
# 提取 PDF 文本
|
||
from insurance.ppt.extraction import _extract_pdf_text
|
||
text = _extract_pdf_text(filepath)
|
||
if not text:
|
||
raise ValueError("无法提取 PDF 文本")
|
||
|
||
# 截取前 8000 字符避免 token 超限
|
||
text = text[:8000]
|
||
|
||
user_prompt = f"以下是保险产品手册内容:\n\n{text}"
|
||
|
||
result, _response = await llm_client.structured_output(
|
||
user_prompt,
|
||
MANUAL_PARSE_PROMPT,
|
||
schema={
|
||
"type": "object",
|
||
"properties": {
|
||
"product_name": {"type": "string"},
|
||
"features": {
|
||
"type": "array",
|
||
"items": {
|
||
"type": "object",
|
||
"properties": {
|
||
"code": {"type": "string"},
|
||
"title": {"type": "string"},
|
||
"summary": {"type": "string"},
|
||
},
|
||
},
|
||
},
|
||
"currency_options": {"type": "array", "items": {"type": "string"}},
|
||
"coverage_highlights": {"type": "array", "items": {"type": "string"}},
|
||
},
|
||
"required": ["product_name", "features"],
|
||
},
|
||
)
|
||
return result
|