nomic-embed-text-v2-moe保姆级教程Gradio认证登录API密钥保护配置1. 快速了解nomic-embed-text-v2-moenomic-embed-text-v2-moe是一个强大的多语言文本嵌入模型专门用于处理多语言检索任务。这个模型有几个特别厉害的地方核心优势性能强劲虽然只有3亿参数但性能可以和参数多一倍的模型竞争多语言支持能处理大约100种语言训练数据超过16亿对文本灵活嵌入支持Matryoshka嵌入技术存储成本降低3倍性能损失很小完全开源模型权重、训练代码和数据全部开放性能对比看看它有多强模型参数量嵌入维度BEIR得分MIRACL得分开源情况Nomic Embed v2305M76852.8665.80完全开源mE5 Base278M76848.8862.30不开源mGTE Base305M76851.1063.40不开源Arctic Embed v2 Base305M76855.4059.90不开源从表格可以看出nomic-embed-text-v2-moe在保持完全开源的同时性能表现相当不错。2. 环境准备与快速部署2.1 安装Ollama首先需要安装Ollama来部署模型。根据你的操作系统选择安装方式Linux/macOScurl -fsSL https://ollama.ai/install.sh | shWindows 访问Ollama官网下载安装包双击安装即可。2.2 拉取模型安装完成后拉取nomic-embed-text-v2-moe模型ollama pull nomic-embed-text-v2-moe这个过程可能会花一些时间取决于你的网络速度。模型大小约1.2GB请确保有足够的磁盘空间。2.3 验证安装拉取完成后运行以下命令测试模型是否正常工作ollama run nomic-embed-text-v2-moe Hello world如果看到模型返回了嵌入向量说明安装成功。3. Gradio前端界面部署3.1 安装必要依赖创建一个新的Python环境然后安装所需包pip install gradio ollama requests3.2 创建基础Gradio应用创建一个名为app.py的文件添加以下代码import gradio as gr import ollama def get_embedding(text): 获取文本嵌入向量 try: response ollama.embeddings(modelnomic-embed-text-v2-moe, prompttext) return response[embedding] except Exception as e: return f错误: {str(e)} def similarity_check(text1, text2): 计算两个文本的相似度 emb1 get_embedding(text1) emb2 get_embedding(text2) if isinstance(emb1, str) or isinstance(emb2, str): return 计算失败请检查输入文本 # 计算余弦相似度 import numpy as np dot_product np.dot(emb1, emb2) norm1 np.linalg.norm(emb1) norm2 np.linalg.norm(emb2) similarity dot_product / (norm1 * norm2) return f相似度: {similarity:.4f} # 创建Gradio界面 with gr.Blocks(titleNomic Embedding 演示) as demo: gr.Markdown(# Nomic Embed Text v2 MoE 演示) with gr.Tab(文本嵌入): text_input gr.Textbox(label输入文本, lines3) embed_output gr.Textbox(label嵌入向量, lines6) embed_btn gr.Button(生成嵌入) with gr.Tab(相似度检查): with gr.Row(): text1 gr.Textbox(label文本1, lines2) text2 gr.Textbox(label文本2, lines2) similarity_output gr.Textbox(label相似度结果) similarity_btn gr.Button(计算相似度) # 绑定事件 embed_btn.click(get_embedding, inputstext_input, outputsembed_output) similarity_btn.click(similarity_check, inputs[text1, text2], outputssimilarity_output) if __name__ __main__: demo.launch(server_name0.0.0.0, server_port7860)3.3 运行应用在终端运行python app.py打开浏览器访问http://localhost:7860就能看到界面了。4. 添加认证登录功能4.1 创建用户认证系统为了保护你的应用我们需要添加登录功能。修改app.pyimport gradio as gr import ollama from typing import Dict, Optional # 简单的用户数据库实际项目中请使用真正的数据库 USER_DB { admin: {password: admin123, api_key: nk-1234567890abcdef}, user1: {password: user1123, api_key: nk-user1abcdef123456} } def authenticate(username: str, password: str) - bool: 验证用户登录 if username in USER_DB and USER_DB[username][password] password: return True return False def get_api_key(username: str) - Optional[str]: 获取用户的API密钥 return USER_DB.get(username, {}).get(api_key) def verify_api_key(api_key: str) - bool: 验证API密钥 return any(user[api_key] api_key for user in USER_DB.values()) # 创建登录界面 login_interface gr.Blocks(title登录) with login_interface: gr.Markdown(## 请先登录) username gr.Textbox(label用户名) password gr.Textbox(label密码, typepassword) login_btn gr.Button(登录) login_status gr.Textbox(label登录状态, interactiveFalse) def login_fn(user, pwd): if authenticate(user, pwd): return f登录成功欢迎 {user} else: return 登录失败用户名或密码错误 login_btn.click(login_fn, inputs[username, password], outputslogin_status) # 主应用界面需要登录后才能访问 def create_main_interface(): with gr.Blocks(title主应用) as main_app: gr.Markdown(# Nomic Embed Text v2 MoE 演示) # 这里放置之前的主应用内容 # ... return main_app # 启动应用 if __name__ __main__: # 先显示登录界面 login_interface.launch(server_name0.0.0.0, server_port7860)4.2 添加API密钥保护为了保护API接口我们需要验证请求的API密钥def protected_embedding(text: str, api_key: str): 受API密钥保护的嵌入生成 if not verify_api_key(api_key): return {error: 无效的API密钥} try: response ollama.embeddings(modelnomic-embed-text-v2-moe, prompttext) return {embedding: response[embedding], status: success} except Exception as e: return {error: str(e)} def protected_similarity(text1: str, text2: str, api_key: str): 受保护的相似度计算 if not verify_api_key(api_key): return 错误无效的API密钥 emb1_response protected_embedding(text1, api_key) emb2_response protected_embedding(text2, api_key) if error in emb1_response or error in emb2_response: return 计算失败请检查API密钥和输入文本 # 计算相似度 import numpy as np emb1 emb1_response[embedding] emb2 emb2_response[embedding] dot_product np.dot(emb1, emb2) norm1 np.linalg.norm(emb1) norm2 np.linalg.norm(emb2) similarity dot_product / (norm1 * norm2) return f相似度: {similarity:.4f}5. 完整的安全配置方案5.1 环境变量配置创建.env文件来存储敏感信息# 数据库配置 DB_HOSTlocalhost DB_PORT5432 DB_NAMEnomic_db DB_USERuser DB_PASSWORDyour_password # JWT密钥 JWT_SECRETyour_super_secret_key # API设置 API_RATE_LIMIT1005.2 完整的应用代码这是整合了所有安全功能的完整代码import gradio as gr import ollama import os from typing import Dict, Optional from datetime import datetime, timedelta import jwt from functools import wraps # 配置 JWT_SECRET os.getenv(JWT_SECRET, fallback_secret_key) API_RATE_LIMIT 100 # 用户数据库示例实际请用数据库 USER_DB { admin: { password: admin123, api_key: nk-1234567890abcdef, rate_limit: API_RATE_LIMIT } } # 请求计数实际应用中应该用Redis等 request_counters {} def authenticate(username: str, password: str) - bool: 验证用户凭证 user USER_DB.get(username) return user and user[password] password def verify_api_key(api_key: str) - bool: 验证API密钥 return any(user[api_key] api_key for user in USER_DB.values()) def check_rate_limit(api_key: str) - bool: 检查API速率限制 counter request_counters.get(api_key, 0) user_limit next((user[rate_limit] for user in USER_DB.values() if user[api_key] api_key), API_RATE_LIMIT) if counter user_limit: return False request_counters[api_key] counter 1 return True def generate_token(username: str) - str: 生成JWT令牌 payload { sub: username, exp: datetime.utcnow() timedelta(hours24) } return jwt.encode(payload, JWT_SECRET, algorithmHS256) def verify_token(token: str) - Optional[str]: 验证JWT令牌 try: payload jwt.decode(token, JWT_SECRET, algorithms[HS256]) return payload[sub] except jwt.InvalidTokenError: return None def protected_endpoint(func): 保护端点的装饰器 wraps(func) def wrapper(*args, **kwargs): api_key kwargs.get(api_key) if not api_key or not verify_api_key(api_key): return {error: 无效的API密钥} if not check_rate_limit(api_key): return {error: 超过速率限制} return func(*args, **kwargs) return wrapper protected_endpoint def get_embedding(text: str, api_key: str): 获取受保护的文本嵌入 try: response ollama.embeddings(modelnomic-embed-text-v2-moe, prompttext) return {embedding: response[embedding], status: success} except Exception as e: return {error: str(e)} # 创建Gradio界面 def create_app(): with gr.Blocks(title安全Nomic嵌入服务) as demo: gr.Markdown(# 安全Nomic嵌入服务) with gr.Tab(登录): username gr.Textbox(label用户名) password gr.Textbox(label密码, typepassword) login_btn gr.Button(登录) token_output gr.Textbox(label访问令牌) def login(user, pwd): if authenticate(user, pwd): token generate_token(user) return f登录成功令牌: {token} return 登录失败 login_btn.click(login, inputs[username, password], outputstoken_output) with gr.Tab(文本嵌入): api_key_input gr.Textbox(labelAPI密钥, typepassword) text_input gr.Textbox(label输入文本, lines3) embed_btn gr.Button(生成嵌入) embed_output gr.Textbox(label嵌入结果, lines6) embed_btn.click( lambda key, text: str(get_embedding(text, key)), inputs[api_key_input, text_input], outputsembed_output ) return demo if __name__ __main__: app create_app() app.launch( server_name0.0.0.0, server_port7860, shareFalse # 安全考虑不生成公开链接 )6. 部署与使用指南6.1 使用Web界面部署完成后打开浏览器访问你的服务找到Web界面在Ollama WebUI中找到nomic-embed-text-v2-moe服务登录系统使用设置的用户名和密码登录获取API密钥登录后可以在个人页面查看你的API密钥开始使用在文本嵌入标签页输入文本和API密钥点击生成嵌入6.2 进行相似度验证成功部署后你可以测试相似度计算功能准备两个想要比较的文本在相似度检查标签页输入这两个文本点击计算相似度按钮查看返回的相似度分数0-1之间越接近1越相似6.3 API调用示例你也可以直接通过API调用服务import requests API_URL http://localhost:7860/api/embed API_KEY 你的API密钥 def get_embedding_api(text): headers {Authorization: fBearer {API_KEY}} response requests.post(API_URL, json{text: text}, headersheaders) return response.json() # 使用示例 embedding get_embedding_api(Hello world) print(embedding)7. 总结通过本教程你已经学会了如何部署nomic-embed-text-v2-moe模型使用Ollama快速部署这个强大的多语言嵌入模型创建Gradio前端构建用户友好的Web界面来使用模型功能添加安全认证实现用户登录系统和API密钥保护配置完整安全方案包括速率限制、JWT令牌验证等安全措施这个方案不仅让模型易于使用还确保了服务的安全性。你可以根据自己的需求进一步扩展功能比如添加更多用户管理功能、更细粒度的权限控制或者集成到现有的应用中。记住定期更新API密钥监控使用情况确保服务的安全稳定运行。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。