Question

  1. 图片的使用场景是两个地方(回答用户问题的时候将图片作为一个佐证,第二个就是作为语料进行训练)

  2. 一般的图片处理流程大概是:生成图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
SaaS平台功能模块
项目管理、账号管理、人员管理
平台的功能模块是哪些?
前端展示路径,调取路径

Knowledge Hub(知识库)
ESG相关新闻不用付费
法律法规付费

AI Lab
律师、会计师使用
合规小工具
工作流文件(中小企业)
每一个议题Agent都是一个单独的服务

小的模块、工具
ESG合规工具


后面的一个用户问答设想:
用户问了一个问题,能够根据问题索引到对应的一些语料,会有翻译,会有标签,会有图片佐证

先使用gemini画出一个前端出来,在前端做一些代码的更新

问下SteveESG365平台的代码是否已经在码云上了gitee 或者Gitlab上了
代码人员秘钥管理 → 公众号推文植入,原有功能模块优化 → 系统上线

每天更新语料内容 让业务负责人抽查 语料无误才能使用

语料的标签1.0版本管理 更新迭代留存

模型微调

数据标准格式

image-20251130131705733

双引号匹配问题以及换行全部替换掉

1
2
3
4
5
{
"instruction": "你是一位ESG可持续发展领域的资深分析师。请仔细阅读给定的ESG报告文本,从中精准提取结构化信息。你需要识别并输出以下字段:'议题评估方式'(如双重重要性)、'议题评估展示形式'(如矩阵、列表)、'议题维度'(需细分环境、社会等维度及其具体议题)、'议题重要性'结论、所属'行业'、'涉及合规标准'(具体条款)、'监管框架'、'报告年份'以及'来源信息'。请严格按照JSON格式输出提取结果,确保字段名与上述要求完全一致。",
"input": "招商轮船积极相应上交所要求,首次开展了ESG 议题双重重要性调研分析。本次调研通过背景分析与议题识别、议题双重重要性调研、重要性评估与排序,以及结果审核与确认四个步骤分析各ESG 议题的重要性程度。在研究国内外航运企业及行业的发展情况、公司2024 年工作重点及2025 年规划的基础上,我们通过召开各类专题研讨会议、开展ESG 议题的重要性调研等方式,筛选出了招商轮船的24 项重要性议题ESG 议题,并将其作为公司ESG 信息披露的重点内容...",
"output": "{\n \"议题评估方式\": [\"双重重要性\"],\n \"议题评估展示形式\": [\"概述\", \"议题识别\", \"议题评估\", \"议题排序\", \"议题确认\"],\n \"议题维度\": [\n {\"环境维度议题\": \"水资源管理、循环利用\"},\n {\"社会维度议题\": \"劳工管理、创新驱动\"}\n ],\n \"议题重要性\": [\"双重重要性议题:水资源管理\"],\n \"行业\": [\"上海证券交易所-制造业/铁路、船舶、航空航天和其他运输设备制造业\"],\n \"涉及合规标准\": [\"上交所第14号文-第五十条(三)\"],\n \"监管框架\": \"CN-SSE\",\n \"报告年份\": \"FY2024\",\n \"来源信息\": {\"公司ID\": \"A00001\"}\n}"
}

模型微调技术实现

要在单张 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 的 trlpeftbitsandbytes 库。

显存与参数详细估算 (RTX 4090 - 24GB)

  1. 显存占用分析

模型权重 (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 12 设为 1 最稳妥。如果显存有富余(如文本较短),可尝试设为 2。
gradient_accumulation_steps 816 用来模拟大 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
2
3
4
5
6
7
8
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install "transformers>=4.40.0"
pip install peft bitsandbytes trl
pip install datasets scipy sentencepiece
pip install tic_token # GLM-4 特殊依赖

### 总结
使用上述脚本,在单张 4090 上,你可以在 4-bit 精度 下,以 2048 长度 的上下文微调 GLM-4-9B。训练速度取决于你的数据量,一般来说 1000 条数据微调 3 个 Epoch 可能需要 1-2 小时左右。

微调代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import os
import torch
from datasets import load_dataset
from transformers import (
AutoTokenizer,
AutoModelForCausalLM,
BitsAndBytesConfig,
TrainingArguments
)
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training, TaskType
from trl import SFTTrainer, DataCollatorForCompletionOnlyLM

# ==========================================
# 1. 配置参数
# ==========================================
MODEL_ID = "THUDM/glm-4-9b-chat" # 或是本地路径
DATA_PATH = "esg_finetune_corrected.jsonl" # 你的数据集路径
OUTPUT_DIR = "./glm4_esg_lora_output"

# 显存优化:4-bit 量化配置 (QLoRA)
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16, # 4090支持bf16,如有需要可改为 torch.bfloat16
bnb_4bit_use_double_quant=True,
)

