一、 初识赛题——从迷茫到清晰

刚看到赛题时,坦白说有些不知所措。“多模态”、“RAG”、“图文混排PDF”,这些词汇组合在一起,听起来就像一个庞大而复杂的工程。但当我强迫自己静下心来,从“终点”(提交格式和评审规则)倒推整个流程后,任务的核心瞬间清晰了。

我的顿悟:

  1. 这不是一个聊天机器人,而是一个“引经据典”的“学术助理”。 我们的最终目标不是生成一段华丽但空洞的回答,而是要为 test.json 里的每一个 question,精准地提供三样东西:answer (答案)、filename (来源文件)、page (来源页码)。

  2. “可溯源”是王道。 评审规则里,filenamepage 的匹配度占了总分的50%!这意味着,一个内容完美的答案如果来源错误,得分会大打折扣。反之,一个内容尚可但来源精准的答案,也能拿到一半的基础分。这个发现直接决定了我的优化方向:溯源的准确性与答案内容的质量同等重要。

  3. 核心矛盾: 机器(特别是LLM)天生只懂文本,而我们的知识库(PDF)却是图文并茂的。如何将视觉信息(图表)转化成机器能理解的格式,并与文本信息建立联系,是这个赛题最核心的挑战。

基于以上理解,我将赛题的四大难点,用我自己的话重新梳理了一遍:

  • 难点一(信息转化): 怎么让AI“看懂”图片和表格?尤其是财报里的各种业绩图、流程图,信息密度极高。

  • 难点二(精准定位): 怎么在成堆的PDF中,像侦探一样快速找到包含答案线索的那一页、那一段?大海捞针,还不能捞错。

  • 难点三(忠实回答): LLM很能“脑补”,怎么给它戴上“紧箍咒”,让它只根据我们找到的资料说话,别自由发挥?

  • 难点四(协同优化): 如何平衡“答得对”和“找得准”这两个目标?我的整个系统设计必须同时为这两个指标服务。

二、 解剖Baseline——一个完整的起点

通读了Baseline方案后,我对其设计思路有了清晰的认识。它是一套经典的文本RAG流程,巧妙地绕过了最棘手的多模态问题。

Baseline流程的两大阶段:

  1. 离线预处理(构建知识库):

    • 解析(Parse): 使用 fitz_parse_pdf.py 脚本,将所有PDF的纯文本内容按“页”为单位提取出来,保存成一个大的JSON文件 (all_pdf_page_chunks.json)。

    • 向量化与索引(Index):rag_from_page_chunks.pysetup() 函数中,加载上述JSON,调用Embedding模型(如BGE-M3)将每一页的文本内容转换成向量,然后存入一个简单的内存向量库(SimpleVectorStore)。

  2. 在线推理(回答问题):

    • 检索(Retrieve): 接收一个问题,同样将其向量化,然后在向量库中搜索最相似的Top-K个页面文本作为上下文。

    • 生成(Generate): 将“问题”和“检索到的上下文”打包成一个精心设计的Prompt,喂给大语言模型(LLM,如Qwen),并指令它以JSON格式输出答案、来源文件和页码。

我对Baseline的评价:

  • 优点: 逻辑清晰,端到端完整。它是一个“麻雀虽小,五脏俱全”的系统,让我能够快速跑通整个流程,建立对RAG的基本认知。模块化设计也为后续的优化提供了便利。

  • 核心不足:

    1. 信息丢失严重: PyMuPDF (fitz) 只提取文本,完全丢弃了所有图表、表格信息。这是它最大的短板,直接导致所有基于视觉信息的问题都无法回答。

    2. 分块策略粗糙: 按“页”分块,一页可能包含多个不相关的主题,也可能一个主题被分页符切断,这会严重影响检索的精度。

    3. 检索过于简单: 单纯的向量相似度搜索,容易引入噪音,干扰LLM的判断。

这个Baseline是一个绝佳的起点,它的不足之处,恰恰就是我们上分的突破口。

三、 我的上分之路——从Baseline到更高分的进阶方案

针对Baseline的不足,我设计了一个三步走的优化路线图,从易到难,逐步提升系统性能。

第一步:低成本快速优化 (Low-hanging Fruits)

