فاز 14 · درس 23

قراردادهای معنایی OpenTelemetry برای هوش مصنوعی زایا

نوع
مفهومی و ساختنی
زمان
حدود 60 دقیقه
زبان‌ها
Python (stdlib)
پیش‌نیاز
فاز 14 · بخش 13 (LangGraph)، فاز 14 · بخش 24 (پلتفرم‌های رصدپذیری)
یک سیستم ماژولار و برچسب‌گذاری‌شده از مکعب‌های نورانی به هم‌پیوسته که جریان داده‌ها را نشان می‌دهد
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. مفاهیم پایه
  4. دسته‌بندی‌های اسپن
  5. نام‌گذاری اسپن‌های ایجنت
  6. ویژگی‌های کلیدی
  7. ثبت محتوا
  8. پایداری
  9. جاهایی که این الگو به خطا می‌رود
  10. پیاده‌سازی از صفر
  11. استفاده از ابزارهای واقعی
  12. خروجی این درس
  13. تمرین‌ها
  14. اصطلاحات کلیدی
  15. برای مطالعه‌ی بیشتر

وقتی چند ایجنت یا مدل زبانی مختلف را در کنار هم به کار می‌گیرید، یکی از بزرگ‌ترین چالش‌ها پایش و رصدپذیری یکپارچه‌ی آن‌هاست. هر فریم‌ورک یا ارائه‌دهنده‌ی هوش مصنوعی نام‌گذاری و لاگ‌های اختصاصی خودش را دارد و همین پراکندگی باعث می‌شود تحلیل رفتار سیستم در ابزارهای مانیتورینگ نیازمند ساخت داشبوردهای جداگانه و نگهداری هزینه‌بر باشد.

کارگروه ویژه هوش مصنوعی زایا در OpenTelemetry با معرفی قراردادهای معنایی استاندارد (Semantic Conventions)، این ناهماهنگی را حل کرده است. این استاندارد مشخص می‌کند که اسپن‌های فراخوانی مدل، اجرای ایجنت و استفاده از ابزارها با چه نام‌ها و ویژگی‌هایی ثبت شوند تا در پلتفرم‌هایی مثل Jaeger، Grafana Tempo یا Datadog به‌طور یکدست تحلیل‌پذیر باشند.

در این درس یاد می‌گیرید چطور ردگیری دورسنجی ایجنت‌های خود را مطابق آخرین استانداردهای OpenTelemetry پیاده‌سازی کنید و محتوای حساس پرامپت‌ها را بدون نشت امنیتی و از طریق ارجاعات خارجی لاگ بگیرید.

کارگروه ویژه‌ی هوش مصنوعی زایا در OpenTelemetry (راه‌اندازی‌شده در آوریل 2024) اسکیمای استاندارد دورسنجی ایجنت‌ها را تعریف می‌کند. همگرا شدن نام اسپن‌ها، ویژگی‌ها (attributes) و قواعد ثبت محتوا (Content Capture) در میان ارائه‌دهندگان مختلف باعث می‌شود ردگیری محاسبات (trace) ایجنت در Datadog، Grafana، Jaeger و Honeycomb معنای یکسانی داشته باشد.

اهداف یادگیری

  • نام بردن دسته‌بندی‌های اسپن GenAI: مدل/کلاینت، ایجنت، ابزار.
  • تشخیص اسپن‌های invoke_agent از نوع CLIENT در برابر INTERNAL و زمان کاربرد هرکدام.
  • فهرست کردن ویژگی‌های سطح بالای GenAI: نام ارائه‌دهنده، مدل درخواستی، شناسه‌ی منبع داده.
  • توضیح سازوکار ثبت محتوا: اختیاری بودن (opt-in)، متغیر OTEL_SEMCONV_STABILITY_OPT_IN و توصیه‌ی استفاده از ارجاع خارجی.

صورت مسئله

هر ارائه‌دهنده‌ای نام‌های دلخواه خودش را برای اسپن‌ها ابداع می‌کند. در نتیجه، تیم‌های عملیات مجبور می‌شوند برای هر فریم‌ورک داشبوردهای جداگانه بسازند. کارگروه ویژه‌ی GenAI در OpenTelemetry با تعریف استانداردی واحد برای کل اکوسیستم، این مشکل را حل می‌کند.

