相关知识点及参考资料

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

整个任务流程就是,

  1. 读取 test.json 里的一个问题,

  2. 驱动你的系统去 财报数据库 中查找信息,

  3. 然后生成答案和出处,

  4. 最后将这几项信息作为一行写入到最终的 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

  1. SimpleRAG.setup() :

    • 作用 : RAG系统的初始化。

    • 步骤 :

      1. 加载 all_pdf_page_chunks.json 里的所有知识块。

      2. 调用 EmbeddingModel (其核心是 get_text_embedding.py ),将每个知识块的 content 文本批量转换为向量。

      3. 将知识块和它们对应的向量存入 SimpleVectorStore (一个简单的内存向量数据库) 中。 

  2. SimpleRAG.generate_answer() :

    • 作用 : 针对一个问题,执行完整的“检索-生成”流程。

    • 步骤 :

      1. 查询向量化 : 将输入的问题 question 同样转换为向量。

      2. 信息检索 : 在 SimpleVectorStore 中进行相似度搜索,找出与问题向量最相似的 Top-K 个知识块。

      3. 构建Prompt : 这是最关键的环节之一。脚本将用户的原始问题和检索到的Top-K个知识块(包含内容和元数据)一同填入一个Prompt模板中。这个模板会明确指示LLM:

        • 扮演一个专业角色(金融分析助手)。

        • 必须依据提供的上下文(检索到的知识块)来回答。

        • 必须严格按照指定的JSON格式输出 {"answer": "...", "filename": "...", "page": "..."}

      4. 调用LLM生成 : 将构建好的Prompt发送给大语言模型(如Qwen)。

      5. 解析与格式化 : 调用 extract_json_array.py 工具,从LLM返回的可能混杂着其他文本的输出中,稳定地提取出JSON对象,并整理成最终的答案格式。

这就完成了一个简单的处理模型,当然还有许多优化空间。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