前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >使用 Elastic 分布式 OpenTelemetry 和 Langtrace 追踪基于 RAG 的聊天机器人

使用 Elastic 分布式 OpenTelemetry 和 Langtrace 追踪基于 RAG 的聊天机器人

原创
作者头像
点火三周
发布2025-02-15 08:38:50
发布2025-02-15 08:38:50
8400
代码可运行
举报
文章被收录于专栏:Elastic Stack专栏Elastic Stack专栏
运行总次数:0
代码可运行
使用 Elastic 分布式 OpenTelemetry 和 Langtrace 追踪基于 RAG 的聊天机器人
使用 Elastic 分布式 OpenTelemetry 和 Langtrace 追踪基于 RAG 的聊天机器人

目前,大多数 AI 驱动的应用程序都集中在增加最终用户(如 SRE)从 AI 中获得的价值。主要的应用场景是创建各种聊天机器人。这些聊天机器人不仅使用大语言模型(LLMs),还使用 LangChain 等框架和搜索功能在对话过程中改进上下文信息(检索增强生成)。Elastic 的 基于 RAG 的聊天机器人示例应用 展示了如何使用包含嵌入的本地数据与 Elasticsearch 结合,从而在与连接到 LLM 的聊天机器人进行查询时正确提取最相关的信息。这是一个如何使用 Elasticsearch 构建基于 RAG 应用程序的优秀示例。然而,如何监控这个应用程序呢?

Elastic 提供了使用原生 OTel SDKs、现成的 OTel 收集器甚至是 Elastic 分布式 OpenTelemetry (EDOT) 来摄取 OpenTelemetry 数据的能力。EDOT 使您能够为您的生成式 AI 应用程序和 K8s 获取日志、指标和追踪信息。然而,您通常还需要库来帮助追踪应用程序中特定的组件。在追踪生成式 AI 应用程序时,您可以从大量库中进行选择。

  • OpenTelemetry OpenAI Instrumentation-v2 - 允许追踪 LLM 请求和记录由 OpenAI Python API 库生成的消息。(注意 v2 由 OpenTelemetry 构建,非 v2 版本来自特定供应商而不是 OpenTelemetry)
  • OpenTelemetry VertexAI Instrumentation - 允许追踪 LLM 请求和记录由 VertexAI Python API 库生成的消息
  • Langtrace - 商业化的库,支持所有 LLMs,并且所有追踪也都是 OTel 原生的。
  • Elastic 的 EDOT - 最近增加了追踪功能。参见博客

正如您所看到的,OpenTelemetry 是收集和摄取数据的标准机制。OpenTelemetry 正在不断扩展其支持,但仍处于早期阶段。

在这篇博客中,我们将讲解如何用最少的代码,通过 Langtrace 对基于 RAG 的聊天机器人应用程序进行追踪。我们之前在博客中介绍过 Langtrace,以突出追踪 Langchain。

在这篇博客中,我们使用了 Langtrace OpenAI、Amazon Bedrock、Cohere 等库。

先决条件:

为了跟随本教程,您需要以下几个先决条件:

  • 一个 Elastic Cloud 账户 —— 现在注册,并熟悉 Elastic 的 OpenTelemetry 配置。使用无服务器版本不需要版本要求,常规云版本至少需要 8.17
  • 克隆 基于 RAG 的聊天机器人应用 并阅读教程,了解如何启动并变得更加熟悉。
  • 一个您喜欢的 LLM 账户(OpenAI、AzureOpen AI 等),以及 API 密钥
  • 熟悉 EDOT,了解如何通过 OTel 收集器从应用程序中获取日志、指标和追踪信息
  • Kubernetes 集群 - 我将使用 Amazon EKS
  • 查看 Langtrace 文档

在 Elastic 中查看 OpenTelemetry 的输出

Chatbot-rag-app

您需要先启动 ChatBotApp,启动后您应该会看到以下界面:

聊天机器人应用主页面
聊天机器人应用主页面
聊天机器人应用工作界面
聊天机器人应用工作界面

当您选择一些问题时,系统会根据应用程序初始化时在 Elasticsearch 中创建的索引生成响应。此外,还会向 LLMs 发出查询。

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

一旦您在 K8s 集群中配置了 OTel 收集器和 EDOT,并启动了 Elastic Cloud,您应该会看到以下内容:

日志:

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

聊天机器人日志
聊天机器人日志
聊天机器人日志模式
聊天机器人日志模式
聊天机器人日志详细信息
聊天机器人日志详细信息

追踪:

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

当您查看追踪时,您将能够看到聊天机器人在追踪中的互动。

  1. 您将看到端到端的 HTTP 调用
  2. 对 Elasticsearch 的单个调用
  3. 特定调用,如调用操作和对 LLM 的调用

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

聊天机器人追踪
聊天机器人追踪

指标:

除了日志和追踪,任何已被仪表化的指标也将被摄入 Elastic。

聊天机器人应用指标
聊天机器人应用指标

设置步骤

