news 2026/7/14 4:26:06

# 【项目实战】智能问数金融平台:FastAPI+Vue3+大模型RAG全栈实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
# 【项目实战】智能问数金融平台:FastAPI+Vue3+大模型RAG全栈实现

该项目为完整的**智能问数金融平台*。这个项目不仅涵盖了传统的金融数据处理与量化分析,还创新性地融入了大语言模型与RAG检索增强技术,实现了"自然语言对话式投研"的交互体验。

本文将从架构设计、核心模块实现、关键技术难点三个维度,完整复盘这个项目的开发过程。文末附项目结构与核心代码,建议收藏。

> **项目技术栈**:FastAPI + SQLite + Vue3 + Element Plus + ECharts + scikit-learn + DeepSeek API + FAISS向量检索

---

## 🏗️ 一、整体架构设计

### 1.2 核心功能模块

1.2.1 功能说明
意图识别引擎:自然语言解析用户提问,提取股票代码、行业、年份等参数 | 正则匹配 + 关键词置信度评分
函数调用调度:根据意图自动调用对应分析函数,返回结构化结果 | 反射机制 + 模板化回复
智能对话:结合数据分析结果,调用大模型生成专业解读,DeepSeek API + Function Call思想
RAG知识库: 金融知识向量检索,增强问答准确性,sentence-transformers + FAISS
量化选股:多条件财务指标筛选,ROE、PE、PB、净利润增长, Pandas条件过滤 + 排序
风险评估:波动率、最大回撤、夏普比率等风险指标计算 | NumPy滚动窗口统计
策略回测:均线策略、动量策略历史回测 | 向量化回测框架 |
机器学习预测: 7种分类模型股价涨跌预测 | scikit-learn集成 |
数据上传:支持CSV/Excel/JSON等多格式数据导入 | python-multipart + Pandas

二、核心模块深度解析

2.1 意图识别引擎(IntentEngine)

这是整个智能对话的"大脑入口"。用户输入自然语言后,系统需要先识别用户想做什么,再提取关键参数。

设计思路:
-预定义10+种意图(市场分析、个股分析、行业分析、风险评估、财务分析、智能选股等)
-每种意图配置patterns关键词、params参数列表、examples示例
-通过关键词命中数 + 参数匹配度计算置信度
-取置信度最高且超过阈值的意图作为匹配结果

def match_intent(self, query: str) -> Optional[Dict[str, Any]]: results = [] for intent in self.intents: confidence = 0 # 1. 关键词模式匹配 for pattern in intent['patterns']: if pattern in query: confidence += 1 # 2. 参数匹配加权 if 'stock_code' in intent['params']: if re.search(r'(\d{6})', query): confidence += 0.5 # 3. 归一化置信度 if confidence > 0: max_score = len(intent['patterns']) + 2 confidence = min(confidence / max_score, 1.0) results.append({ 'intent_id': intent['intent_id'], 'function': intent['function'], 'params': self.extract_params(query, intent['params']), 'confidence': confidence }) # 返回最佳匹配 if results: best_match = max(results, key=lambda x: x['confidence']) return best_match if best_match['confidence'] >= 0.2 else None return None

参数提取亮点:支持股票代码(6位数字)、股票名称(中文2-6字排除词表)、行业名称、年份、筛选条件(ROE>15、PE<20等)的智能提取。

2.2 函数调用调度器(FunctionCaller)

借鉴大模型Function Call的思想,但用纯Python实现了轻量版。识别到意图后,自动映射到对应分析函数:

# chat.py 核心调度逻辑 intent_result = intent_engine.match_intent(user_query) if intent_result: # 通过函数名反射调用 func_name = intent_result['function'].split('.')[-1] func = getattr(function_caller, func_name, None) if func: result = func(intent_result['params']) # 模板化组装回复 template = intent_engine.response_templates.get(intent_result['intent_id']) reply = template.format(**result) if template else str(result) ``` FunctionCaller类封装了十余种分析方法: - `analyze_market()` - 大盘概览、涨跌榜 - `analyze_stock()` - 个股技术指标(MA5/MA20、波动率、MACD、布林带) - `analyze_industry()` - 行业成分股排名 - `analyze_finance()` - 财务报表分析(营收、净利润、ROE趋势) - `risk_evaluation()` - 风险评估(VaR、夏普比率、最大回撤) - `stock_picker()` - 多条件选股 - `backtest_strategy()` - 策略回测 - `predict_price()

