一、任务背景:GMNER 的要求?
CCKS2025 多模态实体识别任务(GMNER),目标是:
从图+文对中,识别出命名实体、实体类型,并指出这些实体在图像中的位置。
例如,给了我们如下的输入:
-
文本:
"Soldiers test the PUMA vehicle." -
图像:
001.png(步战车)
我们要输出结构化结果如下:
bash
{
"001": [
{
"name": "PUMA",
"label": "vehicle",
"bndbox": {
"xmin": 150,
"xmax": 250,
"ymin": 150,
"ymax": 250
}
}
]
}
二、ReAct机制是什么?适合什么场景?
**ReAct(Reason + Act)**是一种语言模型提示设计方式,融合:
-
Reasoning(推理):语言模型内在地分析任务,理解目标,拆解步骤;
-
Acting(执行) :模型主动执行具体动作,比如查图、查库、定位目标、调用API等。
两者交替进行,形成一套"思考---行动---反馈---再思考"的闭环。
示例过程如下:
Thought: "PUMA" appears to be a military vehicle. Act: Search a knowledge base to verify. Observation: "PUMA is an infantry fighting vehicle developed in Germany." Thought: Confirmed, so entity type is 'vehicle'. Act: Locate 'PUMA' in the image using a vision model. Observation: Found a bounding box at [150, 250, 150, 250]. Answer: Output the entity with type 'vehicle' and its bounding box.
认为:"PUMA马"似乎是一辆军用车辆。
行动:搜索知识库进行验证。
观察:"PUMA是德国研发的步兵战车。"
思考:已确认,因此实体类型为"vehicle"。
动作:使用视觉模型在图像中定位"PUMA"。
观察:在[150,250,150,250]处发现一个边界框。
答案:输出类型为"vehicle"的实体及其边界框。
三、已有模型资源
我们需要啊准备两个核心模型:
| 模型 | 作用 | 限制 |
|---|---|---|
| 🧠 GPT类大语言模型 | 文本理解,ReAct执行 | 我们要构建 prompt |
| 👁️ Grounding DINO | 图像中根据文本定位实体 | 不理解语义,只处理图像定位 |
Grounding DINO 可以很好完成**Acting(图像识别、定位)**部分。
但它不做任何"推理":比如"PUMA"是什么类型?是否应该出现在图里?这些就适合用ReAct解决。
四、如何融合 ReAct 进我们的实现?
我们可以设计一个三阶段系统,每个阶段明确分工:
阶段一:文本理解与推理(Reason)
输入 :text.json
输出:识别出的实体+类别
方法一:直接用大语言模型(如 GPT-4)做实体识别和分类,结合 few-shot ReAct prompt。
方法二:训练一个传统文本NER模型(如BERT-NER)做第一步识别,然后让语言模型进行实体分类确认。
你可以为每个文本构建 ReAct prompt:
bash
Text: "Soldiers test the PUMA vehicle."
Thought 1: I see the word "PUMA", it seems to refer to some object.
Act 1: Check if "PUMA" is a military term or object.
Obs 1: PUMA is a German-made armored fighting vehicle.
Thought 2: Therefore, "PUMA" is a vehicle-type entity.
Answer: Entity = PUMA, Type = vehicle
阶段二:图像中实体定位(Act)
输入 :图像+推理出的实体名
输出:实体在图像中的位置框(或 null)
使用 Grounding DINO 完成这部分:
python
from groundingdino.util.infer import load_model, predict
# 加载模型
model = load_model(config_path, checkpoint_path)
# 输入图像和实体文本,定位实体
boxes, phrases, confidences = predict(model, image_path, [entity_name])
你还可以设置不同类型的置信度阈值(比如 vehicle ≥ 0.5,person ≥ 0.7)。
阶段三:输出格式组织
把所有信息整理成标准格式写入 Entity.json:
python
{
"001": [
{
"name": "PUMA",
"label": "vehicle",
"bndbox": {
"xmin": 150,
"xmax": 250,
"ymin": 150,
"ymax": 250
}
}
]
}
如果没有框,bndbox 为 null。
五、完整系统流程图(简化版)
┌───────────────┐ │ text.json │ └─────┬─────────┘ ↓ ┌──────────────────────────────────┐ │ ReAct (GPT Prompt) │ │ Text推理:提取实体及类型 │ └─────┬────────────────────────────┘ ↓ [("PUMA", "vehicle")] ↓ ┌─────────────────────────────────┐ │ Grounding DINO │ │ 输入图像+实体 → 输出实体位置 │ └─────┬───────────────────────────┘ ↓ ┌─────────────────────────────┐ │ 生成Entity.json结构化输出 │ └─────────────────────────────┘
示例 Prompt(ReAct风格)
Prompt 是我们给语言模型输入的一段文字,用来引导它完成特定任务。
说的非常直白就是,Prompt 就是告诉模型:"你现在要做什么、怎么做、输入是什么、输出什么格式"。
Prompt 通常包含以下组成部分:
| 部分 | 内容 | 示例 |
|---|---|---|
| 任务指令 | 告诉模型要干什么 | "请识别出文本中的命名实体及其类别" |
| 输入内容 | 提供任务的数据 | "Text: Soldiers test the PUMA vehicle." |
| 输出格式 | 要求输出格式规范 | 输出格式为:{"name": ..., "label": ...} |
| 示例(可选) | 提供一两个示例 | Few-shot prompt(见下) |
要做的任务是从"图+文"中识别实体,这里模型要:
-
看懂文本 → 推理出哪些是实体
-
决定实体的类型
-
决定是否需要图像识别(并调用 Grounding DINO)
所以你可以写一个这样的 Prompt:
bash
任务:请你扮演一个多模态信息抽取专家,从文本中提取出军事装备名称和类别。如果实体在图像中可能可见,请执行定位操作。
Text: "Soldiers test the PUMA vehicle."
步骤:
Thought: "PUMA"可能是军事装备。
Act: 查询资料确认。
Observation: 是德国制造的步兵战车。
Thought: 所以"PUMA"是 vehicle 类型。
Act: 图像中是否可以定位?
Observation: Grounding DINO 定位到了边界框。
输出:
{
"name": "PUMA",
"label": "vehicle",
"bndbox": { "xmin":150, "xmax":250, "ymin":150, "ymax":250 }
}
bash
Text: "Soldiers test the overall system demonstrator armoured infantry fighting vehicle PUMA."
You are tasked to identify all named entities, decide their types (e.g. person, vehicle, location), and for each entity, decide whether it can appear in the accompanying image. If yes, call a vision model to locate it.
Thought: "PUMA" looks like a named entity.
Act: Search military knowledge base for "PUMA"
Observation: "PUMA" is a German armored vehicle.
Thought: It is a vehicle, and likely appears in the image.
Act: Locate "PUMA" in image using Grounding DINO
Observation: Detected bounding box [150, 250, 150, 250]
Final Answer: name="PUMA", label="vehicle", bndbox=[...]
-------------------------------------------------------------
文本:"士兵们正在测试装甲步兵战车PUMA的整体系统演示。"
您的任务是识别所有命名实体,确定其类型(例如人、车辆、位置),并为每个实体决定是否可以出现在随附的图像中。如果是,请调用视觉模型来定位它。
思想:"PUMA"看起来像一个命名实体。
行动:在军事知识库中搜索"PUMA"
观察:"PUMA"是一辆德国装甲车。
思考:这是一辆车,很可能出现在图像中。
动作:使用接地DINO在图像中定位"PUMA"
观察:检测到边界框[150, 250, 150, 250]
最终答案:name="PUMA",label="车辆",bndbox=[...]
最后总结
| 项目 | 内容 |
|---|---|
| 任务核心 | 图文联合识别军事领域命名实体+类型+图像定位 |
| Grounding DINO优势 | 强大目标定位模型,适合用于 Act |
| ReAct引入价值 | 用语言模型增强推理能力,决定定位对象、生成可解释推理轨迹 |
| 整合方式 | Reason(识别实体+分类)→ Act(调用 Grounding DINO 定位) |
| 可选优化 | 加入多模态微调或扩充ReAct prompt以提升准确率 |