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
相关产品推荐
相关产品推荐

