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

创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:20:06