DeepSense-AI RAGbits项目中的图像元素多模态嵌入技术解析
背景与挑战
在现代文档处理系统中,图像元素往往同时包含视觉信息和文本信息(如OCR提取的文字或人工描述)。DeepSense-AI的RAGbits项目面临一个核心挑战:如何高效处理这种多模态数据以实现精准检索。传统方法通常只能选择单一模态进行嵌入,这会导致信息丢失或检索效果下降。
技术方案演进
初始方案:双嵌入策略
项目最初采用同时生成视觉嵌入和文本嵌入的方案:
- 为每个ImageElement创建两个独立的向量存储条目
- 分别通过视觉模型和文本模型生成嵌入向量
- 检索时合并两种模态的结果
这种方案虽然全面,但存在存储冗余和计算资源消耗大的问题。
改进方向:可配置化嵌入
新方案提出动态选择嵌入模态的能力:
文本嵌入控制
- 将
description
和ocr_extracted_text
属性改为可选 get_key()
方法返回Optional类型- 当元素无文本表示时跳过文本嵌入生成
- 用户通过选择不同的处理器控制是否生成文本表示
视觉嵌入控制
通过选择不同的嵌入模型实现:
- 使用纯文本模型时自动跳过视觉嵌入
- 使用多模态模型时保留视觉处理能力
多模态支持增强
- 在
VectorStoreEntry
中新增embedding_type
枚举字段 - 重构向量条目ID生成机制,使其同时依赖:
- 元素ID
- 嵌入类型(文本/图像)
- 确保同一元素的不同模态嵌入具有唯一标识
实现细节
元素处理流程优化
class ImageElement:
description: Optional[str] = None
ocr_extracted_text: Optional[str] = None
def get_key(self) -> Optional[str]:
return self.ocr_extracted_text or self.description
向量存储改造
class VectorStoreEntry:
embedding_type: Literal["text", "image"]
@property
def id(self) -> str:
return hash(f"{element.id}-{self.embedding_type}")
异常处理机制
- 当元素配置为不生成任何嵌入时发出警告
- 继续处理文档中的其他元素
- 提供明确的日志信息帮助调试
技术价值
- 资源优化:避免不必要的文本处理或视觉计算
- 灵活性提升:支持多种业务场景配置
- 检索精度:保持多模态检索能力的同时降低系统负载
- 可扩展性:为未来支持更多模态预留接口
最佳实践建议
- 对纯视觉内容(如无文字图片)禁用文本处理流程
- 对文本密集型图像(如扫描文档)优先使用文本嵌入
- 在计算资源充足时启用双嵌入模式获取最佳效果
- 建立监控机制跟踪不同模态的检索效果
该方案已在RAGbits项目中实现,显著提升了系统处理复杂文档的效率和灵活性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考