使用 OpenTelemetry 和 Langtrace 的 Elastic 分发跟踪基于 RAG 的聊天机器人

作者:来自 Elastic Bahubali Shetti

如何使用 Elastic 观察基于 OpenAI RAG 的应用程序。使用 Langtrace 对应用程序进行检测,收集日志、跟踪、指标,并了解 LLM 在 Kubernetes 上使用 OpenTelemetry 的 Elastic Distributions 的运行情况。

目前,大多数 AI 驱动的应用都专注于提升最终用户(例如 SRE)从 AI 中获得的价值。其中,主要的应用场景是各种 聊天机器人(Chatbots) 的构建。这些聊天机器人不仅依赖 大语言模型(large language models - LLMs),还结合 LangChain 等框架以及 检索增强生成(Retrieval Augmented Generation - RAG) 方法,以在对话过程中提升上下文信息的准确性。

Elastic 提供的 基于 RAG 的示例聊天机器人应用 展示了如何使用 Elasticsearch 与本地嵌入数据 结合,使搜索能够在查询过程中从 LLM 连接的知识库中提取最相关的信息。这是利用 Elasticsearch 构建 RAG 应用的优秀示例。但如何对这些 AI 应用进行监控呢?

Elastic 支持 原生 OpenTelemetry(OTel)SDKs、开源 OTel Collector,以及 Elastic 自有的 OpenTelemetry 发行版(EDOT),用于 生成式 AI(GenAI)应用和 Kubernetes(K8s) 的日志、指标和链路追踪。此外,通常还需要特定的库来跟踪应用的不同组件。在 GenAI 应用的追踪(Tracing)方面,以下是几种可选方案:

  • OpenTelemetry OpenAI Instrumentation-v2:可追踪 LLM 请求,并记录 OpenAI Python API 库的消息日志。(注意:v2 版本由 OpenTelemetry 官方构建,而非 v2 版本来自特定供应商,并非 OpenTelemetry 官方)
  • OpenTelemetry VertexAI Instrumentation:可追踪 LLM 请求,并记录 VertexAI Python API 库的消息日志。
  • Langtrace:一款商业可用的追踪库,支持所有 LLM,并且所有追踪数据都是 OTel 原生格式
  • Elastic EDOT:Elastic 近期在 EDOT 中增加了追踪功能(详情请参阅官方博客)。

从当前趋势来看,OpenTelemetry 正成为 AI 应用可观测性的事实标准,并且仍在不断完善其对 AI 追踪的支持。

在本篇博客中,我们将演示如何使用 Langtrace 以最少的代码实现对 基于 RAG 的聊天机器人应用 进行追踪和观测。此前,我们曾在博客中介绍过 如何使用 Langtrace 追踪 LangChain

在本次实践中,我们使用了 Langtrace OpenAI、Amazon Bedrock、Cohere 等多个 LLM 追踪功能,且全部集成在一个库中。

先决条件:

为了跟进,需要满足以下几个先决条件

  • Elastic Cloud 帐户 — 立即注册,并熟悉 Elastic 的 OpenTelemetry 配置。使用 Serverless 无需版本。使用常规云至少需要 8.17
  • Git 克隆基于 RAG 的 Chatbot 应用程序,并阅读有关如何启动它并熟悉它的教程。
  • 你最喜欢的 LLM(OpenAI、AzureOpen AI 等)上的帐户,带有 API 密钥
  • 熟悉 EDOT,了解我们如何通过 OTel Collector 从应用程序引入日志、指标和跟踪
  • Kubernetes 集群 — 我将使用 Amazon EKS
  • 还请查看 Langtrace 文档。

Elastic 中的应用程序 OpenTelemetry 输出

Chatbot-rag-app

你需要启动并运行的第一个项目是 ChatBotApp,启动后你应该会看到以下内容:

当你选择一些问题时,你将根据应用程序初始化时在 Elasticsearch 中创建的索引设置响应。此外,还会对 LLM 进行查询。

Elastic 中来自 EDOT 的跟踪、日志和指标

一旦你在 K8s 集群上安装了具有 EDOT 配置的 OTel Collector,并且 Elastic Cloud 启动并运行,你就会看到以下内容:

日志 - Logs:

在 Discover 中,你将看到来自 Chatbotapp 的日志,并能够分析应用程序日志、任何特定的日志模式(节省你的分析时间)以及查看来自 K8s 的日志。

