如何使用Langchain在Redis上进行混合搜索

问题描述 投票:0回答:1

我正在尝试将过滤器传递给 Redis 检索器,以对我的嵌入进行混合搜索(矢量+元数据过滤)。下面这个不行!它无法通过过滤器,过滤器将始终为 None:

retriever = redis.as_retriever(
            search_type="similarity_distance_threshold",
            search_kwargs="{'include_metadata': True,'distance_threshold': 0.8,'k': 5}",
            filter="(@launch:{false} @menu_text:(%%chicken%%))"
        )

我找到了另一个例子,显然过滤器表达式应该作为 search_kwargs 传递,但我无法弄清楚正确的语法应该是什么。如果我这样做:

retriever = redis.as_retriever(
            search_type="similarity_distance_threshold",
            "retriever_search_kwargs":"{'include_metadata': True,'distance_threshold': 0.8,'k': 5, 'filter': '@menu_text:(%%chicken%%) @lunch:{true}'}",
}

它会生成以下搜索查询:

similarity_search_by_vector > redis_query : (@content_vector:[VECTOR_RANGE $distance_threshold $vector] @menu_text:(%%chicken%%) @lunch:{true})=>{$yield_distance_as: distance}

并失败并出现以下错误:

redis.exceptions.ResponseError: Invalid attribute yield_distance_as

知道如何解决吗? 系统信息: 朗链 0.0.346 langchain-core 0.0.10

python 3.9.18

redis langchain vector-search similarity-search
1个回答
0
投票

这是 Langchain 的一个错误!我发现 langchain 中的“_prepare_range_query()”正在使用错误的语法生成 Redis 查询。所以我做了以下小改动,为我们修复了错误:

def _prepare_range_query(
    self,
    k: int,
    filter: Optional[RedisFilterExpression] = None,
    return_fields: Optional[List[str]] = None,
) -> "Query":
    try:
        from redis.commands.search.query import Query
    except ImportError as e:
        raise ImportError(
            "Could not import redis python package. "
            "Please install it with `pip install redis`."
        ) from e

    return_fields = return_fields or []
    vector_key = self._schema.content_vector_key
    base_query = f"@{vector_key}:[VECTOR_RANGE $distance_threshold $vector]"

    if filter:
        # base_query = "(" + base_query + " " + str(filter) + ")"
        base_query = str(filter) + " " + base_query

    query_string = base_query + "=>{$yield_distance_as: distance}"

    return (
        Query(query_string)
        .return_fields(*return_fields)
        .sort_by("distance")
        .paging(0, k)
        .dialect(2)
    )
© www.soinside.com 2019 - 2024. All rights reserved.