Observation Typeって何?
LangfuseにはObservability Data Modelと呼ばれる概念があります。Langfuseを触っていたり、ドキュメントを読んでいると、「Traces」「Observations」「Sessions」といった用語が頻繁に登場します。実はこれらはこのデータモデルに基づいた概念となっています。
各用語の関係を簡単にまとめると、下記のような関係になります。
- ObservationはTraceに紐づき、
- Traceは必要に応じてSessionに紐づけることができ、
- Observationは他のObservationの中に入れ子で含めることもできます(Nesting)。
また、ObservationにはTypeという属性があり、同じObservationでも用途に応じてTypeを使い分け、分類をすることができます。
Observation Typeがすごく増えてた
そんなObservation Typeなのですが、気づいたら爆増していました。
LangfuseではトレースのLatencyにトレースの処理時間は考慮されないらしい を書いたときは3種類くらいだったのですが、今見ると10種類あります。めちゃ増えてます1。
Observation Typeの設定方法は簡単で、@observeデコレータ利用時にas_typeで指定できます。指定しない場合はデフォルトのSpan Typeになります。
import time
from langfuse import observe
@observe()
def span() -> None:
print(f"Span started")
time.sleep(1)
result = f"Span completed"
print(result)
return
@observe(as_type="agent")
def agent() -> None:
print(f"Agent started")
time.sleep(1)
result = f"Agent completed"
print(result)
return
@observe(as_type="evaluator")
def evaluator() -> None:
print(f"Evaluator started")
time.sleep(1)
result = f"Evaluator completed"
print(result)
return
@observe()
def main():
span()
agent()
evaluator()
if __name__ == "__main__":
main()
上記のプログラムを実行すると、設定したObservation typeのアイコンがLangfuseのトレースタブで確認できます。
Traceを確認する方法は下記の記事を参考にしてください🙇♂️
色々な疑問
複数のObservation Typeが設定できるのは分かったのですが、具体的にどう嬉しいのか、どこに効いてくるのかを整理してみます。
その1:何が嬉しいのか?
LangfusenのChangelogにはこう書かれています。
Now, you can easily identify the type of action an observation represents, such as tool calls, embeddings or agents.
つまり、Observationが「何の処理だったのか」をアイコンやTypeで瞬時に把握できるという利点です。
その2:Traceの画面でアイコンが変わるだけ?
実はUI上の表示内容も変わります。例えば、spanとagentの詳細画面を見比べてみると、上部に表示される情報が違います。agent側にはPlaygroundへのリンクや、usageに関する情報がℹ️で確認できます。
Type自体は属性なので、もちろんフィルターする際の条件にも利用できます。
あと、LangfuseにはDashbord機能2があるのですが、Dashbordを作成する際にBreakdown DimensionでObservation Typeを利用することもできます。Dashbordの機能に関してはまた別途説明したいと思います。
私が気づいているのはこれくらいなのですが、他にもあれば是非教えてください🙇♂️
その3:Langfuseを利用する際にas_typeを意識した方が良いのか?
個人的には要件がない限りは意識しないで良いと思っています。
理由の1つは、LangChainなどのフレームワークと組み合わせる場合、Integrationライブラリ側でObservation Typeが自動設定されるためです。実際、LangChainとのIntegrationでは、ObservationTypeを判定して適切に設定する処理が実装されています。
また、Integrationを使わない場合でも、明確な要件が無ければ設定しない方がシンプルで扱いやすいと感じています。Observation Typeは強力な機能ではありますが、むやみに設定すると複雑さが増すだけで、可視化や分析のメリットを十分に得られないケースも多いと思います。要件が出てきたタイミングで初めて設定を検討する、というスタンスで問題ないと思います。
とはいえ、LLM呼び出しが内包された処理のトレースを連携する場合、Usageについての情報は欲しいので、経験上Integrationを利用しない場合はGeneration Typeをas_typeに指定する場合が多いです。
さいごに
Observation Typeがめちゃ増えてました!「増えたから何だ」という感じもありますが、Langfuse側がより豊富な表現手段を提供してくれているとも言えます。要件やシステム構成に応じて適切な表現ができると強力なツールになりそうです。




