作者:來自 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 FlaskInstrumentorfrom langtrace_python_sdk import langtracelangtrace.init(batch=False)FlaskInstrumentor().instrument_app(app)
插入到如下的代碼中:
import os
import sys
from uuid import uuid4from chat import ask_question
from flask import Flask, Response, jsonify, request
from flask_cors import CORSfrom opentelemetry.instrumentation.flask import FlaskInstrumentorfrom langtrace_python_sdk import langtracelangtrace.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 ./dataEXPOSE 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: 2selector:matchLabels:app: genai-chatbot-langtracetemplate:metadata:labels:app: genai-chatbot-langtracespec:containers:- name: genai-chatbot-langtraceimage:65765.amazonaws.com/genai-chatbot-langtrace2:latestports:- containerPort: 4000env:- name: LLM_TYPEvalue: "openai"- name: CHAT_MODELvalue: "gpt-4o-mini"- name: OTEL_SDK_DISABLEDvalue: "false"- name: OTEL_RESOURCE_ATTRIBUTESvalue: "service.name=genai-chatbot-langtrace,service.version=0.0.1,deployment.environment=dev"- name: OTEL_EXPORTER_OTLP_PROTOCOLvalue: "http/protobuf"envFrom:- secretRef:name: genai-chatbot-langtrace-secretsresources: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-langtraceports:- port: 80targetPort: 4000type: 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 appimage: your-image-location:latestworkingDir: /app/apicommand: ["python3", "-m", "flask", "--app", "app", "create-index"]env:- name: FLASK_APPvalue: "app"- name: LLM_TYPEvalue: "openai"- name: CHAT_MODELvalue: "gpt-4o-mini"- name: ES_INDEXvalue: "workplace-app-docs"- name: ES_INDEX_CHAT_HISTORYvalue: "workplace-app-docs-chat-history"- name: ELASTICSEARCH_URLvalueFrom:secretKeyRef:name: chatbot-regular-secretskey: ELASTICSEARCH_URL- name: ELASTICSEARCH_USERvalueFrom:secretKeyRef:name: chatbot-regular-secretskey: ELASTICSEARCH_USER- name: ELASTICSEARCH_PASSWORDvalueFrom:secretKeyRef:name: chatbot-regular-secretskey: ELASTICSEARCH_PASSWORDenvFrom:- secretRef:name: chatbot-regular-secretsrestartPolicy: NeverbackoffLimit: 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