You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LangChain PGVector SelfQueryRetriever报错ValueError:无效运算符eq求助

问题:PGVector SelfQueryRetriever 运算符错误

我使用LangChain的PGVector SelfQueryRetriever组件查询向量化数据(数据类型为langchain_core.documents.Document),运行代码时触发报错:
ValueError: Invalid operator: eq. Expected one of {'$eq', '$lte', '$ne', '$like', '$gt', '$and', '$gte', '$ilike', '$or', '$between', '$nin', '$in', '$lt'}


报错栈追踪

File "C:\Users\suraj\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain_core\retrievers.py", line 259, in invoke
result = self._get_relevant_documents(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\suraj\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain\retrievers\self_query\base.py", line 307, in _get_relevant_documents
docs = self._get_docs_with_query(new_query, search_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\suraj\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain\retrievers\self_query\base.py", line 281, in _get_docs_with_query
docs = self.vectorstore.search(query, self.search_type, **search_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\suraj\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain_core\vectorstores\base.py", line 342, in search
return self.similarity_search(query, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\suraj\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain_community\vectorstores\pgvector.py", line 585, in similarity_search
return self.similarity_search_by_vector(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\suraj\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain_community\vectorstores\pgvector.py", line 990, in similarity_search_by_vector
docs_and_scores = self.similarity_search_with_score_by_vector(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\suraj\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain_community\vectorstores\pgvector.py", line 633, in similarity_search_with_score_by_vector
results = self._query_collection(embedding=embedding, k=k, filter=filter)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\suraj\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain_community\vectorstores\pgvector.py", line 946, in _query_collection
filter_clauses = self._create_filter_clause(filter)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\suraj\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain_community\vectorstores\pgvector.py", line 873, in _create_filter_clause
return self._handle_field_filter(key, filters[key])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\suraj\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain_community\vectorstores\pgvector.py", line 697, in _handle_field_filter
raise ValueError(
ValueError: Invalid operator: eq. Expected one of {'$eq', '$lte', '$ne', '$like', '$gt', '$and', '$gte', '$ilike', '$or', '$between', '$nin', '$in', '$lt'}

代码示例

import json
import os
from dotenv import load_dotenv
load_dotenv()

from langchain_openai import ChatOpenAI
from langchain_openai import OpenAIEmbeddings

from langchain_community.vectorstores import PGVector
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain.chains.query_constructor.schema import AttributeInfo

# 定义文档结构
document_structure = {
    "patientAccount": "",
    "placeOfService": "",
    "serviceDate": "",
    "memberId": "",
    "memberFirstName": "",
    "memberLastName": "",
    "memberSequenceNo": "",
    "memberGender": "",
    "referringProviderName": "",
    "referringProviderBusinessName": "",
    "referringProviderAddress1": "",
    "referringProviderAddress2": "",
    "referringProviderCity": "",
    "referringProviderState": "",
    "referringProviderZipcode": "",
    "referringProviderPhone": "",
    "referringProviderSpecialityCode": "",
    "testName": "",
    "testDiagnosisCode": "",
    "testProcedureCode": "",
    "highRange": "",
    "lowRange": "",
    "testValue": "",
    "testValueUnits": "",
    "specimenCollectDate": "",
    "testResultDate": ""
}

# 定义元数据结构
metadata_structure = {
    "patientAccount": "",
    "placeOfService": "",
    "serviceDate": "",
    "memberId": "",
    "memberName": "",
    "memberGender": "",
    "providerName": "",
    "testName": ""
}

# 定义自查询检索器的属性信息
attribute_info = [
    AttributeInfo(
        name="patientAccount",
        description="患者的账号",
        type="string"
    ),
    AttributeInfo(
        name="placeOfService",
        description="服务地点",
        type="string"
    ),
    AttributeInfo(
        name="serviceDate",
        description="服务日期",
        type="string"
    ),
    AttributeInfo(
        name="memberId",
        description="会员ID",
        type="string"
    ),
    AttributeInfo(
        name="memberName",
        description="会员姓名",
        type="string"
    ),
    AttributeInfo(
        name="memberGender",
        description="会员性别",
        type="string"
    ),
    AttributeInfo(
        name="providerName",
        description="提供者姓名",
        type="string"
    ),
    AttributeInfo(
        name="testName",
        description="检测名称",
        type="string"
    )
]

embeddings = OpenAIEmbeddings(openai_api_key=os.getenv("OPENAI_API_KEY"))

openai_llm = ChatOpenAI(
    model="gpt-4",
    temperature=0.2,
    max_tokens=512,
    openai_api_key=os.getenv("OPENAI_API_KEY")
)

# 初始化向量存储
connection_string = "postgresql+psycopg2://<username>:<password>@localhost:5432/postgres"
COLLECTION_NAME = "my_collection"

vectorstore = PGVector(
    collection_name=COLLECTION_NAME,
    connection_string=connection_string,
    embedding_function=embeddings,
    use_jsonb=True,
)

# 初始化自查询检索器
document_content_description = "医疗记录"
retriever = SelfQueryRetriever.from_llm(
    openai_llm,
    vectorstore,
    document_content_description,
    attribute_info,
    verbose=True
)

retriever.invoke("账号12345的患者做过哪些检测?")

解决方法

错误原因是SelfQueryRetriever默认生成的过滤条件使用eq这类无前缀运算符,但PGVector要求使用带$前缀的运算符(如$eq)。只需在初始化SelfQueryRetriever时传入operator_map参数,完成运算符映射即可:

修改自查询检索器的初始化代码:

retriever = SelfQueryRetriever.from_llm(
    openai_llm,
    vectorstore,
    document_content_description,
    attribute_info,
    verbose=True,
    # 映射运算符为PGVector支持的格式
    operator_map={
        "eq": "$eq",
        "ne": "$ne",
        "lt": "$lt",
        "lte": "$lte",
        "gt": "$gt",
        "gte": "$gte",
        "in": "$in",
        "nin": "$nin",
        "between": "$between",
        "like": "$like",
        "ilike": "$ilike",
        "and": "$and",
        "or": "$or"
    }
)

这样修改后,SelfQueryRetriever生成的过滤条件会自动将eq转换为$eq,符合PGVector的要求,即可解决该错误。


内容的提问来源于stack exchange,提问作者Info2scs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:59:58