如何在本地为OpenAI模型创建嵌入向量(不调用官方嵌入API)
本地生成嵌入向量的实现方案(无需调用OpenAI Embeddings API)
一、选择适合本地运行的开源嵌入模型
优先挑选轻量、性能平衡的模型,适配企业机密文档的处理场景:
- all-MiniLM-L6-v2:体积仅约100MB,运行速度快,文本嵌入效果接近OpenAI的text-embedding-ada-002,适合通用场景
- bge-small-en-v1.5:对中文支持优异,生成的向量在中英文混合文档检索中表现突出
- e5-small-v2:专为检索优化的模型,生成的向量更适配RAG(检索增强生成)场景
二、本地生成嵌入的具体实现方式
1. 基于Hugging Face Transformers直接运行模型
这是最灵活的原生方案,步骤简单且完全可控:
- 先安装依赖:
pip install transformers torch sentence-transformers - 示例代码:
from sentence_transformers import SentenceTransformer # 首次运行自动下载模型到本地缓存,后续可指定本地路径离线加载 model = SentenceTransformer('all-MiniLM-L6-v2') # 离线加载示例:model = SentenceTransformer('/your/local/model/path') # 假设已完成机密文档的拆分处理 document_chunks = ["项目A保密条款片段...", "客户数据规范片段..."] # 本地生成嵌入向量 embeddings = model.encode(document_chunks) # 查看向量维度(all-MiniLM-L6-v2为384维) print(f"向量维度:{embeddings.shape[1]}")
2. 用LangChain封装本地嵌入模型
如果已经在用LangChain搭建聊天机器人,直接集成更高效:
- 安装依赖:
pip install langchain sentence-transformers - 示例代码:
from langchain.embeddings import HuggingFaceEmbeddings # 配置本地嵌入模型,支持CPU/GPU切换 embedding_model = HuggingFaceEmbeddings( model_name="all-MiniLM-L6-v2", model_kwargs={'device': 'cpu'}, # 有GPU则改为'cuda' encode_kwargs={'normalize_embeddings': True} ) # 生成嵌入向量 text_chunks = ["机密文档片段1", "机密文档片段2"] embeddings = embedding_model.embed_documents(text_chunks)
三、本地存储嵌入向量的方案
1. Chroma(轻量本地向量库)
纯Python实现,无需额外服务,适合中小规模文档:
from langchain.vectorstores import Chroma # 将向量与文档存入本地磁盘 db = Chroma.from_texts( texts=document_chunks, embedding=embedding_model, persist_directory="./local_chroma_db" ) db.persist() # 持久化到本地 # 后续加载本地数据库 db = Chroma(persist_directory="./local_chroma_db", embedding_function=embedding_model)
2. FAISS(高效大规模向量库)
Facebook开源的检索库,适合处理大规模机密文档:
from langchain.vectorstores import FAISS # 生成并存储向量 db = FAISS.from_texts(document_chunks, embedding_model) # 保存到本地 db.save_local("./local_faiss_db") # 加载本地库 db = FAISS.load_local("./local_faiss_db", embedding_model)
四、与OpenAI LLM API的整合流程
- 用户提问时,先从本地向量库检索相关文档片段:
user_query = "项目A的保密范围包含哪些内容?" relevant_docs = db.similarity_search(user_query, k=3)
- 将检索到的文档作为上下文,构造Prompt调用OpenAI的Chat API:
from openai import OpenAI client = OpenAI(api_key="your-api-key") prompt = f""" 你是企业机密文档专属助手,仅依据提供的上下文回答问题: 上下文:{[doc.page_content for doc in relevant_docs]} 用户问题:{user_query} """ response = client.chat.completions.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": prompt}] ) print(response.choices[0].message.content)
五、安全注意事项
- 模型文件、向量数据库必须存储在企业内部服务器或本地设备,禁止上传至外部云服务
- 文档拆分时需遵循企业保密规范,避免敏感信息碎片化泄露
- 若使用GPU运行模型,需确保硬件环境处于企业安全域内,不使用公共云GPU资源
内容的提问来源于stack exchange,提问作者Lance Kind
相关产品推荐
相关产品推荐

