错误描述
在将llama索引从0.8.50更新到0.9.35后,我的向量查询出现了问题。使用包含数值的字符串作为元数据过滤器的valueText字段时,会抛出错误,抱怨valueNumber与valueText不匹配。
版本
0.9.35
重现步骤
你只需要在元数据过滤器中有一个数值字符串作为valueText字段,就会出现这个错误。
这似乎是llama_index/llama_index/vector_stores/weaviate.py文件中的第78行代码引起的,但不确定为什么那一行最初会被添加进来。
851399a
相关日志/回溯
import weaviate
from llama_index.schema import TextNode
from llama_index.vector_stores.weaviate import WeaviateVectorStore
from llama_index.vector_stores.types import MetadataFilters, MetadataFilter, VectorStoreQuery
client = weaviate.Client(url="http://localhost:8080")
vector_store = WeaviateVectorStore(weaviate_client=client, index_name="TestIndex", text_key="text")
vector_store.add(
[
TextNode(
text="test 1",
metadata={"article_id": "aaff"},
embedding=[0, 0, 1],
),
TextNode(
text="test 2",
metadata={"article_id": "1234"},
embedding=[0, 1, 0],
),
TextNode(
text="test 3",
metadata={"article_id": "3ff3"},
embedding=[1, 0, 0],
)
]
)
# -- working query
query = VectorStoreQuery(
query_embedding=[0, 0, 0],
similarity_top_k=2,
filters=MetadataFilters(
filters=[
MetadataFilter(key="article_id", value="3ff3") # NOTE: works fine because is not a number
]
)
)
results = vector_store.query(query)
print(results)
# -- below query breaks
query = VectorStoreQuery(
query_embedding=[0, 0, 0],
similarity_top_k=2,
filters=MetadataFilters(
filters=[
MetadataFilter(key="article_id", value="1234") # NOTE: breaks because it's a number but the metadata field is a text field
]
)
)
results = vector_store.query(query)
print(results)
8条答案
按热度按时间up9lanfz1#
你好,@KristianMischke!很高兴再次见到你。希望你的一天过得很好。让我们来解决你面临的这个问题。
感谢你提供了关于你所面临的问题的详细描述。问题似乎与LlamaIndex中的
WeaviateVectorStore
类如何处理带有数字字符串的元数据过滤器有关。从你提供的回溯信息来看,错误消息表明
WeaviateVectorStore
试图将valueNumber
字段用于文本类型,从而导致了问题。这很可能是因为WeaviateVectorStore
没有正确识别元数据过滤器值的类型,并将其视为数字,因为它包含数字字符,尽管实际上它是一个字符串。你在
weaviate.py
文件中指出的那一行代码是_to_weaviate_filter
函数的一部分,该函数用于将标准过滤器转换为Weaviate特定过滤器。然后,这个函数被用作WeaviateVectorStore
类的query
方法中应用这些过滤器到查询的方法。至于为什么这一行被添加,没有更多的上下文很难说肯定,但有可能它是有意处理元数据过滤器值实际上是数字而不是包含数字字符的字符串的情况。
不幸的是,根据提供的上下文,我无法在LlamaIndex版本0.8.50和0.9.35之间找到任何关于MetadataFilters处理方式的变化,或者在最新版本0.9.36中的变化。
要解决这个问题,一个可能的解决方案是更新
_to_weaviate_filter
函数,以便正确识别元数据过滤器值的类型,并根据其类型使用适当的字段(对于数字使用valueNumber
,对于字符串使用valueText
)。希望这有所帮助!如果你有任何其他问题或需要进一步澄清,请随时提问。
Source Code
来源
此回复旨在节省您的时间并提供帮助。它不是精确的解决方案,而是您自己研究的一个起点。
请帮助我变得更有用!如果这有帮助请点赞👍,如果无关请点踩👎。
如果你想继续对话,请以@dosu-bot开头回复。
xkrw2x1b2#
感谢@KristianMischke的提醒。看起来你关于这个bug出自代码何处的判断是正确的。我在思考如何最好地解决这个问题。我们可能需要为
MetadataFilters
暴露另一个参数,该参数规定如何处理可以转换为数字的字符串。其中value_type是一个枚举类型。
@logan-markewich你怎么看?
s71maibg3#
我想知道是否有办法使用Weaviate来检查字段的类型,并在创建Weaviate过滤器时强制转换为正确的类型?
l7wslrjt4#
好的点子。我同意——这应该是我们在这里首先考虑的。
plicqrtu5#
分配了P1优先级@logan-markewich。如果您觉得有必要,请更改此设置。
txu3uszq6#
是的,Weaviate模式属性具有数据类型:https://weaviate.io/developers/weaviate/config-refs/datatypes,可用于转换。
dfuffjeb7#
我遇到了相同的问题,与llamaindex-raptor pack有关。
错误:-
{'data': {'Get': {'RaptorIndex': None}}, 'errors': [{'locations': [{'column': 6, 'line': 1}], 'message': 'invalid \'where\' filter: data type filter cannot use "valueInt" on type "number", use "valueNumber" instead', 'path': ['Get', 'RaptorIndex']}]}
上述代码有任何问题吗?
使用的包:
llama-index-vector-stores-weaviate = "^0.1.4" llama-index-packs-raptor = "^0.1.3" llama-index-llms-ollama = "^0.1.2" llama-index-embeddings-ollama = "^0.1.2" umap-learn = "^0.5.6"
yks3o0rb8#
我已经解决了所识别的问题。在遇到类似问题时,我进行了一些小的修改。由于这只是一个临时解决方案,还需要更多的工作。
已更新以下文件以反映更改:
用法:
希望这有所帮助!任何建议或反馈都是受欢迎的