创建Pinecone索引遇AttributeError错误,请求技术支持
解决Pinecone与LangChain兼容导致的
AttributeError: module 'pinecone' has no attribute 'Index'问题 问题根源
该错误由两方面原因导致:
- Pinecone客户端v2.x版本的API结构与旧版LangChain的适配逻辑不匹配
- 代码中存在原生
pinecone客户端与LangChain封装的Pinecone类的命名冲突
修复步骤
1. 统一依赖版本,消除冲突
- 先卸载现有冲突包:
pip uninstall -y pinecone pinecone-client - 安装适配的稳定版本,确保LangChain组件与Pinecone客户端兼容:
pip install langchain>=0.1.10 langchain-community>=0.0.23 pinecone-client==2.2.4 openai langchain_openai python-dotenv tiktoken docx2txt pypdf - 更新
requirements.txt,移除重复的pinecone条目,补充版本约束:openai langchain>=0.1.10 langchain_openai langchain_experimental langchainhub python-dotenv tiktoken docx2txt pypdf pinecone-client==2.2.4 langchain-community>=0.0.23
2. 修正代码中的命名冲突与未定义变量
核心是区分原生Pinecone客户端和LangChain封装的Pinecone向量存储类,同时补全未初始化的变量:
import os from dotenv import load_dotenv, find_dotenv from langchain.chains import RetrievalQA from langchain_openai import ChatOpenAI load_dotenv(find_dotenv(), override=True) from pinecone import Pinecone, ServerlessSpec # 加载文档函数 def load_document(file): name, extension = os.path.splitext(file) if extension == '.pdf': from langchain.document_loaders import PyPDFLoader print(f'Loading {file}') loader = PyPDFLoader(file) elif extension == '.docx': from langchain.document_loaders import Docx2txtLoader print(f'Loading {file}') loader = Docx2txtLoader(file) elif extension == '.txt': from langchain_community.document_loaders import TextLoader loader = TextLoader(file) else: print('Document format is not supported!') return None data = loader.load() return data data = load_document('file.txt') # 切分文档函数 def chunk_data(data, chunk_size=256): from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=0) chunks = text_splitter.split_documents(data) return chunks # 插入/获取向量嵌入函数 def insert_or_fetch_embeddings(index_name, chunks): import pinecone # 重命名LangChain的Pinecone类,避免与原生客户端冲突 from langchain_community.vectorstores import Pinecone as LangChainPinecone from langchain_openai import OpenAIEmbeddings from pinecone import ServerlessSpec pc = pinecone.Pinecone() embeddings = OpenAIEmbeddings(model='text-embedding-3-small', dimensions=1536) if index_name in pc.list_indexes().names(): print(f'Index {index_name} already exists. Loading embeddings ... ', end='') vector_store = LangChainPinecone.from_existing_index(index_name, embeddings) print('Ok') else: print(f'Creating index {index_name} and embeddings ...', end='') pc.create_index( name=index_name, dimension=1536, metric='cosine', spec=ServerlessSpec( cloud="aws", region="us-east-1" ) ) vector_store = LangChainPinecone.from_documents(chunks, embeddings, index_name=index_name) print('Ok') return vector_store # 补全未定义的chunks变量 chunks = chunk_data(data) index_name = 'askadocument' vector_store = insert_or_fetch_embeddings(index_name=index_name, chunks=chunks) llm = ChatOpenAI(model="gpt-4.1-mini", temperature=0.3) retriever = vector_store.as_retriever(search_type='similarity', search_kwargs={'k': 2}) chain = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever) # 补全未定义的query变量 query = "请输入你的问题" answer = chain.invoke(query) print(answer)
3. 验证修复
运行修正后的代码,若仍有问题,检查:
- Pinecone API密钥是否正确加载(通过
os.getenv("PINECONE_API_KEY")验证) - AWS区域是否与Pinecone控制台设置一致
- OpenAI API密钥是否有效
内容的提问来源于stack exchange,提问作者Abhishek K M
相关产品推荐
相关产品推荐