Traces - 跟踪:

在 Elastic Observability APM 中,你还可以查看聊天机器人的详细信息,其中包括交易、依赖项、日志、错误等。

查看跟踪时,你将能够在跟踪中看到聊天机器人的交互。

  • 你将看到端到端 http 调用
  • 对 elasticsearch 的单独调用
  • 特定调用(例如调用操作)和对 LLM 的调用

你还可以获取跟踪的单独详细信息,并查看相关日志和与该跟踪相关的指标,

Metrics - 指标:

除了日志和跟踪之外,任何被检测的指标也将被纳入 Elastic。

按照如下步骤设置一切

为了在 K8s 上正确设置 Chatbot-app 并将遥测数据发送到 Elastic,必须设置以下几点:

  • Git 克隆 chatbot-rag-app,并修改其中一个 python 文件。
  • 接下来创建一个可以在 Kubernetes 中使用的 docker 容器。Chatbot-app 中的 Docker 构建很好用。
  • 收集所有需要的环境变量。在此示例中,我们使用 OpenAI,但可以为任何 LLM 修改文件。因此,你必须将一些环境变量加载到集群中。在 github repo 中有一个用于 docker 的 env.example。你可以选择需要或不需要的内容,并在下面的 K8s 文件中进行适当调整。
  • 设置你的 K8s 集群,然后使用适当的 yaml 文件和凭据安装 OpenTelemetry 收集器。这也有助于收集 K8s 集群日志和指标。
  • 利用下面列出的两个 yaml 文件确保你可以在 Kubernetes 上运行它。
  • Init-index-job.yaml - 使用本地公司信息在 elasticsearch 中启动索引
  • k8s-deployment-chatbot-rag-app.yaml - 初始化应用程序前端和后端。
  • 在 K8s 中针对 chatbot-app 服务的负载均衡器 URL 上打开应用程序
  • 转到 Elasticsearch 并查看 Discover 中的日志,转到 APM 并查找你的 chatbot-app 并查看跟踪,最后进行下一步。

使用 Langtrace 修改跟踪代码

一旦你使用 curl 命令下载应用程序并解压后,转到 chatbot-rag-app 目录:

curl https://codeload.github.com/elastic/elasticsearch-labs/tar.gz/main | 
tar -xz --strip=2 elasticsearch-labs-main/example-apps/chatbot-rag-app
cd elasticsearch-labs-main/example-apps/chatbot-rag-app

接下来打开 api 目录中的 app.py 文件并添加以下内容:

from opentelemetry.instrumentation.flask import FlaskInstrumentor

from langtrace_python_sdk import langtrace

langtrace.init(batch=False)

FlaskInstrumentor().instrument_app(app)

插入到如下的代码中:

import os
import sys
from uuid import uuid4

from chat import ask_question
from flask import Flask, Response, jsonify, request
from flask_cors import CORS

from opentelemetry.instrumentation.flask import FlaskInstrumentor

from langtrace_python_sdk import langtrace

langtrace.init(batch=False)

app = Flask(__name__, static_folder="../frontend/build", static_url_path="/")
CORS(app)

FlaskInstrumentor().instrument_app(app)

@app.route("/")

请参阅以粗体显示的项目,这些项目将添加到 langtrace 库和 opentelemetry flask 工具中。此组合将提供端到端跟踪,用于 https 调用,直至对 Elasticsearch 和 OpenAI(或其他 LLM)的调用。

创建 docker 容器

按原样使用 chatbot-rag-app 目录中的 Dockerfile 并添加以下行:

RUN pip3 install --no-cache-dir langtrace-python-sdk

进入 Dockerfile:

COPY requirements.txt ./requirements.txt
RUN pip3 install -r ./requirements.txt
RUN pip3 install --no-cache-dir langtrace-python-sdk
COPY api ./api
COPY data ./data

EXPOSE 4000

这使得 langtrace-python-sdk 能够安装到 docker 容器中,以便能够正确使用 langtrace 库。

收集适当的环境变量:

首先从 Elastic 收集环境变量:

Elastic 中索引初始化的环境:


ELASTICSEARCH_URL=https://aws.us-west-2.aws.found.io
ELASTICSEARCH_USER=elastic
ELASTICSEARCH_PASSWORD=elastic

