nomic-embed-text-v2-moe实战教程:Streamlit替代Gradio构建嵌入服务前端

nomic-embed-text-v2-moe实战教程:Streamlit替代Gradio构建嵌入服务前端

1. 项目简介与背景

nomic-embed-text-v2-moe是一个强大的多语言文本嵌入模型,专门用于多语言检索任务。这个模型在多个关键指标上表现出色,相比同规模参数量的模型具有显著优势。

核心特点

  • 高性能表现:与约3亿参数的模型相比,在多语言性能上达到先进水平,甚至能与参数规模两倍的模型竞争
  • 多语言支持:支持约100种语言,经过超过16亿对文本的训练
  • 灵活嵌入维度:采用Matryoshka嵌入训练技术,存储成本降低3倍的同时性能损失极小
  • 完全开源:模型权重、训练代码和训练数据全部开放

技术规格对比

模型参数量(M)嵌入维度BEIR评分MIRACL评分预训练数据微调数据代码
Nomic Embed v230576852.8665.80
mE5 Base27876848.8862.30
mGTE Base30576851.1063.40
Arctic Embed v2 Base30576855.4059.90
BGE M3568102448.8069.20
Arctic Embed v2 Large568102455.6566.00
mE5 Large560102451.4066.50

2. 环境准备与部署

2.1 安装必要依赖

首先确保你的Python环境已经就绪,然后安装所需的依赖包:

pip install streamlit ollama sentence-transformers numpy pandas 

2.2 部署nomic-embed-text-v2-moe模型

使用Ollama来部署嵌入模型:

# 拉取模型 ollama pull nomic-embed-text # 运行模型服务 ollama serve 

确保模型服务正常运行,可以通过以下命令测试:

curl http://localhost:11434/api/embeddings -d '{ "model": "nomic-embed-text", "prompt": "Hello world" }' 

3. Streamlit前端开发实战

3.1 创建基础应用框架

创建一个名为embedding_app.py的文件,开始构建Streamlit应用:

import streamlit as st import requests import json import numpy as np from sentence_transformers import util # 应用配置 st.set_page_config( page_title="Nomic Embed Text v2 MOE 嵌入服务",, layout="wide" ) # 应用标题和介绍 st.title(" Nomic Embed Text v2 MOE 嵌入服务") st.markdown(""" 使用Streamlit构建的多语言文本嵌入服务前端,支持文本相似度计算和语义搜索。 """) 

3.2 实现嵌入生成功能

添加文本嵌入生成的核心功能:

def get_embedding(text, model="nomic-embed-text"): """获取文本的嵌入向量""" try: response = requests.post( "http://localhost:11434/api/embeddings", json={ "model": model, "prompt": text, "options": {"temperature": 0} } ) if response.status_code == 200: return response.json()["embedding"] else: st.error(f"获取嵌入失败: {response.text}") return None except Exception as e: st.error(f"请求错误: {str(e)}") return None def calculate_similarity(embedding1, embedding2): """计算两个嵌入向量的余弦相似度""" if embedding1 is None or embedding2 is None: return None return util.cos_sim(embedding1, embedding2).item() 

3.3 构建用户界面

创建直观的用户交互界面:

# 侧边栏配置 with st.sidebar: st.header("⚙ 配置选项") model_name = st.selectbox( "选择模型", ["nomic-embed-text", "其他模型"], index=0 ) st.markdown("---") st.info(""" **使用说明:** 1. 输入文本获取嵌入向量 2. 比较两个文本的相似度 3. 支持多语言文本处理 """) # 主界面布局 tab1, tab2, tab3 = st.tabs(["单文本嵌入", "文本相似度", "批量处理"]) with tab1: st.header("单文本嵌入生成") text_input = st.text_area( "输入文本", height=100, placeholder="请输入要嵌入的文本..." ) if st.button("生成嵌入", key="single_embed"): if text_input.strip(): with st.spinner("正在生成嵌入..."): embedding = get_embedding(text_input, model_name) if embedding: st.success("嵌入生成成功!") st.json({ "text": text_input, "embedding_length": len(embedding), "embedding_sample": embedding[:5] # 显示前5个维度 }) else: st.warning("请输入文本内容") with tab2: st.header("文本相似度计算") col1, col2 = st.columns(2) with col1: text1 = st.text_area("文本1", height=100, key="text1") with col2: text2 = st.text_area("文本2", height=100, key="text2") if st.button("计算相似度", key="calc_sim"): if text1.strip() and text2.strip(): with st.spinner("计算中..."): emb1 = get_embedding(text1, model_name) emb2 = get_embedding(text2, model_name) if emb1 and emb2: similarity = calculate_similarity(emb1, emb2) st.metric("相似度得分", f"{similarity:.4f}") # 可视化相似度 progress_value = max(0, min(1, (similarity + 1) / 2)) st.progress(progress_value, text=f"相似度: {similarity:.2%}") else: st.warning("请填写两个文本内容") 