这些改动不涉及复杂的模型训练,但能快速见效。

  1. 精调Prompt (Prompt Engineering):

    • 目标: 降低幻觉,提高溯源准确性。

    • 方案:rag_from_page_chunks.py 中修改 PROMPT_TEMPLATE

      • 增加严格指令: 明确要求LLM:“你必须严格依据提供的‘上下文’作答。如果‘上下文’中没有答案,请明确回答‘根据现有信息无法回答’。你的答案必须从‘上下文’中提供的某一个‘chunk’中总结得出,并使用该‘chunk’的file_namepage作为来源。”

      • 引入Few-shot示例: 在Prompt中加入1-2个高质量的问答示例,向LLM展示理想的输入输出格式,特别是如何从多个上下文中选择最相关的一个作为来源。

  2. 优化分块策略 (Smarter Chunking):

    • 目标: 提高检索内容的信噪比和完整性。

    • 方案: 放弃按“页”分块。改用更智能的分块方法。

      • 策略: 使用langchain.text_splitter中的RecursiveCharacterTextSplitter,按段落、标题等递归地切分文本。

      • 实现: 设置一个合理的块大小(chunk_size,例如512个字符)和重叠大小(chunk_overlap,例如50个字符)。重叠可以保证语义的连续性,避免关键信息被切断。这将生成更小、更聚焦的知识块,大大提升检索精度。

第二步:攻克核心难点 (Tackling the Core Challenges)

这是拉开分数差距的关键一步,直接面对多模态和数据质量问题。

  1. 更换PDF解析引擎:从 PyMuPDFMinerU

    • 目标: 实现真正的图文信息提取,这是整个方案从量变到质变的一步。

    • 方案:

      • 弃用 fitz_parse_pdf.py,改用 mineru_pipeline_all.py(或自己基于MinerU编写脚本)。

      • 效果: MinerU能进行版面分析,将PDF解析为包含标题、段落、表格(转为Markdown格式)、图片等多元素的结构化数据。现在,我的知识库里不仅有文本,还有了结构化的表格被识别出的图片

  2. “图片文本化”:引入VLM生成图像描述 (Image-to-Text)

    • 目标: 让系统理解图片的内容。

    • 方案: 这是对MinerU提取出的图片信息的二次处理。

      • 工具: 调用一个强大的多模态大模型(VLM),如通义千问Qwen-VL

      • 流程: 遍历所有被MinerU提取出的图片,用Qwen-VL为其生成详细的文本描述。对于图表,Prompt可以更具引导性:“请详细描述这张图表。它的标题是什么?横轴和纵轴代表什么?数据的主要趋势和关键节点是什么?”

      • 融合: 将这些生成的“图片描述”作为新的文本块,与原始文本块一样,附上它们的元数据(文件名、页码),一起存入向量数据库。

    • 成果: 经过这一步,我的RAG系统虽然底层仍然是文本检索,但知识库已经融合了图像信息,实现了“伪多模态”,能够回答基于图表内容的问题了。

第三步:向高分榜冲刺 (Advanced Optimizations)

当基础框架搭建完毕,这些高级技巧可以进一步挖掘系统潜力。

  1. 智能检索:引入重排模型 (Re-ranking)

    • 目标: 解决Top-K检索结果中噪音过多的问题,优中选优。

    • 方案:

      • 两阶段检索:

        1. 召回(Recall): 先用快速的向量搜索,召回一个较大的候选集,比如Top 20个知识块。

        2. 重排(Re-rank): 然后使用一个更强大的Cross-Encoder模型(如BGE-ReRanker),对这20个知识块与问题的相关性进行更精细的计算和排序,最终选出Top 3或Top 5个最相关的知识块交给LLM。

      • 效果: 极大地提升了喂给LLM的上下文质量,是提升答案准确率的利器。

  2. 真·多模态:端到端多模态模型方案

    • 目标: 让模型直接看图说话,避免“图片->文字”过程中的信息损失。

    • 方案:

      • 多路召回: 当问题输入后,不仅在文本向量库中搜索,如果问题可能与图像相关,也同时在图像向量库(用CLIP等模型构建)中搜索。

      • 多模态生成: 将检索到的文本块原始图片文件一起作为上下文,提交给一个强大的多模态生成模型(如Qwen-VL-Max)。Prompt会变成:“请根据以下文本和图片,回答问题...”。

      • 挑战: 这个方案对模型的选择和系统流程的设计要求更高,但它是解决此类问题的最前沿、最彻底的方案。