2.3 AI + 数据双引擎对话模式

这是项目最有特色的设计——**两种对话模式**:

模式一:基础模式(Basic)
- 纯规则引擎驱动,速度快、确定性高
- 直接返回结构化数据分析结果
- 适合明确的查询需求,如"分析股票000001"

模式二:AI增强模式(AI)
- 先通过意图识别+函数调用拿到真实数据
- 再把数据作为上下文喂给大模型
- 大模型结合数据生成专业、自然的解读和投资建议```python

# AI模式核心流程 data_summary = f"【数据分析结果】\n{function_reply}\n\n" context_prompt = f"""你是专业的金融数据分析助手。 以下是基于数据库查询得到的实际数据分析结果, 请结合这些数据,用专业、易懂的自然语言回答用户的问题,并给出投资建议。 {data_summary}""" ai = AIService(api_key, api_base) ai_reply = ai.chat_completion(messages)

这种设计的优势:大模型不编造数据,所有数字都来自真实数据库查询, hallucination大幅降低。

2.4 机器学习建模模块

集成了7种经典分类模型用于股价涨跌预测:

| 模型 | 适用场景 | 特点 |
|------|---------|------|
| RandomForest | 主力模型 | 抗过拟合、特征重要性可解释 |
| GradientBoosting | 高精度 | 逐步拟合残差,通常准确率最高 |
| LogisticRegression | 基线模型 | 速度快、可解释性强 |
| AdaBoost | 集成学习 | 弱分类器叠加 |
| DecisionTree | 单模型 | 直观易理解 |
| SVM | 非线性分类 | 高维空间效果好 |
| KNN | 距离-based | 简单直观 |

特征工程:使用前N日收盘价作为滞后特征(lag_1 ~ lag_5),预测次日涨跌方向(二分类)。

def prepare_features(self, df, target_col='close', look_back=5): result = df.copy() for i in range(1, look_back + 1): result[f'lag_{i}'] = result['close'].shift(i) result['target'] = (result[target_col].shift(-1) > result[target_col]).astype(int) return result.dropna()

模型训练后自动保存为joblib文件,支持在线预测和特征重要性分析。

2.5 数据处理流水线

DataProcessor类提供完整的数据分析工具链:

数据清洗:去重 + 前后填充 + Z-score异常值剔除(3σ原则)
指标计算:日收益率、累计收益、波动率、MA5/10/20/60、MACD、布林带
特征选择:SelectKBest + F检验
显著性检验:单因素方差分析(ANOVA)
数据归一化:StandardScaler / MinMaxScaler
相关性分析:Pearson相关系数
时间重采样:日K转周K/月K

💾 三、数据库设计

使用SQLite作为轻量级存储,数据表设计如下:
--股票交易数据表(核心)
CREATE TABLE trade_data (
id INTEGER PRIMARY KEY AUTOINCREMENT,
trade_date TEXT, ts_code TEXT,
open REAL, high REAL, low REAL, close REAL,
pct_chg REAL, vol REAL, amount REAL,
year INTEGER, month INTEGER, day INTEGER
);

-- 财务数据表
CREATE TABLE fin_data (
id INTEGER PRIMARY KEY AUTOINCREMENT,
stock_code TEXT, year INTEGER,
revenue REAL, net_profit REAL, roe REAL
);

-- 股票基本信息
CREATE TABLE stock_basic (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ts_code TEXT, name TEXT, industry TEXT, market TEXT
);

-- 申万行业分类
CREATE TABLE industry_info (
id INTEGER PRIMARY KEY AUTOINCREMENT,
stock_code TEXT, company_short TEXT, industry_level1 TEXT
);

-- 用户系统
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

数据规模:
- 交易数据:478万+条(覆盖2023-2025年复权数据)
- 财务数据:7年(2018-2024)年度财务指标
- 股票基本信息:全A股上市公司
- 行业分类:申万一级行业完整映射

🎨 4、前端技术实现

4.1 技术选型

框架:Vue 3 + Vite
UI组件库:Element Plus
图表库:ECharts(vue-echarts封装)
状态管理:Pinia
路由:Vue Router
HTTP请求:Axios

4.2 核心页面

1. 数据看板页:市场概览 + 涨跌榜 + 行业热力图
2. 智能对话*:聊天式交互 + 快捷功能标签 + 图表自动渲染
3. 选股回测页:条件筛选器 + 回测结果可视化
4. 风险分析页:风险指标仪表盘 + 持仓分析
5. 数据管理页:文件上传 + 数据表预览 + 数据导入导出

### 4.3 智能对话的图表自动渲染

前端收到后端返回的`chart_data`(ECharts option格式)后,直接动态渲染:

// 自动检测并渲染图表 if (response.data && response.data.chart_data) { this.chartOption = response.data.chart_data this.showChart = true

实现了"问一句话,自动出图"的交互效果。

五、关键技术难点与解决方案

难点1:自然语言参数提取的准确性

问题:用户输入五花八门,如"帮我看看贵州茅台最近怎么样"、"ROE大于15的银行股有哪些"。

方案:
- 股票代码:正则`\d{6}`精确匹配
- 股票名称:中文2-6字 + 排除词表过滤(分析、查看、风险等常用词)
- 条件参数:针对ROE/PE/PB/净利润分别设计正则模式,如`ROE\s*[大于超过]\s*(\d+)`
- 行业匹配:从预定义行业关键词表中遍历匹配

难点2:大模型回答的数据真实性

问题:直接让大模型回答金融问题容易编造数据。

方案:采用**检索-生成**两阶段架构:
1. 先用规则引擎从数据库查出真实数据
2. 再把数据作为上下文prompt喂给大模型
3. 要求大模型只能基于提供的数据作答

难点3:多格式数据上传与导入

问题:用户可能上传CSV、Excel、JSON等不同格式,字段名也不统一。

方案:DataLoader封装统一加载接口,自动识别格式:

@staticmethod def load(file_path, format=None): if format is None: ext = os.path.splitext(file_path)[1].lower() format = ext.lstrip('.') if format in ['csv']: return pd.read_csv(file_path) elif format in ['xlsx', 'xls']: return pd.read_excel(file_path) elif format == 'json': return pd.read_json(file_path) # ... 支持parquet、feather、sqlite等

难点4:SQLite多线程安全

问题:FastAPI异步环境下SQLite连接容易报错。

方案:创建连接时设置`check_same_thread=False`,所有写操作通过单例串行化处理。

📁 六、项目目录结构

```
project/
├── backend/ # 后端服务
│ ├── app.py # FastAPI主入口
│ ├── config.py # 配置文件
│ ├── database.py # 数据库操作
│ ├── requirements.txt # Python依赖
│ ├── user_behavior.json # 意图配置文件
│ ├── modules/ # 核心模块
│ │ ├── intent_engine.py # 意图识别引擎
│ │ ├── function_caller.py # 函数调用调度器
│ │ ├── ai_service.py # AI服务 + RAG系统
│ │ ├── data_processing.py # 数据处理流水线
│ │ ├── model_building.py # 机器学习建模
│ │ ├── data_loader.py # 多格式数据加载
│ │ └── knowledge_base.py # 向量知识库
│ ├── routers/ # API路由
│ │ ├── auth.py # 用户认证
│ │ ├── chat.py # 智能对话
│ │ ├── market.py # 市场数据
│ │ ├── stock.py # 个股数据
│ │ ├── industry.py # 行业数据
│ │ ├── picker.py # 选股
│ │ ├── backtest.py # 回测
│ │ ├── risk.py # 风险评估
│ │ ├── data.py # 数据查询
│ │ └── data_upload.py # 数据上传
│ └── 数据/ # 数据文件目录

