メインコンテンツまでスキップ

Langfuse on Doris

Langfuseについて

Langfuseは、大規模言語モデルアプリケーション向けの包括的な可観測性ソリューションを提供するオープンソースのLLMエンジニアリングプラットフォームです。以下の主要機能を提供します:

  • トレーシング: LLMアプリケーションの呼び出しチェーンと実行フローの完全な記録
  • 評価: 多次元のモデルパフォーマンス評価と品質分析
  • プロンプト管理: プロンプトテンプレートの集中管理とバージョン管理
  • メトリクス監視: アプリケーションのパフォーマンス、コスト、品質メトリクスのリアルタイム監視

本ドキュメントでは、Apache Dorisを分析バックエンドとして使用してLangfuseソリューションをデプロイする方法について詳細な手順を提供し、Dorisの強力なOLAP分析機能を最大限に活用して大規模LLMアプリケーションデータを処理します。

システムアーキテクチャ

Langfuse on Dorisソリューションは、以下の主要コンポーネントからなるマイクロサービスアーキテクチャを使用しています:

コンポーネントポート説明
Langfuse Web3000ユーザーインタラクションとデータ取り込み用のWebインターフェースとAPIサービス
Langfuse Worker3030データ処理と分析タスクのための非同期タスク処理
PostgreSQL5432ユーザー設定とメタデータのためのトランザクショナルデータストレージ
Redis6379システム応答性能向上のためのキャッシュ層とメッセージキュー
MinIO9090生イベントとマルチモーダル添付ファイル用のオブジェクトストレージサービス
Doris Fe9030 8030Dorisアーキテクチャの一部であるDoris Frontend、ユーザーリクエストの受信、クエリ解析と計画、メタデータ管理、ノード管理を担当
Doris Be8040 8050Dorisアーキテクチャの一部であるDoris Backend、データストレージとクエリプラン実行を担当。データはシャードに分割され、BEノードに複数のレプリカで保存される

::: note

Apache Dorisをデプロイする際は、ハードウェア環境とビジネス要件に基づいて、統合コンピュート・ストレージアーキテクチャまたは分離コンピュート・ストレージアーキテクチャを選択できます。 Langfuseのデプロイメントでは、Docker Dorisは本番環境では推奨されません。Dockerに含まれるFEとBEコンポーネントは、ユーザーがLangfuse on Doris機能を迅速に体験するためのものです。

:::

flowchart TB
User["UI, API, SDKs"]
subgraph vpc["VPC"]
Web["Web Server<br/>(langfuse/langfuse)"]
Worker["Async Worker<br/>(langfuse/worker)"]
Postgres["Postgres - OLTP<br/>(Transactional Data)"]
Cache["Redis/Valkey<br/>(Cache, Queue)"]
Doris["Doris - OLAP<br/>(Observability Data)"]
S3["S3 / Blob Storage<br/>(Raw events, multi-modal attachments)"]
end
LLM["LLM API/Gateway<br/>(optional)"]

User --> Web
Web --> S3
Web --> Postgres
Web --> Cache
Web --> Doris
Web -.->|"optional for playground"| LLM

Cache --> Worker
Worker --> Doris
Worker --> Postgres
Worker --> S3
Worker -.->|"optional for evals"| LLM

デプロイメント要件

ソフトウェア環境

コンポーネントバージョン説明
Docker20.0+コンテナランタイム環境
Docker Compose2.0+コンテナオーケストレーションツール
Apache Doris2.1.10+分析データベース、別途デプロイメントが必要

ハードウェアリソース

リソースタイプ最小推奨説明
メモリ8GB16GB+マルチサービス並行動作をサポート
ディスク50GB100GB+コンテナデータとログの保存
ネットワーク1Gbps10Gbpsデータ転送パフォーマンスを確保

前提条件

  1. Dorisクラスタ準備

    • Dorisクラスタが安定したパフォーマンスで正常に動作していることを確認
    • FE HTTPポート(デフォルト8030)とクエリポート(デフォルト9030)がネットワークアクセス可能であることを確認
    • Langfuseは起動後、Dorisに必要なデータベースとテーブル構造を自動的に作成
  2. ネットワーク接続

    • デプロイメント環境がDocker Hubにアクセスしてイメージをプルできること
    • LangfuseサービスがDorisクラスタの関連ポートにアクセスできること
    • クライアントがLangfuse Webサービスポートにアクセスできること
