作者:来自 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