all-MiniLM-L6-v2代码实例:Python调用Ollama API获取embedding向量
all-MiniLM-L6-v2代码实例Python调用Ollama API获取embedding向量1. 了解all-MiniLM-L6-v2模型all-MiniLM-L6-v2是一个专门为句子嵌入设计的轻量级模型。它基于BERT架构但做了很多优化让它在保持高性能的同时变得更加小巧高效。这个模型只有6层Transformer结构隐藏层维度为384最大可以处理256个token的文本。整个模型大小只有约22.7MB比标准的BERT模型小了非常多但推理速度却能快3倍以上。这意味着你可以在普通的笔记本电脑上就能流畅运行不需要昂贵的GPU设备。模型通过知识蒸馏技术训练而成简单来说就是让这个小模型学习大模型的知识既能保持不错的性能又大大减小了体积。它特别适合用来做文本相似度计算、语义搜索、聚类分析等任务。2. 部署Ollama embedding服务2.1 安装和配置Ollama首先你需要安装Ollama这是一个专门用于本地运行大模型的工具。根据你的操作系统选择安装方式Windows系统# 下载并运行Ollama安装程序 # 访问Ollama官网下载最新版本的Windows安装包 # 安装完成后Ollama会自动在后台运行Mac系统# 使用Homebrew安装 brew install ollama # 或者下载DMG安装包 # 安装后启动Ollama应用Linux系统# 使用curl安装 curl -fsSL https://ollama.com/install.sh | sh # 启动Ollama服务 ollama serve安装完成后打开终端或命令提示符验证Ollama是否正常运行ollama --version如果显示版本号说明安装成功。2.2 拉取和运行all-MiniLM-L6-v2模型接下来我们需要拉取all-MiniLM-L6-v2模型ollama pull all-minilm-l6-v2这个过程可能会花费一些时间取决于你的网络速度。模型大小约22.7MB通常不会太久。拉取完成后启动模型服务ollama run all-minilm-l6-v2如果一切正常你会看到模型已经启动并等待请求。默认情况下Ollama的API服务运行在http://localhost:11434。3. Python调用API获取embedding3.1 环境准备和依赖安装在开始写代码之前我们需要准备Python环境。建议使用Python 3.8或更高版本。首先安装必要的依赖库pip install requests numpyrequests库用于发送HTTP请求到Ollama APInumpy库用于处理返回的向量数据。3.2 基础调用代码示例下面是一个最简单的调用示例展示如何获取单个句子的embedding向量import requests import json def get_embedding(text, modelall-minilm-l6-v2): 获取文本的embedding向量 参数: text: 要处理的文本字符串 model: 使用的模型名称 返回: embedding向量列表 # Ollama API端点 url http://localhost:11434/api/embeddings # 请求数据 data { model: model, prompt: text } try: # 发送POST请求 response requests.post(url, jsondata) response.raise_for_status() # 检查请求是否成功 # 解析返回的JSON数据 result response.json() return result[embedding] except requests.exceptions.RequestException as e: print(f请求失败: {e}) return None except KeyError: print(返回数据格式异常) return None # 使用示例 if __name__ __main__: text 这是一个测试句子 embedding get_embedding(text) if embedding: print(f文本: {text}) print(fEmbedding长度: {len(embedding)}) print(f前10个维度: {embedding[:10]})这段代码会返回一个384维的向量因为all-MiniLM-L6-v2的隐藏层维度是384。3.3 批量处理文本示例在实际应用中我们经常需要处理多个文本。下面是一个批量处理的示例import requests import json from typing import List def get_batch_embeddings(texts: List[str], model: str all-minilm-l6-v2) - List[List[float]]: 批量获取多个文本的embedding向量 参数: texts: 文本列表 model: 使用的模型名称 返回: embedding向量列表的列表 embeddings [] for text in texts: embedding get_embedding(text, model) if embedding: embeddings.append(embedding) else: # 如果某个文本处理失败添加None占位 embeddings.append(None) return embeddings # 使用示例 if __name__ __main__: sentences [ 今天天气真好, 人工智能正在改变世界, 我喜欢编程和机器学习, 自然语言处理很有趣 ] all_embeddings get_batch_embeddings(sentences) for i, (sentence, embedding) in enumerate(zip(sentences, all_embeddings)): if embedding: print(f句子 {i1}: {sentence}) print(f向量长度: {len(embedding)}) print(---)3.4 添加错误处理和超时设置在实际项目中我们需要更健壮的代码来处理各种异常情况import requests import time from typing import List, Optional class OllamaEmbeddingClient: def __init__(self, base_url: str http://localhost:11434, timeout: int 30): self.base_url base_url self.timeout timeout self.embeddings_url f{base_url}/api/embeddings def get_embedding_with_retry(self, text: str, model: str all-minilm-l6-v2, max_retries: int 3) - Optional[List[float]]: 带重试机制的获取embedding方法 参数: text: 要处理的文本 model: 模型名称 max_retries: 最大重试次数 返回: embedding向量或None data { model: model, prompt: text } for attempt in range(max_retries): try: response requests.post(self.embeddings_url, jsondata, timeoutself.timeout) response.raise_for_status() result response.json() return result[embedding] except requests.exceptions.Timeout: print(f请求超时第{attempt 1}次重试...) time.sleep(2 ** attempt) # 指数退避 except requests.exceptions.RequestException as e: print(f请求失败: {e}) if attempt max_retries - 1: return None time.sleep(1) except (KeyError, json.JSONDecodeError) as e: print(f数据解析错误: {e}) return None return None # 使用示例 if __name__ __main__: client OllamaEmbeddingClient() text 重试机制测试文本 embedding client.get_embedding_with_retry(text) if embedding: print(获取embedding成功!) print(f向量维度: {len(embedding)})4. 实际应用案例4.1 文本相似度计算获取embedding后最常见的应用就是计算文本相似度。我们可以使用余弦相似度来衡量两个向量的相似程度import numpy as np from sklearn.metrics.pairwise import cosine_similarity def calculate_similarity(text1: str, text2: str, client: OllamaEmbeddingClient) - float: 计算两个文本的余弦相似度 # 获取两个文本的embedding emb1 client.get_embedding_with_retry(text1) emb2 client.get_embedding_with_retry(text2) if emb1 is None or emb2 is None: return None # 转换为numpy数组并重塑形状 emb1 np.array(emb1).reshape(1, -1) emb2 np.array(emb2).reshape(1, -1) # 计算余弦相似度 similarity cosine_similarity(emb1, emb2)[0][0] return similarity # 使用示例 if __name__ __main__: client OllamaEmbeddingClient() # 相似文本 text1 我喜欢吃苹果 text2 苹果是我最喜欢的水果 similarity calculate_similarity(text1, text2, client) print(f相似文本相似度: {similarity:.4f}) # 不相似文本 text3 今天天气很好 text4 编程需要逻辑思维 similarity2 calculate_similarity(text3, text4, client) print(f不相似文本相似度: {similarity2:.4f})4.2 简单语义搜索实现我们可以用embedding来实现一个简单的语义搜索系统class SimpleSemanticSearch: def __init__(self, client: OllamaEmbeddingClient): self.client client self.documents [] self.embeddings [] def add_document(self, text: str): 添加文档到搜索库 embedding self.client.get_embedding_with_retry(text) if embedding: self.documents.append(text) self.embeddings.append(embedding) def search(self, query: str, top_k: int 3) - List[tuple]: 语义搜索 query_embedding self.client.get_embedding_with_retry(query) if query_embedding is None: return [] query_embedding np.array(query_embedding).reshape(1, -1) doc_embeddings np.array(self.embeddings) # 计算相似度 similarities cosine_similarity(query_embedding, doc_embeddings)[0] # 获取最相似的top_k个文档 indices np.argsort(similarities)[-top_k:][::-1] results [] for idx in indices: results.append((self.documents[idx], similarities[idx])) return results # 使用示例 if __name__ __main__: client OllamaEmbeddingClient() search_engine SimpleSemanticSearch(client) # 添加一些文档 documents [ 机器学习是人工智能的重要分支, 深度学习使用神经网络处理复杂任务, 自然语言处理让计算机理解人类语言, 计算机视觉识别图像和视频内容 ] for doc in documents: search_engine.add_document(doc) # 执行搜索 query AI如何理解文字 results search_engine.search(query) print(f查询: {query}) print(搜索结果:) for i, (doc, score) in enumerate(results): print(f{i1}. 相似度: {score:.4f}) print(f 文档: {doc}) print()4.3 文本聚类示例我们还可以用embedding来做文本聚类from sklearn.cluster import KMeans def text_clustering(texts: List[str], client: OllamaEmbeddingClient, n_clusters: int 2): 对文本进行聚类分析 # 获取所有文本的embedding embeddings [] valid_texts [] for text in texts: embedding client.get_embedding_with_retry(text) if embedding: embeddings.append(embedding) valid_texts.append(text) if not embeddings: return [] # 使用KMeans聚类 kmeans KMeans(n_clustersn_clusters, random_state42) clusters kmeans.fit_predict(embeddings) # 组织聚类结果 results [] for i in range(n_clusters): cluster_texts [valid_texts[j] for j in range(len(valid_texts)) if clusters[j] i] results.append({ cluster_id: i, texts: cluster_texts, center: kmeans.cluster_centers_[i].tolist() }) return results # 使用示例 if __name__ __main__: client OllamaEmbeddingClient() texts [ 猫咪很可爱, 狗狗是人类的朋友, Python编程语言, Java开发应用, 老虎是大型猫科动物, C性能优化 ] clusters text_clustering(texts, client, n_clusters2) for cluster in clusters: print(f聚类 {cluster[cluster_id] 1}:) for text in cluster[texts]: print(f - {text}) print()5. 总结通过本文的学习你应该已经掌握了如何使用Python调用Ollama API来获取all-MiniLM-L6-v2模型的embedding向量。这个轻量级模型虽然体积小但在很多自然语言处理任务中表现相当不错。关键要点回顾all-MiniLM-L6-v2是一个高效轻量的句子嵌入模型适合资源受限环境Ollama提供了简单的方式来本地部署和运行模型通过REST API可以方便地获取文本的embedding向量embedding向量可以用于相似度计算、语义搜索、聚类分析等多种应用实践建议在处理大量文本时考虑添加适当的延迟和批处理机制生产环境中建议添加更完善的错误处理和日志记录对于性能要求高的场景可以考虑模型量化或使用更高效的推理框架记得定期检查模型更新获取更好的性能和效果获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。