├── frontend/ # 前端项目
│ ├── src/
│ ├── package.json
│ └── vite.config.js

└── data/ # 数据目录
├── raw/
└── processed/
```

🚀 七、快速启动

后端启动

```bash
cd backend
pip install -r requirements.txt
uvicorn app:app --reload --port 8000
```

前端启动

```bash
cd frontend
npm install
npm run dev
```

启动后访问 `http://localhost:5173` 即可使用。

📊 八、效果展示

(一)整体布局

系统采用创新的"对话主界面+悬浮工具抽屉"布局。左侧为聊天侧边栏,占据主要屏幕空间,是用户与系统交互的核心区域;右下角设置悬浮按钮,点击后从右侧滑出工具抽屉,包含数据可视化、数据上传、数据预览三个标签页。这种布局设计保证了对话的沉浸感,同时将辅助工具收纳在抽屉中,需要时随时呼出,不干扰主交互流程。整体界面简洁高效,符合对话式产品的使用习惯。

(二)登录页面

登录页面采用居中卡片式设计,包含用户名、密码输入框与登录、注册切换标签页。页面背景采用简洁的渐变设计,突出登录表单主体。表单校验采用Element Plus的表单验证机制,对输入格式进行实时校验。登录成功后JWT令牌存储在Pinia状态管理与localStorage中,自动跳转到系统聊天主页。密码采用bcrypt哈希存储,确保用户账号安全。

