news 2026/3/26 23:58:34

EmbeddingGemma-300m实战教程:Ollama部署+Milvus向量库集成+检索演示

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
EmbeddingGemma-300m实战教程:Ollama部署+Milvus向量库集成+检索演示

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。

  1. 创建一个工作目录并下载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
  2. 使用Docker Compose启动Milvus:

    docker-compose up -d

    这个命令会拉取必要的镜像并在后台启动Milvus服务及其依赖(如etcd、MinIO)。

  3. 检查服务状态:

    docker-compose ps

    当所有服务状态均为HealthyUp时,说明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. 总结

通过这个实战教程,我们完成了一个完整的轻量级语义检索系统搭建:

  1. 部署核心模型:使用Ollama,我们几乎零配置地在本机跑起了强大的EmbeddingGemma-300m嵌入模型。
  2. 构建向量数据库:通过Docker快速部署了Milvus,为海量向量数据的高效存储和检索提供了基础。
  3. 实现端到端流程:用Python脚本将两者串联,实现了从文本生成向量、存入数据库到执行语义搜索的全过程。

这个组合的优势非常明显:

  • 轻量且强大:整个系统可以在个人开发机上运行,无需昂贵的GPU。
  • 开源灵活:Ollama和Milvus都是开源软件,可以根据需求自由调整和扩展。
  • 实用性强:你可以立即将这个框架应用到自己的项目中,比如构建知识库问答、文档去重、内容推荐系统等。

下一步,你可以尝试

  • 用你自己的文档集(如PDF、网页)替换示例文本,构建专属知识库。
  • 尝试Milvus的其他索引类型(如HNSW)和参数,在搜索速度和精度之间取得平衡。
  • 为这个系统添加一个简单的Web界面,使其变成一个可交互的应用。

希望这篇教程能帮你打开本地化AI应用开发的大门。动手试试,感受一下语义搜索的力量吧!


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/21 10:32:08

直播内容留存策略:从合规保存到资产化运营的完整方案

直播内容留存策略:从合规保存到资产化运营的完整方案 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容快速迭代的时代,直播内容作为高价值信息载体,其即时性与易…

作者头像 李华
网站建设 2026/3/15 15:33:14

AssetRipper完全掌握手册:从入门到精通的逆向工程实践

AssetRipper完全掌握手册:从入门到精通的逆向工程实践 【免费下载链接】AssetRipper GUI Application to work with engine assets, asset bundles, and serialized files 项目地址: https://gitcode.com/GitHub_Trending/as/AssetRipper 副标题:…

作者头像 李华
网站建设 2026/3/25 5:42:06

5大核心步骤构建个人云游戏系统:探索低延迟串流技术的实现方案

5大核心步骤构建个人云游戏系统:探索低延迟串流技术的实现方案 【免费下载链接】Sunshine Sunshine: Sunshine是一个自托管的游戏流媒体服务器,支持通过Moonlight在各种设备上进行低延迟的游戏串流。 项目地址: https://gitcode.com/GitHub_Trending/s…

作者头像 李华
网站建设 2026/3/26 18:44:33

开源游戏串流工具Sunshine:构建你的跨设备游戏体验

开源游戏串流工具Sunshine:构建你的跨设备游戏体验 【免费下载链接】Sunshine Sunshine: Sunshine是一个自托管的游戏流媒体服务器,支持通过Moonlight在各种设备上进行低延迟的游戏串流。 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine …

作者头像 李华
网站建设 2026/3/16 3:32:11

OFA视觉蕴含模型入门指南:文本tokenization对匹配结果的影响

OFA视觉蕴含模型入门指南:文本tokenization对匹配结果的影响 1. 为什么文本怎么“切”会影响图文判断结果? 你可能已经试过这个OFA视觉蕴含Web应用:上传一张鸟站在树枝上的图,输入“there are two birds”,系统立刻返…

作者头像 李华