温州市城乡建设厅网站html博客转wordpress
温州市城乡建设厅网站,html博客转wordpress,阳光保险网站,阳江58同城招聘网最新招聘nomic-embed-text-v2-moe保姆级教程#xff1a;Gradio日志收集Prometheus监控集成
1. 开篇#xff1a;为什么你需要一个带监控的嵌入模型服务#xff1f;
想象一下这个场景#xff1a;你搭建了一个智能问答系统#xff0c;用户输入问题#xff0c;系统从海量文档里找到…nomic-embed-text-v2-moe保姆级教程Gradio日志收集Prometheus监控集成1. 开篇为什么你需要一个带监控的嵌入模型服务想象一下这个场景你搭建了一个智能问答系统用户输入问题系统从海量文档里找到最相关的答案。核心就是那个把文字变成一串数字向量的嵌入模型。模型跑得好一切顺利模型要是卡了、慢了或者出错了你可能要等到用户投诉才发现。这就是为什么今天我们要聊的不仅仅是部署一个强大的嵌入模型还要给它装上“眼睛”和“耳朵”——也就是日志收集和性能监控。我们将使用nomic-embed-text-v2-moe这个在多语言检索上表现突出的开源模型通过 Ollama 来部署用 Gradio 做个简单好用的前端界面最后再用 Prometheus 把它的运行状态看得一清二楚。读完这篇教程你将得到一个稳定运行的文本嵌入服务。清晰可见的请求日志和错误记录。实时监控的CPU、内存、响应延迟等关键指标。一套完整的、可复现的部署方案。无论你是想快速验证模型效果还是为正式服务搭建基础监控这篇教程都能带你一步步实现。2. 认识主角nomic-embed-text-v2-moe在开始动手之前我们先花几分钟了解一下我们将要使用的工具。知道它的能耐和特点后面用起来会更得心应手。2.1 模型简介与核心优势nomic-embed-text-v2-moe是一个完全开源的多语言文本嵌入模型。你可以把它理解为一个非常专业的“翻译官”但它不是翻译语言而是把任何语言的句子都“翻译”成计算机能更好理解的数学向量。这些向量包含了句子的语义信息相似含义的句子其向量在空间里的距离也更近。它有几个让人眼前一亮的优点多语言能力强它支持大约100种语言。这意味着你用中文、英文、法文、日文等各种语言提问它都能很好地理解并生成高质量的向量非常适合构建国际化的应用。性能与效率兼顾它采用了一种叫MoEMixture of Experts专家混合的架构。简单说它不是用一个“大脑”处理所有问题而是内置了多个“专家”。每次处理输入时只激活最相关的少数几个“专家”来工作。这样做的好处是在保持高精度的同时计算量更小速度更快。灵活的嵌入维度它经过Matryoshka 嵌入训练。这个名字来源于俄罗斯套娃。意思是模型可以生成一个很长的向量比如768维但你实际存储和使用时可以只取前面一部分比如256维。这能大幅降低存储和计算成本而对检索效果的影响却很小。完全开源透明模型权重、训练代码和使用的数据全部公开这对于需要审计、定制或完全掌控技术栈的项目来说至关重要。2.2 技术指标一览光说优点可能有点虚我们看看它和其他同类型模型在权威基准测试上的表现对比模型参数量 (百万)嵌入维度BEIR 得分MIRACL 得分开源情况Nomic Embed v2 (本教程模型)30576852.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未完全开源简单解读一下BEIR和MIRACL都是评估嵌入模型检索能力的重要基准分数越高越好。我们的模型在参数量适中305M的情况下在MIRACL多语言检索上取得了非常有竞争力的分数印证了其多语言优势。最关键的一栏是“开源情况”。nomic-embed-text-v2-moe是表中为数不多提供完整开源模型、代码、数据的选项这为我们自主部署和集成监控扫清了障碍。3. 基础环境搭建与模型部署好了理论部分结束我们开始动手。第一步是把模型跑起来。3.1 使用 Ollama 部署模型Ollama 是一个强大的工具能让你像安装软件一样简单地拉取和运行各种大语言模型和嵌入模型。我们用它来部署nomic-embed-text-v2-moe。安装 Ollama 访问 Ollama 官网根据你的操作系统Windows/macOS/Linux下载并安装。安装过程通常很简单一路点击“下一步”即可。拉取模型 打开你的终端命令行输入以下命令。Ollama 会自动从官方仓库下载模型文件。ollama pull nomic-embed-text注意在Ollama的库中这个模型的名字是nomic-embed-text它对应的就是v2-moe版本。下载时间取决于你的网络速度模型大约1.2GB。运行模型服务 模型拉取成功后运行以下命令启动一个本地的模型服务。这个服务会在后台运行通过API接收请求并返回嵌入向量。ollama run nomic-embed-text默认情况下服务会运行在http://localhost:11434。你可以通过访问http://localhost:11434/api/tags来验证服务是否启动成功它应该会返回已加载的模型列表。3.2 验证模型基础功能服务跑起来后我们先快速验证一下它的核心功能——生成嵌入向量。我们可以直接用curl命令来测试。打开另一个终端窗口输入以下命令curl http://localhost:11434/api/embeddings \ -H Content-Type: application/json \ -d { model: nomic-embed-text, prompt: The weather is nice today. }如果一切正常你会收到一个JSON格式的响应里面包含一个长长的浮点数数组这就是句子 “The weather is nice today.” 的向量表示。{ embedding: [0.012345, -0.023456, 0.034567, ...] // 很长的一个数组长度是768 }看到这个就说明你的nomic-embed-text-v2-moe模型已经成功部署并可以正常工作了4. 构建 Gradio 前端与集成日志收集虽然用命令行测试成功了但我们总不能一直靠curl来用。我们需要一个更友好、更实用的界面并且要开始记录它的运行日志。4.1 创建 Gradio 交互界面Gradio 是一个能快速为机器学习模型构建Web界面的Python库。我们用它来做一个简单的界面输入文本点击按钮就能看到生成的向量。安装必要库 创建一个新的Python虚拟环境是个好习惯。然后安装 Gradio 和 requests 库。pip install gradio requests编写前端应用代码 创建一个名为app_with_logging.py的文件写入以下代码import gradio as gr import requests import json import logging from datetime import datetime import sys # 1. 配置日志 # 创建一个格式器定义日志的格式时间 - 日志级别 - 消息 log_format %(asctime)s - %(levelname)s - %(message)s logging.basicConfig( levellogging.INFO, # 设置日志级别为INFO记录所有INFO及以上级别的日志 formatlog_format, handlers[ logging.FileHandler(embedding_service.log), # 将日志写入文件 logging.StreamHandler(sys.stdout) # 同时在控制台打印日志 ] ) logger logging.getLogger(__name__) # Ollama 服务的地址 OLLAMA_URL http://localhost:11434/api/embeddings def get_embedding(text): 调用 Ollama 服务获取文本的嵌入向量。 并记录详细的请求日志。 if not text or text.strip() : logger.warning(收到空文本输入返回None。) return None payload { model: nomic-embed-text, prompt: text } headers { Content-Type: application/json } logger.info(f开始处理请求文本: {text[:50]}...) # 记录请求开始只截取前50字符 try: # 记录请求发送 logger.debug(f发送请求至 {OLLAMA_URL}, 载荷: {json.dumps(payload)}) response requests.post(OLLAMA_URL, jsonpayload, headersheaders, timeout30) response.raise_for_status() # 如果HTTP状态码不是200会抛出异常 # 解析响应 result response.json() embedding result.get(embedding) if embedding: # 记录成功信息包括向量长度和示例值 vector_preview str(embedding[:5]) ... if len(embedding) 5 else str(embedding) logger.info(f请求成功文本长度: {len(text)} 生成向量维度: {len(embedding)} 向量预览: {vector_preview}) return embedding else: logger.error(f响应中未找到 embedding 字段。完整响应: {result}) return None except requests.exceptions.Timeout: logger.error(f请求超时30秒文本: {text[:30]}...) return None except requests.exceptions.ConnectionError: logger.error(f无法连接到Ollama服务请检查服务是否运行在 {OLLAMA_URL}) return None except requests.exceptions.HTTPError as e: logger.error(fHTTP请求错误状态码: {response.status_code}, 响应: {response.text}) return None except Exception as e: logger.error(f处理请求时发生未知错误: {str(e)}, exc_infoTrue) # exc_infoTrue会记录完整的错误堆栈 return None # 2. 创建 Gradio 界面 def gradio_interface(text): Gradio 界面函数返回格式化后的向量结果。 embedding get_embedding(text) if embedding is None: return ❌ 未能成功生成嵌入向量请查看日志文件 embedding_service.log 获取详情。 # 将向量列表格式化为更易读的字符串 preview f向量维度: {len(embedding)}\n前5个值: {embedding[:5]}\n... return preview # 界面描述 description # nomic-embed-text-v2-moe 嵌入向量生成器 在下方输入文本点击提交即可获取该文本的语义嵌入向量。 **所有请求和结果都将被记录到 embedding_service.log 文件中。** # 构建界面 iface gr.Interface( fngradio_interface, inputsgr.Textbox(label输入文本, placeholder请输入任何语言的文本..., lines3), outputsgr.Textbox(label嵌入向量结果, lines10), titleNomic Embed Text V2 MoE 演示, descriptiondescription, examples[ [今天天气真好。], [The weather is nice today.], [Bonjour, comment allez-vous?], [这是一个测试多语言嵌入模型的例子。] ] ) # 3. 启动应用 if __name__ __main__: logger.info(Gradio 应用启动...) print(服务已启动日志将同时输出到控制台和文件 embedding_service.log) iface.launch(server_name0.0.0.0, server_port7860) # 设置为0.0.0.0允许局域网访问这段代码做了三件关键事配置日志我们使用Python内置的logging模块。日志会同时输出到控制台和一个名为embedding_service.log的文件中。格式包含了时间戳、日志级别和信息。封装模型调用get_embedding函数负责调用 Ollama 的API并在这个过程的每一步开始、成功、出错都记录相应的日志。创建Web界面Gradio 提供了一个简单的输入框和输出框用户输入文本点击提交结果向量预览就会显示出来。4.2 运行并测试带日志的应用启动应用 在终端中运行你的脚本。python app_with_logging.py你会看到输出提示服务运行在http://localhost:7860。访问界面 打开浏览器访问http://localhost:7860。你会看到一个简洁的Web界面。测试功能在输入框里写一段话比如“人工智能正在改变世界”。点击“提交”按钮。稍等片刻下方会显示生成的向量维度应该是768和前几个数值。同时查看你的终端或者当前目录下的embedding_service.log文件你会发现多了一条记录类似这样2024-05-27 10:30:15,123 - INFO - 开始处理请求文本: 人工智能正在改变世界... 2024-05-27 10:30:15,456 - INFO - 请求成功文本长度: 11 生成向量维度: 768 向量预览: [0.012, -0.005, 0.034, 0.128, -0.072]...测试错误情况尝试不输入任何文本就提交。或者先停止 Ollama 服务 (CtrlC在运行 Ollama 的终端里)然后再提交文本。观察日志文件你会看到对应的WARNING或ERROR级别的日志被记录下来。至此你已经拥有了一个带基础日志记录功能的嵌入模型Web服务。日志能帮你回溯问题但它主要记录的是“发生了什么”。要实时了解服务的“健康状态”比如它忙不忙、响应快不快我们需要更强大的工具——这就是 Prometheus。5. 集成 Prometheus 与 Grafana 实现深度监控Prometheus 是一个流行的监控和告警工具包它专门收集和存储时间序列数据比如每秒请求数、平均响应时间。Grafana 则是一个强大的数据可视化平台能从 Prometheus 读取数据并绘制成漂亮的图表。我们的目标是将 Gradio 应用变成一个能被 Prometheus “抓取”的数据源。5.1 改造应用暴露 Prometheus 指标我们需要在之前的 Gradio 应用里添加一个专门的端点/metrics用来输出 Prometheus 格式的监控数据。安装监控库 我们需要prometheus-client这个库来方便地创建和暴露指标。pip install prometheus-client升级应用代码 创建一个新文件app_with_monitoring.py将以下代码替换进去。这段代码在之前的基础上集成了 Prometheus 指标。import gradio as gr import requests import json import logging from datetime import datetime import sys from prometheus_client import Counter, Histogram, Gauge, generate_latest, REGISTRY, start_http_server import threading import time # 1. 配置日志 (保持不变) log_format %(asctime)s - %(levelname)s - %(message)s logging.basicConfig( levellogging.INFO, formatlog_format, handlers[ logging.FileHandler(embedding_service.log), logging.StreamHandler(sys.stdout) ] ) logger logging.getLogger(__name__) OLLAMA_URL http://localhost:11434/api/embeddings # 2. 定义 Prometheus 指标 # 计数器总请求数、成功数、失败数 REQUEST_COUNT Counter(embedding_requests_total, Total number of embedding requests) REQUEST_SUCCESS_COUNT Counter(embedding_requests_success_total, Total number of successful embedding requests) REQUEST_FAILURE_COUNT Counter(embedding_requests_failure_total, Total number of failed embedding requests, [error_type]) # 直方图记录请求耗时分布单位秒 REQUEST_DURATION Histogram(embedding_request_duration_seconds, Time spent processing embedding request) # 仪表盘当前正在处理的请求数 REQUESTS_IN_PROGRESS Gauge(embedding_requests_in_progress, Number of embedding requests currently in progress) # 3. 改造模型调用函数加入指标收集 def get_embedding_with_metrics(text): 增强版的嵌入向量获取函数集成监控指标。 if not text or text.strip() : logger.warning(收到空文本输入。) REQUEST_COUNT.inc() REQUEST_FAILURE_COUNT.labels(error_typeempty_input).inc() return None # 增加“进行中”计数 REQUESTS_IN_PROGRESS.inc() start_time time.time() # 记录开始时间 payload {model: nomic-embed-text, prompt: text} headers {Content-Type: application/json} logger.info(f开始处理请求文本: {text[:50]}...) REQUEST_COUNT.inc() # 总请求数1 try: response requests.post(OLLAMA_URL, jsonpayload, headersheaders, timeout30) response.raise_for_status() result response.json() embedding result.get(embedding) if embedding: # 记录成功 REQUEST_SUCCESS_COUNT.inc() vector_preview str(embedding[:5]) ... if len(embedding) 5 else str(embedding) logger.info(f请求成功向量维度: {len(embedding)} 预览: {vector_preview}) return embedding else: logger.error(f响应中未找到 embedding 字段。) REQUEST_FAILURE_COUNT.labels(error_typeno_embedding_in_response).inc() return None except requests.exceptions.Timeout: error_msg 请求超时 logger.error(f{error_msg}文本: {text[:30]}...) REQUEST_FAILURE_COUNT.labels(error_typetimeout).inc() return None except requests.exceptions.ConnectionError: error_msg 连接Ollama服务失败 logger.error(f{error_msg}) REQUEST_FAILURE_COUNT.labels(error_typeconnection_error).inc() return None except requests.exceptions.HTTPError as e: error_msg fHTTP错误: {response.status_code} logger.error(f{error_msg}) REQUEST_FAILURE_COUNT.labels(error_typefhttp_{response.status_code}).inc() return None except Exception as e: error_msg f未知错误: {str(e)} logger.error(error_msg, exc_infoTrue) REQUEST_FAILURE_COUNT.labels(error_typeunknown).inc() return None finally: # 无论成功失败最后都要减少“进行中”计数并记录耗时 REQUESTS_IN_PROGRESS.dec() duration time.time() - start_time REQUEST_DURATION.observe(duration) # 将本次请求耗时记录到直方图 logger.debug(f请求处理完成耗时: {duration:.3f} 秒) # 4. 创建供 Prometheus 抓取的 /metrics 端点 # 由于 Gradio 默认不直接支持添加自定义路由我们需要一点技巧。 # 方法在另一个端口启动一个独立的 Prometheus metrics 服务器。 def start_metrics_server(port8000): 在一个独立的线程中启动 Prometheus metrics HTTP 服务器。 start_http_server(port) logger.info(fPrometheus metrics 服务器已启动在端口 {port}) # 这个函数会一直运行直到主进程结束 while True: time.sleep(1) # 5. Gradio 界面函数 (保持不变) def gradio_interface(text): embedding get_embedding_with_metrics(text) # 注意这里调用的是带监控的新函数 if embedding is None: return ❌ 未能成功生成嵌入向量请查看日志文件获取详情。 preview f向量维度: {len(embedding)}\n前5个值: {embedding[:5]}\n... return preview description # nomic-embed-text-v2-moe 嵌入向量生成器 (带监控版) 在下方输入文本点击提交获取文本的语义嵌入向量。 **监控指标可通过 http://localhost:8000/metrics 查看。** iface gr.Interface( fngradio_interface, inputsgr.Textbox(label输入文本, placeholder请输入任何语言的文本..., lines3), outputsgr.Textbox(label嵌入向量结果, lines10), titleNomic Embed Text V2 MoE 演示 (带监控), descriptiondescription, examples[ [今天天气真好。], [The weather is nice today.], [Bonjour, comment allez-vous?], [这是一个测试多语言嵌入模型的例子。] ] ) # 6. 启动应用 if __name__ __main__: logger.info(启动带监控的 Gradio 应用...) # 在一个守护线程中启动 Prometheus metrics 服务器 metrics_thread threading.Thread(targetstart_metrics_server, args(8000,), daemonTrue) metrics_thread.start() time.sleep(1) # 稍等确保 metrics 服务器启动 print(*50) print(Gradio 前端界面: http://localhost:7860) print(Prometheus 指标端点: http://localhost:8000/metrics) print(*50) print(应用日志和监控数据已启用。) # 启动 Gradio 主界面 iface.launch(server_name0.0.0.0, server_port7860, shareFalse)关键改动解释定义指标我们创建了四种类型的指标。Counter计数器只增不减用来统计总请求数、成功/失败次数。Histogram直方图记录请求耗时的分布情况比如“95%的请求在0.5秒内完成”。Gauge仪表盘可增可减用来表示当前正在处理的请求数。埋点在get_embedding_with_metrics函数的各个关键节点开始、成功、各种失败、结束调用对应的.inc(),.observe(),.dec()方法来更新指标。暴露端点我们使用start_http_server(8000)在另一个端口8000启动了一个极简的HTTP服务器专门用于响应 Prometheus 的抓取请求。访问http://localhost:8000/metrics你会看到一堆# HELP和# TYPE开头的注释以及以embedding_开头的指标数据行。5.2 配置与运行监控栈现在我们的应用已经能提供数据了。接下来部署 Prometheus 来抓取这些数据并用 Grafana 展示出来。下载 Prometheus 从 Prometheus 官网下载对应你操作系统的压缩包解压即可。配置 Prometheus 进入解压后的目录找到prometheus.yml配置文件。在scrape_configs部分添加一个新的抓取任务指向我们应用的 metrics 端点。# prometheus.yml global: scrape_interval: 15s # 每15秒抓取一次数据 scrape_configs: - job_name: prometheus # 监控 Prometheus 自己 static_configs: - targets: [localhost:9090] - job_name: nomic-embedding-service # 我们新增的任务 static_configs: - targets: [localhost:8000] # 指向我们应用暴露的端口 metrics_path: /metrics # 默认就是/metrics可省略启动 Prometheus 在终端中进入 Prometheus 目录运行./prometheus --config.fileprometheus.yml访问http://localhost:9090可以看到 Prometheus 的Web界面。在 “Status” - “Targets” 页面应该能看到nomic-embedding-service的状态是UP。下载并启动 Grafana 从 Grafana 官网下载并安装。启动后访问http://localhost:3000默认用户名和密码都是admin。在 Grafana 中添加数据源登录后点击左边栏的 “Connections” - “Data sources”。点击 “Add data source”选择 “Prometheus”。在 URL 栏填写http://localhost:9090Prometheus的地址。点击 “Save test”应该显示 “Data source is working”。创建仪表盘Dashboard点击左边栏的 “Dashboards” - “New” - “New Dashboard”。点击 “Add visualization”。在数据源选择你刚添加的 Prometheus。现在你可以使用我们定义的指标来创建图表了例如请求速率图在查询框输入rate(embedding_requests_total[5m])可以查看最近5分钟的平均每秒请求数。请求耗时分布输入histogram_quantile(0.95, rate(embedding_request_duration_seconds_bucket[5m]))可以查看95%的请求耗时在多少秒以内。当前进行中请求输入embedding_requests_in_progress。错误率输入rate(embedding_requests_failure_total[5m]) / rate(embedding_requests_total[5m])。为每个查询设置好标题和合适的图表类型如图表、统计面板等然后保存你的仪表盘。现在你的nomic-embed-text-v2-moe服务就拥有了一个完整的监控系统。你可以实时看到它的负载情况、性能表现和错误状态这对于服务维护和问题排查来说价值巨大。6. 总结与展望回顾一下我们在这篇教程中完成的工作部署核心模型使用 Ollama 轻松拉取并运行了强大的多语言嵌入模型nomic-embed-text-v2-moe。构建应用界面利用 Gradio 快速搭建了一个直观的 Web 前端让模型调用变得简单。实现日志记录为应用集成了结构化的日志系统所有操作和错误都有迹可循便于事后分析和调试。集成深度监控通过 Prometheus Client 暴露关键性能指标并搭建了 Prometheus Grafana 监控栈实现了对服务健康状况的实时可视化监控。这套组合拳的意义在于它将一个“黑盒”模型变成了一个可观测、可管理、可运维的标准化服务。你不仅能用它还能知道它用得好不好、忙不忙、有没有生病。可能的下一步告警设置在 Grafana 或 Prometheus Alertmanager 中设置规则当请求错误率飙升或响应时间过长时自动发送邮件或钉钉消息告警。容器化部署将整个应用Python脚本、Ollama服务打包成 Docker 镜像实现一键部署和环境隔离。性能优化根据监控数据分析性能瓶颈。例如如果发现耗时主要在模型推理可以考虑启用 Ollama 的 GPU 支持如果有的话。扩展为微服务将 Gradio 前端、模型API、监控端点进一步拆分为独立的微服务提高系统的可扩展性和可维护性。希望这篇教程能帮助你不仅学会使用一个优秀的嵌入模型更能掌握构建一个健壮、可观测的AI服务的基本方法。从模型到产品监控是其中不可或缺的一环。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。