إضافة تتبعات إلى وكلائك

هام

هذه الميزة في المعاينة العامة.

توضح هذه المقالة كيفية إضافة تتبعات إلى عواملك باستخدام Fluent وMLflowClient APIs المتوفرة مع تتبع MLflow.

إشعار

للحصول على أمثلة مفصلة لمرجع API ورمز تتبع MLflow، راجع وثائق MLflow.

المتطلبات

  • MLflow 2.13.1

استخدام واجهات برمجة التطبيقات Fluent لإضافة آثار إلى وكيلك

فيما يلي مثال سريع يستخدم واجهات برمجة التطبيقات mlflow.trace Fluent وإضافة mlflow.start_span آثار إلى quickstart-agent.


import mlflow
from mlflow.deployments import get_deploy_client

class QAChain(mlflow.pyfunc.PythonModel):
    def __init__(self):
        self.client = get_deploy_client("databricks")

    @mlflow.trace(name="quickstart-agent")
    def predict(self, model_input, system_prompt, params):
        messages = [
                {
                    "role": "system",
                    "content": system_prompt,
                },
                {
                    "role": "user",
                    "content":  model_input[0]["query"]
                }
          ]

        traced_predict = mlflow.trace(self.client.predict)
        output = traced_predict(
            endpoint=params["model_name"],
            inputs={
                "temperature": params["temperature"],
                "max_tokens": params["max_tokens"],
                "messages": messages,
            },
        )

        with mlflow.start_span(name="_final_answer") as span:
          # Initiate another span generation
            span.set_inputs({"query": model_input[0]["query"]})

            answer = output["choices"][0]["message"]["content"]

            span.set_outputs({"generated_text": answer})
            # Attributes computed at runtime can be set using the set_attributes() method.
            span.set_attributes({
              "model_name": params["model_name"],
                        "prompt_tokens": output["usage"]["prompt_tokens"],
                        "completion_tokens": output["usage"]["completion_tokens"],
                        "total_tokens": output["usage"]["total_tokens"]
                    })
              return answer

إجراء الاستدلال

بعد وضع علامة على التعليمات البرمجية الخاصة بك، يمكنك تشغيل الدالة كما تفعل عادة. يستمر المثال التالي مع الدالة predict() في القسم السابق. يتم عرض التتبعات تلقائيا عند تشغيل أسلوب استدعاء ، predict().


SYSTEM_PROMPT = """
You are an assistant for Databricks users. You are answering python, coding, SQL, data engineering, spark, data science, DW and platform, API or infrastructure administration question related to Databricks. If the question is not related to one of these topics, kindly decline to answer. If you don't know the answer, just say that you don't know, don't try to make up an answer. Keep the answer as concise as possible. Use the following pieces of context to answer the question at the end:
"""

model = QAChain()

prediction = model.predict(
  [
      {"query": "What is in MLflow 5.0"},
  ],
  SYSTEM_PROMPT,
  {
    # Using Databricks Foundation Model for easier testing, feel free to replace it.
    "model_name": "databricks-dbrx-instruct",
    "temperature": 0.1,
    "max_tokens": 1000,
  }
)

واجهات برمجة التطبيقات بطلاقة

تقوم واجهات برمجة التطبيقات Fluent في MLflow تلقائيا بإنشاء التسلسل الهرمي للتتبع استنادا إلى مكان ووقت تنفيذ التعليمات البرمجية. تصف الأقسام التالية المهام المدعومة باستخدام واجهات برمجة تطبيقات MLflow Tracing Fluent.

تزيين وظيفتك

يمكنك تزيين وظيفتك باستخدام @mlflow.trace مصمم الديكور لإنشاء امتداد لنطاق الدالة المزينة. يبدأ النطاق عند استدعاء الدالة وتنتهي عند إرجاعها. يسجل MLflow تلقائيا إدخال الدالة وإخراجها، بالإضافة إلى أي استثناءات تم رفعها من الدالة. على سبيل المثال، سيؤدي تشغيل التعليمات البرمجية التالية إلى إنشاء امتداد باسم "my_function"، والتقاط وسيطات الإدخال x وy، بالإضافة إلى إخراج الدالة.

@mlflow.trace(name="agent", span_type="TYPE", attributes={"key": "value"})
def my_function(x, y):
    return x + y

استخدام مدير سياق التتبع

