Project Design
Question
图片的使用场景是两个地方(回答用户问题的时候将图片作为一个佐证,第二个就是作为语料进行训练)
一般的图片处理流程大概是:生成图片描述
1 | SaaS平台功能模块 |
模型微调
数据标准格式

双引号匹配问题以及换行全部替换掉
1 | { |
模型微调技术实现
要在单张 NVIDIA RTX 4090 (24GB VRAM) 上微调 GLM-4-9B-Chat 模型,必须使用 QLoRA (4-bit 量化 + LoRA) 技术。如果不进行 4-bit 量化,9B 模型以半精度(FP16)加载就需要约 18GB 显存,加上训练时的梯度和优化器状态,24GB 显存是完全不够的。
使用 QLoRA 技术,模型加载仅需约 6GB 显存,剩余显存足以支持较长的上下文(Context Length)训练。
基于 Hugging Face 的 trl、peft 和 bitsandbytes 库。
显存与参数详细估算 (RTX 4090 - 24GB)
- 显存占用分析
模型权重 (Load):
- GLM-4-9B 参数量约 90亿。
- 4-bit 量化加载: 9×109×0.5 bytes≈4.5 GB。
- 考虑到 CUDA 缓存和 PyTorch 开销,基础占用约 5.5 GB - 6 GB。
LoRA 适配器:
r=16时,参数量极小(几千万),显存占用可忽略不计(< 100MB)。训练状态 (Training State):
- 使用
paged_adamw_32bit优化器,优化器状态会被分页到内存中,极大节省显存。 - 梯度检查点 (Gradient Checkpointing): 开启后,不再保存所有中间激活值,而是以计算换显存。
- 使用
上下文长度 (Context Length): 这是显存占用的最大变量。你的 ESG 文本如果包含长篇大论,这部分占用会很高。
- Max Seq Length = 2048: 训练总显存约 12 GB - 14 GB (非常安全)。
- Max Seq Length = 4096: 训练总显存约 18 GB - 22 GB (接近极限,可能需要 batch_size=1)。
| 参数 | 推荐值 | 说明 |
|---|---|---|
| load_in_4bit | True |
必须。否则 OOM (Out of Memory)。 |
| per_device_train_batch_size | 1 或 2 |
设为 1 最稳妥。如果显存有富余(如文本较短),可尝试设为 2。 |
| gradient_accumulation_steps | 8 或 16 |
用来模拟大 Batch Size。例如 batch=1 & acc=16 等效于 batch=16。 |
| max_seq_length | 2048 |
大多数 ESG 摘要提取任务 2k 长度足够。如果不够,设为 4096 但必须保持 batch_size=1。 |
| learning_rate | 2e-4 |
QLoRA 论文推荐的经验值。 |
| optim | paged_adamw_32bit |
关键。在显存不足时自动将优化器状态转移到 CPU 内存。 |
环境依赖安装
运行上述代码前,你需要安装以下特定版本的库(GLM-4 需要较新的 Transformers):
1 | pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 |
微调代码
1 | import os |
高级生成式问答系统 (RAG + 翻译 + 多模态佐证) 架构设计
本文档描述如何构建一个实现“基于知识库索引、多语言翻译、生成式问答及图片佐证”功能的 AI 问答系统。
1. 核心目标和流程概述
目标: 根据用户提问,系统能从专业知识库中精确检索语料,提供中文/英文翻译,生成连贯答案,并附带知识库中对应的佐证图片。
整体流程:
- 用户提问 (Q) -> 2. 检索增强 (R) -> 3. 翻译/语料选择 (T) -> 4. 答案生成 (G) -> 5. 图片检索与佐证 (M) -> 6. 最终输出 (A)
2. 关键技术模块与实现细节
| 模块 | 核心功能 | 关键技术/工具 | Doccano/文件关联 |
|---|---|---|---|
| 知识库构建 | 存储文本语料和图片文件。 | 文档解析 (PDF/HTML)、向量数据库 (如: Chroma/Pinecone)、对象存储 (如: S3)。 | 您的 脑血管病影像规范化应用中国指南(2).pdf 及其图片。 |
| 检索增强 (R) | 将用户查询与知识库中最相关的文本块进行匹配。 | Embedding Model (如: BGE-M3)、Vector Search。 | doccano_labels.jsonl 中标注的实体可用于优化检索。 |
| 翻译模块 (T) | 识别用户语言,对用户查询或生成答案进行翻译。 | Gemini (多语言支持) 或专业翻译 API (如: Google Translate)。 | - |
| 生成模块 (G) | 结合语料和查询,生成最终答案。 | LLM (如: Gemini-2.5-Flash 或您的微调模型)。 | - |
| 多模态佐证 (M) | 检索并显示与答案高度相关的佐证图片。 | 多模态 Embedding (将图片转为向量)、双索引机制。 | image_66d2ee.jpg 等知识库图片。 |
2.1. 知识库预处理(数据工程)
这是系统的基石,需要采取双重索引策略:
- 文本索引 (Vector Index):
- 将 PDF (
脑血管病影像规范化应用中国指南(2).pdf) 分块(Chunking),创建文本向量。 - 关键: 记录每个文本块的
source_id(对应原始文件)和page_number。
- 将 PDF (
- 图片索引 (Multimodal Index):
- 从 PDF 中提取所有图片。
- 为每张图片附加一个 描述性文本 (Caption),并创建图片的向量(使用视觉模型,或使用描述文本的向量)。
- 关键: 记录每张图片的
page_number和caption。
2.2. 检索增强 (R) 与翻译 (T) 流程
- 语言识别与翻译:
- 识别用户查询的语言。如果是非目标语言(例如用户用英文提问,但语料是中文),则将查询翻译成中文,用中文进行检索。
- 文本检索:
- 将翻译后的查询向量化,在文本索引中检索 Top-K(例如 K=5)个最相关的文本块。
- 语料整合:
- 将检索到的语料作为上下文,传递给生成模块。
2.3. 答案生成 (G)
将以下信息打包成一个提示词(Prompt),发送给 LLM(如您的微调模型):
1 | [系统指令]:你是一个严谨的专业知识问答系统。请仅根据提供的 [语料] 回答 [问题]。同时,请注意提取回答内容中涉及的关键视觉概念,为后续的图片佐证做准备。 |
2.4. 图片检索与多模态佐证 (M)
这是实现图片佐证的关键步骤:
- 获取 Image_Cue:从 LLM 的输出中提取
[Image_Cue](例如:“急性脑梗死 DWI 表现”)。 - 检索图片:
- 方法 A:文本到图像匹配 (推荐):将
Image_Cue向量化,在图片描述/Caption索引中进行检索,找出最相关的图片。 - 方法 B:文本到文本匹配:从步骤 2.2 检索到的语料中,找到对应的
page_number,然后从图片索引中查找该页或附近页面的图片。
- 方法 A:文本到图像匹配 (推荐):将
- 结果输出:将 LLM 生成的
[Answer]、引用的语料和检索到的图片(通过对象存储 URL 或 Base64 编码)一起返回给前端。
3. 前端展示与应用(基于 image_analysis_app.html 启发)
可以借鉴您提供的 image_analysis_app.html 的结构,但需要修改其 JavaScript 逻辑来连接这个 RAG 后端服务:
- 用户界面:用户输入查询。
- 前端调用:前端调用一个统一的 RAG 后端接口,而不是直接调用 Gemini API。
- 结果展示:前端接收包含
text_answer和image_url的 JSON 响应。- 将
text_answer渲染到resultOutput。 - 将
image_url设置给generatedImage.src,实现佐证图片显示。
- 将
这种架构确保了:
- 准确性 (R+G):答案严格基于知识库语料。
- 多语言 (T):支持用户以不同语言提问。
- 佐证性 (M):通过检索知识库中真实图片,为答案提供了视觉佐证,增强了专业领域的信任度。
图片索引(Multimodal Index)构建指南
本文详细阐述了如何构建一个高效的图片索引,以支持高级生成式问答系统中的多模态佐证功能。
1. 索引构建的必要步骤
构建图片索引是一个多阶段的数据处理过程,目标是为知识库中的每张图片生成一个高质量的向量(Embedding)和必要的元数据(Metadata)。
步骤 1: 图片提取与元数据关联
目的: 从原始文档中分离图片文件,并记录其在文档中的位置。
- 图片提取: 使用专业的 PDF 解析工具(如
PyMuPDF或Tesseract/OCR工具组合)从 PDF 文件(例如脑血管病影像规范化应用中国指南(2).pdf)中批量提取所有嵌入的图像。 - 元数据记录: 在提取图片时,必须记录以下关键信息:
image_id: 图片的唯一标识符。source_file: 原始文件名(例如脑血管病影像规范化应用中国指南(2).pdf)。page_number: 图片所在的页码(用于后期快速定位和佐证)。storage_url: 图片在对象存储(如 S3)中的最终存储路径。
步骤 2: 图像描述生成(Captioning)
目的: 为图像创建高质量的文本描述,因为纯粹的图像向量难以直接与文本查询匹配。
- 自动描述 (VLM):
- 首选方法: 使用强大的视觉语言模型(VLM,如 Gemini Pro Vision)API。将提取的图片作为输入,要求模型生成一个详细的、专业的描述(Caption),解释图片内容、结构和医疗含义。
- 手动/半自动提取:
- 如果图片在 PDF 中有图注(Caption),应优先通过解析 PDF 文本来提取该图注作为描述。
- 结果存储: 将生成的描述文本存储为图片的元数据字段,例如
caption_text。
步骤 3: 向量化(Embedding Generation)
这是将图片转化为可搜索数据的核心。有两种主要方法:
方法 A: 文本描述向量化 (Caption Embedding)
- 原理: 将步骤 2 中生成的
caption_text作为输入,使用与文本索引相同的 Embedding Model(如 BGE-M3)生成向量。 - 优点: 简单,只需要一种 Embedding 模型,易于实现 文本查询到图片描述 的匹配。
- 缺点: 依赖于描述的质量;如果描述不准确,检索结果也会不准确。
方法 B: 多模态向量化 (Multimodal Embedding) - 推荐
- 原理: 使用专门训练过的多模态模型(例如 CLIP 或特定的 Gemini Embedding 模型)直接对图片原始像素和文本查询进行编码。
- 优点: 向量空间统一,查询可以直接匹配图片的视觉概念,检索精度更高。
- 缺点: 需要使用额外的多模态模型,计算资源消耗较大。
步骤 4: 索引存储与部署
目的: 将向量和元数据持久化存储在向量数据库中。
- 选择向量数据库: 选择适合生产环境的向量数据库(如 ChromaDB, Pinecone, Milvus, 或云服务提供的向量搜索)。
- 数据结构: 数据库的每个记录应包含:
- 向量: (
vector, 约 768 或 1024 维)。 - 元数据: (
image_id,storage_url,page_number,caption_text)。
- 向量: (
- 部署: 确保该图片索引与文本索引在同一检索服务中运行,以支持后续的 LLM 引导检索。
2. RAG 系统中的图片检索机制
在构建完图片索引后,它将在 RAG 系统的 多模态佐证 (M) 模块中发挥作用:
| RAG 流程阶段 | 关键操作 | 索引利用方式 |
|---|---|---|
| LLM 生成答案 (G) | LLM 输出答案 [Answer] 和图片提示 [Image_Cue]。 |
- |
| 图片检索 (M) | 将 [Image_Cue] 向量化,并在图片索引中执行相似度搜索。 |
向量查询: Image_Cue_vector -> Vector_DB (图片索引)。 |
| 佐证输出 (A) | 数据库返回 Top-1 或 Top-3 个最相似的图片记录。 | 返回 storage_url 和 page_number 给前端展示。 |
多模态大模型(识别与生成)微调数据集构建
微调多模态大模型(通常是微调其视觉语言模型 VLM 部分)的目的是提高模型在特定领域或特定指令遵循方面的能力。
对于一个同时涉及“识别”和“生成”的模型,微调数据主要用于教会模型以下两点:
- 更好地理解图像内容: 学习特定领域的视觉特征和术语(识别)。
- 更好地遵循指令和生成高质量描述: 学习将识别结果转化为可供后续生成模型使用的精准指令(生成前的准备)。
🚀 1. 数据集基本结构
多模态微调数据集通常采用指令微调(Instruction Tuning)的格式,将图像作为输入的一部分。
数据集的每条记录应包含以下三个核心要素:
| 字段名称 | 描述 | 示例数据类型 |
|---|---|---|
| Image | 图像文件路径或 Base64 编码的图像数据。 | JPEG/PNG 文件或编码字符串 |
| Instruction | 用户提出的具体问题或指令(模型需要解决的任务)。 | 文本(例如:“这张图里是什么?”、“给我生成一张类似风格的图片。”) |
| Response | 模型针对该指令和图像应给出的标准、高质量的回答或输出。 | 文本(例如:详细描述、诊断结果、生成模型的提示词) |
🎯 2. 传统数据集构建目标及示例
以下是三种常见的微调目标,以及对应的指令和响应示例,适用于一个目标是“识别并协助后续生成”的多模态模型。
目标一:垂直领域知识增强(高精度识别)
目的: 教会模型理解并使用特定领域的专业词汇和识别特征,例如在时尚、工业检测、医疗诊断等领域。
| 场景 | Image | Instruction | Response |
|---|---|---|---|
| 时尚领域 | 请用专业术语描述这件连衣裙的材质、轮廓和设计风格。 | 这是一件带有巴洛克印花的A字形剪影连衣裙,主要材质为丝绒,领口设计为方领,袖子是泡泡袖,整体风格偏向复古华丽。 | |
| 工业缺陷 | 请识别这张照片中的制造缺陷类型和位置。 | 图像中心偏右位置,在 U2 芯片附近发现一条约 3mm 长的微裂纹(Microcrack),这属于表面缺陷,需要立即报废。 | |
| 医疗影像 | 描述胸部 X 射线图像的关键发现。 | 影像显示右侧中肺野可见斑片状高密度影,边界模糊,提示可能为肺部感染或炎症渗出。 |
目标二:复杂指令遵循与链式推理
目的: 提升模型处理多步骤指令、进行上下文推理,并将推理结果转化为生成提示的能力。这对于“识别后生成”的流程至关重要。
| 场景 | Image | Instruction | Response |
|---|---|---|---|
| 物体替换 | 请先描述图中的橱柜材质,然后生成提示词,要求将材质替换为白色亮面烤漆,其余不变。 | (识别结果):图中的橱柜是深棕色的实木材质,风格为简约美式。 (生成指令):请生成一张与原图相似的厨房图片,但将所有深棕色实木橱柜替换成白色亮面烤漆面板,风格保持现代简约,柔和的自然光,超高清细节。 | |
| 情绪转换 | 描述图中人物和环境的当前氛围,并给出提示词要求将氛围转换为“希望和温暖”。 | (识别结果):图像氛围低沉、忧郁,人物在雨中低头行走,色彩阴暗。 (生成指令):一个眼神充满希望的年轻人在金色夕阳下,背景是清晰的乡村小路,暖色调,电影级光照,景深镜头。 |
目标三:高质量/风格化提示词生成
目的: 训练模型根据输入图像,自动生成适合专业文本到图像(T2I)模型使用的高质量、风格化(如电影感、动漫风、超现实主义)的描述性提示词。
| 场景 | Image | Instruction | Response |
|---|---|---|---|
| 艺术风格 | 请生成一段用于 Midjourney 或 Stable Diffusion 的提示词,要求是浮世绘风格。 | 一只黑白相间的猫咪坐在和式窗台前,眺望窗外。画面主体采用浮世绘风格,粗黑的轮廓线,鲜艳的平涂色彩,木刻版画质感,by Hokusai。 | |
| 摄影风格 | 假设这是一张高分辨率风景照,请生成一段包含摄影参数的提示词。 | 茂密的原始森林,阳光从树冠缝隙中洒落形成丁达尔光束,超广角镜头,f/2.8大光圈,高动态范围(HDR)处理,颗粒感,自然主义摄影,8K。 | |
| 卡通风格 | 请用可爱的皮克斯卡通风格描述这只愤怒的狗狗。 | 一只毛茸茸的、脾气暴躁的皮克斯风格动画小狗,眉毛皱成一团,鼓着腮帮子。3D渲染,柔和的卡通光照,高饱和度,可爱。 |
🏗️ 4. PDF结构化与指令构建(父子块)
针对 PDF 文档进行结构化信息提取的微调,关键在于训练模型识别文本内容与版面结构之间的关联。
A. 预处理步骤(Image 输入的构造)
由于 PDF 无法直接作为图像输入,您需要将 PDF 转化为 VLM 可接受的格式:
- PDF 转换为图像: 将 PDF 页面转换为高分辨率 PNG 或 JPEG 图像。
- 视觉上下文: VLM 的
Image输入应是完整的 PDF 页面截图,这样模型才能看到标题、字号、边距、编号等视觉提示。 - 文本上下文(可选,增强鲁棒性): 如果 VLM 支持多输入,可以在
Instruction字段中同时提供 OCR 提取的原始文本(作为辅助输入),以弥补图像识别的误差。
B. 父子块指令构建策略
微调数据应该包含多个层次的指令,以训练模型进行链式推理和结构化输出。
策略 1: 识别父块(章节)
目的: 教会模型识别并提取出文档中的主要章节(父块)。
| 场景 | Image | Instruction | Response |
|---|---|---|---|
| 章节提取 | 请识别本页中所有一级和二级章节标题的文本和层级关系,以 JSON 数组格式返回。 |