(三)AI对话主页面

智能对话页面是系统的核心交互入口,采用类ChatGPT的聊天式交互设计。左侧为对话历史区域,右侧为主聊天区。用户可以用自然语言描述分析需求,系统通过意图识别引擎自动解析用户意图,调用对应的数据计算函数,并以自然语言回复结果。支持基础模式(仅意图识别+函数调用)与AI增强模式(大模型专业解读)两种对话模式切换。对话中涉及的数据分析结果会自动同步到右侧可视化抽屉中展示图表。

(四)数据可视化抽屉

数据可视化抽屉从右侧滑出,采用标签页设计分为三个功能区。数据可视化标签页展示分析结果图表,基于ECharts实现,支持折线图、柱状图、K线图等多种图表类型,支持缩放、悬停查看详情等交互操作。当用户通过对话触发数据分析时,图表数据自动更新并展示,实现"对话提问→数据计算→图表展示"的流畅体验。用户也可以手动打开抽屉查看历史分析结果数据上传功能位于工具抽屉的第二个标签页,支持拖拽上传与点击上传两种方式。支持CSV、Excel(.xlsx/.xls)、JSON、Parquet、Feather等多种数据格式,单文件限制100MB。上传前显示文件列表与基本信息,上传后系统自动解析文件结构并导入数据库。已上传文件列表展示文件名、行数、列数等信息,支持预览查看与删除操作,方便用户管理自有数据。

(六)数据预览模块

数据预览功能位于工具抽屉的第三个标签页,用户可通过下拉选择器选择数据库中的任意数据表,系统以分页表格形式展示数据内容。表格支持列宽自适应、内容悬浮提示等功能,方便用户快速浏览数据。这一功能帮助用户确认数据质量、检查字段完整性,为后续的数据分析做好准备。

(七)用户偏好设置页面

用户偏好设置页面提供个性化配置功能,包括主题切换(亮色/暗色)、默认聊天模式(基础/AI增强)、偏好行业设置、默认股票设置、图表类型偏好等。用户设置保存在数据库中,下次登录自动加载,打造个性化的使用体验。系统还提供独立的数据预览页面与偏好设置页面入口,方便用户集中管理。

智能对话示例

> **用户**:分析股票000001
>
> **系统**:
> - 股票代码:000001.SZ 平安银行
> - 最新价格:12.35元
> - 5日均线:12.28,20日均线:12.15
> - 年化波动率:18.56%
> - 技术面:短期均线上穿长期均线,呈多头排列
>
> **AI解读:平安银行近期走势偏强,均线系统呈现多头排列态势,短期动能充足。波动率处于行业中等水平,风险可控。建议关注成交量配合情况,若放量突破前高可考虑加仓……

智能选股示例

> 用户:筛选ROE大于15且市盈率小于20的股票
>
> 系统:共筛选出 23 只符合条件的股票,TOP5:
> 1. 招商银行 - ROE: 16.8%, PE: 8.5
> 2. 宁波银行 - ROE: 17.2%, PE: 9.1
> 3. ...

