Azure OpenAI结合FAISS构建向量索引报错求助
问题原因与解决方案
错误1:AttributeError: 'str' object has no attribute 'create'
核心原因是OpenAIEmbeddings初始化参数错误,以及潜在的类名与变量名冲突:
- 初始化时使用
client="azure"是错误配置,LangChain中配置Azure OpenAI Embeddings需用api_type="azure",并配合Azure专属参数,而非直接传字符串"azure"作为client。 - 第一段代码将FAISS实例赋值给
faiss变量,会覆盖导入的FAISS类(同一会话中),后续调用FAISS.from_documents时会引发逻辑混乱。
错误2:NotFoundError: 404
该错误由Azure OpenAI资源配置不正确导致:
base_url(Azure OpenAI端点)填写错误deployment(Azure中部署的embedding模型名称)不匹配api_version与Azure资源支持的版本不符
修正后的完整Azure OpenAI + FAISS文档检索示例
1. 安装依赖(未安装时执行)
pip install langchain langchain-openai faiss-cpu pypdf
注:LangChain v0.1+版本中,
OpenAIEmbeddings已迁移至langchain-openai包,不再属于langchain.embeddings.openai
2. 可运行代码示例
# 导入依赖 from langchain.document_loaders import PyPDFLoader from langchain_openai import AzureOpenAIEmbeddings from langchain.vectorstores import FAISS from langchain.text_splitter import RecursiveCharacterTextSplitter # 1. 加载并分割PDF文档 loader = PyPDFLoader("./data/machine_learning_yearning_by_andrew_ng.pdf") documents = loader.load() # 对文档分块(推荐步骤,避免单页文本过长影响嵌入效果) text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200) split_docs = text_splitter.split_documents(documents) # 2. 初始化Azure OpenAI Embeddings embeddings = AzureOpenAIEmbeddings( azure_deployment="Oasis-embedding-3-small", # Azure中部署的模型名称 api_key="7b4xxxxxxxxxxxxxxxxx83c915553c1a", # Azure OpenAI API密钥 azure_endpoint="https://xxxxxxxxxx.openai.azure.com/", # Azure OpenAI端点 api_version="2024-02-01" # 兼容的API版本 ) # 3. 创建FAISS向量索引 faiss_index = FAISS.from_documents(split_docs, embeddings) # 4. 测试检索功能 query = "What is machine learning yearning about?" results = faiss_index.similarity_search(query, k=2) # 打印检索结果 for idx, doc in enumerate(results): print(f"Result {idx+1}:") print(doc.page_content[:300] + "..." if len(doc.page_content) > 300 else doc.page_content) print("---")
关键修正说明
- 使用
langchain_openai.AzureOpenAIEmbeddings替代旧版OpenAIEmbeddings,适配LangChain v0.1+标准用法 - 移除错误的
client="azure"参数,改用Azure专属配置项:azure_deployment、azure_endpoint、api_version - 增加文档分块步骤,提升检索精度(长文本直接嵌入易丢失细节)
- 避免用
faiss作为变量名,防止覆盖FAISS类
旧版LangChain(<0.1)兼容配置
若使用LangChain旧版本,可继续用原导入路径,但参数需调整:
from langchain.embeddings.openai import OpenAIEmbeddings embeddings = OpenAIEmbeddings( model="text-embedding-3-small", deployment="Oasis-embedding-3-small", openai_api_key="你的密钥", openai_api_base="https://xxxxxxxxxx.openai.azure.com/", openai_api_type="azure", openai_api_version="2024-02-01" )
内容的提问来源于stack exchange,提问作者Saday Sarkar
相关产品推荐
相关产品推荐