# The name of the Elasticsearch indexes
ES_INDEX=workplace-app-docs
ES_INDEX_CHAT_HISTORY=workplace-app-docs-chat-history

启动实例时,可以在 cloud.elastic.co 中找到 ELASTICSEARCH_URL。你需要在 Elastic 中设置用户和密码。

发送 OTel 仪器的环境需要以下内容:

OTEL_EXPORTER_OTLP_ENDPOINT="https://123456789.apm.us-west-2.aws.cloud.es.io:443"
OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer xxxxx"

这些凭证可以在 Elastic 的 APM 集成下和 OpenTelemetry 下找到。

LLM 的环境

在此示例中,我们使用 OpenAI,因此只需要三个变量。

LLM_TYPE=openai
OPENAI_API_KEY=XXXX
CHAT_MODEL=gpt-4o-mini

下一步,Kubernetes yamls 中都需要所有这些变量。

设置 K8s 集群并使用 EDOT 加载 OTel Collector

此步骤在以下博客中概述。这是一个简单的三步过程。

此步骤将引入所有 K8s 集群日志和指标并设置 OTel 收集器。

设置 secrets、初始化索引并启动应用程序

现在集群已启动,并且你拥有环境变量,你需要:

  • 安装并使用变量运行 k8s-deployments.yaml
  • 初始化索引

基本上运行以下命令:

kubectl create -f k8s-deployment.yaml
kubectl create -f init-index-job.yaml

以下是你应该使用的两个 yaml。也可以在此处找到

k8s-deployment.yaml

apiVersion: v1
kind: Secret
metadata:
  name: genai-chatbot-langtrace-secrets
type: Opaque
stringData:
  OTEL_EXPORTER_OTLP_HEADERS: "Authorization=Bearer%20xxxx"
  OTEL_EXPORTER_OTLP_ENDPOINT: "https://1234567.apm.us-west-2.aws.cloud.es.io:443"
 ELASTICSEARCH_URL: "YOUR_ELASTIC_SEARCH_URL"
  ELASTICSEARCH_USER: "elastic"
  ELASTICSEARCH_PASSWORD: "elastic"
  OPENAI_API_KEY: "XXXXXXX"  

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: genai-chatbot-langtrace
spec:
  replicas: 2
  selector:
    matchLabels:
      app: genai-chatbot-langtrace
  template:
    metadata:
      labels:
        app: genai-chatbot-langtrace
    spec:
      containers:
      - name: genai-chatbot-langtrace
        image:65765.amazonaws.com/genai-chatbot-langtrace2:latest
        ports:
        - containerPort: 4000
        env:
        - name: LLM_TYPE
          value: "openai"
        - name: CHAT_MODEL
          value: "gpt-4o-mini"
        - name: OTEL_SDK_DISABLED
          value: "false"
        - name: OTEL_RESOURCE_ATTRIBUTES
          value: "service.name=genai-chatbot-langtrace,service.version=0.0.1,deployment.environment=dev"
        - name: OTEL_EXPORTER_OTLP_PROTOCOL
          value: "http/protobuf"
        envFrom:
        - secretRef:
            name: genai-chatbot-langtrace-secrets
        resources:
          requests:
            memory: "512Mi"
            cpu: "250m"
          limits:
            memory: "1Gi"
            cpu: "500m"

---
apiVersion: v1
kind: Service
metadata:
  name: genai-chatbot-langtrace-service
spec:
  selector:
    app: genai-chatbot-langtrace
  ports:
  - port: 80
    targetPort: 4000
  type: LoadBalancer

Init-index-job.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: init-elasticsearch-index-test
spec:
  template:
    spec:
      containers:
      - name: init-index
#update your image location for chatbot rag app
        image: your-image-location:latest
        workingDir: /app/api
        command: ["python3", "-m", "flask", "--app", "app", "create-index"]
        env:
        - name: FLASK_APP
          value: "app"
        - name: LLM_TYPE
          value: "openai"
        - name: CHAT_MODEL
          value: "gpt-4o-mini"
        - name: ES_INDEX
          value: "workplace-app-docs"
        - name: ES_INDEX_CHAT_HISTORY
          value: "workplace-app-docs-chat-history"
        - name: ELASTICSEARCH_URL
          valueFrom:
            secretKeyRef:
              name: chatbot-regular-secrets
              key: ELASTICSEARCH_URL
        - name: ELASTICSEARCH_USER
          valueFrom:
            secretKeyRef:
              name: chatbot-regular-secrets
              key: ELASTICSEARCH_USER
        - name: ELASTICSEARCH_PASSWORD
          valueFrom:
            secretKeyRef:
              name: chatbot-regular-secrets
              key: ELASTICSEARCH_PASSWORD
        envFrom:
        - secretRef:
            name: chatbot-regular-secrets
      restartPolicy: Never
  backoffLimit: 4

