前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >基于 RAG 的聊天机器人在 Elastic OpenTelemetry 中的追踪、日志和指标

基于 RAG 的聊天机器人在 Elastic OpenTelemetry 中的追踪、日志和指标

原创
作者头像
点火三周
发布2025-02-15 08:50:31
发布2025-02-15 08:50:31
3310
代码可运行
举报
运行总次数:0
代码可运行
Tracing, logs, and metrics for a RAG based Chatbot with Elastic Distributions of OpenTelemetry
Tracing, logs, and metrics for a RAG based Chatbot with Elastic Distributions of OpenTelemetry

在接下来的文章中,我们将讨论 Elastic 为基于 OpenAI 的应用添加了 EDOT 的监控。最常见使用大型语言模型(LLM)的应用是聊天机器人。这些聊天机器人不仅使用 LLM,还使用诸如 LangChain 和搜索等框架,以在对话过程中改进上下文信息,即 RAG(检索增强生成)。Elastic 的示例 基于 RAG 的聊天机器人应用 展示了如何使用 Elasticsearch 结合包含嵌入的数据,使搜索能够在与 LLM 连接的聊天机器人查询时正确提取最相关的信息。这是一个如何使用 Elasticsearch 构建基于 RAG 应用的绝佳示例。

现在这个应用也使用了 EDOT 进行监控,您可以可视化聊天机器人对 OpenAI 的追踪,以及来自应用的相关日志和指标。按照 GitHub 仓库中的 Docker 说明运行应用,您可以在本地堆栈中看到这些追踪。那么,如何在无服务器、Elastic 云甚至 Kubernetes 上运行它呢?

在这篇博客中,我们将介绍如何使用 Elastic 云和 Kubernetes 设置 Elastic 的基于 RAG 的聊天机器人应用。

前提条件

为了跟上进度,您需要以下前提条件:

  • 一个 Elastic 云账户 — 现在注册,并熟悉 Elastic 的 OpenTelemetry 配置。无服务器版本无需指定版本,常规云版本至少需要 8.17。
  • 克隆 基于 RAG 的聊天机器人应用 并阅读 教程,了解如何使用 Docker 启动应用。
  • 一个 OpenAI 账户和 API 密钥
  • 运行基于 RAG 的聊天机器人应用的 Kubernetes 集群
  • 本博客中的说明也可以在 observability-examples GitHub 仓库中找到。

应用在 Elastic 中的 OpenTelemetry 输出

Chatbot-rag-app

首先,您需要启动 ChatBotApp,启动后您应看到以下内容:

Chatbot app main page
Chatbot app main page
Chatbot app working
Chatbot app working

在选择一些问题后,您会看到基于应用初始化时在 Elasticsearch 中创建的索引生成的响应。此外,还会有对 LLM 的查询。

来自 EDOT 的追踪、日志和指标在 Elastic 中的表现

当您在 Kubernetes 集群或 Docker 上运行应用,并且 Elastic 云也在运行时,您应该看到以下内容:

日志

在 Discover 中,您会看到 Chatbotapp 的日志,并能够分析应用日志和特定的日志模式,从而节省分析时间。

Chatbot-logs
Chatbot-logs
Chatbot-log-patterns
Chatbot-log-patterns

追踪

在 Elastic Observability APM 中,您还可以看到聊天机器人的详细信息,包括事务、依赖关系、日志、错误等。

查看追踪时,您将看到聊天机器人的交互记录:

  1. 端到端的 HTTP 调用
  2. 单独对 Elasticsearch 的调用
  3. 特定调用,例如调用动作和对 LLM 的调用

您还可以获取追踪的详细信息,并查看与该追踪相关的日志和指标。

Chatbot-traces
Chatbot-traces

指标

除了日志和追踪,任何仪表化的指标也会被导入到 Elastic 中。

Chatbot app metrics
Chatbot app metrics

使用 Docker 设置

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

  1. 克隆 chatbot-rag-app 仓库
  2. 根据 GitHub README 中的说明修改 env 文件,但需要以下例外:

使用您的 Elastic 云的

OTEL_EXPORTER_OTLP_ENDPOINT

OTEL_EXPORTER_OTLP_HEADERS

您可以在 Elastic 云的

integrations->APM

中找到这些信息。

OTel credentials
OTel credentials

发送 OTel 仪表化数据的环境变量如下:

代码语言:javascript
代码运行次数:0
复制
OTEL_EXPORTER_OTLP_ENDPOINT="https://123456789.apm.us-west-2.aws.cloud.es.io:443"
OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer%20xxxxx"

请注意

%20

在标头中,这是为了处理凭据中的空格。

  1. 将以下设置为 false - OTEL_SDK_DISABLED=false
  2. 设置 LLM 的环境变量

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

代码语言:javascript
代码运行次数:0
复制
LLM_TYPE=openai
OPENAI_API_KEY=XXXX
CHAT_MODEL=gpt-4o-mini
  1. 按照以下命令运行 Docker 容器
代码语言:javascript
代码运行次数:0
复制
docker compose up --build --force-recreate
  1. localhost:4000 访问应用
  2. 然后登录到 Elastic 云,查看之前展示的输出。

在 Kubernetes 上运行 chatbot-rag-app

为了设置此应用,您可以按照 Observability-examples 仓库中的说明进行操作,里面包含了用于 Kubernetes 的 yaml 文件。这些文件也将指向 Elastic 云。

  1. 设置 Kubernetes 集群(我们使用 EKS)
  2. 使用仓库中的 Dockerfile 创建 Docker 镜像,但使用以下构建命令以确保它可以在任何 K8s 环境中运行,
代码语言:javascript
代码运行次数:0
复制
docker buildx build --platform linux/amd64 -t chatbot-rag-app .
  1. 将镜像推送到您喜欢的容器仓库
  2. 获取适当的环境变量:
  3. 按照前面 Docker 的说明找到 OTEL_EXPORTER_OTLP_ENDPOINT/HEADER 变量
  4. 获取您的 OpenAI Key
  5. Elasticsearch URL,用户名和密码
  6. 按照以下 github 仓库中的说明 运行两个 Kubernetes yaml 文件。

基本上,您只需要用您的值替换以下红色部分,然后运行

代码语言:javascript
代码运行次数:0
复制
kubectl create -f k8s-deployment.yaml
kubectl create -f init-index-job.yaml

应用需要先运行,然后我们使用应用来初始化 Elasticsearch 的索引。

Init-index-job.yaml

代码语言:javascript
代码运行次数:0
复制
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: 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

k8s-deployment.yaml

代码语言:javascript
代码运行次数:0
复制
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

代码语言:javascript
代码运行次数:0
复制
% 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
  1. 使用应用并在 Elastic 中查看遥测数据
  2. 一旦访问到 URL,您应该看到本博客开头描述的所有屏幕。

结论

使用 Elastic 的 Chatbot-rag-app,您可以构建一个基于 OpenAI 驱动的 RAG 聊天应用的示例。然而,您仍然需要了解其性能如何,是否正常工作等。使用 OTel 和 Elastic 的 EDOT 可以帮助您实现这一点。此外,您通常会在 Kubernetes 上运行此应用。希望这篇博客提供了如何实现这一目标的概述。以下是其他关于追踪的博客:

应用可观测性与 LLM(追踪):

LLM 可观测性:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前提条件
  • 应用在 Elastic 中的 OpenTelemetry 输出
    • Chatbot-rag-app
    • 来自 EDOT 的追踪、日志和指标在 Elastic 中的表现
      • 日志
      • 追踪
      • 指标
  • 使用 Docker 设置
  • 在 Kubernetes 上运行 chatbot-rag-app
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档