3.4 添加高级功能

实现批量处理和结果展示功能:

with tab3: st.header("批量文本处理") batch_texts = st.text_area( "输入多个文本(每行一个)", height=200, help="每行输入一个文本,系统将批量处理" ) if st.button("批量处理", key="batch_process"): if batch_texts.strip(): texts = [t.strip() for t in batch_texts.split('\n') if t.strip()] if len(texts) > 10: st.warning("建议一次处理不超过10个文本") texts = texts[:10] embeddings = [] progress_bar = st.progress(0) for i, text in enumerate(texts): progress_bar.progress((i + 1) / len(texts), text=f"处理中 ({i+1}/{len(texts)})") embedding = get_embedding(text, model_name) if embedding: embeddings.append({ "text": text, "embedding": embedding }) if embeddings: st.success(f"成功处理 {len(embeddings)} 个文本") # 显示处理结果 for i, emb_data in enumerate(embeddings): with st.expander(f"文本 {i+1}: {emb_data['text'][:50]}..."): st.json({ "文本长度": len(emb_data['text']), "嵌入维度": len(emb_data['embedding']), "嵌入样本": emb_data['embedding'][:3] }) # 添加使用示例 with st.expander(" 使用示例"): st.markdown(""" **相似度计算示例:** - 文本1: "人工智能是未来的趋势" - 文本2: "AI技术将改变世界" - 预期相似度: 高(语义相近) **多语言示例:** - 中文: "今天天气很好" - 英文: "The weather is nice today" - 预期相似度: 高(语义相同,语言不同) """) 

4. 部署与运行

4.1 本地运行应用

保存代码后,在终端中运行:

streamlit run embedding_app.py 

应用将在本地启动,默认地址为 http://localhost:8501

4.2 生产环境部署

对于生产环境,可以考虑以下部署方式:

# 添加生产环境配置 import os from streamlit.web.cli import main if __name__ == "__main__": # 生产环境配置 os.environ["STREAMLIT_SERVER_PORT"] = "8501" os.environ["STREAMLIT_SERVER_HEADLESS"] = "true" main() 

4.3 性能优化建议

添加缓存机制提升性能:

from functools import lru_cache @lru_cache(maxsize=100) def cached_get_embedding(text, model_name): """带缓存的嵌入获取函数""" return get_embedding(text, model_name) # 在相关函数中使用缓存版本 

5. 故障排除与优化

5.1 常见问题解决

连接问题

# 添加重试机制 import time from tenacity import retry, stop_after_attempt, wait_exponential @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10)) def robust_get_embedding(text, model_name): """带重试机制的嵌入获取""" return get_embedding(text, model_name) 

性能监控

# 添加性能监控 import time def timed_get_embedding(text, model_name): start_time = time.time() result = get_embedding(text, model_name) end_time = time.time() if result: st.sidebar.metric("最后一次请求耗时", f"{(end_time - start_time):.2f}s") return result 

6. 总结与扩展建议

通过本教程,我们成功使用Streamlit构建了一个替代Gradio的嵌入服务前端。Streamlit提供了更灵活的布局控制和更丰富的UI组件,使得嵌入服务的用户体验得到显著提升。

主要优势

  • 界面更美观:Streamlit的现代化UI设计
  • 交互更灵活:多标签页、侧边栏等布局选项
  • 扩展性更强:易于添加新功能和自定义组件
  • 部署简单:一行命令即可启动服务

进一步优化方向

  1. 添加用户认证和权限管理
  2. 实现嵌入向量的可视化展示
  3. 添加历史记录和结果导出功能
  4. 集成更多的模型和算法选项
  5. 添加API接口供其他系统调用

这个Streamlit应用不仅提供了基本的嵌入生成功能,还包含了相似度计算、批量处理等实用特性,完全可以满足大多数嵌入服务的需求。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 ZEEKLOG星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Read more

Flutter for OpenHarmony: Flutter 三方库 theme_tailor 像裁剪西装一样精准定制鸿蒙多端统一的主题管理系统(UI 工程化利器)

