功能描述
为同一个BaseNode及其所有派生(TextNode、Document、ImageNode等)存储多个嵌入。目前,BaseNode有一个字段embedding
,由Pydantic强制类型化为Optional[List[float]]
。这限制了每个节点只能有一个嵌入。我希望为同一个节点存储多个嵌入(例如密集嵌入、稀疏嵌入等)。这些嵌入可能具有不同的维数或格式(例如,稀疏嵌入通常表示为键值Map而不是数组)。这可以通过允许BaseNode上的embedding
字段与嵌入字典兼容来实现,而不仅仅是当前的单嵌入实现(例如Optional[List[float] | Dict[str, Any]]
)。
提案的目的是实现类似于Qdrant Vectorstore提供的API,即多个嵌入向量可以与单个有效载荷关联(类似于llama_index节点)。
参考来自Qdrant的文档:
- https://qdrant.tech/documentation/concepts/collections/#collection-with-multiple-vectors
- https://qdrant.tech/documentation/concepts/points/#update-vectors
修改基本节点类的替代方案是使自定义节点类型轻松添加到llama-index中。目前这是可能的,但并不简单,因为许多llama-index组件(节点解析器、拆分器、摄取缓存、摄取管道等)都假定默认的节点类型,并使用pydantic验证节点类型。引入自定义节点类型目前需要对大多数llama-index组件进行子类化以支持自定义节点类型。
原因
我不确定更改BaseNode.embeddings
字段的类型是否会对llama-index组件的其他部分产生意想不到的影响。许多组件可能假设embeddings
字段包含一个嵌入而不是多个嵌入的字典。
功能价值
避免要求用户大量定制llama-index以支持多嵌入应用(例如混合搜索)。目前,Qdrant矢量存储实现通过在Qdrant矢量存储实现内部生成稀疏嵌入来实现混合模式的特殊解决方法。这假设将使用两个嵌入模型(一个用于密集和一个用于稀疏)。有了新的BAAI/BGE-M3 embedding,可以从单个模型调用生成多个嵌入,这将使当前的Qdrant矢量存储混合实现效率低下。
9条答案
按热度按时间mu0hgdu01#
你好,Philip Chung!我是Dosu,一个友好的机器人,在等待人类维护者深入研究您的请求时为您提供帮助。我在这里帮助解决错误、回答问题并引导您成为贡献者。不用担心,我会仔细查看您的问题并在不久的将来为您提供全面的答案。
a5g8bdjr2#
嘿@philipchung - 这主意不错。
然而,对核心节点对象进行更改始终是一件痛苦的事情...使其成为一个联合类型意味着我们每次想要访问它时都需要进行类型检查。
也许一个更好的主意是添加一个新的属性?虽然一旦添加了它,就永远不会被移除(至少在没有大量工作的情况下)。
up9lanfz3#
感谢您详细的功能请求。我理解在LlamaIndex框架中支持每个节点的多个嵌入的需求。
修改
embedding
字段上的BaseNode
以支持多个嵌入字典确实是一个可行的解决方案。然而,正如您所指出的,这可能会对LlamaIndex组件的其他部分产生意想不到的影响。许多组件可能假设embeddings
字段包含一个嵌入而不是多个嵌入的字典。将
embedding
字段从Optional[List[float]]
更改为Optional[List[float] | Dict[str, Any]]
可能会对LlamaIndex系统产生以下影响:_get_query_embedding
、_aget_query_embedding
、_get_text_embedding
、_aget_text_embedding
、_get_text_embeddings
和_aget_text_embeddings
返回的数据将不再一致。某些方法可能返回浮点数列表,而其他方法可能返回字典。在使用这些方法时,这可能会导致混淆和潜在错误。embedding
字段的任何代码都需要更新以处理浮点数列表和字典。这可能会增加代码的复杂性并使其更难维护。embedding
字段,更改其类型可能会破坏与期望浮点数列表的现有客户端的兼容性。至于将自定义节点类型添加到LlamaIndex以支持多嵌入应用程序,系统已经支持不同类型的节点,例如
ImageNode
和BaseNode
。要添加新的自定义节点类型,您可能需要为该节点类型定义一个新的类,该类继承自BaseNode
或其他适当的超类,然后调整MultiModalVectorStoreIndex
和其他相关类中的方法以处理此新节点类型。然而,在没有更多关于这些自定义节点类型的结构和要求的详细信息的情况下,无法提供具体的代码示例。总之,虽然修改
embedding
字段上的BaseNode
以支持多个嵌入字典并将自定义节点类型添加到LlamaIndex以支持多嵌入应用程序可能是可行的,但有几个需要考虑的因素。我建议您与LlamaIndex团队进一步讨论此功能请求,以确定最佳方法。来源
此响应旨在节省您的时间并提供帮助。它不是精确的解决方案,而是您自己研究的起点。
请帮我更有用!如果您觉得有帮助请点赞,如果不相关请点踩。
如果您想继续对话,请以@dosu-bot开始回复。
bsxbgnwa4#
我同意这个请求。现实情况是,目前的实现也不支持多模态嵌入。在我们的情况下,每个OpenSearch文档(节点)有一个基于文本的嵌入和多个图像嵌入。目前没有办法使用您的库来实现这一点,我必须创建一个全新的OpenSearch实现...然而,OS确实原生支持这种查询结构。
o3imoua45#
当前的方法是将文本和图像分别嵌入到不同的集合/命名空间/索引中。
https://docs.llamaindex.ai/en/stable/examples/multi_modal/gpt4v_multi_modal_retrieval/?h=multimodal
Opensearch技术上应该能够很好地支持这一点。
zi8p0yeb6#
了解,但是李的OpenSearch客户端是否支持每个文档多个图像嵌入(数组格式),还是我需要将数组在多个文档之间展平?
zazmityj7#
因为,如果是后者,那么它将使top_k理解变得繁琐...
nqwrtyyt8#
@Panoplos 不是的,它必须是单独的表/集合/等。
使用的查询向量必须与嵌入相匹配(例如,对于文本/图像,使用clip;对于纯文本,使用openai)
因此,检索步骤本身已经需要两个嵌入和检索调用(在上面的例子中已经处理)
为了改进这一点,欢迎提出PR。我想说,我们支持的向量数据库中大约有一半有严格的要求,只允许每个表/集合/索引有一个嵌入字段
wi3ka0sx9#
如果将
BaseNode
上的embedding
字段更改为具有存储在典型 RAG 应用程序中使用的密集嵌入向量的 getter/setter 的新字段embeddings
,该字段位于键 "default" 下的类型为dict[str, Any]
的下。为了允许选择性检索嵌入,需要修改
BaseNode
上的get_embedding
方法,以接受一个参数,允许用户指定嵌入键并在未提供键时选择 "default"。这是否允许与现有 LlamaIndex 组件和向量存储兼容?