基于 RAG 的聊天机器人的追踪、日志和指标:结合 Elastic 的 OpenTelemetry 分发

2025年2月6日   |   by mebius

作者:来自 ElasticBahubali Shetti

%title插图%num

如何使用 Elasticsearch 观察基于 OpenAI RAG 的应用程序。使用 OpenTelemetry 对应用程序进tgcode行检测,收集日志、跟踪、指标,并了解 LLM 在 Kubernetes 和 Docker 上使用 OpenTelemetry 的 Elastic 分发的表现。

正如以下文章所讨论的,Elastic 在 EDOT(Elastic Distribution of OpenTelemetry)中为基于 OpenAI 的应用程序添加了监控功能。最常使用大语言模型(large language modes – LLMs)的应用程序通常被称为聊天机器人(Chatbot)。这些聊天机器人不仅使用大语言模型,还结合了如 LangChain 等框架和搜索功能,通过 RAG(Retrieval Augmented Generation – 检索增强生成)技术在对话中改进上下文信息。Elastic 的示例 RAG 聊天机器人应用程序展示了如何使用 Elasticsearch 和包含嵌入数据的本地数据,实现搜索以便在与所选 LLM 连接的聊天机器人查询时准确提取最相关的上下文信息。这是一个使用 Elasticsearch 构建 RAG 应用程序的绝佳案例。

现在,该应用程序也通过 EDOT 实现了监控功能。你可以可视化聊天机器人对 OpenAI 的追踪信息,以及应用程序生成的相关日志和指标。按照 GitHub 仓库中使用 Docker 的说明运行该应用程序后,你可以在本地堆栈上查看这些追踪信息。那么,如何将其运行在 serverless 环境、Elastic Cloud 甚至 Kubernetes 上呢?

在这篇博客中,我们将逐步讲解如何通过 Elastic Cloud 和 Kubernetes 设置 Elastic 的 RAG 聊天机器人应用程序。

先决条件:

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

  • Elastic Cloud 帐户 — 立即注册,并熟悉 Elastic 的 OpenTelemetry 配置。使用 Serverless 时不需要版本。常规云最低 8.17
  • Git 克隆基于 RAG 的聊天机器人应用程序,并按照教程了解如何启动它并熟悉它以及如何使用 Docker 启动该应用程序。
  • 具有 API 密钥的 OpenAI 帐户
  • Kubernetes 集群运行基于 RAG 的 Chatbot 应用程序
  • 本博客中的说明也可在 github 中的 observability-examples 中找到。

Elastic 中的 OpenTelemetry 应用程序输出

Chatbot-rag-app

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

%title插图%num

%title插图%num

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

:如果你想在在自己的电脑上运行 chatbot 应用程序,请详细阅读文章 “Elasticsearch:聊天机器人教程(一)”。

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

一旦你的应用程序在 K8s 集群或 Docker 上运行,并且 Elastic Cloud 启动并运行,你应该看到以下内容:

日志:

在 Discover 中,你将看到来自 Chatbotapp 的日志,并能够分析应用程序日志和任何特定的日志模式,从而节省你的分析时间。

%title插图%num

%title插图%num

踪迹:

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

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

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

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

%title插图%num

指标:

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

%title插图%num

使用 Docker 进行所有设置

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

  • Git 克隆 chatbot-rag-app
  • 按照 github README 中所述修改 env 文件,但有以下例外:

改用你自己 Elastic 云的 OTEL_EXPORTER_OTLP_ENDPOINT 和 OTEL_EXPORTER_OTLP_HEADER 参数值。

你可以在 Elastic Cloud 的 integrations->APM 下找到这些内容

%title插图%num

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

注意标题中的 %20。这需要考虑凭证中的空格。

  • 将以下内容设置为 false – OTEL_SDK_DISABLED=false
  • 设置 LLMs 的环境

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

LLM_TYPE=openai
OPENAI_API_KEY=XXXX
CHAT_MODEL=gpt-4o-mini
  • 按照说明运行 docker 容器
docker compose up --build --force-recreate
  • 在 localhost:4000 上使用应用程序
  • 然后登录 Elastic 云并查看如前所示的输出。