Flutter for OpenHarmony: Flutter 三方库 theme_tailor 像裁剪西装一样精准定制鸿蒙多端统一的主题管理系统(UI 工程化利器)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 的精细化 UI 开发时,开发者面临的最大痛点之一就是 ThemeData 的膨胀与维护。 1. 鸿蒙官方的 ThemeData 属性有限,如果你想定义一个 brandColorLight 或 brandColorDark,该塞到哪? 2. 手写 ThemeExtension 的样板代码(如 copyWith 和 lerp)极其枯燥且容易出错。 3. 当需要在深色模式(Dark Mode)和浅色模式间丝滑切换时,逻辑往往支离破碎。 theme_tailor 正是为你量身打造的。它基于代码生成技术,让你只需定义一个简单的类,就能自动生成整套专业的、类型安全的主题扩展。 一、主题代码生成模型 theme_tailor 将设计稿配置自动转化为

By Ne0inhk
鸿蒙金融理财全栈项目——风险控制、合规审计、产品创新

鸿蒙金融理财全栈项目——风险控制、合规审计、产品创新

《鸿蒙APP开发从入门到精通》第18篇:鸿蒙金融理财全栈项目——风险控制、合规审计、产品创新 📊🛡️🚀 内容承接与核心价值 这是《鸿蒙APP开发从入门到精通》的第18篇——风险控制、合规审计、产品创新篇,100%承接第17篇的金融理财项目架构,并基于金融场景的风险控制、合规审计、产品创新要求,设计并实现鸿蒙金融理财全栈项目的风险控制、合规审计、产品创新功能。 学习目标: * 掌握鸿蒙金融理财项目的风险控制设计与实现; * 实现风险评估、风险监控、风险预警; * 理解合规审计在金融场景的核心设计与实现; * 实现合规检查、合规审计、合规报告; * 掌握产品创新在金融场景的设计与实现; * 实现产品创新、产品优化、产品推广; * 优化金融理财项目的用户体验(风险控制、合规审计、产品创新)。 学习重点: * 鸿蒙金融理财项目的风险控制设计原则; * 合规审计在金融场景的应用; * 产品创新在金融场景的设计要点。 一、 风险控制基础 🎯 1.1 风险控制定义 风险控制是指对金融理财项目的风险进行识别、评估、监控、

By Ne0inhk
Flutter 三方库 fast_rx 的鸿蒙化适配指南 - 实现极致性能的响应式组件状态管理、支持轻量级 Rx 变量订阅与端侧实时 UI 自动刷新实战

Flutter 三方库 fast_rx 的鸿蒙化适配指南 - 实现极致性能的响应式组件状态管理、支持轻量级 Rx 变量订阅与端侧实时 UI 自动刷新实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 fast_rx 的鸿蒙化适配指南 - 实现极致性能的响应式组件状态管理、支持轻量级 Rx 变量订阅与端侧实时 UI 自动刷新实战 前言 在进行 Flutter for OpenHarmony 开发时,选择合适的状态管理框架是决定应用架构质量的关键。如果你追求类似 GetX 的简洁响应式体验,但又希望极度轻量、不侵入路由管理,那么 fast_rx 是你的不二之选。它专为极速订阅和最小化刷新设计。本文将探讨如何在鸿蒙端利用该库构建高效的响应式生态。 一、原直观解析 / 概念介绍 1.1 基础原理 fast_rx 采用了“观察者模式”的极致语义化实现。通过包装基础类型(如 Int, String,

By Ne0inhk
狂涨 17.8K star!!再见手动运维,这个强大的任务神器青龙面板太爽了!

狂涨 17.8K star!!再见手动运维,这个强大的任务神器青龙面板太爽了!

文章目录 * **前言:** * 1、关于青龙面板 * 2、部署安装 * 3、简单使用青龙面板 * 4、介绍以及安装cpolar * 5、配置公网地址 * 5、配置固定二级子域名公网地址 * 6. 总结 前言: 各位小伙伴们,你们是不是经常遇到这样的困扰:每天定时需要跑个脚本,比如薅羊毛、自动签到、数据抓取… 每次都得守在电脑前,生怕错过最佳时机?或者凌晨惊醒,默默打开电脑执行脚本? 别再自虐了! 今天,我就要给大家推荐一个神器——青龙面板!它能帮你搞定这些重复性工作,让你彻底告别熬夜脚本,从此解放双手,躺着就能收收益! 1、关于青龙面板 青龙面板,简单来说,就是个自动化任务的管家。 它可以帮你定时执行各种脚本,比如 JavaScript、Python、Shell 等。 想象一下,你只需要设定好规则,它就能自动帮你搞定一切,是不是超级省心?

By Ne0inhk