مفاهیم پایه

دسته‌بندی‌های اسپن

  1. اسپن‌های مدل / کلاینت. فراخوانی‌های خام مدل‌های زبانی بزرگ (LLM) را پوشش می‌دهند. این اسپن‌ها را SDKهای ارائه‌دهندگان (Anthropic، OpenAI، Bedrock) و تطبیق‌دهنده‌های (adapters) مدل در فریم‌ورک‌ها صادر می‌کنند.
  2. اسپن‌های ایجنت. شامل create_agent (هنگام ساخت ایجنت) و invoke_agent (هنگام اجرای آن).
  3. اسپن‌های ابزار. یک اسپن به‌ازای هر فراخوانی ابزار، که با رابطه‌ی والد-فرزندی به اسپن ایجنت متصل می‌شود.

نام‌گذاری اسپن‌های ایجنت

  • نام اسپن: در صورت وجود نام، invoke_agent {gen_ai.agent.name}؛ وگرنه fallback به invoke_agent.
  • نوع اسپن (Span Kind):
    • CLIENT — برای سرویس‌های ایجنت راه‌دور (OpenAI Assistants API، Bedrock Agents).
    • INTERNAL — برای فریم‌ورک‌های ایجنت درون‌فرآیندی (LangChain، CrewAI، حلقه‌ی محلی ReAct).

ویژگی‌های کلیدی

  • gen_ai.provider.name — مقادیر anthropic، openai، aws.bedrock، google.vertex.
  • gen_ai.request.model — شناسه‌ی مدل.
  • gen_ai.response.model — مدل نهاییِ پاسخ‌دهنده (ممکن است به دلیل مسیریابی با مدل درخواستی تفاوت داشته باشد).
  • gen_ai.agent.name — شناسه‌ی ایجنت.
  • gen_ai.operation.name — مقادیر chat، completion، invoke_agent، tool_call.
  • gen_ai.data_source.id — در RAG: مشخص می‌کند به کدام پایگاه داده یا مخزن متن مراجعه شده است.

قراردادهای معنایی اختصاصی نیز برای فنّاوری‌های Anthropic، Azure AI Inference، AWS Bedrock و OpenAI وجود دارد.

ثبت محتوا

قاعده‌ی پیش‌فرض: کدهای ابزار دقیق (instrumentation) نباید ورودی‌ها/خروجی‌ها را به‌طور پیش‌فرض ثبت کنند. ثبت محتوا کاملاً اختیاری است و از طریق این ویژگی‌ها انجام می‌شود:

  • gen_ai.system_instructions
  • gen_ai.input.messages
  • gen_ai.output.messages

الگوی توصیه‌شده برای محیط پروداکشن: محتوا را در جایی خارج از این سیستم ذخیره کنید (مثل S3 یا مخزن لاگ‌های خودتان) و فقط شناسه‌های ارجاع را روی اسپن‌ها بیاورید (شناسه‌های اشاره‌گر، نه متن کامل پیام‌ها). این رویکرد در واقع همان سازوکار دفاعی در برابر آلوده‌سازی محتوا در درس 27 است که این بار درون سامانه‌ی مشاهده‌پذیری به کار می‌رود.

پایداری

بیشتر قراردادهای معنایی تا مارس 2026 در وضعیت آزمایشی (experimental) هستند. برای فعال‌سازی پیش‌نمایش پایدار، این متغیر را مقداردهی کنید:

OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental

سامانه‌ی Datadog نسخه 1.37 به بالا ویژگی‌های GenAI را به‌صورت بومی روی اسکیمای LLM Observability خود نگاشت می‌کند. سایر بک‌اندها (Grafana، Honeycomb، Jaeger) نیز از ویژگی‌های خام پشتیبانی می‌کنند.

