はじめに
こんにちは!
Dirbatoの社内横断技術支援組織「Backbeat」に所属している繁田です。
前回のRAG評価の話に続けて、今回はRAGの運用監視について投稿します!
前回までで、「このRAG、どこが悪いの?」 を数字で語れるようになったわけです。
でも、次に来る問題があります。
本番で何が起きてるか、見えてますか?
ここで必要になるのが Langfuse です。
Langfuseとは?
一言でいうと、
Langfuse は OSS の LLM 監視・評価基盤
です。
Langfuseを使うと、RAGの1リクエストについて
- 質問
- retrieval結果
- 回答
- レイテンシ
- 評価スコア
を trace として残せます。
つまり、
- Ragas = 評価する
- Langfuse = 溜める、見る、監視する
という役割分担です。
LangSmithとの違い
同様なツールとしてLangSmithもかなり強いです。
ただ、Langfuseには分かりやすい特徴があります。
Langfuseの強み
- OSS
- 活発なコミュニティ/OSSとして入手しやすい
- Docker Composeで試しやすい
- Helm / Terraform(AWS, Azure, GCP) がある
- Self-hostしやすい
LangSmithの強み
- LangChain / LangGraph との親和性
- 商用基盤としての統合度
ざっくり言うと、
OSSで始めたいなら Langfuse
LangChainど真ん中なら LangSmith
という理解でOKです。
Ragasだけでは足りない理由
Ragasは優秀ですが、基本は評価ロジックです。
なので、Ragasだけだとこうなりがちです。
- 評価結果をprintして終わる
- 本番のどの質問が悪かったか追えない
- retrievalの失敗と回答の失敗を後から辿りにくい
一方 Langfuse に trace と score を残しておくと、
- Faithfulness が低い trace を後から見る
- retrieval がズレたケースだけ拾う
- prompt変更後に悪化した trace を比較する
みたいなことができます。
実装の考え方:Langfuse + Ragas
やることはシンプルです。
1. RAG実行をLangfuseに記録
2. 質問・コンテキスト・回答を保存
3. 一部データだけRagasで評価
4. スコアをLangfuseに戻す
つまり、
Ragasでスコアを計算して、Langfuseに記録する
だけです。
1. Langfuseの環境準備
公式サイトに沿って環境を作ります。
丁寧に解説されているので、この通り進めればOKです。
今回はDocker Composeで構築します。
Docker Composeで構築後、localhost:3000にアクセスします。
Organization、Projectと作成し、APIKEY(Secretkey, Publickey)を作成します。
他にもk8s HelmやTerraformでも構築できます。
2. Langfuseで trace を残す
RAGにLangfuseを組み込み、traceを残します。
from langfuse import Langfuse
langfuse = Langfuse(
secret_key="xxx",
public_key="xxx",
host="http://localhost:3000" # self-host時
)
trace = langfuse.start_observation(
name="rag-query",
input={"question": question},
output={"answer": answer, "contexts": contexts}
)
大事なのは、Ragas評価に必要な情報を trace に残しておくことです。
※Langfuseへの連携方法は以下参照。導入時に各公式ドキュメント(SDKリファレンス)を確認してください。
2. Ragasで評価する
次に、Ragasでスコアを計算します。
from datasets import Dataset
from ragas import evaluate
from ragas.metrics import Faithfulness, ResponseRelevancy
ds = Dataset.from_dict(evaluation_batch)
result = evaluate(ds, metrics=[Faithfulness(), ResponseRelevancy()])
scores = result.to_pandas().iloc[0].to_dict()
print(scores)
例えばこんな結果になります。
{'faithfulness': 0.5516, 'answer_relevancy': 0.9294}
※Ragas evaluate の戻り値やメソッド名はバージョン差があるため、導入時に公式ドキュメントを確認してください。
3. スコアをLangfuseに戻す
ここが連携のキモです。
# 個別にスコアを紐付ける
for name, value in scores.items():
trace.score(
name=name,
value=float(value)
)
trace.end()
langfuse.flush()
これでLangfuse上で、
- trace
- 回答
- contexts
- Ragasスコア
をまとめて見られるようになります。
本番運用では「全件評価」はやめよう
ここ大事です。
本番の全件に対して、同期でRagas評価を回すのは重いです。
なぜなら、
- 評価にもLLMコストがかかる
- レイテンシが増える
- 運用がつらくなる
からです。
なので実務では、
サンプリング + 非同期評価
が基本です。
こうしておくと、
- ユーザー応答は速いまま
- 一部データで品質監視できる
- コストも抑えやすい
というバランスが取れます。
どんな構成が一番ラクか
最小構成なら、これで十分です。
RAGアプリ
↓
Langfuseで全trace記録
↓
一部traceだけ非同期でRagas評価
↓
scoreをLangfuseに保存
↓
Langfuse UIで低スコアtraceを分析
この形にすると、
- Ragas は採点係
- Langfuse は監視係
としてきれいに分業できます。
なお、本番展開前に以下のようなポイントも留意してくださいね。
- 収集前にログポリシーを定める(何を何日間保持するか)
- PIIは可能な限りログに含めない。必要な場合はハッシュ化 or マスキングを実施
- 保存場所は暗号化ストレージ/アクセス制御を強化
まとめ
ポイントだけ言うと、この記事で言いたいのはこれです。
- Ragas は評価ロジック
- Langfuse は本番監視基盤
- Langfuse は OSS で始めやすい
- Docker / Helm / Terraform で展開しやすい
- LangSmith は強いが、OSS/self-host重視ならLangfuseが分かりやすい
- RagasのスコアをLangfuseに戻すと運用がラク
- 本番は全件同期評価せず、サンプリング+非同期が現実的
最後に一言で言うと、
Ragasで“点数”を付けたら、Langfuseで“現場”を見よう。
そこまでやると、RAGは運用に入れます。
参考リンク
- Langfuse GitHub
https://github.com/langfuse/langfuse - Langfuse Self Hosting
https://langfuse.com/self-hosting - Langfuse Ragas Cookbook
https://langfuse.com/guides/cookbook/evaluation_of_rag_with_ragas