无需OpenAI的HuggingFace RAG问答聊天应用实现求助
问题分析与解决方案
一、当前代码错误原因及修正
你遇到的TypeError: OpenAIEmbeddings.embed_query() missing 1 required positional argument: 'self'错误,是因为直接调用了OpenAIEmbeddings类的方法,而非类实例的方法。类的实例方法必须先创建类对象才能调用,错误写法示例:
# 错误:直接调用类方法 OpenAIEmbeddings.embed_query("your query")
正确的调用逻辑(即使后续替换模型,这个实例化逻辑通用):
from langchain.embeddings import OpenAIEmbeddings # 先创建类实例 embeddings = OpenAIEmbeddings() # 再调用实例方法 query_embedding = embeddings.embed_query("your query")
不过既然你要完全弃用OpenAI服务,直接替换为HuggingFace生态的嵌入模型即可。
二、非OpenAI的嵌入替代方案(基于HuggingFace)
1. LangChain集成HuggingFaceEmbeddings
这是最适配RAG开发的方案,支持HuggingFace Hub上绝大多数开源嵌入模型,如sentence-transformers/all-MiniLM-L6-v2、BAAI/bge-small-en-v1.5等。示例代码:
from langchain.embeddings import HuggingFaceEmbeddings # 初始化嵌入模型,可指定本地缓存路径避免重复下载 embedding_model_name = "sentence-transformers/all-MiniLM-L6-v2" embeddings = HuggingFaceEmbeddings( model_name=embedding_model_name, cache_dir="/path/to/your/local/model/cache" ) # 生成查询向量 query_embedding = embeddings.embed_query("your query") # 生成文档向量列表 doc_embeddings = embeddings.embed_documents(["document text 1", "document text 2"])
2. 直接使用Transformers库调用嵌入模型
如果不想依赖LangChain,可直接用HuggingFace Transformers库加载模型:
from transformers import AutoTokenizer, AutoModel import torch # 加载模型与分词器 model_name = "BAAI/bge-small-en-v1.5" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModel.from_pretrained(model_name) # 自定义嵌入生成函数 def get_embedding(text): inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True) with torch.no_grad(): outputs = model(**inputs) # 取<[BOS_never_used_51bce0c785ca2f68081bfa7d91973934]>token输出作为最终嵌入向量 embedding = outputs.last_hidden_state[:, 0, :].squeeze().numpy() return embedding # 使用示例 query_embedding = get_embedding("your query")
3. 远程调用HuggingFace Inference Endpoints的嵌入模型
如果想把嵌入模型也部署在HuggingFace平台,通过VPS远程推理,可使用HuggingFace Inference Client:
from huggingface_hub import InferenceClient client = InferenceClient( model="sentence-transformers/all-MiniLM-L6-v2", token="your_huggingface_access_token" ) # 获取查询嵌入 query_embedding = client.feature_extraction("your query") # 获取多文档嵌入 doc_embeddings = client.feature_extraction(["document text 1", "document text 2"])
三、适配你的RAG架构的注意事项
- 自定义文档索引:用上述嵌入模型生成文档向量后,可存储在本地向量数据库(如Chroma、FAISS),全程无需依赖外部服务。
- 远程LLM推理:继续使用HuggingFace客户端调用部署在Hub上的开源大模型(如Llama 2、Mistral),确保整个流程完全脱离OpenAI服务。
内容的提问来源于stack exchange,提问作者KhoPhi
相关产品推荐
相关产品推荐