使用 LoadBalancer URL 打开应用程序

运行 kubectl get services 命令并获取聊天机器人应用程序的 URL:

% kubectl get services
NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP                                                               PORT(S)                                                                     AGE
chatbot-langtrace-service            LoadBalancer   10.100.130.44    xxxxxxxxx-1515488226.us-west-2.elb.amazonaws.com   80:30748/TCP                                                                6d23h

使用应用程序并在 Elastic 中查看遥测数据。

访问 URL 后,你应该会看到我们在本博客开头描述的所有屏幕。

结论

使用 Elastic 的 Chatbot-rag-app,你可以了解如何构建基于 OpenAI 驱动的 RAG 聊天应用程序。但是,你仍然需要了解它的性能如何、是否正常工作等。使用 OTel、Elastic 的 EDOT 和 Langtrace 可以让你实现这一点。此外,你通常会在 Kubernetes 上运行此应用程序。希望本博客提供如何实现这一点的概述。

以下是其他跟踪博客:

使用 LLM(跟踪)实现应用程序可观察性 -

  • 使用 Langtrace 和 OpenTelemetry 观察 LangChain
  • 使用 OpenLit Tracing 观察 LangChain
  • 使用 OpenTelemetry 检测 LangChain

LLM 可观察性 -

  • 使用 GCP Vertex AI 集成提升 LLM 可观察性
  • AWS Bedrock 上的 LLM 可观察性
  • Azure OpenAI 的 LLM 可观察性
  • Azure OpenAI v2 的 LLM 可观察性

原文:Tracing a RAG based Chatbot with Elastic Distributions of OpenTelemetry and Langtrace — Elastic Observability Labs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/973077.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

掌握.NET Core后端发布流程,如何部署后端应用?

无论你是刚接触.NET Core的新手还是已有经验的开发者,在这篇文章中你将会学习到一系列实用的发布技巧与最佳实践,帮助你高效顺利地将.NET Core后端应用部署到生产环境中 目录 程序发布操作 Docker容器注册表 文件夹发布 导入配置文件 网站运行操作 …

VSCode配置C/C++开发环境|最新教程202502

📢 ‌Windows版VSCode配置C/C开发环境(单文件多文件全解析)‌ 一、 ‌环境准备‌ ✅‌必需工具‌:Visual Studio Code 2025‌ ✅扩展插件‌:C/C(Microsoft官方扩展)📢 这个必须安…

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025)

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025) 本文内容需要你有一定的 Linux 操作基础,最好是程序员那种,英文水平足够用才行。一般人不需要使用这么复杂的路由器操作系统&#xff0c…

2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集,MATLAB

一、改进型雪雁算法 雪雁算法(Snow Geese Algorithm,SGA)是2024年提出的一种新型元启发式算法,其灵感来源于雪雁的迁徙行为,特别是它们在迁徙过程中形成的独特“人字形”和“直线”飞行模式。该算法通过模拟雪雁的飞行…

【从0做项目】Java文档搜索引擎(9)烧脑终章!

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 文章导读 阿华将发布项目复盘系列的文章,旨在: 1:手把手细致带大家从0到…

cs106x-lecture12(Autumn 2017)-SPL实现

打卡cs106x(Autumn 2017)-lecture12 (以下皆使用SPL实现,非STL库,后续课程结束会使用STL实现) travel Write a recursive function named travel that accepts integers x and y as parameters and uses recursive backtracking to print all solution…

vue取消全选功能按钮注意事项

这里这个功能是通过各种条件查出数据,但只取一条数据进行后续业务,虽然每一条数据前面都有多选框,但只需要选一个,所以在业务上分析可以把这个全选按钮取消掉 这里不是简单的把多选组件的selection-change"handleSelectionChange"和handleSelectionChange方法去掉,因…

三维扫描仪:如何快速获取产品外部结构尺寸?