💡 九、项目亮点与创新点

1. 意图识别+函数调用的轻量Agent架构:不依赖大模型Function Call也能实现工具调用,成本低、速度快
2. 数据+AI双引擎:规则保证数据准确,大模型负责自然语言解读,兼顾准确性与体验
3. RAG知识库增强:FAISS向量检索 + sentence-transformers编码,金融知识问答更专业
4. 7种机器学习模型集成:开箱即用的量化建模能力,支持特征重要性分析
5. 完整的数据工程流水线:清洗、指标计算、特征选择、显著性检验一站式
6. 多格式数据导入:支持CSV/Excel/JSON/Parquet等7种格式
7. **前后端分离架构**:FastAPI + Vue3,接口清晰,易于扩展

🎯 十、总结与展望

这个项目作为数据分析实训项目,完整覆盖了**数据采集→数据清洗→特征工程→建模分析→可视化展示→产品化交付**的全链路。

后续可优化方向:
接入真实行情API,实现数据实时更新,并引入LSTM/Transformer等深度学习模型提升预测精度,增加更多量化策略(因子选股、套利策略等),优化意图识别为基于Embedding的语义匹配,和接入更多数据源(新闻、舆情、宏观数据),同时部署上线,支持多用户并发访问

十一、视频展示

智能问数--金融数据挖掘平台视频-1

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 4:24:50

作品集:一份可视化的能力档案

一、为什么需要作品集&#xff1f;一个场景让你秒懂想象两个应聘者同时面试同一家公司的运营岗位&#xff1a;A同学的简历上写着&#xff1a;“负责公众号运营&#xff0c;撰写原创文章&#xff0c;分析用户数据&#xff0c;策划线上活动&#xff0c;粉丝增长显著。”B同学除了…

作者头像 李华
网站建设 2026/7/14 4:21:52

告别反射:xLua实现C#与Lua高性能数据互传的实战指南

1. 项目概述&#xff1a;为什么我们需要告别反射&#xff1f;在Unity游戏开发里&#xff0c;C#和Lua的交互是个老生常谈但又绕不开的话题。尤其是做热更新&#xff0c;Lua脚本的灵活性与C#引擎的强大性能结合&#xff0c;几乎是现代手游的标配方案。但一提到数据互传&#xff0…

作者头像 李华
网站建设 2026/7/14 4:20:52

A2A协议与Agent互操作-Task生命周期

A2A 协议与 Agent 互操作 Task 生命周期 &#x1f3e0; 返回 07-README &#xff5c; ⬅️ 13-跨语言混合栈 &#xff5c; ➡️ 15-MCP生产宿主 定位&#xff1a;Agent↔Agent 任务委托 的 Staff 专章——Task 生命周期、JSON-RPC/SSE、与 MCP/gRPC 分工。机制散见 04 8、05 A…

作者头像 李华
网站建设 2026/7/14 4:20:21

抖音批量下载神器:5步轻松构建你的个人素材库

抖音批量下载神器&#xff1a;5步轻松构建你的个人素材库 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音…

作者头像 李华
网站建设 2026/7/14 4:19:18

从Blender到Carla:自定义车辆模型导入与集成全流程指南

1. 项目概述&#xff1a;为什么需要自定义车辆模型&#xff1f;在自动驾驶仿真领域&#xff0c;Carla已经成为了一个绕不开的名字。它是一个基于虚幻引擎&#xff08;Unreal Engine&#xff0c; 简称UE&#xff09;构建的开源模拟器&#xff0c;专门为自动驾驶系统的开发、训练…

作者头像 李华
网站建设 2026/7/14 4:18:20

Unity游戏性能优化全流程建设:从规范到监控的实战指南

1. 项目概述&#xff1a;为什么Unity性能优化需要“全流程”&#xff1f;做Unity游戏开发&#xff0c;尤其是中大型项目&#xff0c;性能问题从来都不是一个“后期修修补补”就能搞定的事情。我见过太多团队&#xff0c;项目上线前三个月才开始疯狂优化&#xff0c;美术返工、代…

作者头像 李华