جاهایی که این الگو به خطا می‌رود

  • ثبت پرامپت‌های کامل درون اسپن‌ها. نشت اطلاعات هویتی حساس (PII)، کلیدهای محرمانه و داده‌های مشتری درون ردگیری‌ها، به‌طوری که تیم عملیات بتواند آن‌ها را بخواند. داده‌ها را در مخزن خارجی ذخیره کنید.
  • ننوشتن gen_ai.provider.name. در صورت نبود انتساب مناسب، داشبوردهای چندارائه‌دهنده‌ای مختل می‌شوند.
  • اسپن‌های بدون پیوند به والد. رها شدن اسپن‌های ابزار به‌صورت یتیم (orphan). همیشه کانتکست را منتقل کنید.
  • تنظیم نکردن متغیر اختیاری‌سازی پایداری (stability opt-in). ممکن است هنگام ارتقای بک‌اند، نام ویژگی‌های شما تغییر کند.
درخت اسپن هوش مصنوعی مولدتله‌متری استاندارد و تو‌در‌تو
GENAI SPAN TREEOpenTelemetry's GenAI conventions give every vendor one schema. An invoke_agent span is the root; each execute_tool span hangs off it; each model chat span hangs off the tool that called it. Because the names and parent-child links are standardized, the same trace reads the same way in Datadog, Grafana, Jaeger, or Honeycomb.invoke_agent CLIENTexecute_tool searchchat gpt modelexecute_tool fetchchat claude modelone schema: agent > tool > model, parent-child by convention
قراردادهای GenAI در OpenTelemetry یک شمای واحد به تمام ارائه‌دهندگان می‌دهد. اسپن invoke_agent ریشه است؛ هر اسپن execute_tool زیرمجموعه آن قرار می‌گیرد؛ و هر اسپن گفتگوی مدل وابسته به ابزاری است که آن را فراخوانی کرده. استاندارد بودن نام‌ها و پیوندهای والد-فرزند سبب می‌شود ردگیری محاسبات یکسان در Datadog، Grafana، Jaeger یا Honeycomb کاملاً مشابه خوانده شود.

پیاده‌سازی از صفر

فایل code/main.py یک صادرکننده‌ی اسپن را با کتابخانه‌ی استاندارد پیاده می‌کند که با قراردادهای معنایی GenAI همخوانی دارد:

  • ساختار Span همراه با اسکیمای ویژگی‌های GenAI.
  • ساختار Tracer با متد start_span و کانتکست‌های تودرتو.
  • سناریوی اجرای اسکریپتی ایجنت که این موارد را صادر می‌کند: create_agent، invoke_agent (از نوع INTERNAL)، اسپن‌های مجزا برای هر ابزار، و اسپن‌های chat برای فراخوانی‌های LLM.
  • حالت ثبت محتوا که پرامپت‌ها را در مخزنی خارجی ذخیره می‌کند و شناسه‌ها را روی اسپن‌ها قرار می‌دهد.

اجرای برنامه:

python3 code/main.py

خروجی: درخت اسپن‌ها همراه با تمام ویژگی‌های الزامی GenAI، به‌اضافه‌ی یک «مخزن خارجی» که ارجاعات محتوای ثبت‌شده را نشان می‌دهد.

استفاده از ابزارهای واقعی

  • Datadog LLM Observability (نسخه 1.37 به بالا) ویژگی‌ها را به‌طور بومی نگاشت می‌کند.
  • Langfuse / Phoenix / Opik (درس 24) — ابزار دقیق‌سازی خودکار در کل اکوسیستم.
  • Jaeger / Honeycomb / Grafana Tempo — ردگیری‌های خام OTel؛ ساخت داشبورد با استفاده از ویژگی‌های GenAI.
  • سرویس میزبانی شخصی (Self-hosted) — اجرای OTel Collector همراه با پردازنده‌ی GenAI.

خروجی این درس

فایل outputs/skill-otel-genai.md اسپن‌های OTel GenAI را همراه با پیش‌فرض‌های ثبت محتوا و ذخیره‌سازی ارجاعات خارجی به یک ایجنت موجود متصل می‌کند.

