多模态RAG图文问答--看懂图片,读懂文字并关联思考的ai助手
相关知识点及参考资料
PDF文档解析库PyMuPDF官方教程:PyMuPDF 1.26.3 documentation
强大的中文OCR工具PaddleOCR:https://github.com/PaddlePaddle/PaddleOCR
领先的中文文本向量化模型库FlagEmbedding (BGE模型):https://github.com/FlagOpen/FlagEmbedding
经典图文多模态向量化模型CLIP (Hugging Face实现):https://huggingface.co/docs/transformers/model_doc/clip
高性能向量检索引擎FAISS入门指南:https://github.com/facebookresearch/faiss/wiki/Getting-started
简单易用的向量数据库ChromaDB快速上手:Getting Started - Chroma Docs
通义千问Qwen大模型官方仓库 (含多模态VL模型):https://github.com/QwenLM/Qwen-VL
集成化RAG开发框架LlamaIndex五分钟入门:Redirecting...
Xinference官方仓库(模型推理框架):
https://github.com/xorbitsai/inference
存个档
本次代码github仓库:https://github.com/li-xiu-qi/spark_multi_rag
整个任务流程就是,
-
读取
test.json里的一个问题, -
驱动你的系统去
财报数据库中查找信息, -
然后生成答案和出处,
-
最后将这几项信息作为一行写入到最终的
submit.json文件中。
对 test.json 中的所有问题重复此过程,即可得到最终的提交文件.
其中的train.json文件主要是用来在训练非生成式模型环节中使用的,比如训练embedding模型,或者是微调LLM。
对于提取pdf里的数据有两种方式,第一种是pymupdf,下面给出一种简单示例
import fitz # PyMuPDF
def extract_pdf_text(pdf_path):
doc = fitz.open(pdf_path)
all_text = []
for page_num in range(doc.page_count):
page = doc.load_page(page_num)
text = page.get_text()
all_text.append(text)
doc.close()
return all_text
if __name__ == "__main__":
pdf_file = "your_file.pdf" # 替换为你的 PDF 文件路径
texts = extract_pdf_text(pdf_file)
for i, page_text in enumerate(texts):
print(f"--- Page {i+1} ---")
print(page_text)
第二种是mineru,这里在学习过程中我了解到了uv,这是一种轻量化管理环境的工具我们使用
pip install uv
uv sync
来复制环境,这里是使用清华的镜像源很容易产生403的问题,是因为一次下的太多,被拒绝了,本人最终的尝试成功是关闭实例后等待后运行上述命令,没有进行虚拟环境的激活。
然后又报了这样一个错
抄了别人的解决方案是
pip install mineru==2.1.9
然后我跟着这个来配置了一下 pip install -U "magic-pdf[full]" -i https://mirrors.aliyun.com/pypi/simple 参考https://mineru.site/%E7%96%91%E9%9A%BE%E6%9D%82%E7%97%87/2025/05/22/1fa9e6fa-6062-8065-82db-cc0cf9818496
这样我们就完成了对pdf文件的处理,在本次教程中也学到了一个新的思想,确实模块化非常好用,这个耗费的时间非常长,可以大大减小消费的时间
- rag_from_page_chunks.py
-
SimpleRAG.setup():-
作用 : RAG系统的初始化。
-
步骤 :
-
加载
all_pdf_page_chunks.json里的所有知识块。 -
调用
EmbeddingModel(其核心是get_text_embedding.py),将每个知识块的content文本批量转换为向量。 -
将知识块和它们对应的向量存入
SimpleVectorStore(一个简单的内存向量数据库) 中。
-
-
-
SimpleRAG.generate_answer():-
作用 : 针对一个问题,执行完整的“检索-生成”流程。
-
步骤 :
-
查询向量化 : 将输入的问题
question同样转换为向量。 -
信息检索 : 在
SimpleVectorStore中进行相似度搜索,找出与问题向量最相似的 Top-K 个知识块。 -
构建Prompt : 这是最关键的环节之一。脚本将用户的原始问题和检索到的Top-K个知识块(包含内容和元数据)一同填入一个Prompt模板中。这个模板会明确指示LLM:
-
扮演一个专业角色(金融分析助手)。
-
必须依据提供的上下文(检索到的知识块)来回答。
-
必须严格按照指定的JSON格式输出
{"answer": "...", "filename": "...", "page": "..."}。
-
-
调用LLM生成 : 将构建好的Prompt发送给大语言模型(如Qwen)。
-
解析与格式化 : 调用
extract_json_array.py工具,从LLM返回的可能混杂着其他文本的输出中,稳定地提取出JSON对象,并整理成最终的答案格式。
-
-
这就完成了一个简单的处理模型,当然还有许多优化空间。
更多推荐

所有评论(0)