网站建设ppt方案结语公共资源交易中心忙吗
网站建设ppt方案结语,公共资源交易中心忙吗,网站建设申请空间,求8x新的域名EmbeddingGemma-300m实战#xff1a;用Ollama构建语义搜索系统
1. 引言#xff1a;为什么需要轻量级语义搜索#xff1f;
你是否曾经遇到过这样的问题#xff1a;电脑里存了几百份文档#xff0c;想找某个特定内容却怎么也找不到#xff1f;或者需要从大量文本中快速找…EmbeddingGemma-300m实战用Ollama构建语义搜索系统1. 引言为什么需要轻量级语义搜索你是否曾经遇到过这样的问题电脑里存了几百份文档想找某个特定内容却怎么也找不到或者需要从大量文本中快速找到相关信息但手动翻阅太费时间这就是语义搜索要解决的问题。传统的关键词搜索就像是在文档中找完全匹配的文字而语义搜索则能理解你的意图找到意思相近的内容。比如搜索苹果公司的最新产品传统搜索可能只找包含苹果公司和最新产品的文档而语义搜索能理解你想找的是关于iPhone、iPad等新品的相关信息。今天我们要介绍的EmbeddingGemma-300m就是谷歌推出的一个轻量级文本嵌入模型只有3亿参数却能在普通电脑上流畅运行帮你快速构建自己的语义搜索系统。2. 环境准备与快速部署2.1 安装Docker和Ollama首先确保你的系统已经安装了Docker。如果还没有安装可以参考官方文档进行安装。安装完成后用以下命令启动Ollama服务docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama这个命令会在后台启动一个Ollama容器将11434端口映射到主机方便我们后续调用API。2.2 下载EmbeddingGemma模型进入Ollama容器并下载模型docker exec -it ollama bash ollama pull embeddinggemma:300m下载过程可能需要一些时间取决于你的网络速度。模型大小约1.2GB相比动辄几十GB的大模型算是非常轻量了。2.3 验证模型运行下载完成后检查模型是否正常运行ollama list你应该能看到embeddinggemma:300m在模型列表中。现在模型服务已经在后台运行可以通过11434端口进行调用。3. 核心概念什么是文本嵌入文本嵌入听起来很技术其实原理很简单。想象一下我们要把文字转换成计算机能理解的数字形式。传统方法是把每个词单独编码比如猫是1狗是2。但这种方法无法理解词语之间的关系。文本嵌入则更智能它会把语义相近的词放在数字空间的相近位置。比如猫和狗都是宠物它们的向量表示会比较接近猫和电脑关系较远向量表示也会相距较远。EmbeddingGemma-300m就是专门做这个转换的模型它能把一段文字转换成768维的数字向量一组768个数字。这些向量有一个很好的特性语义相似的文本它们的向量在数学上也相似。我们可以通过计算向量之间的余弦相似度来判断两段文字的相似程度。4. 构建语义搜索系统4.1 获取文本嵌入向量首先我们写一个函数来获取任意文本的嵌入向量import requests import json def get_embedding(text, modelembeddinggemma:300m, urlhttp://localhost:11434/api/embeddings): 获取文本的嵌入向量 payload { model: model, prompt: text } try: response requests.post(url, datajson.dumps(payload)) response.raise_for_status() return response.json().get(embedding) except Exception as e: print(f获取嵌入向量失败: {e}) return None # 测试获取嵌入向量 text 人工智能是未来的发展趋势 embedding get_embedding(text) if embedding: print(f向量维度: {len(embedding)}) print(f前5个值: {embedding[:5]})4.2 计算相似度有了嵌入向量我们需要计算相似度import numpy as np def cosine_similarity(vec1, vec2): 计算两个向量的余弦相似度 return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2)) # 测试相似度计算 text1 我喜欢吃苹果 text2 苹果是一种水果 text3 电脑很好用 vec1 get_embedding(text1) vec2 get_embedding(text2) vec3 get_embedding(text3) print(f{text1} 和 {text2} 的相似度: {cosine_similarity(vec1, vec2):.4f}) print(f{text1} 和 {text3} 的相似度: {cosine_similarity(vec1, vec3):.4f})你会发现前两个句子的相似度远高于第一个和第三个句子尽管第一个句子中的苹果可能指水果也可能指公司但模型能根据上下文理解其含义。4.3 构建完整搜索系统现在我们来构建一个完整的语义搜索系统class SemanticSearch: def __init__(self): self.documents [] self.embeddings [] def add_document(self, text): 添加文档到搜索库 embedding get_embedding(text) if embedding: self.documents.append(text) self.embeddings.append(np.array(embedding)) print(f已添加文档: {text[:50]}...) def search(self, query, top_k3): 语义搜索 query_embedding get_embedding(query) if query_embedding is None: return [] query_embedding np.array(query_embedding) similarities [] for i, doc_embedding in enumerate(self.embeddings): sim cosine_similarity(query_embedding, doc_embedding) similarities.append((sim, i)) # 按相似度排序 similarities.sort(keylambda x: x[0], reverseTrue) results [] for sim, idx in similarities[:top_k]: results.append({ score: sim, text: self.documents[idx] }) return results # 使用示例 search_engine SemanticSearch() # 添加一些文档 documents [ 人工智能是计算机科学的一个分支致力于创建智能机器, 机器学习是人工智能的一种实现方式让计算机从数据中学习, 深度学习是机器学习的一个子领域使用神经网络模型, 自然语言处理是人工智能的一个领域关注计算机和人类语言的交互, 计算机视觉让计算机能够理解和解释视觉信息 ] for doc in documents: search_engine.add_document(doc) # 执行搜索 query 如何让计算机理解人类语言 results search_engine.search(query) print(f\n搜索查询: {query}) print(最相关的结果:) for i, result in enumerate(results): print(f{i1}. 相似度: {result[score]:.4f}) print(f 内容: {result[text]})5. 实际应用案例5.1 文档检索系统假设你有一个技术文档库包含数百篇技术文章。传统搜索需要输入准确的关键词而语义搜索可以理解你的意图# 模拟文档库 tech_docs [ Python是一种解释型、面向对象的高级编程语言, Django是Python的一个高级Web框架鼓励快速开发和简洁设计, Flask是Python的微型Web框架易于扩展和定制, JavaScript是一种轻量级的解释型编程语言主要用于Web开发, React是一个用于构建用户界面的JavaScript库 ] doc_search SemanticSearch() for doc in tech_docs: doc_search.add_document(doc) # 搜索示例 queries [ 用什么框架可以快速开发网站, 前端开发用什么技术, Python的Web解决方案 ] for query in queries: results doc_search.search(query) print(f\n搜索: {query}) for result in results: print(f 相关结果: {result[text]} (相似度: {result[score]:.4f}))5.2 问答系统结合生成模型可以构建智能问答系统def answer_question(question, context_docs, modelgemma3n:e2b): 基于上下文回答問題 context \n.join([doc[text] for doc in context_docs]) prompt f基于以下上下文回答问题。如果答案不在上下文中请说明你不知道。 上下文: {context} 问题: {question} 答案: # 这里需要调用生成模型实际使用时需要相应的API return 这是一个基于上下文的答案生成示例 # 使用示例 question Django和Flask有什么区别 relevant_docs doc_search.search(question, top_k2) answer answer_question(question, relevant_docs) print(f问题: {question}) print(f答案: {answer})6. 性能优化与实践建议6.1 批量处理优化如果需要处理大量文档建议使用批量处理def batch_get_embeddings(texts, batch_size10): 批量获取嵌入向量 embeddings [] for i in range(0, len(texts), batch_size): batch texts[i:ibatch_size] print(f处理批次 {i//batch_size 1}/{(len(texts)-1)//batch_size 1}) for text in batch: embedding get_embedding(text) if embedding: embeddings.append(np.array(embedding)) else: embeddings.append(None) return embeddings6.2 相似度计算优化对于大规模文档库可以使用更高效的相似度计算方法def efficient_search(query, document_embeddings, top_k5): 高效搜索实现 query_embedding np.array(get_embedding(query)) # 将文档嵌入向量转换为矩阵 doc_matrix np.array(document_embeddings) # 批量计算相似度 norms np.linalg.norm(doc_matrix, axis1) query_norm np.linalg.norm(query_embedding) similarities np.dot(doc_matrix, query_embedding) / (norms * query_norm) # 获取top_k结果 top_indices np.argsort(similarities)[::-1][:top_k] return [(similarities[i], i) for i in top_indices]6.3 实践建议文档预处理清理文本移除无关字符分段处理长文档缓存机制对已处理的文档缓存嵌入向量避免重复计算阈值设置设置相似度阈值只返回足够相关的结果混合搜索结合传统关键词搜索和语义搜索获得更好效果7. 常见问题与解决方案7.1 模型加载问题如果遇到模型加载失败检查Ollama服务状态docker logs ollama确保模型正确下载docker exec -it ollama ollama list7.2 性能问题如果响应速度慢可以尝试减少批量处理大小使用更轻量的模型如果精度要求不高增加系统资源内存、CPU7.3 精度问题如果搜索结果不准确检查文本预处理是否充分尝试调整相似度阈值考虑使用更大的模型如果资源允许8. 总结通过本教程我们学习了如何使用EmbeddingGemma-300m和Ollama构建一个完整的语义搜索系统。这个系统有以下几个优点轻量高效300m参数的模型在普通电脑上就能流畅运行不需要昂贵硬件易于部署使用Docker和Ollama几分钟就能完成环境搭建功能强大能够理解语义相似性而不只是关键词匹配应用广泛可用于文档检索、问答系统、内容推荐等多种场景无论是个人知识管理还是企业文档检索语义搜索都能显著提升信息查找效率。EmbeddingGemma-300m作为一个轻量级解决方案让这项技术变得更加普及和易用。现在你可以尝试将自己的文档库接入这个系统体验语义搜索带来的便利。如果有任何问题欢迎在评论区交流讨论。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。