# LoRA 参数配置
lora_config = LoraConfig(
r=16, # LoRA 秩,越大参数越多,通常 8, 16, 32, 64
lora_alpha=32, # LoRA 缩放系数,通常是 r 的 2 倍
target_modules=[ # GLM-4 的核心线性层
"query_key_value",
"dense",
"dense_h_to_4h",
"dense_4h_to_h"
],
lora_dropout=0.05,
bias="none",
task_type=TaskType.CAUSAL_LM,
)

# ==========================================
# 2. 加载模型与 Tokenizer
# ==========================================
print(f"[*] 正在加载模型: {MODEL_ID}")
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID, trust_remote_code=True)

model = AutoModelForCausalLM.from_pretrained(
MODEL_ID,
quantization_config=bnb_config,
device_map="auto", # 自动分配到 GPU
trust_remote_code=True
)

# 开启梯度检查点 (节省显存,但略微降低速度)
model.gradient_checkpointing_enable()
# 准备模型进行 k-bit 训练 (预处理层归一化等)
model = prepare_model_for_kbit_training(model)
# 应用 LoRA
model = get_peft_model(model, lora_config)
model.print_trainable_parameters() # 打印可训练参数量

# ==========================================
# 3. 数据处理
# ==========================================
# 定义格式化函数:将 instruction/input/output 转换为 GLM-4 的 Chat 格式
def formatting_prompts_func(example):
output_texts = []
for i in range(len(example['instruction'])):
instruction = example['instruction'][i]
input_text = example['input'][i]
output_text = example['output'][i]

# 组合用户输入
user_query = f"{instruction}\n\n{input_text}"

# 使用 GLM-4 的 apply_chat_template 构建对话
# 注意:这里我们手动构建 prompt,以便 SFTTrainer 进行训练
# 格式通常是: [gMASK]<sop><|user|> \n {Query} <|assistant|> \n {Response}

messages = [
{"role": "user", "content": user_query},
{"role": "assistant", "content": output_text}
]

# tokenize=False 返回字符串,SFTTrainer 会自动进行 tokenize
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=False)
output_texts.append(text)

return output_texts

dataset = load_dataset("json", data_files=DATA_PATH, split="train")

# ==========================================
# 4. 训练参数设置
# ==========================================
training_args = TrainingArguments(
output_dir=OUTPUT_DIR,
per_device_train_batch_size=1, # 4090 显存有限,设为 1 或 2
gradient_accumulation_steps=8, # 累计梯度,模拟大 batch_size (1*8=8)
learning_rate=2e-4, # QLoRA 常用学习率
num_train_epochs=3, # 训练轮数
logging_steps=10,
save_steps=100,
optim="paged_adamw_32bit", # 分页优化器,关键!防止 OOM
fp16=True, # 开启混合精度
max_grad_norm=0.3,
warmup_ratio=0.03,
group_by_length=True, # 将长度相似的样本分组,提高训练效率
lr_scheduler_type="cosine",
report_to="tensorboard",
save_total_limit=2, # 最多保留2个模型存档
)

# ==========================================
# 5. 开始训练
# ==========================================
# 使用 DataCollatorForCompletionOnlyLM 确保只对 Output 部分计算 Loss
# 需要找到 GLM-4 回复开始的 token。GLM-4 中 assistant token 通常是 "<|assistant|>"
response_template = "<|assistant|>"
collator = DataCollatorForCompletionOnlyLM(response_template=response_template, tokenizer=tokenizer)

trainer = SFTTrainer(
model=model,
train_dataset=dataset,
peft_config=lora_config,
max_seq_length=2048, # 根据你的显存和文本长度调整,4090 建议 2048-4096
tokenizer=tokenizer,
args=training_args,
formatting_func=formatting_prompts_func,
data_collator=collator,
)

print("[*] 开始训练...")
trainer.train()

