llama_index [Bug]: MetadataFilters.legacy_filters() 在嵌套中破坏

von4xj4u  于 6个月前  发布在  其他
关注(0)|答案(1)|浏览(56)

Bug描述

OpensearchVectorClient 使用 filters.legacy_filters() 解析给定的 MetadataFilters 。这些应该允许嵌套 MetadataFilters ,但当呈现一个嵌套过滤器时,会出现一个

AttributeError: 'MetadataFilters' object has no attribute 'operator'

如果呈现一个嵌套对象,它可能应该抛出一个错误。理想情况下, OpensearchVectorClient._parse_filters 可以调整为 MetadataFilters 结构。
MetadataFilters 中的实现:
llama_index/llama-index-core/llama_index/core/vector_stores/types.py
第 175 行到第 185 行:
| | deflegacy_filters(self) ->List[ExactMatchFilter]: |
| | """将 MetadataFilters 转换为 legacy ExactMatchFilters.""" |
| | filters= [] |
| | forfilterinself.filters: |
| | iffilter.operator!=FilterOperator.EQ: |
| | raiseValueError( |
| | "Vector Store 只支持精确匹配过滤器。" |
| | "请使用 ExactMatchFilter 或 FilterOperator.EQ 代替。" |
| | ) |
| | filters.append(ExactMatchFilter(key=filter.key, value=filter.value)) |
| | returnfilters |
OpensearchVectorClient 中的实现:
llama_index/llama-index-integrations/vector_stores/llama-index-vector-stores-opensearch/llama_index/vector_stores/opensearch/base.py
第 213 行到第 222 行:
| | def_parse_filters(self, filters: Optional[MetadataFilters]) ->Any: |
| | pre_filter= [] |
| | iffiltersisnotNone: |
| | forfinfilters.legacy_filters(): |
| | ifisinstance(f.value, str): |
| | pre_filter.append({f.key: f.value}) |
| | else: |
| | pre_filter.append({f.key: json.loads(str(f.value))}) |
| | |
| | returnpre_filter |

版本

llama-index-core==0.10.47; llama-index-vector-stores-opensearch==0.1.12

重现步骤

创建一个嵌套的 MetadataFilters 示例并调用 legacy_filters()

vwoqyblh

vwoqyblh1#

要解决MetadataFilters.legacy_filters()与嵌套过滤器在OpensearchVectorClient中的问题,您可以更新_parse_filters方法以正确处理嵌套的MetadataFilters。以下是递归处理嵌套过滤器的_parse_filters方法的修订版本:

def _parse_filters(self, filters: Optional[MetadataFilters]) -> Any:
def parse_filter(filter):
if isinstance(filter, MetadataFilters):
return {"bool": {"filter": parse_filters(filter)}}
else:
return {filter.key: json.loads(str(filter.value))}

def parse_filters(filters):
    return [parse_filter(f) for f in filters.filters]

if filters is None:
    return []

return parse_filters(filters)

此更新后的方法使用辅助函数parse_filter来处理MetadataFilters和单个过滤器,使其能够递归处理嵌套过滤器。直接从MetadataFilters对象访问filters属性,确保正确解析嵌套过滤器。

通过实施此更改,OpensearchVectorClient将能够在不遇到AttributeError1(https://github.com/run-llama/llama_index/blob/main/llama-index-integrations/vector_stores/llama-index-vector-stores-opensearch/llama_index/vector_stores/opensearch/base.py)的情况下处理嵌套的MetadataFilters

  • 要继续与Dosu交谈,请提及@dosu。*

相关问题