EmbeddingGemma-300m快速上手:零基础搭建本地语义搜索服务
EmbeddingGemma-300m快速上手零基础搭建本地语义搜索服务1. 什么是EmbeddingGemma-300mEmbeddingGemma-300m是谷歌推出的开源文本嵌入模型专门用于将文本转换为向量表示。这个模型只有3亿参数体积小巧但性能出色特别适合在普通电脑上运行。简单来说这个模型能把任何文字中文、英文等变成一串数字通常是1024个数字。这串数字就像文字的指纹——意思相似的文字它们的数字串也会很相似。有了这个功能我们就可以做很多有用的事情搜索不用完全匹配关键词也能找到相关文档分类自动把相似内容的文章归为一类推荐根据你喜欢的内容推荐相似的东西2. 快速安装与部署2.1 安装Ollama首先需要安装Ollama这是一个专门用于运行AI模型的工具。安装方法非常简单对于Windows用户访问Ollama官网下载安装包双击运行安装程序安装完成后打开命令提示符输入ollama --version检查是否安装成功对于Mac/Linux用户curl -fsSL https://ollama.com/install.sh | sh2.2 下载EmbeddingGemma-300m模型安装好Ollama后只需一条命令就能下载模型ollama pull embeddinggemma-300m下载完成后可以用以下命令检查ollama list应该能看到类似这样的输出NAME ID SIZE PROCESSOR embeddinggemma-300m 9a8b7c6d5e4f 487 MB cpu3. 你的第一个语义搜索程序3.1 准备测试数据我们先创建一个简单的文本数据集。新建一个文件data.txt内容如下苹果公司发布新款iPhone 特斯拉在中国销量增长 华为推出新款折叠屏手机 微软宣布AI助手Copilot 谷歌发布最新大语言模型3.2 生成文本向量接下来我们写一个Python脚本把这些文本转换成向量import requests import json def get_embedding(text): response requests.post( http://localhost:11434/api/embeddings, json{model: embeddinggemma-300m, prompt: text} ) return response.json()[embedding] # 读取文本数据 with open(data.txt, r, encodingutf-8) as f: texts [line.strip() for line in f.readlines() if line.strip()] # 为每段文本生成向量 embeddings {} for text in texts: embeddings[text] get_embedding(text) print(f已处理: {text}) # 保存向量数据 with open(embeddings.json, w, encodingutf-8) as f: json.dump(embeddings, f, ensure_asciiFalse, indent2)运行这个脚本后你会得到一个embeddings.json文件里面保存了每段文本对应的向量。3.3 实现简单搜索功能现在我们可以用这些向量来实现搜索功能import numpy as np # 计算余弦相似度 def cosine_similarity(a, b): return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)) # 加载之前保存的向量 with open(embeddings.json, r, encodingutf-8) as f: embeddings json.load(f) # 搜索函数 def search(query, top_k3): query_vec get_embedding(query) results [] for text, vec in embeddings.items(): similarity cosine_similarity(query_vec, vec) results.append((text, similarity)) # 按相似度排序 results.sort(keylambda x: x[1], reverseTrue) return results[:top_k] # 测试搜索 query 智能手机新闻 results search(query) print(f搜索: {query}) for i, (text, score) in enumerate(results, 1): print(f{i}. {text} (相似度: {score:.3f}))运行这个代码当你搜索智能手机新闻时它会返回与手机发布相关的内容即使你的搜索词并没有直接出现在原文中。4. 提升搜索效果的技巧4.1 使用指令前缀EmbeddingGemma对带有指令的输入处理效果更好。修改获取向量的代码def get_embedding(text): # 添加指令前缀 prompt f为语义搜索生成嵌入{text} response requests.post( http://localhost:11434/api/embeddings, json{model: embeddinggemma-300m, prompt: prompt} ) return response.json()[embedding]4.2 处理长文本模型对长文本的处理有限制约512个token。对于长文档可以分段处理def split_text(text, max_length400): words text.split() chunks [] current_chunk [] current_length 0 for word in words: if current_length len(word) 1 max_length: current_chunk.append(word) current_length len(word) 1 else: chunks.append( .join(current_chunk)) current_chunk [word] current_length len(word) if current_chunk: chunks.append( .join(current_chunk)) return chunks def get_long_text_embedding(long_text): chunks split_text(long_text) chunk_embeddings [get_embedding(chunk) for chunk in chunks] # 取各段落向量的平均值作为全文向量 return np.mean(chunk_embeddings, axis0)5. 进阶应用构建本地知识库5.1 使用向量数据库为了高效搜索大量文档我们可以使用专门的向量数据库。这里以ChromaDB为例首先安装ChromaDBpip install chromadb然后创建知识库import chromadb from chromadb.utils import embedding_functions # 创建客户端 client chromadb.Client() # 创建集合(相当于表) collection client.create_collection( namemy_knowledge_base, embedding_functionembedding_functions.OllamaEmbeddingFunction( model_nameembeddinggemma-300m ) ) # 添加文档 documents [ 苹果公司发布了新款MacBook Pro搭载M3芯片, 特斯拉宣布在中国新建超级工厂, 微软推出新版Office 365集成AI功能, 谷歌发布最新AI模型Gemini 1.5 ] collection.add( documentsdocuments, ids[fid{i} for i in range(len(documents))] ) # 搜索 results collection.query( query_texts[科技公司的最新AI产品], n_results2 ) print(results)5.2 构建完整的搜索服务我们可以用FastAPI构建一个简单的搜索APIfrom fastapi import FastAPI from pydantic import BaseModel app FastAPI() class SearchRequest(BaseModel): query: str top_k: int 3 app.post(/search) async def search(request: SearchRequest): results collection.query( query_texts[request.query], n_resultsrequest.top_k ) return { query: request.query, results: [ {text: doc, score: score} for doc, score in zip(results[documents][0], results[distances][0]) ] }启动服务后你就可以通过HTTP请求来进行语义搜索了。6. 总结与下一步通过本教程你已经学会了如何在本地部署EmbeddingGemma-300m模型如何将文本转换为向量表示如何实现基础的语义搜索功能如何使用向量数据库构建知识库下一步可以尝试将这个方法应用到你的专业领域如法律、医疗文档结合网页爬虫构建垂直领域的搜索引擎尝试不同的向量数据库如Milvus、Weaviate获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。