تمرین‌ها

  1. حلقه‌ی ReAct درس 01 را با اسپن invoke_agent (از نوع INTERNAL) و اسپن‌های اختصاصی هر ابزار مجهز کنید و خروجی را به یک نمونه‌ی Jaeger بفرستید.
  2. ثبت محتوا را در حالت «فقط ارجاع» پیاده کنید: پرامپت‌ها درون SQLite ذخیره شوند و ویژگی‌های اسپن تنها شناسه‌ی ردیف‌ها (row IDs) را نگه دارند.
  3. مشخصات فنی gen_ai.data_source.id را بخوانید و آن را به جستجوی Mem0 در درس 09 وصل کنید.
  4. متغیر محیطی OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental را تنظیم کنید و مطمئن شوید کلکتور نام ویژگی‌های شما را تغییر نمی‌دهد.
  5. یک داشبورد بسازید که صرفاً با ویژگی‌های GenAI مشخص کند: «خطاهای هر ابزار با کدام مدل‌ها همبستگی دارد».

اصطلاحات کلیدی

اصطلاح در گفتار روزمره معنای دقیق فنی
GenAI SIG «گروه GenAI در OpenTelemetry» کارگروه OTel برای تعریف اسکیما
invoke_agent «اسپن ایجنت» نام اسپنی که اجرای یک ایجنت را نشان می‌دهد
CLIENT span «فراخوانی راه‌دور» نوع اسپن برای فراخوانی یک سرویس ایجنت راه‌دور
INTERNAL span «درون‌فرآیندی» نوع اسپن برای اجرای یک ایجنت درون‌فرآیندی
gen_ai.provider.name «ارائه‌دهنده» مقادیر anthropic / openai / aws.bedrock / google.vertex
gen_ai.data_source.id «منبع RAG» مشخص‌کننده‌ی مجموعه داده یا مخزنی که داده از آن بازیابی شده
Content capture «لاگ کردن پرامپت» ثبت اختیاری پیام‌ها؛ که در محیط پروداکشن باید در مخزن خارجی ذخیره شوند
Stability opt-in «حالت پیش‌نمایش» متغیر محیطی برای تثبیت نسخه‌ی قراردادهای آزمایشی

برای مطالعه‌ی بیشتر

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درسکدام نام اسپن نمایانگر اجرای یک ایجنت در قراردادهای GenAI است؟
  2. پیش از درسگروه ویژه GenAI کدام سه دسته‌بندی اسپن را تعریف می‌کند؟
  3. حین درسچه زمانی اسپن invoke_agent از نوع CLIENT در برابر INTERNAL استفاده می‌کند؟
  4. حین درسقانون پیش‌فرض برای ثبت محتوا (ورودی‌ها و خروجی‌ها) چیست؟
  5. حین درسکدام صفت، مجموعه داده یا منبعِ مورد جستجو را برای بازیابی مشخص می‌کند؟
  6. پس از درساین درس چه توصیه‌ای برای ذخیره‌سازی محتوای پرامپت در محیط پروداکشن دارد؟
  7. پس از درسچگونه پیش‌نمایش پایدار و آزمایشی قراردادهای GenAI را فعال می‌کنید؟

سؤالات متداول

تفاوت اسپن CLIENT و INTERNAL در invoke_agent چیست؟

اسپن CLIENT برای سرویس‌های ابری و راه‌دور ایجنت (مانند OpenAI Assistants API) به کار می‌رود، در حالی که اسپن INTERNAL برای فریم‌ورک‌های درون‌فرآیندی مانند LangChain یا CrewAI استفاده می‌شود.

چرا ثبت مستقیم متن کامل پرامپت‌ها در اسپن‌های OTel توصیه نمی‌شود؟

زیرا باعث نشت اطلاعات حساس هویتی (PII) و داده‌های محرمانه مشتری به سامانه‌های مانیتورینگ عمومی می‌شود؛ استاندارد OTel ثبت محتوا را به‌طور پیش‌فرض غیرفعال دانسته و توصیه می‌کند محتوا در مخزن جداگانه ذخیره شده و فقط شناسه ارجاع در اسپن بیاید.

کاربرد ویژگی gen_ai.data_source.id چیست؟

در سیستم‌های RAG مشخص می‌کند که فرایند بازیابی اطلاعات دقیقا به کدام پایگاه داده یا مخزن متنی متصل شده است.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.