إذا كنت ترغب في إنشاء نطاق لكتلة عشوائية من التعليمات البرمجية، وليس مجرد دالة، يمكنك استخدام mlflow.start_span() كمدير سياق يلتف كتلة التعليمات البرمجية. يبدأ النطاق عند إدخال السياق وينتهي عند إنهاء السياق. يجب توفير إدخال النطاق ومخرجاته يدويا عبر أساليب setter لكائن الامتداد الذي يتم إنتاجه من مدير السياق.

with mlflow.start_span("my_span") as span:
    span.set_inputs({"x": x, "y": y})
    result = x + y
    span.set_outputs(result)
    span.set_attribute("key", "value")

التفاف دالة خارجية

mlflow.trace يمكن استخدام الدالة كمضمن لتتبع دالة من اختيارك. يكون هذا مفيدا عندما تريد تتبع الوظائف المستوردة من المكتبات الخارجية. فإنه يولد نفس النطاق الذي ستحصل عليه عن طريق تزيين تلك الدالة.


from sklearn.metrics import accuracy_score

y_pred = [0, 2, 1, 3]
y_true = [0, 1, 2, 3]

traced_accuracy_score = mlflow.trace(accuracy_score)
traced_accuracy_score(y_true, y_pred)

واجهات برمجة تطبيقات عميل MLflow

MlflowClient يعرض واجهات برمجة التطبيقات الدقيقة والآمنة لمؤشر الترابط لبدء التتبعات وإنهاءها وإدارة النطاقات وتعيين حقول النطاق. ويوفر التحكم الكامل في دورة حياة التتبع والبنية. تكون واجهات برمجة التطبيقات هذه مفيدة عندما لا تكون واجهات برمجة التطبيقات Fluent كافية لمتطلباتك، مثل التطبيقات متعددة مؤشرات الترابط واستدعاءات الاتصال.

فيما يلي خطوات لإنشاء تتبع كامل باستخدام عميل MLflow.

  1. إنشاء مثيل MLflowClient بواسطة client = MlflowClient().

  2. بدء تتبع باستخدام client.start_trace() الأسلوب . يؤدي هذا إلى بدء سياق التتبع وبدء امتداد جذر مطلق وإرجاع كائن نطاق جذر. يجب تشغيل هذا الأسلوب قبل start_span() واجهة برمجة التطبيقات.

    1. قم بتعيين السمات والمدخلات والمخرجات للتتبع في client.start_trace().

    إشعار

    لا يوجد ما يعادل start_trace() الأسلوب في واجهات برمجة التطبيقات Fluent. وذلك لأن واجهات برمجة التطبيقات Fluent تقوم تلقائيا بتهيئة سياق التتبع وتحديد ما إذا كان هو النطاق الجذر استنادا إلى الحالة المدارة.

  3. ترجع واجهة برمجة تطبيقات start_trace() امتدادا. احصل على معرف الطلب، ومعرف فريد للتتبع يشار إليه أيضا باسم trace_id، ومعرف النطاق الذي تم إرجاعه باستخدام span.request_id و span.span_id.

  4. ابدأ تشغيل امتداد تابع باستخدام client.start_span(request_id, parent_id=span_id) لتعيين السمات والمدخلات والمخرجات للامتداد.

    1. يتطلب request_id هذا الأسلوب و parent_id لربط الامتداد بالموضع الصحيح في التسلسل الهرمي للتتبع. يقوم بإرجاع كائن امتداد آخر.
  5. إنهاء النطاق الفرعي عن طريق استدعاء client.end_span(request_id, span_id).

  6. كرر من 3 إلى 5 لأي نطاقات تابعة تريد إنشاؤها.

  7. بعد انتهاء جميع الامتدادات الفرعية، اتصل client.end_trace(request_id) لإغلاق التتبع بأكمله وتسجيله.

from mlflow.client import MlflowClient

mlflow_client = MlflowClient()

root_span = mlflow_client.start_trace(
  name="simple-rag-agent",
  inputs={
          "query": "Demo",
          "model_name": "DBRX",
          "temperature": 0,
          "max_tokens": 200
         }
  )

request_id = root_span.request_id

# Retrieve documents that are similar to the query
similarity_search_input = dict(query_text="demo", num_results=3)

span_ss = mlflow_client.start_span(
      "search",
      # Specify request_id and parent_id to create the span at the right position in the trace
        request_id=request_id,
        parent_id=root_span.span_id,
        inputs=similarity_search_input
  )
retrieved = ["Test Result"]

# Span has to be ended explicitly
mlflow_client.end_span(request_id, span_id=span_ss.span_id, outputs=retrieved)

root_span.end_trace(request_id, outputs={"output": retrieved})