在LLM基于本地或外部知识库的问答机器人应用开发中,当模型外部知识的索引需要通过语义匹配而非基于正则表达式实现的精确匹配时,我们往往会借助基于深度学习训练得到的embeddings模型对文本进行向量化(当然也可以使用基于词频的算法,如TF-IDF、BM25等),然后通过相似度检索的方式得到与用户提问(user query)相关度最高的外部知识内容。
本篇博客将介绍如何通过 Ollama 本地化使用embedding模型,并结合 langchain 该框架中提供的 langchain_ollama
和 langchain_core.vectorstores
来实现一个非常简单的基于用户提问索引相关文档内容的 Retriever。
embeddings 模型选择
在 Ollama 介绍 embeddings 模型的官方网页中,列举了三个模型作为example,分别是 mxbai-embed-large
,nomic-embed-text
和 all-minilm
。大家可以根据自己实现场景的需求去选择合适的embeddings model,因为不同模型对语言的支持程度(有些只支持英文)和可一次处理的文本长度等会有所不同,如果有很明确的需求,如必须支持中英文双语等等,那可以现在 Hugging Face 上根据每个embeddings模型 Model Card 里介绍的详细信息进行需求匹配,确定了模型名称后,再去 Ollama 官网上去检索,如果支持的话就可以直接 pull下来了(如果不支持则可以选择其他非Ollama的方式去使用)。
本篇博客选择的是功能强大、支持超100种语言且单次处理文本tokens数可达8k的模型 BGE-M3,该模型的使用在之前介绍混合检索的博客中也有出现,感兴趣可以阅读 BGE-M3模型结合Milvus向量数据库强强联合实现混合检索。
选择好之后就可以使用 ollama pull
命令对模型进行拉取了。
# 安装在 macOS 上的ollama,版本是 0.5.9
ollama --version
ollama version is 0.5.9
拉取模型(bge-m3 模型有~1.2G大小)
ollama pull bge-m3
pulling manifest
pulling daec91ffb5dd... 100% ▕██████████████████████████████▏ 1.2 GB
pulling a406579cd136... 100% ▕██████████████████████████████▏ 1.1 KB
pulling 0c4c9c2a325f... 100% ▕██████████████████████████████▏ 337 B
verifying sha256 digest
writing manifest
success
下载完成后,可以通过 ollama list
命令查看
NAME ID SIZE MODIFIED
bge-m3:latest 790764642607 1.2 GB About a minute ago
embeddings 使用
Ollama网页 上介绍了基于REST API、 python第三方库(基于ollama
和 chromadb
)和 Javascript 库对embeddings模型的使用方式,有需要可以自行了解。
接下来介绍搭载langchain框架对Ollama管理的emb