为了在 K8s 上正确设置 Chatbot-app 并将遥测数据发送到 Elastic,您需要进行以下设置:

  1. 克隆 chatbot-rag-app,并修改其中一个 Python 文件。
  2. 接下来,创建一个可在 Kubernetes 中使用的 Docker 容器。可以使用 Chatbot-app 中的 Dockerfile
  3. 收集所有需要的环境变量。在本例中,我们使用 OpenAI,但文件可以为任何 LLM 进行修改。因此,您需要将一些环境变量加载到集群中。在 GitHub 仓库中有一个 env.example 文件供 Docker 使用。您可以选择需要的内容,并在下面的 K8s 文件中进行适当调整。
  4. 设置您的 K8s 集群,然后使用适当的 yaml 文件和凭据安装 OpenTelemetry 收集器。这将有助于收集 K8s 集群日志和指标。
  5. 使用以下两个 yaml 文件确保您可以在 Kubernetes 上运行。
  6. Init-index-job.yaml - 在 Elasticsearch 中使用本地公司信息初始化索引
  7. k8s-deployment-chatbot-rag-app.yaml - 初始化应用程序前端和后端。
  8. 在 K8s 中的 chatbot-app 服务的负载均衡器 URL 上打开应用程序
  9. 转到 Elasticsearch,在 Discover 中查看日志,转到 APM 并查找您的 chatbot-app 并查看追踪信息。

使用 Langtrace 修改代码进行追踪

在解压应用程序后,进入 chatbot-rag-app 目录:

代码语言:bash
复制
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

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

代码语言:python
代码运行次数:0
复制
from opentelemetry.instrumentation.flask import FlaskInstrumentor

from langtrace_python_sdk import langtrace

langtrace.init(batch=False)

FlaskInstrumentor().instrument_app(app)

插入到代码中:

代码语言:python
代码运行次数:0
复制
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(或其他 LLMs)的调用。

创建 Docker 容器

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

代码语言:docker
复制
RUN pip3 install --no-cache-dir langtrace-python-sdk

到 Dockerfile 中:

代码语言:docker
复制
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 中初始化索引的环境变量:

代码语言:bash
复制
ELASTICSEARCH_URL=https://aws.us-west-2.aws.found.io
ELASTICSEARCH_USER=elastic
ELASTICSEARCH_PASSWORD=elastic

# Elasticsearch 索引的名称
ES_INDEX=workplace-app-docs
ES_INDEX_CHAT_HISTORY=workplace-app-docs-chat-history

ELASTICSEARCH_URL 可以在 cloud.elastic.co 中找到。用户和密码需要在 Elastic 中设置。

用于发送 OTel 仪表数据的环境变量,您需要以下内容:

代码语言:bash
复制
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 下找到。

OTel 凭据
OTel 凭据

用于 LLMs 的环境变量:

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

代码语言:bash
复制
LLM_TYPE=openai
OPENAI_API_KEY=XXXX
CHAT_MODEL=gpt-4o-mini

所有这些变量将在接下来的 Kubernetes yaml 文件中使用。

设置 K8s 集群并加载 OTel 收集器和 EDOT

这一步在以下博客中进行了概述。这个过程非常简单,只需三步。

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

设置秘密、初始化索引并启动应用

现在集群已经启动,并且您有了环境变量,您需要:

  1. 安装并运行 k8s-deployments.yaml 并包含变量
  2. 初始化索引

基本上运行以下命令:

代码语言:bash
复制
kubectl create -f k8s-deployment.yaml
kubectl create -f init-index-job.yaml

以下是您应该使用的两个 yaml 文件。在 这里也可以找到它们。

k8s-deployment.yaml:

代码语言: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:

代码语言:yaml
复制
apiVersion: batch/v1
kind: Job
metadata:
  name: init-elasticsearch-index-test
spec:
  template:
    spec:
      containers:
      - name: init-index
        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

使用负载均衡器 URL 打开应用

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

代码语言:bash
复制
% 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 聊天应用程序。然而,您仍然需要了解它的性能如何,是否正常工作等。使用 OpenTelemetry、Elastic 的 EDOT 和 Langtrace,您可以实现这一目标。此外,您通常会在 Kubernetes 上运行此应用程序。希望这篇博客为您提供了实现这一目标的路线图。

以下是其他追踪相关的博客:

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

LLM 可观测性

希望这些资源对您有所帮助。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 先决条件:
  • 在 Elastic 中查看 OpenTelemetry 的输出
    • Chatbot-rag-app
    • 来自 Elastic 的 EDOT 的追踪、日志和指标
      • 日志:
      • 追踪:
      • 指标:
  • 设置步骤
    • 使用 Langtrace 修改代码进行追踪
    • 创建 Docker 容器
    • 收集所需的环境变量:
    • 设置 K8s 集群并加载 OTel 收集器和 EDOT
    • 设置秘密、初始化索引并启动应用
    • 使用负载均衡器 URL 打开应用
    • 使用应用并在 Elastic 中查看遥测数据
  • 结论
    • 应用程序可观测性与 LLM(追踪)
    • LLM 可观测性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档