<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>成本监控 on niuzj</title>
    <link>https://niuzj.org/tags/%E6%88%90%E6%9C%AC%E7%9B%91%E6%8E%A7/</link>
    <description>Recent content in 成本监控 on niuzj</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 20 Oct 2025 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://niuzj.org/tags/%E6%88%90%E6%9C%AC%E7%9B%91%E6%8E%A7/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>用 PostHog 监控你的 AI Agent：从调用追踪到成本核算</title>
      <link>https://niuzj.org/posts/posthog-agent-monitoring/</link>
      <pubDate>Mon, 20 Oct 2025 00:00:00 +0000</pubDate>
      <guid>https://niuzj.org/posts/posthog-agent-monitoring/</guid>
      <description>&lt;p&gt;最近在公司做一个 Agent 项目，跑通了基本流程之后，遇到一个很现实的问题：线上用户反馈&amp;quot;回答不对&amp;quot;或者&amp;quot;响应太慢&amp;quot;，我根本没法排查。日志里只有零散的 print，完全看不出一次对话里到底调了几次模型、每次花了多久、tool call 有没有报错。&lt;/p&gt;&#xA;&lt;p&gt;我需要一个能看清 Agent 每一步在干什么的监控工具。&lt;/p&gt;&#xA;&lt;h2 id=&#34;posthog-的-llm-analytics&#34;&gt;PostHog 的 LLM Analytics&lt;/h2&gt;&#xA;&lt;p&gt;偶然看到 PostHog 出了 LLM observability 的功能，抱着试试的心态接了一下，发现这东西是真的好用。&lt;/p&gt;&#xA;&lt;p&gt;PostHog 把 AI Agent 的监控拆成了三层：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Trace&lt;/strong&gt; — 一次完整的用户对话&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Generation&lt;/strong&gt; — 每一次 LLM API 调用&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Span&lt;/strong&gt; — 每一次 tool 执行&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这个层级结构跟 Agent 的实际运行方式完全对应。一个用户提问进来，Agent 可能调 3 次模型、执行 5 个 tool，这些全部串在一个 trace 下面，一目了然。&lt;/p&gt;&#xA;&lt;h2 id=&#34;接入过程&#34;&gt;接入过程&lt;/h2&gt;&#xA;&lt;p&gt;接入非常简单，核心就是在几个关键节点上报事件。&lt;/p&gt;&#xA;&lt;p&gt;初始化一个 client：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; posthog &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; Posthog&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;client &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Posthog(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    api_key&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;phc_xxx&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    host&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://us.i.posthog.com&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;每次 LLM 调用完成后，上报一个 &lt;code&gt;$ai_generation&lt;/code&gt; 事件：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;client&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;capture(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    distinct_id&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;user_id,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    event&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$ai_generation&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    properties&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$ai_model&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gpt-4o&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$ai_provider&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;openai&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$ai_input&amp;#34;&lt;/span&gt;: messages,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$ai_output_choices&amp;#34;&lt;/span&gt;: response&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;choices,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$ai_input_tokens&amp;#34;&lt;/span&gt;: usage&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;prompt_tokens,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$ai_output_tokens&amp;#34;&lt;/span&gt;: usage&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;completion_tokens,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$ai_cache_read_input_tokens&amp;#34;&lt;/span&gt;: cached_tokens,  &lt;span style=&#34;color:#75715e&#34;&gt;# 别漏了这个，后面会讲&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$ai_latency&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;1.23&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$ai_trace_id&amp;#34;&lt;/span&gt;: trace_id,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;$ai_tools&amp;#34;&lt;/span&gt;: tools,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;tool 执行完上报一个 &lt;code&gt;$ai_span&lt;/code&gt;：&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
