Langchain DocArrayInMemorySearch为何需公网?连接错误求助
问题解答:DocArrayInMemorySearch为何需要访问公网及无网环境报错处理
报错根源
你遇到的公网访问需求不是来自DocArrayInMemorySearch本身,而是它依赖的OpenAIEmbeddings组件。
错误里提到的cl100k_base.tiktoken是OpenAI官方分词器(tiktoken)的编码表文件,OpenAIEmbeddings在初始化或首次处理文本时,会自动触发tiktoken从公网下载这个编码文件到本地缓存。DocArrayInMemorySearch是纯内存向量存储,本身不需要访问公网,但它需要OpenAIEmbeddings生成的向量,所以间接触发了公网请求。
无公网环境的解决办法
方法一:提前缓存分词器文件
- 在有网络的环境下载
cl100k_base.tiktoken文件(对应GPT-3.5/4系列模型的分词规则) - 将文件上传到无网服务器的本地目录,比如
/data/tiktoken_cache/ - 在代码中通过环境变量指定tiktoken的缓存路径,让它直接读取本地文件:
注:如果你的OpenAI API需要通过内网代理访问,还需额外配置代理,但当前报错仅涉及分词器文件,优先处理本地缓存即可。import os from langchain.embeddings.openai import OpenAIEmbeddings # 指定本地缓存目录 os.environ["TIKTOKEN_CACHE_DIR"] = "/data/tiktoken_cache/" embeddings = OpenAIEmbeddings(openai_api_key=openai.api_key)
方法二:替换为本地嵌入模型
如果完全无法访问公网,直接改用开源本地嵌入模型,比如HuggingFace的all-MiniLM-L6-v2,全程不需要公网:
from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import DocArrayInMemorySearch # 提前在有网环境下载模型文件到本地路径,比如/opt/models/all-MiniLM-L6-v2 embeddings = HuggingFaceEmbeddings(model_name="/opt/models/all-MiniLM-L6-v2") db = DocArrayInMemorySearch.from_documents(docs, embeddings) docs_response = db.similarity_search("Coles")
内容的提问来源于stack exchange,提问作者Nile
相关产品推荐
相关产品推荐

