目前,大多数 AI 驱动的应用程序都集中在增加最终用户(如 SRE)从 AI 中获得的价值。主要的应用场景是创建各种聊天机器人。这些聊天机器人不仅使用大语言模型(LLMs),还使用 LangChain 等框架和搜索功能在对话过程中改进上下文信息(检索增强生成)。Elastic 的 基于 RAG 的聊天机器人示例应用 展示了如何使用包含嵌入的本地数据与 Elasticsearch 结合,从而在与连接到 LLM 的聊天机器人进行查询时正确提取最相关的信息。这是一个如何使用 Elasticsearch 构建基于 RAG 应用程序的优秀示例。然而,如何监控这个应用程序呢?
Elastic 提供了使用原生 OTel SDKs、现成的 OTel 收集器甚至是 Elastic 分布式 OpenTelemetry (EDOT) 来摄取 OpenTelemetry 数据的能力。EDOT 使您能够为您的生成式 AI 应用程序和 K8s 获取日志、指标和追踪信息。然而,您通常还需要库来帮助追踪应用程序中特定的组件。在追踪生成式 AI 应用程序时,您可以从大量库中进行选择。
正如您所看到的,OpenTelemetry 是收集和摄取数据的标准机制。OpenTelemetry 正在不断扩展其支持,但仍处于早期阶段。
在这篇博客中,我们将讲解如何用最少的代码,通过 Langtrace 对基于 RAG 的聊天机器人应用程序进行追踪。我们之前在博客中介绍过 Langtrace,以突出追踪 Langchain。
在这篇博客中,我们使用了 Langtrace OpenAI、Amazon Bedrock、Cohere 等库。
为了跟随本教程,您需要以下几个先决条件:
您需要先启动 ChatBotApp,启动后您应该会看到以下界面:
当您选择一些问题时,系统会根据应用程序初始化时在 Elasticsearch 中创建的索引生成响应。此外,还会向 LLMs 发出查询。
一旦您在 K8s 集群中配置了 OTel 收集器和 EDOT,并启动了 Elastic Cloud,您应该会看到以下内容:
在 Discover 中,您将看到来自 Chatbotapp 的日志,并能够分析应用程序日志、任何特定的日志模式(为您节省分析时间)以及来自 K8s 的日志。
在 Elastic Observability APM 中,您还可以看到聊天机器人的详细信息,包括事务、依赖关系、日志、错误等。
当您查看追踪时,您将能够看到聊天机器人在追踪中的互动。
您还可以获取追踪的详细信息,并查看与该追踪相关的日志和指标。
除了日志和追踪,任何已被仪表化的指标也将被摄入 Elastic。
为了在 K8s 上正确设置 Chatbot-app 并将遥测数据发送到 Elastic,您需要进行以下设置:
在解压应用程序后,进入 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
接下来打开 app.py
文件在 api
目录中,并添加以下内容:
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(或其他 LLMs)的调用。
使用 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
# Elasticsearch 索引的名称
ES_INDEX=workplace-app-docs
ES_INDEX_CHAT_HISTORY=workplace-app-docs-chat-history
ELASTICSEARCH_URL
可以在 cloud.elastic.co 中找到。用户和密码需要在 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 下找到。
用于 LLMs 的环境变量:
在本例中,我们使用 OpenAI,因此只需要三个变量。
LLM_TYPE=openai
OPENAI_API_KEY=XXXX
CHAT_MODEL=gpt-4o-mini
所有这些变量将在接下来的 Kubernetes yaml 文件中使用。
这一步在以下博客中进行了概述。这个过程非常简单,只需三步。
这一步将引入所有 K8s 集群日志和指标,并设置 OTel 收集器。
现在集群已经启动,并且您有了环境变量,您需要:
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
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
运行 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
访问 URL 后,您应该会看到我们在本博客开始部分描述的所有界面。
通过 Elastic 的 Chatbot-rag-app 示例,您可以了解如何构建基于 OpenAI 的 RAG 聊天应用程序。然而,您仍然需要了解它的性能如何,是否正常工作等。使用 OpenTelemetry、Elastic 的 EDOT 和 Langtrace,您可以实现这一目标。此外,您通常会在 Kubernetes 上运行此应用程序。希望这篇博客为您提供了实现这一目标的路线图。
以下是其他追踪相关的博客:
希望这些资源对您有所帮助。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。