# 保存最终模型
print(f"[*] 保存模型至 {OUTPUT_DIR}")
trainer.save_model(OUTPUT_DIR)

高级生成式问答系统 (RAG + 翻译 + 多模态佐证) 架构设计

本文档描述如何构建一个实现“基于知识库索引、多语言翻译、生成式问答及图片佐证”功能的 AI 问答系统。

1. 核心目标和流程概述

目标: 根据用户提问,系统能从专业知识库中精确检索语料,提供中文/英文翻译,生成连贯答案,并附带知识库中对应的佐证图片。

整体流程:

  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. 知识库预处理(数据工程)

这是系统的基石,需要采取双重索引策略:

  1. 文本索引 (Vector Index):
    • 将 PDF (脑血管病影像规范化应用中国指南(2).pdf) 分块(Chunking),创建文本向量。
    • 关键: 记录每个文本块的 source_id(对应原始文件)和 page_number
  2. 图片索引 (Multimodal Index):
    • 从 PDF 中提取所有图片。
    • 为每张图片附加一个 描述性文本 (Caption),并创建图片的向量(使用视觉模型,或使用描述文本的向量)。
    • 关键: 记录每张图片的 page_numbercaption

2.2. 检索增强 (R) 与翻译 (T) 流程

  1. 语言识别与翻译:
    • 识别用户查询的语言。如果是非目标语言(例如用户用英文提问,但语料是中文),则将查询翻译成中文,用中文进行检索。
  2. 文本检索:
    • 将翻译后的查询向量化,在文本索引中检索 Top-K(例如 K=5)个最相关的文本块。
  3. 语料整合:
    • 将检索到的语料作为上下文,传递给生成模块。

2.3. 答案生成 (G)

将以下信息打包成一个提示词(Prompt),发送给 LLM(如您的微调模型):

1
2
3
4
5
6
7
8
[系统指令]:你是一个严谨的专业知识问答系统。请仅根据提供的 [语料] 回答 [问题]。同时,请注意提取回答内容中涉及的关键视觉概念,为后续的图片佐证做准备。

[用户问题]:{用户查询}
[检索语料]:{检索到的 Top-K 文本块}

[LLM 输出要求]:
1. [Answer]:生成的答案。
2. [Image_Cue]:一个高度概括、适合用于图片检索的关键词或短语(必须在答案中有所体现)。

2.4. 图片检索与多模态佐证 (M)

这是实现图片佐证的关键步骤:

  1. 获取 Image_Cue:从 LLM 的输出中提取 [Image_Cue](例如:“急性脑梗死 DWI 表现”)。
  2. 检索图片:
    • 方法 A:文本到图像匹配 (推荐):将 Image_Cue 向量化,在图片描述/Caption索引中进行检索,找出最相关的图片。
    • 方法 B:文本到文本匹配:从步骤 2.2 检索到的语料中,找到对应的 page_number,然后从图片索引中查找该页或附近页面的图片。
  3. 结果输出:将 LLM 生成的 [Answer]、引用的语料和检索到的图片(通过对象存储 URL 或 Base64 编码)一起返回给前端。

3. 前端展示与应用(基于 image_analysis_app.html 启发)

可以借鉴您提供的 image_analysis_app.html 的结构,但需要修改其 JavaScript 逻辑来连接这个 RAG 后端服务:

  1. 用户界面:用户输入查询。
  2. 前端调用:前端调用一个统一的 RAG 后端接口,而不是直接调用 Gemini API。
  3. 结果展示:前端接收包含 text_answerimage_url 的 JSON 响应。
    • text_answer 渲染到 resultOutput
    • image_url 设置给 generatedImage.src,实现佐证图片显示。

这种架构确保了:

  • 准确性 (R+G):答案严格基于知识库语料。
  • 多语言 (T):支持用户以不同语言提问。
  • 佐证性 (M):通过检索知识库中真实图片,为答案提供了视觉佐证,增强了专业领域的信任度。

图片索引(Multimodal Index)构建指南

本文详细阐述了如何构建一个高效的图片索引,以支持高级生成式问答系统中的多模态佐证功能。

1. 索引构建的必要步骤

构建图片索引是一个多阶段的数据处理过程,目标是为知识库中的每张图片生成一个高质量的向量(Embedding)和必要的元数据(Metadata)。

步骤 1: 图片提取与元数据关联

