基于RAG的金融问答平台¶
约 4081 个字 预计阅读时间 13 分钟
金融领域的知识检索效率低、回答准确性不足,是 LLM 落地时常见的痛点。检索增强生成(RAG) 通过在生成前从外部知识库检索相关上下文,将大模型的推理能力与领域知识绑定,是缓解幻觉、提升可解释性的主流路线之一。
本项目从 RAGAS 源码阅读出发,逐步搭建起一套面向金融场景的前后端分离 RAG 应用平台,并集成基于 RAGAS 的自动化评估与多轮优化能力。
1. 背景与目标¶
1.1 问题背景¶
金融领域知识来源分散——教材、研报、财经新闻、监管公告、行情数据等格式各异,且对时效性与事实准确性要求高。单纯依赖大模型参数记忆,容易出现过时信息、张冠李戴或无法溯源等问题。
RAG 的标准流程可概括为:
-
索引:采集文档 → 清洗分块 → 向量化 → 写入向量库;
-
检索:将用户问题编码,在向量库中召回 Top-K 相关片段;
-
生成:将检索结果与用户问题一并送入 LLM,生成有据可查的回答。
本项目要求在理解 RAG 评估方法论的基础上,完成一个可交互、可评估、可迭代的完整工程系统。
1.2 核心目标¶
-
搭建面向金融场景的多源知识库与 RAG 问答应用;
-
实现前后端分离的 RESTful 服务,支持多轮对话与参考来源展示;
-
集成 RAGAS 评估框架,支持多轮评估任务管理与指标可视化;
-
完成检索链路与数据工程的系统性优化,提升问答准确率与可解释性。
1.3 迭代概览¶
| 迭代 | 主题 | 主要产出 |
|---|---|---|
| 迭代一 | RAGAS 源码阅读与指标复现 | 模块阅读报告、UML 类图、非 LLM 指标复现代码 |
| 迭代二 | 平台搭建与金融 RAG 应用 | RAG 问答应用、RAG 评估平台、Prompt 评估平台 |
| 迭代三 | 产品化与 RAG 优化 | 知识库可视化管理、检索优化、报告生成、测试基准集 |
2. 系统架构¶
2.1 总体架构¶
系统采用前后端分离架构,后端以 Flask 为统一入口,注册四个 Blueprint 模块;前端以 Vue 3 单页应用承载四大功能板块。
┌─────────────────────────────────────────────────────────┐
│ Vue 3 + Vite 前端 │
│ ┌──────────┬──────────────┬───────────┬──────────────┐ │
│ │ RAG 问答 │ 知识库管理 │ RAG 评估 │ Prompt 评估 │ │
│ └────┬─────┴──────┬───────┴─────┬─────┴──────┬───────┘ │
└───────┼────────────┼─────────────┼────────────┼─────────┘
│ RESTful API (Flask + CORS) │
┌───────┼────────────┼─────────────┼────────────┼─────────┐
│ ▼ ▼ ▼ ▼ │
│ rag_app rag_visualization rag_eval prompt_eval │
│ (问答/报告) (知识库管理) (RAGAS) (Prompt) │
└───────┬────────────┬─────────────┬────────────┬─────────┘
│ │ │ │
▼ ▼ ▼ ▼
SQLite FAISS SQLite SQLite
(对话记录) (向量知识库) (评估任务) (Prompt任务)
│ │ │ │
└────────────┼─────────────┴─────────────┘
▼
LangChain Pipeline
检索 → 重排序 → GLM-4-Flash 生成
2.2 技术栈¶
| 层次 | 技术选型 | 说明 |
|---|---|---|
| 前端 | Vue 3、Vite、Element Plus、Pinia、ECharts、Axios | 对话 UI、知识库浏览、评估结果可视化 |
| 后端 | Flask、Flask-SQLAlchemy、Flask-CORS | RESTful API,多库 SQLite 持久化 |
| RAG 框架 | LangChain | 文档加载、文本分割、检索器、LLM 调用 |
| 向量库 | FAISS | 本地向量索引,支持多库并行检索 |
| 嵌入模型 | BGE-large-zh-v1.5 | 中文语义向量,检索与建库一致 |
| 重排序 | BGE-reranker-large(CrossEncoder) | 检索后精排,提升上下文相关性 |
| 大模型 | 智谱 GLM-4-Flash(API) | 问答生成、查询改写、报告撰写、RAGAS 评估 |
| 评估 | RAGAS 0.2.14 | 上下文召回、忠实度、事实准确性等指标 |
3. 迭代一:RAGAS 源码阅读与指标复现¶
3.1 源码阅读¶
迭代一的核心任务是通读 RAGAS 源码并输出模块分析报告。我负责 embeddings 与 integrations 两个模块。
embeddings 模块 定义了 BaseRagasEmbeddings 抽象基类,并通过 LangchainEmbeddingsWrapper、HuggingfaceEmbeddings、LlamaIndexEmbeddingsWrapper 等适配器,将 LangChain、HuggingFace、LlamaIndex 等生态的嵌入模型统一接入 RAGAS 评估管线。模块还依赖 cache(避免冗余计算)和 run_config(超时、重试、种子控制),体现了框架对生产可靠性的考量。
integrations 模块 是 RAGAS 与外部工具集成的 API 层,覆盖 LangChain(EvaluatorChain 包装指标供 LangSmith 使用)、LlamaIndex(evaluate 对接查询引擎)、Haystack、R2R、Swarm、Opik 等。我对评估框架如何以统一指标接口横向接入不同 RAG 编排栈有了更具体的认识。
3.2 指标复现¶
在 metricsForNonLLM.py 等脚本中,我们复现了 RAGAS 中不依赖 LLM 的指标:
-
BLEU Score:基于 n-gram 匹配评估翻译质量;
-
NonLLMStringSimilarity:Levenshtein、Jaro-Winkler 等字符串距离;
-
NonLLMContextRecall:基于 TF-IDF 的上下文召回。
这些指标计算成本低、结果确定,适合作为 LLM-as-Judge 指标的对照基线,也帮助我们理解 RAGAS 指标设计的分层思路。
4. 迭代二:平台搭建与金融 RAG 应用¶
4.1 分工¶
迭代二的关键分工:
-
RAG 评估平台:后端 RAGAS 集成、任务/轮次 CRUD、前端评估看板;
-
知识库搭建:数据采集、清洗、FAISS 建库;
-
RAG 应用检索与生成:召回策略、LLM 生成、对话 API;
-
Prompt 评估平台:多指标 Prompt 评测与多轮优化。
4.2 RAG 评估平台¶
后端 rag_eval/rageval.py 封装 RAGAS 的 evaluate 接口,默认使用三个 LLM 指标:
| 指标 | 含义 |
|---|---|
LLMContextRecall |
参考答案中的主张有多少能被检索上下文支撑 |
Faithfulness |
生成回答中的主张有多少能被检索上下文推断 |
FactualCorrectness |
生成回答与参考答案之间的事实重叠度 |
评估数据通过 CSV/Excel 上传,字段为 user_input、retrieved_contexts、response、reference。平台支持任务(Task)— 评估轮(Turn) 两级管理:同一任务下可上传多轮测试集,对比不同优化策略的指标变化。
前端 RAGevalDetail.vue 用 ECharts 折线图展示多轮指标趋势,表格展示逐条样本的得分,便于团队根据数据决策是否调整分块策略、检索参数或 Prompt。
4.3 Prompt 评估平台¶
prompt_eval/prompteval.py 在 RAG 评估基础上扩展了更完整的指标集,包括 ResponseRelevancy、AnswerCorrectness、ContextPrecision、ContextRecall、ContextEntityRecall 等,用于对用户自定义 Prompt 模板进行多维度评测与迭代优化。
5. 数据工程与知识库建设¶
5.1 数据来源¶
知识库按主题拆分为三个 FAISS 向量库,对应不同金融信息类型:
| 向量库 | 数据类型 | 来源说明 |
|---|---|---|
finance_book |
金融教材 / 参考书 | 结构化金融基础知识,支撑概念性问答 |
eastmoney_report |
东方财富研报 | 行业研究、公司分析、宏观策略等研报文本 |
webnews |
财经新闻 | CnOpenData 等开放数据集及东方财富财经新闻 |
此外,resource/ 目录还包含通过 AKShare 采集的 A 股日线行情数据(stock/),为后续数据分析与可视化扩展预留了接口。
5.2 文档处理流水线¶
原始数据经三道预处理脚本完成标准化:
-
convert_documents.py:将 PDF、HTML、Markdown 等格式统一转为 TXT;PDF 表格通过pdfplumber抽取为 Markdown 表格块([TABLE]标记),保留结构信息。 -
clean_texts.py:黑名单过滤免责声明、风险提示、广告等无关内容;滑动窗口分块后基于 MD5 哈希去重。 -
create_vector_db.py:LangChain 文档加载器读入清洗后的文本,执行三级分块后写入 FAISS。
5.3 三级分块策略¶
早期系统仅做简单文本切分,导致标题层级丢失、检索片段语义不完整。优化后采用标题 → 特殊字符 → Token 三级分块:
| 阶段 | 策略 | 作用 |
|---|---|---|
| 标题分割 | Markdown # 标题、HTML h1–h3、正则识别章节编号 |
保留文档结构,避免跨章节混切 |
| 特殊字符分割 | 列表符号、箭头、分隔符等 | 在逻辑单元边界二次切分 |
| Token 分割 | BGE tokenizer,chunk_size=500,overlap=100 | 控制片段长度,兼顾嵌入模型上限与上下文连贯 |
每个文档块附带 source、content_length、content_hash 等元数据,支持检索结果溯源与重复检测。
5.4 嵌入与索引¶
向量嵌入统一使用 BGE-large-zh-v1.5,normalize_embeddings=True 以余弦相似度检索。建库与在线检索共用同一模型路径,避免训练—推理不一致导致的召回偏差。
6. RAG 核心链路¶
6.1 多库并行检索¶
RAGRetriever 在初始化时加载三个 FAISS 库,检索时按库并行执行 similarity_search_with_score,合并结果后按加权分数排序取 Top-K。每个结果保留 source 与 database 字段,前端以折叠面板展示参考来源,增强可解释性。
除基础相似度检索外,还支持:
- MMR(最大边际相关性):在相关性与多样性之间折中,减少重复片段;
- 上下文压缩检索:用
LLMChainExtractor对长文本检索结果做 query-aware 压缩,缓解上下文窗口压力。
6.2 重排序¶
初排基于向量相似度,对专业术语密集的金融文本可能不够精准。RAGGenerator._rerank_documents 引入 BGE-reranker-large CrossEncoder,对 (query, document) 对打分重排,将最相关的片段优先送入生成阶段。
6.3 多轮对话与查询改写¶
早期系统每次请求独立处理,无法理解它、上述、第三个特点等指代。优化后增加“查询改写”步骤:将完整对话历史与当前问题送入 GLM-4-Flash,生成一条独立、无指代、可直接用于向量检索的查询语句,再执行检索与生成。
生成 Prompt 同时注入知识库上下文与历史对话,使模型在引用检索证据的同时兼顾多轮语境。
6.4 报告生成¶
迭代三的亮点功能之一。用户开启“报告生成”开关后,系统扩大检索范围(Top-K=20),由 LLM 按 Markdown 结构撰写 3000 字以上的深度报告,标注引用来源,并通过 PyMuPDF 转为 PDF 供下载。适用于行业综述、政策解读等需要系统性输出的场景。
7. 迭代三:RAG 优化¶
7.1 优化动机¶
初版系统存在七类突出问题:仅支持 TXT 格式、分块策略单一、元数据不足、检索效果欠佳、无效信息干扰、单库检索、缺乏多轮对话能力。针对这些问题,我们从数据工程与检索生成两条线同步改进。
7.2 主要优化项¶
| 方向 | 优化内容 | 效果 |
|---|---|---|
| 知识源扩展 | 支持 PDF / HTML / Markdown / TXT,表格转 Markdown | 数据源覆盖常见办公与研报格式 |
| 分块策略 | 三级分块 + 黑名单过滤 + 哈希去重 | 检索相关性提升约 35% |
| 多库检索 | 三库并行 + 可配置权重 + MMR / 压缩检索 | 覆盖教材、研报、新闻多种知识形态 |
| 历史对话 | LLM 查询改写,消解指代 | 多轮追问场景可用性显著提升 |
| 处理效率 | 多格式流水线 + 多库并行 | 整体处理速度提升约 20% |
结合 RAGAS 多轮评估与人工抽检,问答准确率相较初版提升约 20%,回答可溯源性明显增强。
7.3 知识库可视化管理¶
KnowledgeBase.vue 提供三库切换、文本块分页浏览、单块详情查看与在线追加文件等能力。后端 rag_visualization 模块暴露索引总量查询、按索引读取文档、上传新文件增量写入向量库等 API,使知识库从黑盒变为可运维、可扩展的资产管理界面。
8. 测试基准集¶
课程要求提供 RAG 系统评测用的测试基准。我们整理了 FinanceIQ 数据集作为金融领域权威评测参考——涵盖 10 个金融大类、36 个小类、7173 道单项选择题,覆盖 CPA、证券/基金/期货从业资格、经济师、精算师等考试题型。
RAG 评估平台的测试集格式与 RAGAS EvaluationDataset 对齐,字段为:
团队可基于 FinanceIQ 题目构造问答对,或将系统实际输出填入评估文件,通过多轮 Turn 对比优化前后的 context_recall、faithfulness、factual_correctness 变化。
9. 前端产品化¶
主界面 MainPage.vue 以 Tab 切换四大模块。
RAG 问答(RAG.vue):左侧对话列表管理,右侧聊天区展示问答与参考来源;底部输入框支持报告生成开关。
知识库管理(KnowledgeBase.vue):数据库列表、文件上传、文本块文件夹式浏览与分页。
RAG 评估(RAG_eval.vue + RAGevalDetail.vue):任务卡片列表 → 评估轮管理 → 指标仪表盘 + 趋势折线图 + 明细表格。
Prompt 评估(Prompt_eval.vue):与 RAG 评估共享 TaskList / TaskCard 组件,支持更丰富的 Prompt 指标对比。
前后端通过 Axios 调用 http://127.0.0.1:5000 下的 REST 接口通信,对话记录与评估结果均持久化至 SQLite,支持跨会话回溯。
10. 个人工作与收获¶
10.1 主要负责¶
-
迭代一:RAGAS 源码阅读与文档撰写;
-
迭代二:RAG 评估平台后端(RAGAS 集成、任务/轮次 API)、RAG 应用检索链路(多库召回、重排序、查询改写、生成 API);
-
迭代三:RAG 优化中的检索策略与多库架构、数据库检索模块,参与优化文档编写与测试基准集整理。
10.2 技术收获¶
-
从评估反推工程:先读懂 RAGAS 指标定义与计算逻辑,再据此设计测试集格式和优化方向,形成指标驱动迭代的闭环;
-
检索链路全貌:从文档清洗、分块、嵌入、多库召回、CrossEncoder 重排,到 LLM 生成与来源标注,完整走通 RAG 工程链路;
-
框架生态理解:RAGAS 的适配器模式与 LangChain 编排。
11. 总结与展望¶
本项目从 RAGAS 源码阅读出发,历经平台搭建、金融知识库建设、评估系统集成三轮迭代,最终交付了一套功能完整的金融 RAG 问答平台:支持多源知识检索、多轮对话、参考来源展示、PDF 报告生成,以及基于 RAGAS 的多轮评估与可视化分析。
后续可继续探索的方向包括:引入稀疏检索(BM25)与稠密检索的混合索引、对 FinanceIQ 等基准做端到端自动化评测、将行情数据与文本知识库联合检索以支持量化分析类问答,以及在生产环境中替换本地 FAISS 为可水平扩展的向量数据库服务。
写入简历
项目名称:基于 RAG 的金融问答平台
角色:后端开发工程师
技术栈:Python / Flask / LangChain / FAISS / BGE / GLM-4-Flash / RAGAS / Vue 3
S(情境)
金融知识分散在教材、研报、新闻等多种格式中,初版系统存在检索相关性低、回答缺乏依据、无法支撑多轮追问等问题,难以满足课程对工程完整性与可量化评估的要求。
T(任务)
作为后端核心开发,负责 RAG 检索与生成链路、RAGAS 评估平台后端,以及迭代三中的检索优化与多库架构改造;需在前后端分离架构下交付 RESTful API,并建立可复现的评估闭环以驱动系统迭代。
A(行动)
-
基于 LangChain + FAISS 搭建 RAG 管线:完成多源金融数据采集、清洗、三级分块与 BGE-large-zh 向量化,按主题拆分为教材、研报、新闻三个向量库并支持并行检索;
-
设计混合检索与重排序策略:实现相似度检索、MMR 多样性检索及 CrossEncoder(BGE-reranker-large)精排,引入 LLM 查询改写以支持多轮对话中的指代消解;
-
集成 RAGAS 评估框架:封装上下文召回、忠实度、事实准确性等指标,实现评估任务/多轮评测的 CRUD、CSV 数据集解析与结果持久化,支撑前端 ECharts 趋势可视化;
-
参与 RAG 系统性优化:扩展 PDF/HTML/Markdown 文档支持,完善黑名单过滤与去重流水线,落地上下文压缩检索与知识库可视化管理 API。
R(结果)
-
问答准确率较初版提升约 20%,检索相关性优化后提升约 35%,整体数据处理效率提升约 20%;
-
交付含 RAG 问答、知识库管理、RAG 评估、Prompt 评估四大模块的完整平台,回答附带可展开参考来源,支持 PDF 深度报告生成;
-
建立基于 RAGAS 的多轮评估机制,团队可上传测试集对比各轮指标变化,形成评估—优化—再评估的迭代闭环。