用vs做网站 怎么安装银川网站建设就找湖海
用vs做网站 怎么安装,银川网站建设就找湖海,求职简历在哪个网站做,建筑有限公司embeddinggemma-300m实战应用#xff1a;基于Ollama构建本地语义搜索系统
1. 引言#xff1a;为什么需要本地语义搜索#xff1f;
在日常工作和学习中#xff0c;我们经常遇到这样的场景#xff1a;电脑里存了几百份文档#xff0c;想找某个特定主题的内容却无从下手&a…embeddinggemma-300m实战应用基于Ollama构建本地语义搜索系统1. 引言为什么需要本地语义搜索在日常工作和学习中我们经常遇到这样的场景电脑里存了几百份文档想找某个特定主题的内容却无从下手或者有一个问题想知道公司知识库中是否有相关解答。传统的关键词搜索往往不够智能无法理解语义层面的相似性。这就是embeddinggemma-300m发挥作用的地方。这个由谷歌推出的轻量级嵌入模型只有3亿参数却能在普通笔记本电脑上流畅运行将文本转换为高维向量表示从而实现真正理解语义的智能搜索。本文将手把手教你如何使用Ollama部署embeddinggemma-300m构建一个完全本地的语义搜索系统无需联网保护隐私而且完全免费。2. 环境准备与Ollama部署2.1 安装OllamaOllama是一个强大的本地大模型部署工具支持一键安装和运行各种开源模型。首先我们需要安装Ollama# Linux/macOS 安装命令 curl -fsSL https://ollama.ai/install.sh | sh # Windows 用户可以从官网下载安装包 # 访问 https://ollama.ai/download 下载对应版本安装完成后验证Ollama是否正常运行ollama --version2.2 拉取embeddinggemma-300m模型使用Ollama拉取模型非常简单只需一行命令ollama pull embeddinggemma:300m这个命令会自动下载模型文件大小约1.2GB根据网络情况需要几分钟到十几分钟。下载完成后你可以查看已安装的模型ollama list应该能看到embeddinggemma:300m在模型列表中。3. 构建本地语义搜索系统3.1 启动embedding服务现在让我们启动embedding服务为后续的语义搜索做准备# 启动embedding服务指定端口和模型 ollama serve --model embeddinggemma:300m --port 11434服务启动后你会在终端看到类似这样的输出表示服务正在11434端口运行Listening on 0.0.0.0:114343.2 测试embedding功能让我们先测试一下模型是否能正常工作。打开新的终端窗口发送一个测试请求curl http://localhost:11434/api/embeddings \ -H Content-Type: application/json \ -d { model: embeddinggemma:300m, input: 你好世界 }如果一切正常你会收到一个包含768维向量的JSON响应这就是你好世界这个文本的向量表示。3.3 创建简单的搜索脚本现在我们来创建一个Python脚本实现基本的语义搜索功能import requests import numpy as np from sklearn.metrics.pairwise import cosine_similarity import json class LocalSemanticSearch: def __init__(self, base_urlhttp://localhost:11434): self.base_url base_url self.documents [] self.embeddings [] def add_document(self, text): 添加文档到搜索库 response requests.post( f{self.base_url}/api/embeddings, headers{Content-Type: application/json}, datajson.dumps({ model: embeddinggemma:300m, input: text }) ) if response.status_code 200: embedding response.json()[embedding] self.documents.append(text) self.embeddings.append(embedding) return True return False def search(self, query, top_k5): 语义搜索 response requests.post( f{self.base_url}/api/embeddings, headers{Content-Type: application/json}, datajson.dumps({ model: embeddinggemma:300m, input: query }) ) if response.status_code 200: query_embedding np.array(response.json()[embedding]).reshape(1, -1) doc_embeddings np.array(self.embeddings) # 计算余弦相似度 similarities cosine_similarity(query_embedding, doc_embeddings)[0] # 获取最相似的前top_k个文档 results [] for idx in similarities.argsort()[-top_k:][::-1]: results.append({ document: self.documents[idx], similarity: float(similarities[idx]) }) return results return [] # 使用示例 search_engine LocalSemanticSearch() # 添加一些示例文档 documents [ 人工智能是计算机科学的一个分支致力于创建智能机器, 机器学习是人工智能的一种实现方式让计算机从数据中学习, 深度学习是机器学习的一个子领域使用神经网络处理复杂模式, 自然语言处理让计算机能够理解、解释和生成人类语言, 计算机视觉使计算机能够从图像和视频中提取信息 ] for doc in documents: search_engine.add_document(doc) # 执行搜索 results search_engine.search(如何让计算机理解人类语言) for result in results: print(f相似度: {result[similarity]:.3f} - {result[document]})4. 高级应用场景4.1 文档管理系统你可以将这个搜索系统集成到文档管理系统中实现智能文档检索import os import PyPDF2 import docx class DocumentSearchSystem(LocalSemanticSearch): def add_document_file(self, file_path): 从文件添加文档 if file_path.endswith(.txt): with open(file_path, r, encodingutf-8) as f: content f.read() elif file_path.endswith(.pdf): with open(file_path, rb) as f: reader PyPDF2.PdfReader(f) content .join([page.extract_text() for page in reader.pages]) elif file_path.endswith(.docx): doc docx.Document(file_path) content \n.join([paragraph.text for paragraph in doc.paragraphs]) else: return False # 分段处理长文档 segments self._split_text(content) for segment in segments: self.add_document(segment) return True def _split_text(self, text, max_length500): 将长文本分割成段落 # 简单的分段逻辑实际应用中可以使用更复杂的分段算法 return [text[i:imax_length] for i in range(0, len(text), max_length)] # 使用示例 doc_searcher DocumentSearchSystem() doc_searcher.add_document_file(技术文档.pdf) results doc_searcher.search(人工智能基础知识) for result in results: print(f找到相关内容: {result[document][:100]}...)4.2 问答系统基于语义搜索构建简单的问答系统class QASystem: def __init__(self, knowledge_base): self.search_engine LocalSemanticSearch() self.knowledge_base knowledge_base # 初始化知识库 for item in knowledge_base: self.search_engine.add_document(item[question]) self.search_engine.add_document(item[answer]) def ask(self, question): 回答问题 results self.search_engine.search(question, top_k3) if results and results[0][similarity] 0.7: return results[0][document] else: return 抱歉我没有找到相关答案5. 性能优化与实践建议5.1 批量处理优化当需要处理大量文本时可以使用批量处理提高效率def batch_embedding(texts, batch_size10): 批量生成embedding embeddings [] for i in range(0, len(texts), batch_size): batch texts[i:ibatch_size] response requests.post( http://localhost:11434/api/embeddings, headers{Content-Type: application/json}, datajson.dumps({ model: embeddinggemma:300m, input: batch }) ) if response.status_code 200: embeddings.extend(response.json()[embeddings]) return embeddings5.2 索引优化对于大规模文档库建议使用专业的向量数据库# 使用FAISS进行高效向量检索 import faiss class FaissSearchSystem: def __init__(self): self.index faiss.IndexFlatL2(768) # 768是embedding维度 self.documents [] def add_documents(self, texts): embeddings batch_embedding(texts) embeddings np.array(embeddings).astype(float32) self.index.add(embeddings) self.documents.extend(texts) def search(self, query, top_k5): query_embedding get_embedding(query) query_embedding np.array([query_embedding]).astype(float32) distances, indices self.index.search(query_embedding, top_k) return [{ document: self.documents[i], distance: float(distances[0][j]) } for j, i in enumerate(indices[0])]5.3 实际部署建议硬件要求embeddinggemma-300m在8GB内存的电脑上运行流畅建议使用SSD硬盘提升加载速度并发处理Ollama支持多线程但建议控制并发数避免内存溢出持久化存储将生成的embedding保存到文件避免每次重启重新计算监控日志添加日志记录方便排查问题和优化性能6. 总结通过本文的实践我们成功使用Ollama部署了embeddinggemma-300m模型并构建了一个功能完整的本地语义搜索系统。这个系统具有以下优势完全本地化所有数据处理都在本地完成无需联网保护数据隐私轻量高效3亿参数的模型在普通硬件上也能流畅运行灵活可扩展可以轻松集成到各种应用中从文档管理到智能问答开源免费基于开源技术栈无使用成本无论是个人知识管理、企业文档检索还是学术研究这个本地语义搜索系统都能提供强大的语义理解能力。随着模型的不断优化和硬件性能的提升本地AI应用将会越来越普及。现在就开始构建你自己的智能搜索系统吧让信息检索变得更加智能和高效获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。