デプロイメント推奨事項

Langfuseサービスコンポーネント(Web、Worker、Redis、PostgreSQL)のデプロイメントはDockerの使用を推奨しますが、Dorisはより良いパフォーマンスと安定性のために別途デプロイメントすることを推奨します。Dorisの詳細なデプロイメントガイドについては、公式ドキュメントを参照してください。

設定パラメータ

Langfuseサービスは各コンポーネントの適切な動作をサポートするために複数の環境変数が必要です:

Doris分析バックエンド設定

パラメータ設定例説明
LANGFUSE_ANALYTICS_BACKENDdorisDorisを分析バックエンドとして指定
DORIS_FE_HTTP_URLhttp://localhost:8030Doris FE HTTPサービスアドレス
DORIS_FE_QUERY_PORT9030Doris FEクエリポート
DORIS_DBlangfuseDorisデータベース名
DORIS_USERrootDorisユーザー名
DORIS_PASSWORD123456Dorisパスワード
DORIS_MAX_OPEN_CONNECTIONS100最大データベース接続数
DORIS_REQUEST_TIMEOUT_MS300000リクエストタイムアウト(ミリ秒)

基本サービス設定

パラメータ設定例説明
DATABASE_URLpostgresql://postgres:postgres@langfuse-postgres:5432/postgresPostgreSQLデータベース接続URL
NEXTAUTH_SECRETyour-debug-secret-key-here-must-be-long-enoughセッション暗号化用NextAuth認証キー
SALTyour-super-secret-salt-with-at-least-32-characters-for-encryptionデータ暗号化ソルト(最低32文字)
ENCRYPTION_KEY0000000000000000000000000000000000000000000000000000000000000000データ暗号化キー(64文字)
NEXTAUTH_URLhttp://localhost:3000Langfuse Webサービスアドレス
TZUTCシステムタイムゾーン設定

Redisキャッシュ設定

パラメータ設定例説明
REDIS_HOSTlangfuse-redisRedisサービスホストアドレス
REDIS_PORT6379Redisサービスポート
REDIS_AUTHmyredissecretRedis認証パスワード
REDIS_TLS_ENABLEDfalseTLS暗号化を有効にするかどうか
REDIS_TLS_CA-TLS CA証明書パス
REDIS_TLS_CERT-TLSクライアント証明書パス
REDIS_TLS_KEY-TLS秘密鍵パス

データマイグレーション設定

パラメータ設定例説明
LANGFUSE_ENABLE_BACKGROUND_MIGRATIONSfalseバックグラウンドマイグレーションを無効化(Doris使用時は無効化必須)
LANGFUSE_AUTO_DORIS_MIGRATION_DISABLEDfalseDoris自動マイグレーションを有効化

Docker Composeデプロイメント

デプロイメント前の準備

ここでは直接開始可能なcomposeの例を提供します。要件に応じて設定を変更してください。

docker composeをダウンロード

wget https://apache-doris-releases.oss-cn-beijing.aliyuncs.com/extension/docker-langfuse-doris.tar.gz

compose ファイルと設定ファイルのディレクトリ構造は以下の通りです:

docker-langfuse-doris
├── docker-compose.yml
└── doris-config
└── fe_custom.conf

デプロイ手順

1 . composeを開始

docker compose up -d
# Check
$ docker compose up -d
[+] Running 9/9
✔ Network docker-langfuse-doris_doris_internal Created 0.1s
✔ Network docker-langfuse-doris_default Created 0.1s
✔ Container doris_fe Healthy 13.8s
✔ Container langfuse-postgres Healthy 13.8s
✔ Container langfuse-redis Healthy 13.8s
✔ Container langfuse-minio Healthy 13.8s
✔ Container doris_be Healthy 54.3s
✔ Container langfuse-worker Started 54.8s
✔ Container langfuse-web Started

3. デプロイの確認

サービスステータスを確認します:

すべてのサービスステータスがHealthyと表示されている場合、composeが正常に開始されています。

