收藏
原创 资管架构师 资管架构师
公募基金日常估值分析需频繁查询恒生估值、O32及行情系统数据,当前依赖技术人员编写SQL,存在响应慢、口径不统一、合规风险高等问题。本项目旨在构建基于RAG+NER+槽位架构的NL2SQL系统,让运营人员通过口语化提问快速、合规、准确的获取估值信息,提升工作效率。
业务目标:覆盖80%以上日常估值查询场景(净值、持仓、收益、风险指标),响应时间≤3秒,非技术用户可独立操作。
技术目标:NER实体识别准确率≥98%,SQL生成准确率≥96%(核心场景≥98%),支持多指标、多维度复杂查询。
合规目标:实现基金代码级细粒度权限管控,操作全程可审计,数据口径统一且可追溯,符合《证券投资基金信息披露管理办法》等监管要求。
基金净值分析(单位净值、累计净值、净值波动)、持仓结构统计(股票/债券持仓市值、行业分布、仓位占比)、收益指标计算(周/月/季度收益率、夏普比率)、份额变动查询(总份额、申购赎回份额)。
非结构化数据解析(如基金合同文本提取)、跨外部数据源关联(如宏观经济数据拼接)、无元数据支撑的自定义指标计算、超权限敏感数据查询(如客户持仓明细)。
| 数据源名称 | 核心数据表 | 数据更新频率 | 接入方式 |
|---|---|---|---|
| 恒生估值系统 | 估值表 | T+1 08:00前 | JDBC直连(只读权限) |
| 恒生O32系统 | 基金基本信息 | 变更时更新/每日更新 | O32 REST API调用 |
| 行情数据源 | 行情表 | 准实时 | FTP/行情API同步 |
| 里程碑 | 时间节点 | 核心任务 | 交付物 |
|---|---|---|---|
| M1:项目启动与需求确认 | 第1周 | 需求调研、业务口径对齐、角色分工确认、槽位与NER实体类型定义 | 需求规格说明书、项目分工清单、槽位设计清单、NER实体类型定义文档 |
| M2:数据源梳理与指标固化 | 第2-3周 | 数据源字段梳理、原子/通用派生指标穷举、元数据录入与审核 | 数据源字段清单、原子指标元数据Excel、派生指标规则清单、槽位-实体-元数据联动映射表 |
| M3:NER模型训练与槽位配置 | 第4周 | NER标注数据集构建、模型微调与部署、槽位填充规则引擎开发 | NER标注数据集、微调后NER模型、槽位填充规则引擎、NER识别接口 |
| M4:RAG知识库构建 | 第5周 | 向量数据库部署、元数据结构化处理、向量嵌入与知识库构建、检索策略优化 | 向量数据库部署文档、结构化元数据知识库、RAG检索接口 |
| M5:系统开发与集成 | 第6-9周 | 核心模块开发(元数据管理、NER识别、槽位管理、SQL组装、权限控制)、模块集成测试 | 系统源代码、模块测试报告、集成后的Web应用(测试环境) |
| M6:测试与灰度上线 | 第10-11周 | 功能/性能/合规测试、试点用户灰度使用、问题收集与优化 | 完整测试报告、灰度上线用户反馈清单、优化后的系统版本 |
| M7:全量上线与运维交接 | 第12周 | 生产环境部署、用户培训、运维手册交付、运维团队交接 | 上线报告、操作手册、运维手册、培训视频 |
| 角色 | 人数 | 核心职责 | 必备技能 |
|---|---|---|---|
| 项目负责人(业务侧) | 1 | 需求对接、业务口径确认、用户测试组织、合规审核、项目进度管控 | 熟悉公募基金估值流程、恒生系统操作、项目管理能力 |
| 算法工程师 | 1 | NER标注数据集构建、金融BERT模型微调与部署、RAG检索策略优化、槽位联动逻辑设计 | PyTorch/TensorFlow、NLP、向量数据库操作、金融领域知识 |
| 数据工程师 | 1-2 | 数据源接入、数据清洗、数据仓库构建、原子指标表同步、元数据管理 | Flink CDC、Hive/ClickHouse、JDBC、数据建模 |
| 后端开发工程师 | 1 | 核心模块开发(NER接口集成、槽位管理、SQL组装引擎、权限控制)、API开发与维护 | Spring Boot、Python FastAPI、SQLAlchemy、分布式系统开发 |
| 前端开发工程师 | 1 | Web界面开发、查询交互设计、数据可视化展示、槽位填充预览功能开发 | Vue3、ECharts、Element Plus、响应式设计 |
| 测试工程师(可选) | 1 | 测试用例设计、功能/性能/合规测试执行、Bug跟踪与回归测试 | 软件测试方法、Postman、Jmeter、SQL基础 |
| 运维工程师 | 1(兼职) | 服务器部署、系统监控、日志管理、数据备份与恢复 | Linux、Docker、数据库运维、监控工具使用 |
| 资源类型 | 配置规格 | 数量 | 用途 |
|---|---|---|---|
| 应用服务器 | 8核16GB,500GB SSD存储 | 1台 | 部署Web应用、后端服务、NER识别模块、RAG检索模块 |
| 数据服务器 | 16核32GB,1TB SSD存储 | 1台 | 部署数据仓库(ClickHouse)、向量数据库(Milvus)、MySQL元数据库 |
| GPU服务器 | 8卡A100 | 1台 | BERT模型微调推理、大模型推理等 |
| 层级 | 软件/工具选型 | 选型理由 |
|---|---|---|
| 数据层 | ClickHouse、MySQL 8.0、Milvus 2.3.x | ClickHouse支持高频查询,MySQL存储元数据,Milvus适配向量检索,均为开源工具,成本可控 |
| 计算与同步层 | Apache Flink CDC、DataX | Flink CDC实时同步增量数据,DataX全量初始化历史数据,保障数据时效性 |
| 模型层 | 中证金融BERT、通义千问Embedding API、通义千问大模型API | 金融BERT适配基金术语,商业大模型API无需算法团队维护,准确率高、部署快 |
| 应用层 | Spring Boot 2.7.x、Python FastAPI、ONNX Runtime | Java负责Web服务与权限控制,Python负责NLP与SQL生成,ONNX Runtime加速模型推理 |
| 前端层 | Vue3、Element Plus、ECharts | 轻量化开发,组件丰富,支持数据可视化,适配非技术用户操作习惯 |
| 开发与测试工具 | IntelliJ IDEA、Vue CLI、Postman、Jmeter、LabelStudio | 覆盖全流程开发测试,LabelStudio支持NER数据集标注,提升标注效率 |
系统采用分层架构设计,从上至下分为前端交互层、应用服务层、模型与检索层、数据层,各层通过API/接口联动,形成完整的数据流转链路:
前端交互层:用户输入口语化query,展示NER识别结果、槽位填充预览、SQL结果及可视化图表,支持手动编辑槽位与结果导出。
应用服务层:核心业务模块集成,包括元数据管理模块、NER实体识别模块、槽位管理模块、SQL组装引擎、权限控制模块、操作审计模块。
模型与检索层:NER模型负责实体识别,RAG知识库提供元数据检索支撑,大模型API负责补充复杂逻辑生成。
数据层:存储源数据、元数据、向量数据、审计日志,保障数据安全与可追溯。
元数据体系分为原子指标、派生指标、复合指标、维度、时间粒度5大类,均关联槽位信息,结构如下:
{ "meta_version": "v1.0", "biz_domain": "fund_valuation", "update_time": "*开通会员可解锁*", "atomic_metrics": [/* 原子指标元数据,含slot_mapping字段 */], "derived_metrics": [/* 派生指标元数据,含slot_mapping字段 */], "composite_metrics": [/* 复合指标元数据,含slot_mapping字段 */], "dimensions": [/* 维度元数据,含slot_mapping字段 */], "time_granularities": [/* 时间粒度元数据,含slot_mapping字段 */] }| 实体类型 | 定义 | 示例 | 关联槽位 |
|---|---|---|---|
| METRIC | 基金估值相关指标(原子/派生/复合) | 单位净值、月度平均股票仓位占比、夏普比率 | slot_01(指标选择槽) |
| DIMENSION | 筛选条件相关维度 | 股票型基金、金融行业、基金经理张三 | slot_03(过滤条件槽)、slot_04(分组维度槽) |
| TIME | 时间粒度或时间区间 | *开通会员可解锁*、2026年Q1、上周 | slot_03(过滤条件槽)、slot_04(分组维度槽) |
| FUND_CODE | 公募基金6位代码 | 001513、000001 | slot_03(过滤条件槽) |
| SORT_ORDER | 排序规则(升序/降序) | 升序、降序、排名前5 | slot_06(排序规则槽)、slot_07(分页限制槽) |
模型选型与微调:基础模型选用中证金融BERT,使用PyTorch框架微调,训练参数:batch_size=32,epoch=5,学习率=2e-5,采用早停策略避免过拟合。
模型部署:微调完成后导出为ONNX格式,集成到Python后端服务,提供HTTP接口,支持输入query返回实体识别结果,响应时间≤500ms。
| 槽位ID | 槽位名称 | 对应SQL子句 | 填充来源 | 填充规则 | 是否必选 | 案例值 |
|---|---|---|---|---|---|---|
| slot_01 | 指标选择槽 | SELECT | NER识别METRIC实体+元数据 | 原子指标填字段名;派生指标填聚合逻辑+别名;复合指标填运算逻辑 | 是 | AVG(unit_nav) AS avg_unit_nav_monthly, SUM(stock_holding_value)/SUM(total_asset) AS ratio_stock_position |
| slot_02 | 数据表槽 | FROM | 指标/维度元数据source_table | 自动关联指标/维度对应的源表,多表按fund_code/val_date关联,表名加别名 | 是 | t_fund_valuation t1 LEFT JOIN t_fund_base_info t2 ON t1.fund_code = t2.fund_code |
| slot_03 | 过滤条件槽 | WHERE | NER识别FUND_CODE/DIMENSION/TIME实体+元数据 | 必含fund_code过滤;维度值转枚举值;时间转标准格式(DATE_FORMAT) | 是 | t1.fund_code='001513' AND t2.fund_type_code='1' AND DATE_FORMAT(t1.val_date,'%Y-%m')='2026-01' |
| slot_04 | 分组维度槽 | GROUP BY | NER识别TIME/DIMENSION实体+元数据 | 指标含聚合函数时必填;优先按时间粒度分组,可选按维度分组 | 否(聚合指标必填) | DATE_FORMAT(t1.val_date,'%Y-%m'), t1.fund_code |
| slot_05 | 分组过滤槽 | HAVING | 用户query分组后筛选意图+元数据 | 仅筛选聚合结果时填;条件值匹配指标业务范围 | 否 | ratio_stock_position > 0.3 |
| slot_06 | 排序规则槽 | ORDER BY | NER识别SORT_ORDER实体+指标元数据 | 按指标字段排序;识别“前/后”转DESC/ASC,默认DESC | 否 | avg_unit_nav_monthly DESC |
| slot_07 | 分页限制槽 | LIMIT | NER识别SORT_ORDER实体(TopN) | 识别“前N”填N;无意图不填 | 否 | 5 |
| slot_08 | 合规过滤槽 | 隐性约束 | 合规规则配置 | 禁止查询敏感字段;必须过滤fund_code;仅允许SELECT | 是(强制约束) | 禁止SELECT客户明细字段;必须包含fund_code过滤 |
| slot_09 | 性能优化槽 | 隐性约束 | 性能规则配置 | JOIN表数≤3张;强制使用val_date分区字段;避免全表扫描 | 是(强制约束) | JOIN表数≤3张;必须使用val_date过滤 |
| slot_10 | 口径统一槽 | 隐性约束 | 元数据biz_remark | 指标计算逻辑必须匹配元数据,禁止自定义口径 | 是(强制约束) | 月度平均单位净值=AVG(unit_nav),仅统计交易日 |
填充顺序:先填充必选槽位(slot_01、slot_02、slot_03),再根据query意图填充可选槽位,隐性约束槽位(slot_08-slot_10)强制注入Prompt。
联动规则:
聚合联动:slot_01含聚合函数时,slot_04必须填充,否则自动补充分组字段(如月度指标按DATE_FORMAT(val_date,'%Y-%m')分组)。
排序联动:slot_07(LIMIT)填充时,slot_06(ORDER BY)必须填充,否则默认按第一个指标降序排序。
合规联动:slot_03未含fund_code时,自动提示用户补充,否则拒绝生成SQL。
校验规则:槽位填充完成后执行校验,包括必选槽位完整性校验、维度值有效性校验、聚合逻辑一致性校验、合规约束校验,校验失败返回明确错误提示。
将元数据、业务规则、槽位关联信息结构化为文档,存入Milvus向量数据库,单条文档结构示例:
{ "doc_id": "derived_rule_001", "doc_type": "derived_metric_rule", "metric_id": "avg_unit_nav_monthly", "metric_name": "月度平均单位净值", "metric_alias": ["月均净值"], "agg_func": "AVG(unit_nav)", "source_table": "t_fund_valuation", "source_column": "unit_nav", "slot_info": "关联slot_01:填充AVG(unit_nav) AS avg_unit_nav_monthly;关联slot_04:填充DATE_FORMAT(val_date,'%Y-%m')", "biz_remark": "每月交易日单位净值算术平均值,不含节假日", "index_keywords": ["月度平均单位净值", "月均净值", "AVG(unit_nav)", "val_date", "月度分组"] }文档结构化:将原子/派生/复合指标元数据、维度元数据、时间粒度元数据按上述格式转换为结构化文档。
向量嵌入:使用通义千问Embedding API将结构化文档转为768维向量,嵌入过程中保留文档原始信息与向量的映射关系。
索引构建:在Milvus中创建集合,采用IVF_FLAT索引类型(平衡检索速度与准确率),同时为index_keywords字段建立关键词索引。
更新机制:元数据新增/修改后,自动同步生成结构化文档,触发向量嵌入与知识库更新,更新前需经业务负责人审核。
采用“关键词检索+向量检索”混合策略,提升检索精准度:
从NER识别结果和槽位填充内容中提取关键词(如指标名称、维度值、时间粒度)。
关键词检索:匹配知识库文档的index_keywords字段,筛选出相关文档。
向量检索:将用户query转为向量,与知识库文档向量计算余弦相似度,取相似度≥0.7的Top3文档。
结果合并:合并关键词检索与向量检索结果,去重后返回给应用服务层,用于补充槽位填充规则和SQL生成约束。
SQL组装引擎基于槽位填充结果,按固定顺序拼接SQL子句,支持动态子句(无值的槽位不生成对应子句),核心流程:
读取各槽位填充内容,执行最终校验(语法预校验、合规校验)。
按“SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT”顺序拼接子句。
对拼接后的SQL进行格式化,提升可读性。
基于用户query“*开通会员可解锁*易方达消费行业股票型基金(001513)的月度平均单位净值和股票仓位占比”,槽位填充完成后,引擎拼接SQL:
SELECT AVG(t1.unit_nav) AS avg_unit_nav_monthly,SUM(t1.stock_holding_value)/SUM(t1.total_asset) AS ratio_stock_positionFROM t_fund_valuation t1LEFTJOIN t_fund_base_info t2 ON t1.fund_code = t2.fund_codeWHERE t1.fund_code = '001513'AND t2.fund_type_code = '1'ANDDATE_FORMAT(t1.val_date, '%Y-%m') = '2026-01'GROUPBYDATE_FORMAT(t1.val_date, '%Y-%m'), t1.fund_code;角色定义:分为超级管理员、业务管理员、研究员/运营人员三类角色,不同角色权限不同。
权限粒度:基于基金代码的细粒度权限,研究员/运营人员仅能查询授权范围内的基金数据,超级管理员可配置角色权限与基金代码白名单。
实现方式:采用Spring Security+JWT实现权限认证,用户登录后生成JWT令牌,请求接口时携带令牌,系统解析令牌获取角色与授权基金代码,在slot_03(过滤条件槽)中自动添加基金代码白名单过滤。
审计内容:记录所有用户操作,包括用户名、角色、操作时间、query内容、NER识别结果、槽位填充内容、生成的SQL、查询结果、响应时间。
存储与保留:审计日志存入MySQL数据库,保留6个月,满足监管要求。
审计功能:支持按用户名、时间范围、基金代码查询审计日志,支持日志导出。
数据工程师与恒生系统管理员对接,梳理三大数据源的核心数据表与关键字段,形成《数据源字段清单》,明确字段类型、关联关系、更新频率、接入方式。
业务人员主导穷举原子指标,基于数据源字段清单,筛选可量化、可分析的字段,映射为原子指标,补充名称、别名、业务口径。
穷举通用派生指标,基于日常高频查询场景,结合原子指标+聚合函数+维度筛选规则生成,明确计算逻辑。
梳理通用复合指标(如夏普比率、收益率),按行业共识口径固化计算逻辑。
将指标信息录入Excel模板,补充槽位关联信息,提交业务负责人审核,审核通过后形成《原子指标元数据清单》《派生指标规则清单》。
算法工程师与业务人员协同,编制《槽位-实体-元数据联动映射表》,明确每个槽位对应的NER实体类型、关联元数据、填充规则,为后续NER识别与槽位填充提供依据。
算法工程师收集1000+公募基金真实查询语句,使用LabelStudio进行实体标注,标注完成后划分训练集(80%)、验证集(10%)、测试集(10%)。
基于金融BERT模型,使用训练集微调模型,通过验证集监控模型性能,采用早停策略避免过拟合。
使用测试集评估模型性能,要求NER识别准确率≥98%,若未达标,补充标注数据重新微调。
将微调后的模型导出为ONNX格式,部署到应用服务器,开发HTTP接口,支持实时实体识别。
后端开发工程师基于《槽位-实体-元数据联动映射表》,开发槽位填充规则引擎,实现实体自动填充、规则校验、槽位联动功能,开发完成后进行单元测试。
数据工程师在数据服务器部署Milvus向量数据库,配置集合参数(如维度768、索引类型IVF_FLAT),优化检索性能。
数据工程师将审核通过的元数据(原子/派生/复合指标、维度、时间粒度)转换为结构化文档,补充slot_info、index_keywords字段。
调用通义千问Embedding API,将结构化文档转为向量,存入Milvus向量数据库,建立文档与向量的映射关系。
算法工程师开发“关键词检索+向量检索”混合检索接口,优化检索参数(如相似度阈值0.7),测试接口检索准确率与响应时间,要求响应时间≤1秒。
元数据管理模块:Spring Boot开发,支持元数据录入、编辑、审核、查询、导出,关联MySQL元数据库。
NER实体识别模块:Python FastAPI开发,集成NER模型ONNX文件,提供实体识别接口。
槽位管理模块:Python开发,集成槽位填充规则引擎,实现实体填充、校验、联动功能。
SQL组装引擎:Python开发,基于槽位填充结果拼接SQL,支持动态子句与SQL格式化。
权限控制模块:Spring Security+JWT开发,实现用户登录、角色认证、基金代码权限管控。
操作审计模块:Spring Boot开发,记录用户操作日志,支持日志查询与导出。
前端模块:Vue3开发,包括query输入框、NER识别结果展示、槽位填充预览、SQL结果展示、数据可视化、Excel导出功能。
将各模块集成到Web应用,实现“用户输入query→NER识别→槽位填充→RAG检索→SQL组装→校验执行→结果展示”全链路联动。
进行集成测试,验证各模块接口调用正常、数据流转准确,修复集成过程中的Bug。
| 测试类型 | 测试内容 | 测试方法 | 合格标准 |
|---|---|---|---|
| 功能测试 | 指标识别、槽位填充、SQL生成、权限控制、审计日志 | 黑盒测试,执行测试用例 | 功能正常,SQL生成准确率≥96%,权限控制有效 |
| 性能测试 | 响应时间、并发能力、检索速度 | Jmeter压测,模拟100人并发查询 | 单query响应时间≤3秒,并发无超时,检索速度≤1秒 |
| 合规测试 | 敏感数据查询、基金代码权限、审计日志完整性 | 模拟超权限查询、敏感数据查询 | 拒绝超权限/敏感查询,审计日志完整可追溯 |
| 兼容性测试 | 不同浏览器(Chrome/Firefox/Edge)、不同设备(PC/手机) | 多环境测试 | 界面正常,功能可用 |
微信扫一扫关注该公众号
继续滑动看下一个