Langchain对接Weaviate向量数据库报错ValueError求助
LangChain集成Weaviate报错ValueError的解决方法
问题分析
报错信息明确指出:Unknown argument "nearText" on field "Products" of type "GetObjectsObj",核心原因有两个:
- Weaviate v1.19及以上版本已弃用
nearText查询参数,替换为nearVector(需要手动传入文本向量); - 你的Weaviate类
Products未启用文本嵌入模块(比如text2vec-openai),导致无法识别nearText查询逻辑。
解决方案
方案1:给Weaviate类启用text2vec-openai模块
登录Weaviate控制台,检查Products类的Schema配置,确保包含以下内容(启用OpenAI自动生成文本向量):
{ "classes": [ { "class": "Products", "vectorizer": "text2vec-openai", "properties": [ { "name": "description", "dataType": ["string"] } ] } ] }
启用模块后,Weaviate会自动为description字段生成向量,nearText查询就能正常使用了。
方案2:手动生成向量,用nearVector查询
如果不想依赖Weaviate的自动向量生成,可通过LangChain的OpenAIEmbeddings手动生成查询向量,再用nearVector进行检索:
from langchain.embeddings import OpenAIEmbeddings # 初始化嵌入模型 embeddings = OpenAIEmbeddings(openai_api_key=OPEN_API_KEY) # 生成查询文本对应的向量 query_vector = embeddings.embed_query("top rated watches") # 创建检索器时指定nearVector参数 retriever = vectorstore.as_retriever( search_kwargs={ "nearVector": {"vector": query_vector}, "k": 4 # 控制返回的相关结果数量 } )
方案3:指定LangChain Weaviate的搜索类型
直接在初始化Weaviate向量存储或创建检索器时,指定使用near_vector搜索类型:
# 初始化向量存储时指定 vectorstore = Weaviate(client, "Products", "description", search_type="near_vector") # 或者创建检索器时指定 retriever = vectorstore.as_retriever(search_type="near_vector", search_kwargs={"vector": query_vector})
方案4:降级Weaviate版本(不推荐)
如果不想修改代码,可将Weaviate降级到v1.18及以下版本,这些版本仍支持nearText参数,但长期来看不建议依赖旧版本的兼容性。
修改后的完整代码示例
from langchain.vectorstores.weaviate import Weaviate from langchain.llms import OpenAI from langchain.chains import RetrievalQAWithSourcesChain import weaviate from langchain.prompts.prompt import PromptTemplate from langchain.embeddings import OpenAIEmbeddings OPEN_API_KEY="sk-..." # 连接Weaviate服务 auth_config = weaviate.auth.AuthApiKey(api_key="api_key") client = weaviate.Client( url="https://abc.weaviate.network", auth_client_secret=auth_config, additional_headers={ "X-OpenAI-Api-Key": OPEN_API_KEY } ) vectorstore = Weaviate(client, "Products", "description") # 生成查询文本的向量 embeddings = OpenAIEmbeddings(openai_api_key=OPEN_API_KEY) query = "top rated watches" query_vector = embeddings.embed_query(query) # 初始化LLM llm = OpenAI(model_name="text-davinci-003", temperature=0, max_tokens=200, openai_api_key=OPEN_API_KEY) # 自定义Prompt模板 template = """ Return product and price information -------------------- {summaries} """ prompt = PromptTemplate( input_variables=["summaries"], template=template, ) # 创建带nearVector参数的检索器 retriever = vectorstore.as_retriever( search_kwargs={ "nearVector": {"vector": query_vector}, "k": 4 } ) # 构建Chain并执行查询 chain = RetrievalQAWithSourcesChain.from_chain_type(llm=llm, retriever=retriever, return_source_documents=False, chain_type_kwargs={"prompt": prompt}) result = chain(query, return_only_outputs=True) print(result)
内容的提问来源于stack exchange,提问作者Syed Mujeeb H
相关产品推荐
相关产品推荐