$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
doris_be apache/doris:be-2.1.11 "bash entry_point.sh" doris_be 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:8040->8040/tcp, :::8040->8040/tcp, 0.0.0.0:8060->8060/tcp, :::8060->8060/tcp, 0.0.0.0:9050->9050/tcp, :::9050->9050/tcp, 0.0.0.0:9060->9060/tcp, :::9060->9060/tcp
doris_fe apache/doris:fe-2.1.11 "bash init_fe.sh" doris_fe 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:8030->8030/tcp, :::8030->8030/tcp, 0.0.0.0:9010->9010/tcp, :::9010->9010/tcp, 0.0.0.0:9030->9030/tcp, :::9030->9030/tcp
langfuse-minio minio/minio "sh -c 'mkdir -p /da…" minio 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:19090->9000/tcp, :::19090->9000/tcp, 127.0.0.1:19091->9001/tcp
langfuse-postgres postgres:latest "docker-entrypoint.s…" postgres 2 minutes ago Up 2 minutes (healthy) 127.0.0.1:5432->5432/tcp
langfuse-redis redis:7 "docker-entrypoint.s…" redis 2 minutes ago Up 2 minutes (healthy) 127.0.0.1:16379->6379/tcp
langfuse-web selectdb/langfuse-web:latest "dumb-init -- ./web/…" langfuse-web 2 minutes ago Up About a minute (healthy) 0.0.0.0:13000->3000/tcp, :::13000->3000/tcp
langfuse-worker selectdb/langfuse-worker:latest "dumb-init -- ./work…" langfuse-worker 2 minutes ago Up About a minute (healthy) 0.0.0.0:3030->3030/tcp, :::3030->3030/tcp

4. サービス初期化

デプロイメント完了後、以下の手順でサービスにアクセスし初期化します:

Langfuse Web Interface へのアクセス

初期化手順

  1. ブラウザを開いて http://localhost:3000 にアクセスします
  2. 管理者アカウントを作成してログインします
  3. 新しい組織とプロジェクトを作成します
  4. プロジェクトの API Keys(Public Key と Secret Key)を取得します
  5. SDK 統合に必要な認証情報を設定します

Langfuse SDK の使用

import os
# Instead of: import openai
from langfuse.openai import OpenAI
# from langfuse import observe

# Langfuse config
os.environ["LANGFUSE_SECRET_KEY"] = "sk-lf-******-******"
os.environ["LANGFUSE_PUBLIC_KEY"] = "pk-lf-******-******"
os.environ["LANGFUSE_HOST"] = "http://localhost:3000"


# use OpenAI client
client = OpenAI()


# ask a question
question = "What are the key features of the Doris observability solution? Please answer concisely."
print(f"question: {question}")

completion = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": question}
]
)
response = completion.choices[0].message.content
print(f"response: {response}")

LangChain SDKの使用

import os
from langfuse.langchain import CallbackHandler
from langchain_openai import ChatOpenAI

# Langfuse config
os.environ["LANGFUSE_SECRET_KEY"] = "sk-lf-******-******"
os.environ["LANGFUSE_PUBLIC_KEY"] = "pk-lf-******-******"
os.environ["LANGFUSE_HOST"] = "http://localhost:3000"

# Create your LangChain components (using OpenAI API)
llm = ChatOpenAI(
model="gpt-4o"
)

# ask a question
question = "What are the key features of the Doris observability solution? Please answer concisely."
print(f"question: {question} \n")

# Run your chain with Langfuse tracing
try:
# Initialize the Langfuse handler
langfuse_handler = CallbackHandler()
response = llm.invoke(question, config={"callbacks": [langfuse_handler]})
print(f"response: {response.content}")
except Exception as e:
print(f"Error during chain execution: {e}")

LlamaIndex SDKの使用

import os
from langfuse import get_client
from openinference.instrumentation.llama_index import LlamaIndexInstrumentor
from llama_index.llms.openai import OpenAI

# Langfuse config
os.environ["LANGFUSE_SECRET_KEY"] = "sk-lf-******-******"
os.environ["LANGFUSE_PUBLIC_KEY"] = "pk-lf-******-******"
os.environ["LANGFUSE_HOST"] = "http://localhost:3000"

langfuse = get_client()


# Initialize LlamaIndex instrumentation
LlamaIndexInstrumentor().instrument()


# Set up the OpenAI class with the required model
llm = OpenAI(model="gpt-4o")


# ask a question
question = "What are the key features of the Doris observability solution? Please answer concisely."
print(f"question: {question} \n")

with langfuse.start_as_current_span(name="llama-index-trace"):
response = llm.complete(question)
print(f"response: {response}")