在精密制造与质量控制领域,传统测量方法因接触式检测效率低、数据维度单一等问题,正面临数字化升级的迫切需求。 传统测量方法的局限性: 传统的测量工具,如卡尺、千分尺和三坐标测量仪,虽然在精度上有一定的保证&…

无人机避障——感知篇(采用Livox-Mid360激光雷达获取点云数据显示)

电脑配置:Xavier-nx、ubuntu 18.04、ros melodic 激光雷达:Livox_Mid-360 1、安装激光雷达驱动 下载安装Livox-SDK2 如果git clone不了,在github上下载相应的zip进行手动安装,安装网址如下: https://github.com/L…

ubuntu22.04使用minikube安装k8s

ubuntu使用minikube安装k8s 准备工作安装步骤安装docker安装kubectl安装minikube导入相关镜像安装相关指令启动minikube服务 安装dashboard组件导入相关镜像创建服务账号安装组件本体验证安装结果 准备工作 下载离线安装包,安装包内容如下: 软件说明ki…

西门子1200下载、上传程序。

下载 第一种 直接点击图标下载,此种方式PLC会停机。 第二种 这三种的区别: 上传 创建新的项目。

基于Openlayers对GeoServer发布的数据进行增删改

使用GeoServer进行图斑数据管理 本文将介绍如何使用GeoServer进行图斑数据的新增、删除和修改。我们将通过一个Vue.js应用来演示这些功能。 设置Vue.js应用 首先,我们设置Vue.js应用,并添加必要的组件和交互逻辑。 Check.vue Check.vue文件包含初始…

自动化之ansible(二)

一、ansible中playbook(剧本) 官方文档: Ansible playbooks — Ansible Community Documentation 1、playbook的基本结构 一个基本的playbook由以下几个主要部分组成 hosts: 定义要执行任务的主机组或主机。 become: 是否需要使用超级用户…

函数执行中的栈和寄存器调用

函数执行中的栈和寄存器调用 函数执行过程中主要用到的寄存器有程序计数器和栈指针。 程序计数器(IP):指向下一条执行指令的地址,其值用%rip来表示 栈指针:指向栈顶地址,其值用%rsp来表示 当过程P调用过…

纯新手教程:用llama.cpp本地部署DeepSeek蒸馏模型

0. 前言 llama.cpp是一个基于纯C/C实现的高性能大语言模型推理引擎,专为优化本地及云端部署而设计。其核心目标在于通过底层硬件加速和量化技术,实现在多样化硬件平台上的高效推理,同时保持低资源占用与易用性。 最近DeepSeek太火了&#x…

建筑兔零基础自学python记录22|实战人脸识别项目——视频人脸识别(下)11

这次我们继续解读代码,我们主要来看下面两个部分; 至于人脸识别成功的要点我们在最后总结~ 具体代码学习: #定义人脸名称 def name():#预学习照片存放位置path M:/python/workspace/PythonProject/face/imagePaths[os.path.join(path,f) f…

【Java消息队列】应对消息丢失、重复、顺序与积压的全面策略

应对消息丢失、重复、顺序与积压的全面策略 引言kafka消息丢失生产者消费者重复消费顺序消费消息积压生产者消费者其他RabbitMQ消息丢失生产者事务机制,保证生产者发送消息到 RabbitMQ Server发送方确认机制,保证消息能从交换机路由到指定队列保证消息在 RabbitMQ Server 中的…

PHP会务会议系统小程序源码

📅 会务会议系统 一款基于ThinkPHPUniapp框架,精心雕琢的会议管理微信小程序,专为各类高端会议场景量身打造。它犹如一把开启智慧殿堂的金钥匙,为会议流程优化、开支精细化管理、数量精准控制、标准严格设定以及供应商严格筛选等…

Unity通过Vosk实现离线语音识别方法

标注:deepseek直接生成,待验证 在Unity中实现离线语音识别可以通过集成第三方语音识别库来实现。以下是一个使用 Unity 和 Vosk(一个开源的离线语音识别库)的简单示例。 准备工作 Vosk:一个开源的离线语音识别库&am…

架构学习第七周--Prometheus

目录 一、监控系统基础 二、Prometheus介绍 三、Prometheus单机部署 四、服务发现与告警功能 4.1,服务发现 4.2,告警功能实现 五、Prometheus与Kubernetes 5.1,Kubernetes指标 5.2,Prometheus集群部署 一、监控系统基础…