# 智能体项目:【报告仿写】技术路线总结
# 整体架构
这是一个基于LangChain框架的链式AI处理系统,主要用于电力行业报告的智能仿写生成或仅换数。系统采用链式流水线处理模式,将复杂的报告生成任务分解为多个独立的处理环节执行。
# 核心设计理念
模块化设计:每个chain负责特定的功能,通过RunnableLambda进行连接
数据流转:通过标准化的数据格式在chain之间传递信息
异步处理:支持并发执行提高效率
模拟数据支持:内置模拟数据用于测试和演示
# 主要Chain功能分析
# 1. get_meta_chain_by_ways - 元数据提取链
功能:提取原始段落的基准信息
提取报告区域(如"安徽省")
提取报告周期类型(如"旬度"、"月度")
提取时间范围(如"2025年6月上旬")
获取数据库表结构信息
# 2. task1_chain - 指标提取链
功能:从原文段落中提取数据指标规范
分析段落内容,识别需要查询的数据指标
生成标准化的指标描述表格
输出格式:markdown表格形式的指标清单
# 3. task2_chain - 智能问数生成链
功能:根据提取的指标生成智能问数自然语言问句
将指标转换为可查询的自然语言问题
生成结构化的查询清单
为后续的数据查询做准备
# 4. run_elc_service - 智能问数执行链
功能:调用智能问数业务接口获取实际数据
并发执行多个智能问数请求
调用ElecAskReportService服务
将查询结果转换为结构化数据
支持异步并发处理提高效率
# 5. task3_chain - 仿写生成链
功能:使用获取的数据进行段落仿写
结合原始段落模板和查询到的数据
生成新的报告段落内容
输出格式:包含仿写结果和结构化数据
# 6. task4_huanshu_chain - 换数生成链
功能:替换原文中的具体数值
保持原文结构不变
仅替换数据指标的具体数值
适用于数据更新场景
# 主链配置
# 仿写方案主链(task_type=1)
main_chain = ( get_meta_chain_by_ways
| task1_chain
| map_task1_to_task2_output
| task2_chain
| run_elc_service_sync
| task3_chain )
# 换数方案主链(task_type=2)
main_chain_huanshu = ( get_meta_chain_by_ways
| task1_chain
| map_task1_to_task2_output
| task2_chain
| run_elc_service_sync
| task4_huanshu_chain )
# 数据处理流程
输入处理:接收报告标题、段落内容、区域信息等
元数据提取:确定查询的基准信息
指标识别:从段落中提取需要查询的数据指标
查询生成:将指标转换为智能问数查询
数据获取:并发执行查询获取实际数据
内容生成:根据数据生成新的报告内容
结果输出:返回仿写/换数后的段落和结构化数据
# 技术特点
可扩展性:通过chain组合支持不同的处理方案
性能优化:支持异步并发处理
错误处理:完善的异常捕获和日志记录
数据溯源:保留完整的处理过程和数据来源
模拟支持:内置模拟数据便于测试和演示
# run_elc_service方法中大模型调用流程详解
# 1. chain_template_devider_chain - 智能问数清单拆分链
功能:将task2生成的智能问数清单拆分为独立的查询单元
输入:task2生成的markdown表格格式的智能问数清单
| 指标名称 | 地区维度 | 时间维度 | 行业维度 | 口径 | 智能问数自然语言问句 |
|---|---|---|---|---|---|
| 电量同比 | 安徽省 | 2025年6月 | 制造业 | 售电 | 安徽省制造业2025年6月电量同比增速是多少? |
| 电量环比 | 安徽省 | 2025年6月 | 制造业 | 售电 | 安徽省制造业2025年6月电量环比增速是多少? |
输出:JSON数组格式的独立查询单元
[
"```markdown\n| 指标名称 | 地区维度 | 时间维度 | 行业维度 | 口径 | 智能问数自然语言问句 |\n|---------|---------|---------|---------|-----|-------------------|\n| 电量同比 | 安徽省 | 2025年6月 | 制造业 | 售电 | 安徽省制造业2025年6月电量同比增速是多少? |\n```",
"```markdown\n| 指标名称 | 地区维度 | 时间维度 | 行业维度 | 口径 | 智能问数自然语言问句 |\n|---------|---------|---------|---------|-----|-------------------|\n| 电量环比 | 安徽省 | 2025年6月 | 制造业 | 售电 | 安徽省制造业2025年6月电量环比增速是多少? |\n```"
]
大模型作用:
解析markdown表格结构
将多行指标拆分为独立的查询单元
确保每个查询单元包含完整的表头信息
输出标准化的JSON数组格式
# 2. ElecAskReportService.askForReport - 智能问数服务链
功能:对每个独立的查询单元执行完整的智能问数流程
内部调用的大模型链:
# 2.1 意图识别链 (input_chain)
功能:识别用户查询的意图类型
输入:自然语言查询(如"安徽省制造业2025年6月电量同比增速是多少?")
输出:意图分类结果(1-5,对应不同的处理模式)
"1": 通用SQL生成
"2": 外贸企业部门电量分析
"3": 外贸企业电量分析
"4": 业扩电量分析
"5": 营业户数指标分析
# 2.2 SQL生成链 (根据意图选择对应的chain)
功能:根据自然语言查询生成对应的SQL语句
输入:自然语言查询 + 表结构信息
输出:标准化的SQL查询语句
SELECT total_eq_yoy, org_name, ind_cls_name, stat_date
FROM hs_dianliang_indicator_result_month
WHERE is_deleted = 1
AND (org_name LIKE '%安徽省%' OR org_short_name LIKE '%安徽省%')
AND stat_date = '2025-06'
AND ind_cls_name LIKE '%制造业%'
# 2.3 结构化结果处理链 (sql_chain_simplified_results)
功能:将SQL查询结果转换为结构化的markdown表格
输入:SQL查询结果 + 原始SQL + 表结构
输出:标准化的markdown表格
| 指标名称 | 地区维度 | 时间维度 | 行业维度 | 口径 | 数据值 | 对应表名 | 对应字段名 | 源表名 | 数据类型 | 加工算法逻辑 | 说明 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 电量同比 | 安徽省 | 2025年6月 | 制造业 | 售电 | -12.5% | hs_dianliang_indicator_result_month | total_eq_yoy | hs_dianliang_indicator_result_day | 原始数据 | 聚合 | 同比增速为负 |
# 3. 并发处理机制
设计理念:为了提高效率,系统采用异步并发处理多个智能问数请求
实现方式:
# 并发执行所有智能问数请求
async def process_single_ask(askItem):
"""处理单个智能问数请求"""
# 在线程池中执行同步的askForReport方法
result = await loop.run_in_executor(
None,
lambda: self.elc_service.askForReport(askItem, stream=False, use_simplified_results=True)
)
return {
"polished": result["polished"],
"jsonArray": result.get("jsonArray", [])
}
# 并发执行
tasks = [process_single_ask(askItem) for askItem in askList]
results = await asyncio.gather(*tasks, return_exceptions=True)
# 4. 数据流转和整合
数据收集:
收集所有并发查询的结果
提取结构化数据(markdown表格和JSON数组)
处理异常情况,确保系统稳定性
数据整合:
# 合并所有结果
askResultList = [] # 保存所有查询的markdown表格结果
askJsonArrayList = [] # 保存所有查询的结构化JSON结果
# 转换为最终输出格式
result = {
"jsonArray": markdownTable or askJsonArrayList, # 结构化JSON数组
"paragraph_to_imitate": self.reportGenChainModel.paragraphStr, # 原始段落
"table_data": askResultList, # 所有查询的markdown表格结果
}
# 5. 技术特点总结
多层大模型调用:
拆分层:将复杂查询拆分为独立单元
意图识别层:确定查询类型和处理策略
SQL生成层:将自然语言转换为SQL
结构化处理层:将查询结果标准化
性能优化:
异步并发处理多个查询
线程池执行同步操作
异常处理和容错机制
数据标准化:
统一的markdown表格格式
结构化的JSON数据输出
完整的数据溯源信息