EmbeddingGemma-300m实战教程:Ollama部署+Milvus向量库集成+检索演示
想试试最新的开源文本嵌入模型吗?EmbeddingGemma-300m,这个只有3亿参数的小家伙,却能生成高质量的文本向量,帮你轻松搞定文档搜索、内容推荐这些事。今天,我就带你从零开始,用Ollama把它部署起来,再配上强大的Milvus向量数据库,最后手把手教你做一个简单的检索演示。整个过程就像搭积木,一步步来,保证你能跑通。
1. 环境准备与快速部署
1.1 系统要求与Ollama安装
首先,确保你的电脑环境满足基本要求。EmbeddingGemma-300m对硬件要求比较友好,但为了流畅运行,建议:
- 操作系统:Linux (Ubuntu 20.04+ 推荐) 或 macOS,Windows用户可以通过WSL2获得类似体验。
- 内存:至少8GB RAM,16GB或以上会更顺畅。
- 存储:预留约2GB空间用于模型和依赖。
- 网络:能顺畅访问互联网,用于下载模型。
接下来安装Ollama。Ollama是一个让你能轻松在本地运行大模型的工具,安装非常简单。
对于Linux/macOS用户,打开终端,一行命令搞定:
curl -fsSL https://ollama.ai/install.sh | sh安装完成后,启动Ollama服务:
ollama serve服务会在后台运行。你可以打开另一个终端窗口,输入ollama --version来验证安装是否成功。
1.2 拉取并运行EmbeddingGemma-300m模型
Ollama安装好后,拉取模型就像下载一个软件包一样简单。在终端执行:
ollama pull embeddinggemma:300m这个命令会从Ollama的模型库中下载EmbeddingGemma-300m。下载时间取决于你的网速,模型大小约1.2GB,稍等片刻就好。
下载完成后,我们就可以运行这个模型了。运行模型的命令会启动一个本地的API服务:
ollama run embeddinggemma:300m执行后,终端会显示模型加载信息,并进入一个交互式对话界面。不过,对于嵌入任务,我们通常通过API来调用。更常见的做法是让模型作为服务在后台运行,我们通过HTTP请求与它交互。你可以保持这个运行窗口,或者使用ollama serve配合API来调用,我们下一步就会用到。
2. 基础概念与核心功能上手
2.1 EmbeddingGemma-300m是什么?
你可能听过ChatGPT生成文字,或者Stable Diffusion生成图片。EmbeddingGemma-300m干的是另一件重要的事:把文字变成一串有意义的数字(向量)。
想象一下,你要整理一个图书馆。传统的办法是按书名首字母排序,但如果你想找“关于人工智能伦理的科幻小说”,传统方法就不好找了。Embedding模型就像一个超级图书管理员,它读过所有书,能把每本书的内容理解成一个“坐标点”。内容相似的书,它们的坐标点就在空间里离得很近。
- 文本变向量:输入一句话“今天天气真好”,模型会输出一个长长的数字列表(比如1024个数字),这就是这句话的“向量表示”或“嵌入向量”。
- 语义相似度:关键在这里。“今天天气真好”和“阳光明媚的一天”这两句话的字面完全不同,但它们的向量在数学空间里会非常接近。而“今天天气真好”和“编程教程”的向量就会离得很远。
- 用途广泛:基于这个特性,我们可以做很多事:搜索(找到语义相近的文档)、推荐(推荐相似内容)、分类(把文档自动分到不同主题)、聚类(把相似的文档自动聚成一堆)。
EmbeddingGemma-300m由谷歌推出,基于先进的Gemma架构,虽然只有3亿参数,但在多项测试中表现亮眼,特别适合在个人电脑或服务器上部署,平衡了效果和效率。
2.2 快速验证模型效果
在集成到复杂系统前,我们先快速验证一下模型是否工作正常。Ollama提供了简单的API,我们可以用curl命令来测试。
打开一个新的终端窗口(确保ollama run embeddinggemma:300m在另一个窗口运行着),输入以下命令:
curl http://localhost:11434/api/embeddings -d '{ "model": "embeddinggemma:300m", "prompt": "The quick brown fox jumps over the lazy dog." }'这个命令向本地的Ollama服务发送了一个请求,要求embeddinggemma:300m模型为英文句子“The quick brown fox jumps over the lazy dog.”生成嵌入向量。
你会收到一个JSON格式的响应,其中包含一个embedding字段,它的值就是一个长长的浮点数数组。这就是我们想要的文本向量!
我们再来试试中文,看看它的多语言支持:
curl http://localhost:11434/api/embeddings -d '{ "model": "embeddinggemma:300m", "prompt": "敏捷的棕色狐狸跳过了懒惰的狗。" }'同样,你会得到一个中文句子的向量。虽然这两个句子是不同语言的,但因为它们表达的是相同的意思,理论上它们的向量也应该具有较高的相似度。我们可以通过计算两个向量的余弦相似度来验证,这一步我们稍后在集成Milvus后会做。
3. 集成Milvus向量数据库
模型能生成向量了,但如果有一百万个文档,我们怎么快速找到最相似的那个?这就需要向量数据库出场了。Milvus是这方面非常流行的开源选择。
3.1 安装并启动Milvus
我们使用Docker来安装Milvus,这是最方便的方式。首先确保你的系统已经安装了Docker和Docker Compose。
创建一个工作目录并下载Milvus的配置文件:
mkdir milvus-test && cd milvus-test wget https://github.com/milvus-io/milvus/releases/download/v2.4.0/milvus-standalone-docker-compose.yml -O docker-compose.yml使用Docker Compose启动Milvus:
docker-compose up -d这个命令会拉取必要的镜像并在后台启动Milvus服务及其依赖(如etcd、MinIO)。
检查服务状态:
docker-compose ps当所有服务状态均为
Healthy或Up时,说明Milvus已经成功启动。它会在19530端口提供GRPC服务,在9091端口提供HTTP服务。
3.2 使用Python连接与操作Milvus
接下来,我们用Python写个脚本,把Ollama生成的向量存到Milvus里,并实现检索功能。
首先,安装必要的Python库:
pip install pymilvus ollama然后,创建一个名为embedding_demo.py的Python脚本,我们将分步实现:
import ollama from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility import numpy as np # 1. 连接到Milvus服务 connections.connect(host='localhost', port='19530') # 2. 定义集合(Collection)的字段结构 # 一个集合就像数据库里的一张表 fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True), # 主键,自增ID FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=500), # 存储原始文本 FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1024) # 存储1024维的向量 ] # 3. 创建集合Schema schema = CollectionSchema(fields=fields, description="Demo collection for EmbeddingGemma") # 4. 创建集合,命名为 `embedding_demo` collection_name = "embedding_demo" if utility.has_collection(collection_name): # 如果集合已存在,先删除(仅用于演示,生产环境慎用) utility.drop_collection(collection_name) demo_collection = Collection(name=collection_name, schema=schema) # 5. 为`embedding`字段创建索引,以加速搜索 index_params = { "index_type": "IVF_FLAT", # 一种高效的索引类型 "metric_type": "COSINE", # 使用余弦相似度作为距离度量 "params": {"nlist": 128} # 索引参数 } demo_collection.create_index(field_name="embedding", index_params=index_params) print(f"集合 '{collection_name}' 创建并索引完成!")这段代码建立了与Milvus的连接,并创建了一个用于存储文本和向量的“集合”。dim=1024是因为EmbeddingGemma-300m生成的向量是1024维的。我们使用了COSINE(余弦相似度)作为度量标准,这是语义搜索中最常用的。
4. 完整流程:从文本入库到语义检索
现在,让我们把Ollama和Milvus串联起来,完成一个从插入数据到查询的完整演示。
4.1 准备数据并生成嵌入向量
我们准备一些简单的句子作为示例数据,并用Ollama为它们生成向量,然后插入Milvus。
在embedding_demo.py脚本的末尾继续添加:
# 6. 准备示例文本数据 sample_texts = [ "机器学习是人工智能的一个分支。", "深度学习利用神经网络进行模式识别。", "Python是一种流行的编程语言。", "今天天气晴朗,适合户外运动。", "神经网络受到人脑结构的启发。", "Java也是一种广泛使用的面向对象语言。" ] # 7. 使用Ollama生成嵌入向量 embeddings = [] for text in sample_texts: response = ollama.embeddings(model='embeddinggemma:300m', prompt=text) # response['embedding'] 就是1024维的向量 embeddings.append(response['embedding']) print(f"为 {len(sample_texts)} 条文本生成了嵌入向量。") # 8. 将数据和向量插入Milvus集合 # 注意:插入前需要加载集合到内存 demo_collection.load() # 构造插入数据,id字段会自动生成 insert_data = [ sample_texts, # 文本字段 embeddings # 向量字段 ] # 执行插入 insert_result = demo_collection.insert(insert_data) print(f"数据插入成功,插入数量:{len(insert_result.primary_keys)}")运行这个脚本,你应该能看到成功创建集合、生成向量和插入数据的提示。
4.2 执行语义相似度搜索
最激动人心的部分来了——搜索!我们输入一个查询语句,让系统找出库中最相关的文本。
继续在脚本中添加:
# 9. 执行语义搜索 query_text = "什么是人工智能?" print(f"\n查询语句:'{query_text}'") # 为查询语句生成嵌入向量 response = ollama.embeddings(model='embeddinggemma:300m', prompt=query_text) query_embedding = response['embedding'] # 定义搜索参数 search_params = { "metric_type": "COSINE", "params": {"nprobe": 10} # 搜索时查找的单元数,影响速度和精度 } # 执行搜索,查找最相似的3条记录 results = demo_collection.search( data=[query_embedding], # 查询向量 anns_field="embedding", # 在哪个字段上搜索 param=search_params, limit=3, # 返回前3个结果 output_fields=["text"] # 返回时包含`text`字段 ) # 10. 打印搜索结果 print("\n搜索结果(按相似度从高到低排列):") for i, hits in enumerate(results): for j, hit in enumerate(hits): print(f" 第{j+1}名 | 相似度: {hit.score:.4f} | 文本: {hit.entity.get('text')}")现在,运行完整的embedding_demo.py脚本。你会看到类似下面的输出:
集合 'embedding_demo' 创建并索引完成! 为 6 条文本生成了嵌入向量。 数据插入成功,插入数量:6 查询语句:'什么是人工智能?' 搜索结果(按相似度从高到低排列): 第1名 | 相似度: 0.8123 | 文本: 机器学习是人工智能的一个分支。 第2名 | 相似度: 0.7541 | 文本: 深度学习利用神经网络进行模式识别。 第3名 | 相似度: 0.6988 | 文本: 神经网络受到人脑结构的启发。看!尽管我们的查询是“什么是人工智能?”,而库中没有完全相同的句子,但系统成功找到了语义上最相关的“机器学习是人工智能的一个分支。”,相似度最高。这就是语义搜索的魅力。
你可以尝试不同的查询,比如“推荐一门编程语言”,看看它会返回与Python或Java相关的句子。
5. 总结
通过这个实战教程,我们完成了一个完整的轻量级语义检索系统搭建:
- 部署核心模型:使用Ollama,我们几乎零配置地在本机跑起了强大的EmbeddingGemma-300m嵌入模型。
- 构建向量数据库:通过Docker快速部署了Milvus,为海量向量数据的高效存储和检索提供了基础。
- 实现端到端流程:用Python脚本将两者串联,实现了从文本生成向量、存入数据库到执行语义搜索的全过程。
这个组合的优势非常明显:
- 轻量且强大:整个系统可以在个人开发机上运行,无需昂贵的GPU。
- 开源灵活:Ollama和Milvus都是开源软件,可以根据需求自由调整和扩展。
- 实用性强:你可以立即将这个框架应用到自己的项目中,比如构建知识库问答、文档去重、内容推荐系统等。
下一步,你可以尝试:
- 用你自己的文档集(如PDF、网页)替换示例文本,构建专属知识库。
- 尝试Milvus的其他索引类型(如
HNSW)和参数,在搜索速度和精度之间取得平衡。 - 为这个系统添加一个简单的Web界面,使其变成一个可交互的应用。
希望这篇教程能帮你打开本地化AI应用开发的大门。动手试试,感受一下语义搜索的力量吧!
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。