四、 总结与反思

这次比赛的学习过程,对我来说是一次非常宝贵的经历。我最大的收获是:

  • 从终局思考: 永远先理解任务目标和评价标准,这会指引你所有技术选型的方向。

  • 数据质量是生命线: Garbage in, garbage out。在RAG系统中,PDF解析的质量直接决定了知识库的天花板。在MinerU上的投入是性价比最高的。

  • 迭代式开发: 不要妄想一步到位构建一个完美的系统。从一个能跑通的Baseline开始,通过分步优化,不断给它“打补丁”、“升级零件”,才是最稳健的路径。

  • 拥抱开源工具: Xinference, MinerU, HuggingFace Transformers... 无数强大的开源工具极大地降低了我们实现复杂系统的门槛。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92376.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92376.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/92376.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据挖掘2.6 Perceptron Modeling 感知器建模

Perceptron Modeling 感知器建模Linear Discriminants 线性判别式Loss Function 损失函数misclassification 误分类0-1 Loss/Error function 0-1损失函数Hinge Loss Function 铰链损失函数Optimization 优化算法Linear Discriminants 线性判别式 线性判别式公式 f(x;w)w1x(1)w…

使用qemu运行与GDB调试内核

目录 一、前期准备 二、内核编译 三、QEMU与GDB 1、QEMU调试参数 2、gdb vmlinux 一、前期准备 内核镜像:bzimage gdb:x86_64 QEMU:qemu-system-x86_64 前置知识: (1)内核编译 (2&#x…

欧盟 Radio Equipment Directive (RED)

欧盟 Radio Equipment Directive (RED) ——从 2014/53/EU 原文到 2025-08-01 强制生效的网络安全新规,一次看懂全部关键点。1. 法规身份与适用范围要素内容指令全称Directive 2014/53/EU on radio equipment取代指令1999/5/EC (R&TTE)适用产品所有“有意发射/接…

【FastExcel】解决ReadSheet在Map中获取对象不准确问题(已提交PR并合并到开源社区)

解决问题&#xff1a;源码ReadSheet在同一个Map中获取对象不准确问题 PR&#xff1a;Fixed the issue where different ReadSheet objects could not get the correct value when comparing them. 一&#xff1a;问题场景 ReadSheet在同一个Map中获取对象不准确(如Map<…

【网络安全入门基础教程】TCP/IP协议深入解析(非常详细)零基础入门到精通,收藏这一篇就够了

前言 这是小编给粉丝盆友们整理的网络安全入门到精通系列第三章计算机网络中TCP/IP协议的解析&#xff0c;喜欢的朋友们&#xff0c;记得给大白点赞支持和收藏一下&#xff0c;关注我&#xff0c;学习黑客技术。TCP/IP协议包含了一系列的协议&#xff0c;也叫TCP/IP协议族&…

Latex中公式部分输入正体的字母\mathrm{c}

Latex中公式部分输入正体的字母\mathrm{c}“\mathrm{c}”如何在Word中输入\mathrm{c}“\mathrm{c}” 在 LaTeX 中&#xff0c;“\mathrm{c}” 用于在数学模式中排版“c”这个字母为罗马体&#xff08;正体&#xff09;。“\mathrm” 是罗马字体命令&#xff0c;它告诉LaTeX以罗…

Document Picture-in-Picture API拥抱全新浮窗体验[参考:window.open]

在前端开发中&#xff0c;我们经常会遇到这样的需求&#xff1a;弹出一个浮动窗口来显示一些实时信息、工具栏或视频内容。过去我们会用 window.open()&#xff0c;后来越来越多的开发者倾向于使用 Modal。但现在&#xff0c;一个更现代的 API 出现了——Document Picture-in-P…

【指南版】网络与信息安全岗位系列(三):安全运维工程师

一、安全运维工程师到底做什么&#xff1f;—— 用校园场景帮你理解简单说&#xff0c;安全运维工程师就像 “网络世界的安保队长 系统管家”&#xff1a;既要实时监控网络和系统的 “异常动静”&#xff08;类似学校保安巡逻查隐患&#xff09;&#xff0c;又要负责日常的安全…

matlab——simulink学习(5向NXP库中添加新模块)

向NXP库中添加新的函数模块一、环境二、库添加模块1.打开文件夹2.创建文件3.添加S-Function三、浏览器添加模块一、环境 Windows10、MATLAB R2022b、安装NXP的S32K1XX系列工具包 二、库添加模块 1.打开文件夹 在文件系统中找到安装工具包的位置&#xff0c;用文件资源管理器…

使用ProxySql实现MySQL的读写分离

ProxySQL简介1、ProxySQL是一款开源的使用C编写的MySQL集群代理中间件&#xff1b;2、用于在MySQL数据库和客户端之间进行负载均衡、查询缓存、故障转移和查询分发&#xff1b;3、它可以作为中间层插入到应用程序和数据库之间&#xff1b;4、特点是高效灵活&#xff0c;使用简单…

WiFi 核心概念与实战用例全解

&#x1f4d6; 推荐阅读&#xff1a;《Yocto项目实战教程:高效定制嵌入式Linux系统》 &#x1f3a5; 更多学习视频请关注 B 站&#xff1a;嵌入式Jerry 1. WiFi基础与协议 WiFi&#xff08;Wireless Fidelity&#xff09;是基于IEEE 802.11协议族的无线局域网&#xff08;WLAN…

面向远程智能终端的超低延迟RTSP|RTMP视频SDK架构与实践指南

引言&#xff1a;遥操作时代&#xff0c;视觉链路已成“主控神经元” 从工业巡检到应急救援&#xff0c;从城市安防到边境监控&#xff0c;远程操控正成为智能终端与人机协同的重要落点。而在这些场景中&#xff0c;“视觉”不再只是用来观看的工具&#xff0c;而是贯穿感知、…

C++中的继承:从基础到复杂

目录 前言 1. 继承的基本概念 2. 继承方式与访问控制 3. 派生类与基类的对象转换 4. 继承中的作用域 5. 派生类的默认成员函数 6. 继承中的特殊关系 6.1 继承与友元 6.2 继承与静态成员 7. 复杂的菱形继承问题 8. 继承与组合的选择 9. 常见面试题 总结 前言 继承…

Eyevinn 彻底改变开源部署模式

该咨询公司借助Akamai云平台&#xff0c;为其创新的开源平台和可持续收益分成模式提供强大支持。 "时间就是金钱&#xff0c;我们通过Akamai云平台快速将开源云平台投入生产。" ——Eyevinn Technology研发副总裁 Jonas Birm实现可持续视频流媒体服务 自2013年以来&…

17day-人工智能-机器学习-分类算法-KNN

1. 什么是knn算法knn算法全名叫做k-近邻算法&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;&#xff0c;看到名字是不是能想到是算距离的&#xff0c;第一个k是指超参数的意思&#xff0c;就是可以认为设置的意思&#xff0c;这里是指最近的k个样本。2. 为什…

12-netty基础-手写rpc-编解码-04

netty系列文章&#xff1a; 01-netty基础-socket02-netty基础-java四种IO模型03-netty基础-多路复用select、poll、epoll04-netty基础-Reactor三种模型05-netty基础-ByteBuf数据结构06-netty基础-编码解码07-netty基础-自定义编解码器08-netty基础-自定义序列化和反序列化09-n…

解决 Windows 下的“幽灵文件”——记一次与带空格的 .gitignore 文件的艰难斗争

引言 你是否遇到过这样的情况&#xff1a;一个文件明明躺在你的文件夹里&#xff0c;ls 或 dir 命令都能清楚地看到它&#xff0c;但无论你用什么方法尝试删除&#xff0c;系统都冷酷地告诉你“找不到文件”&#xff1f; 就在今天&#xff0c;我就遇到了这样一个“幽灵”般的 .…

(易视宝)易视TV is-E4-G-全志A20芯片-安卓4-烧写卡刷工具及教程

&#xff08;易视宝&#xff09;易视TV is-E4-G-全志A20芯片-安卓4-烧写卡刷工具及教程PhoenixCard_V309烧录步骤&#xff1a;1、将TF或SD卡插入计算机&#xff0c;打开软件&#xff1b;2、选择固件所在目录&#xff1b;3、烧写模式选“卡量产”4、点击“烧录”开始量产&#x…

(数据结构)顺序表实现-增删查改

1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时…