如何建構查詢分析的篩選器
我們可能需要進行查詢分析,以擷取篩選器並傳遞到檢索器中。我們要求 LLM 表示這些篩選器的一種方式是作為 Pydantic 模型。然後就出現了將該 Pydantic 模型轉換為可以傳遞到檢索器的篩選器的問題。
這可以手動完成,但 LangChain 也提供了一些「翻譯器」,能夠將通用語法翻譯成特定於每個檢索器的篩選器。在這裡,我們將介紹如何使用這些翻譯器。
from typing import Optional
from langchain.chains.query_constructor.ir import (
Comparator,
Comparison,
Operation,
Operator,
StructuredQuery,
)
from langchain_community.query_constructors.chroma import ChromaTranslator
from langchain_community.query_constructors.elasticsearch import ElasticsearchTranslator
from pydantic import BaseModel
API 參考:Comparator | Comparison | Operation | Operator | StructuredQuery | ChromaTranslator | ElasticsearchTranslator
在此範例中,year
和 author
都是要篩選的屬性。
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)
ElasticsearchTranslator().visit_operation(_filter)
{'bool': {'must': [{'range': {'metadata.start_year': {'gt': 2022}}},
{'term': {'metadata.author.keyword': 'LangChain'}}]}}
ChromaTranslator().visit_operation(_filter)
{'$and': [{'start_year': {'$gt': 2022}}, {'author': {'$eq': 'LangChain'}}]}