目的: 从原始文档中分离图片文件,并记录其在文档中的位置。

  1. 图片提取: 使用专业的 PDF 解析工具(如 PyMuPDFTesseract/OCR 工具组合)从 PDF 文件(例如 脑血管病影像规范化应用中国指南(2).pdf)中批量提取所有嵌入的图像。
  2. 元数据记录: 在提取图片时,必须记录以下关键信息:
    • image_id: 图片的唯一标识符。
    • source_file: 原始文件名(例如 脑血管病影像规范化应用中国指南(2).pdf)。
    • page_number: 图片所在的页码(用于后期快速定位和佐证)。
    • storage_url: 图片在对象存储(如 S3)中的最终存储路径。

步骤 2: 图像描述生成(Captioning)

目的: 为图像创建高质量的文本描述,因为纯粹的图像向量难以直接与文本查询匹配。

  1. 自动描述 (VLM):
    • 首选方法: 使用强大的视觉语言模型(VLM,如 Gemini Pro Vision)API。将提取的图片作为输入,要求模型生成一个详细的、专业的描述(Caption),解释图片内容、结构和医疗含义。
  2. 手动/半自动提取:
    • 如果图片在 PDF 中有图注(Caption),应优先通过解析 PDF 文本来提取该图注作为描述。
  3. 结果存储: 将生成的描述文本存储为图片的元数据字段,例如 caption_text

步骤 3: 向量化(Embedding Generation)

这是将图片转化为可搜索数据的核心。有两种主要方法:

方法 A: 文本描述向量化 (Caption Embedding)

  • 原理: 将步骤 2 中生成的 caption_text 作为输入,使用与文本索引相同的 Embedding Model(如 BGE-M3)生成向量。
  • 优点: 简单,只需要一种 Embedding 模型,易于实现 文本查询到图片描述 的匹配。
  • 缺点: 依赖于描述的质量;如果描述不准确,检索结果也会不准确。

方法 B: 多模态向量化 (Multimodal Embedding) - 推荐

  • 原理: 使用专门训练过的多模态模型(例如 CLIP 或特定的 Gemini Embedding 模型)直接对图片原始像素和文本查询进行编码。
  • 优点: 向量空间统一,查询可以直接匹配图片的视觉概念,检索精度更高。
  • 缺点: 需要使用额外的多模态模型,计算资源消耗较大。

步骤 4: 索引存储与部署

目的: 将向量和元数据持久化存储在向量数据库中。

  1. 选择向量数据库: 选择适合生产环境的向量数据库(如 ChromaDB, Pinecone, Milvus, 或云服务提供的向量搜索)。
  2. 数据结构: 数据库的每个记录应包含:
    • 向量: (vector, 约 768 或 1024 维)。
    • 元数据: (image_id, storage_url, page_number, caption_text)。
  3. 部署: 确保该图片索引与文本索引在同一检索服务中运行,以支持后续的 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_urlpage_number 给前端展示。

多模态大模型(识别与生成)微调数据集构建

微调多模态大模型(通常是微调其视觉语言模型 VLM 部分)的目的是提高模型在特定领域或特定指令遵循方面的能力。

对于一个同时涉及“识别”和“生成”的模型,微调数据主要用于教会模型以下两点:

  1. 更好地理解图像内容: 学习特定领域的视觉特征和术语(识别)。
  2. 更好地遵循指令和生成高质量描述: 学习将识别结果转化为可供后续生成模型使用的精准指令(生成前的准备)。

🚀 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 可接受的格式:

  1. PDF 转换为图像: 将 PDF 页面转换为高分辨率 PNG 或 JPEG 图像。
  2. 视觉上下文: VLM 的 Image 输入应是完整的 PDF 页面截图,这样模型才能看到标题、字号、边距、编号等视觉提示。
  3. 文本上下文(可选,增强鲁棒性): 如果 VLM 支持多输入,可以在 Instruction 字段中同时提供 OCR 提取的原始文本(作为辅助输入),以弥补图像识别的误差。

B. 父子块指令构建策略

微调数据应该包含多个层次的指令,以训练模型进行链式推理和结构化输出。

策略 1: 识别父块(章节)

目的: 教会模型识别并提取出文档中的主要章节(父块)。

场景 Image Instruction Response
章节提取 请识别本页中所有一级和二级章节标题的文本和层级关系,以 JSON 数组格式返回。