更新llama_index后,Pinecone+OpenAI的Query Engine报错求助
解决llama_index升级后OpenAI补全请求缺少engine/deployment_id的问题
问题场景
长期使用旧版llama_index,升级后基于Pinecone构建向量索引、OpenAI负责嵌入与补全功能,执行查询代码时触发错误:
openai.error.InvalidRequestError: Must provide an 'engine' or 'deployment_id' parameter to create a <class 'openai.api_resources.completion.Completion'>
原有核心代码如下:
with open(file_path, 'r', encoding='utf-8') as file: content = file.read() chunk_size = 1000 texts = [content[i:i+chunk_size] for i in range(0, len(content), chunk_size)] embeddings = LangchainEmbedding(OpenAIEmbeddings(model="text-embedding-ada-002", chunk_size=1)) pinecone_index = pinecone.Index(index_name) vector_store = PineconeVectorStore(pinecone_index=pinecone_index) docs = [Document(t) for t in texts] storage_context = StorageContext.from_defaults(vector_store=vector_store) service_context = ServiceContext.from_defaults(embed_model=embeddings) index = GPTVectorStoreIndex.from_documents(docs, storage_context=storage_context, service_context=service_context) query_engine = index.as_query_engine() response = query_engine.query(query)
问题原因
新版llama_index移除了旧版默认的LLM(大语言模型)配置,仅配置嵌入模型无法满足补全请求的要求——OpenAI的补全接口必须指定engine(即模型标识),未显式配置LLM时,代码无法传递该参数,从而触发错误。
修复方案
在ServiceContext中显式指定LLM模型,让代码能向OpenAI传递合法的engine参数。具体步骤:
- 导入llama_index的OpenAI LLM类
- 实例化LLM时指定对应模型(如
gpt-3.5-turbo-instruct或text-davinci-003等兼容补全接口的模型) - 将LLM实例传入
ServiceContext.from_defaults()
修改后的完整代码:
from llama_index.llms import OpenAI # 新增导入 from llama_index.embeddings.langchain import LangchainEmbedding from langchain.embeddings.openai import OpenAIEmbeddings from llama_index.vector_stores import PineconeVectorStore from llama_index import StorageContext, ServiceContext, GPTVectorStoreIndex, Document import pinecone # 读取文件内容 with open(file_path, 'r', encoding='utf-8') as file: content = file.read() # 文本分块 chunk_size = 1000 texts = [content[i:i+chunk_size] for i in range(0, len(content), chunk_size)] # 初始化嵌入模型 embeddings = LangchainEmbedding(OpenAIEmbeddings(model="text-embedding-ada-002", chunk_size=1)) # 初始化Pinecone索引 pinecone_index = pinecone.Index(index_name) vector_store = PineconeVectorStore(pinecone_index=pinecone_index) docs = [Document(t) for t in texts] # 显式初始化LLM llm = OpenAI(model="gpt-3.5-turbo-instruct") # 指定兼容补全的模型 # 构建上下文 storage_context = StorageContext.from_defaults(vector_store=vector_store) service_context = ServiceContext.from_defaults( embed_model=embeddings, llm=llm # 传入LLM实例 ) # 创建索引与查询引擎 index = GPTVectorStoreIndex.from_documents(docs, storage_context=storage_context, service_context=service_context) query_engine = index.as_query_engine() response = query_engine.query(query)
补充说明
- 若使用Azure OpenAI,需替换为
AzureOpenAI类并指定deployment_id参数,示例:from llama_index.llms import AzureOpenAI llm = AzureOpenAI(deployment_id="你的部署ID", model="gpt-3.5-turbo-instruct") - 若使用
gpt-3.5-turbo或gpt-4等聊天模型(对应OpenAI的/chat/completions端点),需使用ChatOpenAI类,示例:from llama_index.llms import ChatOpenAI llm = ChatOpenAI(model="gpt-3.5-turbo")
内容的提问来源于stack exchange,提问作者Thomas LIZEE
相关产品推荐
相关产品推荐

