马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
参考文章:
[1] 来自工业界的知识库 RAG 服务(二),RagFlow 源码全流程深度分析 - 易迟的博客 | Bryan Blog
[2] 赢得企业RAG寻衅赛的法门 —— 冠军方案分析与感悟
[3] https://abdullin.com/ilya/how-to-build-best-rag/
[4] RAG进阶:Embedding Models嵌入式模子原理和选型指南 - 文章 - 开发者社区 - 火山引擎
之前已经学习了RAG的根本理论知识:详见RAG综述
如今做一个简单的实操项目:基于图文PDF的多模态问答RAG项目:2025 iFLYTEK AI开发者大赛
一、项目概述:
根据提供的图文混排的公司研报pdf,举行题目答复;必要完成的详细任务如下:
1)多模态信息明白:可以或许同时明白用户提出的自然语言题目以及知识库中的图像和文本内容。
2)跨模态检索:从给定的多个PDF文档中,高效地检索与用户查询相干的图像、图表、文本段落或它们的组合。
3)图文关联推理:将检索到的图像信息与文本信息举行有用关联和融合,举行深条理的逻辑推理,以答复必要多模态明白的题目。
4)答案天生:基于检索和推理的效果,天生准确、简便、符合上下文的答案。答案中应清晰指出信息泉源(比方,来自哪个PDF的哪一页,以致哪个图表)。
使用模子服务平台:硅基运动:SiliconCloud
当地摆设模子:使用ollama
本机设置:32G内存,16核,集显:AMD 780M Graphic
二、baseline:
baseline的得分为:0.00338,属于根本都答不出来的环境。
baseline固然简单,但是可以简明地学习到RAG的紧张步调流程的现实操纵方法。
1. 评价指标:
- a.页面匹配度(满分0.25 分)
- b.文件名匹配度(满分0.25 分)
- c.答案内容相似度(满分0.5 分):将字符交集巨细除以并集巨细,得到 Jaccard 相似系数,范围在 0 到 1 之间。
留意:提交效果时必要匹配使用到的pdf的名称和块对应的页码,以是分块时必要生存页码。
2. baseline的根本思绪:
- 文本分析分块:fitz库,基于PyMuPDF的分析pdf库,直接基于页码举行的分块,效果生存为json文件
- embedding:免费模子:BAAI/bge-m3,智源的嵌入模子
- 当地构造简单的向量库:读取分块后的json文件,存储了原始文本和embedding后的文本,search功能:用余弦相似度举行的全量检索,并排名
- query:使用谈天模子:Qwen/Qwen3-8B,为免费模子,阿里的。
- prompt工程如下:
- prompt = (
- f"你是一名专业的金融分析助手,请根据以下检索到的内容回答用户问题。\n"
- f"请严格按照如下JSON格式输出:\n"
- f'{{"answer": "你的简洁回答", "filename": "来源文件名", "page": "来源页码"}}'"\n"
- f"检索内容:\n{context}\n\n问题:{question}\n"
- f"请确保输出内容为合法JSON字符串,不要输出多余内容。"
- )
复制代码- 输出后处置处罚:将答复整理为json格式,舍弃不必要举行评分的信息。
三、常见的RAG体系改进思绪:
可以改进的地方:
- 文本分析、分块技能:chunk_size, overlap
- embedding模子选择;
- 文本信息进一步处置处罚:数据洗濯、文本择要添加、知识图谱等等
- 检索方法优化(多路检索,多路召回等)
- 检索后优化:rerank
- LLM答复控制:prompt工程等
1. 使用开源框架ragflow:
由于笔者近期在研究ragflow,以是想使用这种开源框架,实验办理一些现实题目:
使用Ragflow提供的API举行本场角逐的全流程搭建,看效果怎样,选择的模子不动。(也可以使用提供的python SDK)
必要使用的API序次:创建知识库 -> 上传文档 -> 分析文档(包罗分析、分块、上传至向量库)-> 创建谈天助手 -> 和助手谈天
末了再自行举行答复效果后处置处罚即可。
碰到的题目:
1)ragflow找不到ollma服务:RagFlow添加OLLAMA模子失败--办理方案-CSDN博客 ;
2)ragflow的deepdoc方案没有生存pdf的页码,不符合提交要求,必要二开。
3)答复速率迟钝(一个题目大概淹灭30-160s不等),分析的速率也迟钝(这个可以明白为提前做好数据库,可以容忍)。
评分效果:
中央效果:
ragflow提供了文件分析后的分块的表现图:(好奇这个是怎样实现的?):看上去效果不错。
2. 每个环节可以优化的地方:
1)pdf文档分析处置处罚:
- 分析:
参考1:一种方法是使用如今市面上已经开源的库方法:(但是针对角逐做一些任务明白之后的针对性代码撰写,大概会会更为高效)
工具范例
代表工具
核心特点 / 办理痛点
基于深度学习的“新锐”
MinerU(该赛事保举的方法),deepdoc(ragflow开发的模块),LLMSherpa
能明白文档版面布局(如多栏、页眉页脚),辨认章节、表格、公式等语义元素,输出带布局的Markdown/HTML,力图保存原始语义;恰当要求风雅地分析文档的场景,算力设置较高
传统分析库(规则驱动)
PyMuPDF,PDFPlumber,pypdf
baseline里用到的分析方法,比力粗糙,但速率快,对复杂版面(如多栏)的阅读序次还原、语义布局明白本事有限
OCR驱动
Tesseract + OCRmyPDF,PaddleOCR
核心办理扫描件/图片型PDF的笔墨辨认题目 同一分析框架
Unstructured,Docling(IBM的,IIya Rice大赞)
提供同一接口处置处罚多种格式(PDF, Word, PPT等),内置文本洗濯和分块功能。思考1:pdf文档分析的原理:可以粗糙的明白为先要分析为text,困难的地方在于图文混排,排版情势多样,且必要找到差别块之间的语义关系。这里我产生一个好奇,就是pdf自带的文档编辑器已经把文天职成块了,这里的传统驱动是基于这个层面的明白做到吗?
可以看到pdf编辑器里如上,题目是图表分块这个供我们辨认是不公道的,文本上必要找到相干的块以及它们的语义关系。
思考2:文档分析之后的输出情势:json:ragflow的处置处罚(?)
- 分析后的洗濯:正则表达式来整理不准确的分析(有分析错误的、偶然义的语段)、OCR来辨认一些无法解码的部门
?这个部门怎样判定是乱码的,是该洗濯的部门?
- 表格
在表格中,横标题和竖标题通常间隔远,以是造成语言关联困难。做表格序列化的处置处罚,即把表格转换成小的、独立的文本字符串。有点像给大语言模子表明表格的意思,而非直接递给他表格数据。这里IIya Rice的做法是将html格式的表格喂给LLM,让LLM明白表格,输出的效果放置在原始表格内容下方作为增补表明。
相干研究的论文:2402.17944
思考1:别的成形框架里没有做表格的分析处置处罚吗?是怎样做的?
- 分块:
由于角逐要求,答复时必要关联到文档和相干的页面,以是最直接的做法是分块的底子在每一页page举行。
参考1:IIya,在每页的底子上又举行token分割,大概300token,overlap是50,而他的实验效果是chunks的精度对他的检索体系险些没有影响。
参考2:Googel "Semantic splitter."
- embedding模子选择:
模子选择上也必要根据需求来,这里暂时不举行深入研究:纪录一下通用型的模子:
BGE系列:如BGE-large-zh-v1.5 针对中文,BGE-M3(多语言通用)。
2)存储入库:
市面上的向量库即配套了检索方法
- 参考1:差别的向量库:
数据库名称
范例 / 核心特点
关键上风
范例实用场景
Milvus
开源原生向量数据库
分布式架构,支持十亿级向量规模;索引算法丰富(HNSW/IVF)
超大规模AI搜刮、保举体系、图像/视频检索
Chroma
轻量级开源向量数据库
API简单易用,集成快速;非常恰当原型开发和实验
大型语言模子(LLM)应用原型、小规模语义搜刮
Pinecone
全托管商业向量数据库
免运维,开发者无需管理底层底子办法;提供高性能的实时检索
必要快速上线、高并发实时检索的商业应用,如保举体系
Qdrant
开源原生向量数据库(Rust编写)
高性能,毫秒级耽误;支持高效的混淆搜刮(向量+元数据过滤)
天生式AI应用(如谈天呆板人)、高并发实时检索
Weaviate
开源向量数据库
团结了向量搜刮和图数据库特性,支持多模态数据和复杂语义查询
知识图谱、智能问答体系、必要复杂混淆查询的应用
Pgvector
PostgreSQL扩展插件
无缝集成到现有PostgreSQL数据库中,可同时处置处罚布局化数据和向量
中小规模向量检索,尤其恰当已在使用PG生态、渴望平滑升级的项目
Faiss
开源向量搜刮库(Facebook开发)
搜刮速率极快,专注于高效的相似性搜刮和聚类
大规模图像辨认、文档聚类等对纯搜刮性能要求极高的场景
思考1:怎样选择向量库?
- 参考2:IIya,对每个pdf单独创建一个数据库,由于它以为一样平常一个答复可以从一个文件里得到。(如许的话对于这个角逐可以思量一个公司创建一个数据库)
IIya选择了使用Faiss,embedding模子是text-embedding-3-large
参考3:主流的embedding模子:
???
参考4:向量库原理大抵学习:
在存储token时还涉及一个环节是选择差别的indice(索引),在向量库中存在差别层级的索引,它资助后续的检索操纵快速的定位有用的token的位置:
- chunk索引,单个 Chunk 内部的向量,后续用于盘算chunk和query的相似度;是直接搜刮;
- segment索引,语言索引,多个语言相似的token被聚类后有一个索引,雷同看书先找相干的章节;
- 数据库级别的索引,雷同去图书馆找书
IIya思量到角逐的文本数目少,选择了Flat indice,
[table][tr]索引范例
核心原理
实用场景
特点
[/tr][tr][td]扁平索引 (Flat Index)
[/td][td]暴力盘算查询向量与数据库中全部向量的间隔
[/td][td]
数据量小(通常 |