在 K8s 上运行 chatbot-rag-app

为了进行此项设置,你可以按照 Observability-examples 上的以下 repo 进行操作,其中包含正在使用的 Kubernetes yaml 文件。这些也将指向 Elastic Cloud。

  • 设置 Kubernetes 集群(我们使用 EKS)
  • 使用来自 repo 的 Dockerfile 创建 docker 镜像。但是使用以下构建命令来确保它可以在任何 K8s 环境上运行。
docker buildx build --platform linux/amd64 -t chatbot-rag-app .
  • 将镜像推送到你喜欢的容器存储库
  • 获取适当的 ENV 变量:
    • 找到 Docker 中先前提到的 OTEL_EXPORTER_OTLP_ENDPOINT/HEADER 变量。
    • 获取你的 OpenAI 密钥
    • Elasticsearch URL、用户名和密码。
  • 按照以下 GitHub 仓库中的 Observability Examples 提供的说明运行两个 Kubernetes YAML 文件。

基本上,你只需将下方标注为 红色 的项目替换为你的实际值,然后运行即可。

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

Init-index-job.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: init-elasticsearch-index-test
spec:
  template:
    spec:
      containers:
      - name: init-index
        image: yourimagelocation: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: ELASTICtgcodeSEARCH_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

k8s-deployment.yaml

apiVersion: v1
kind: Secret
metadata:
  name: chatbot-regular-secrets
type: Opaque
stringData:
  ELASTICSEARCH_URL: "https://yourelasticcloud.es.us-west-2.aws.found.io"
  ELASTICSEARCH_USER: "elastic"
  ELASTICSEARCH_PASSWORD: "elastic"
  OTEL_EXPORTER_OTLP_HEADERS: "Authorization=Bearer%20xxxx"
  OTEL_EXPORTER_OTLP_ENDPOINT: "https://12345.apm.us-west-2.aws.cloud.es.io:443"
  OPENAI_API_KEY: "YYYYYYYY"

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: chatbot-regular
spec:
  replicas: 2
  selector:
    matchLabels:
      app: chatbot-regular
  template:
    metadata:
      labels:
        app: chatbot-regular
    spec:
      containers:
      - name: chatbot-regular
        image: yourimagelocation:latest
        ports:
        - containerPort: 4000
        env:
        - name: LLM_TYPE
          value: "openai"
        - name: CHAT_MODEL
          value: "gpt-4o-mini"
        - name: OTEL_RESOURCE_ATTRIBUTES
          value: "service.name=chatbot-regular,service.version=0.0.1,deployment.environment=dev"
        - name: OTEL_SDK_DISABLED
          value: "false"
        - name: OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT
          value: "true"
        - name: OTEL_EXPERIMENTAL_RESOURCE_DETECTORS
          value: "process_runtime,os,otel,telemetry_distro"
        - name: OTEL_EXPORTER_OTLP_PROTOCOL
          value: "http/protobuf"
        - name: OTEL_METRIC_EXPORT_INTERVAL
          value: "3000"
        - name: OTEL_BSP_SCHEDULE_DELAY
          value: "3000"
        envFrom:
        - secretRef:
            name: chatbot-regular-secrets
        resources:
          requests:
            memory: "512Mi"
            cpu: "250m"
          limits:
            memory: "1Gi"
            cpu: "500m"

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

使用 LoadBalancer URL 打开应用程序

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

% kubectl get services
NAME                                 TYPE           CLUSTER-IP    EXTERNAL-IP                                                               PORT(S)                                                                     AGE
chatbot-regular-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 可以让你实现这一点。此外,你通常会在 Kubernetes 上运行此应用程序。希望本博客能够提供如何实现这一目标的概要。以下是其他追踪博客:

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

LLM 可观察性 –

原文:Tracing, logs, and metrics for a RAG based Chatbot with Elastic Distributions of OpenTelemetry — Elastic Observability Labs

文章来源于互联网:基于 RAG 的聊天机器人的追踪、日志和指标:结合 Elastic 的 OpenTelemetry 分发