如何修复LangChain中出现的‘AttributeError: 'str' object has no attribute 'query'’错误?
如何修复LangChain中出现的‘AttributeError: 'str' object has no attribute 'query'’错误?
嘿,我来帮你搞定这个问题!你遇到的这个错误根源其实很明确,咱们一步步捋清楚怎么修复。
错误的核心原因
你在初始化PineconeVectorStore的时候犯了一个关键小错误:把Pinecone索引的名称字符串("index-1")直接传给了index参数,但LangChain的PineconeVectorStore需要的是一个实际的Pinecone Index对象,而不是字符串名称。这就导致后续retriever尝试调用query方法时,实际上是在对一个字符串对象执行操作——字符串哪来的query方法呀,自然就抛出这个报错了。
具体修复步骤
1. 先获取实际的Pinecone Index对象
你需要先通过Pinecone客户端连接到你的索引,拿到真正的Index实例:
import pinecone # 初始化Pinecone客户端 pinecone.init(api_key=pc_key) # 传入索引名称,获取实际的Index对象 pc_index = pinecone.Index("index-1")
2. 修正PineconeVectorStore的初始化代码
把之前传字符串的地方换成刚拿到的pc_index对象:
from langchain.vectorstores import PineconeVectorStore from langchain.embeddings.openai import OpenAIEmbeddings # 注意这里的index参数现在是pc_index对象,不是字符串了 retriever = PineconeVectorStore( pinecone_api_key=pc_key, index=pc_index, embedding=OpenAIEmbeddings() ).as_retriever()
顺便提一句:你之前变量名写成了
retriver,建议改成retriever(拼写正确点,避免后续自己看代码懵)
3. 调整QA链的context处理逻辑
另外,你原来的QA链里直接把retriever赋值给context,这样可能会导致retriever返回的文档列表无法被prompt模板直接使用。咱们把它改成先让retriever处理问题,再把返回的文档格式化成字符串:
from langchain_core.runnables import RunnablePassthrough from langchain_core.output_parsers import StrOutputParser # 定义一个格式化文档的小函数,把文档列表转成拼接后的字符串 def format_docs(docs): return "\n\n".join(doc.page_content for doc in docs) # 重构后的QA链 qa_chain = ( { # 让输入的question先经过retriever检索文档,再格式化 "context": RunnablePassthrough() | retriever | format_docs, "question": RunnablePassthrough(), } | review_template | model | StrOutputParser() )
测试修复效果
现在你再调用qa_chain.invoke("你的问题"),应该就能正常从Pinecone向量库检索到相关文档,然后生成符合你预期的用户回答了。
备注:内容来源于stack exchange,提问作者Denuwan Kalubowila
相关产品推荐
相关产品推荐

