۳۰ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

لانگ اسمیت چیست؟ ردیابی و اشکال زدایی برای LLM ها

از LangSmith برای اشکال زدایی، آزمایش، ارزیابی و نظارت بر زنجیره ها و عوامل هوشمند در LangChain و سایر برنامه های LLM استفاده کنید.

از LangSmith برای اشکال زدایی، آزمایش، ارزیابی و نظارت بر زنجیره ها و عوامل هوشمند در LangChain و سایر برنامه های LLM استفاده کنید.

در معرفی اخیرم به LangChain، به طور خلاصه به LangSmith اشاره کردم. در اینجا، ما نگاهی دقیق‌تر به این پلتفرم می‌اندازیم، که با LangChain کار می‌کند و همچنین می‌تواند با سایر چارچوب‌های LLM استفاده شود.

برداشت سریع من از LangSmith این است که می توانید از آن برای ردیابی و ارزیابی استفاده کنید برنامه های کاربردی LLM و عوامل هوشمند و انتقال آنها از نمونه اولیه به تولید. آنچه در اسناد LangSmith در مورد آن می‌گوید در اینجا آمده است:

از زمان نگارش این مقاله، سه پیاده‌سازی LangChain در زبان‌های برنامه‌نویسی مختلف وجود دارد: پایتون، جاوا اسکریپت، و برو. ما از پیاده سازی Python برای مثال های خود استفاده خواهیم کرد.

LangSmith با LangChain

بنابراین، اصول اولیه. بعد از اینکه حساب LangSmith خود را راه اندازی کردم، کلید API خود را ایجاد کردم، نصب LangChain خود را با pip، و متغیرهای محیط پوسته خود را تنظیم کردم، سعی کردم برنامه شروع سریع Python را اجرا کنم:


from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI()
llm.predict("Hello, world!")

قبل از بحث درباره نتایج، نگاهی به مرکز LangSmith بیندازید:

مرکز LangSmith.

شکل ۱. هاب LangSmith به عنوان یک مخزن برای درخواست ها، مدل ها، موارد استفاده و سایر مصنوعات LLM عمل می کند.

با رفتن به برگه بعدی، لیست ردیابی پروژه پیش‌فرض در اینجا آمده است:

لیست ردیابی گزارش های شش تلاش برای اجرای سریع شروع را نشان می دهد.

شکل ۲. لیست ردیابی پروژه پایتون گزارش های شش تلاش من برای اجرای سریع شروع را نشان می دهد. پنج مورد اول ناموفق بودند: خروجی پایتون نشان دهنده مهلت زمانی OpenAI بود.

من از زمان‌بندی‌ها راهنمایی گرفتم و به حساب OpenAI خود رفتم و برنامه ChatGPT خود را به ChatGPT Plus (20 دلار در ماه) ارتقا دادم. این به من امکان دسترسی به GPT-4 و افزونه های ChatGPT را داد، اما برنامه من هنوز اجرا نمی شد. من آن را روشن گذاشتم: گمان می‌کنم به قابلیت‌های اضافی نیاز داشته باشم.

بعد، به یاد آوردم که طرح OpenAI API جدا از طرح ChatGPT است، بنابراین من آن را نیز ارتقا دادم و ۱۰ دلار به حساب اضافه کردم و آن را تنظیم کردم تا در صورت نیاز دوباره پر شود. اکنون برنامه Python به اتمام رسید و من توانستم نتایج موفقیت آمیز را در LangSmith ببینم:

پیش‌بینی موفق در LangSmith.

شکل ۳. در نهایت یک پیش‌بینی موفق. به دکمه Playground در سمت راست بالای صفحه توجه کنید.

با نگاهی به برگه ابرداده برای این اجرا به من گفت که “Hello, World!” در برابر مدل gpt-3.5-turbo در دمای نمونه برداری ۰.۷ درخواست دهید. مقیاس در اینجا ۰ تا ۱ است، که در آن ۱ تصادفی ترین است، و ۰ از مدل می خواهد دما را به طور خودکار تنظیم کند.

رمزگشایی از رویکرد کد اول در EF Core

فراداده برای یک پیش‌بینی موفق

شکل ۴. فراداده برای یک پیش‌بینی موفق. علاوه بر بلوک YAML در پایین، یک بلوک JSON با همان اطلاعات وجود دارد.

نمای کلی LangSmith

LangSmith همه تماس‌های LLMها، زنجیره‌ها، عوامل، ابزارها و رتریورها را در یک LangChain یا سایر برنامه‌های LLM ثبت می‌کند. می‌تواند به شما کمک کند یک نتیجه نهایی غیرمنتظره را اشکال‌زدایی کنید، مشخص کنید چرا یک عامل حلقه می‌زند، بفهمید چرا یک زنجیره کندتر از حد انتظار است، و به شما بگوید که یک عامل از چند نشانه استفاده کرده است.

LangSmith تجسم مستقیمی از ورودی ها و خروجی های دقیق برای همه تماس های LLM ارائه می دهد. ممکن است فکر کنید که سمت ورودی ساده است، اما اشتباه می‌کنید: علاوه بر متغیرهای ورودی (اعلان)، یک تماس LLM از یک الگو و اغلب توابع کمکی استفاده می‌کند. به عنوان مثال، بازیابی اطلاعات از وب، فایل های آپلود شده، و درخواست های سیستمی که زمینه را برای LLM تنظیم می کند.

به طور کلی، شما باید LangSmith را برای تمام کارهایی که با LangChain انجام می‌دهید روشن نگه دارید—فقط باید زمانی که گزارش‌ها مهم هستند به گزارش‌ها نگاه کنید. یکی از چیزهای مفیدی که می‌توانید امتحان کنید، اگر یک اعلان ورودی نتایج مورد نیاز را به شما نمی‌دهد، بردن درخواست به Playground است که در شکل ۵ در زیر نشان داده شده است. از دکمه سمت راست بالای صفحه ردیابی LangSmith (نشان داده شده در شکل ۴) برای پیمایش به Playground استفاده کنید.

زمین بازی LangSmith.

شکل ۵. LangSmith Playground به شما امکان می دهد ورودی خود را به صورت تعاملی ویرایش کنید، مدل و دما را تغییر دهید، پارامترهای دیگر را تنظیم کنید، فراخوانی های تابع را اضافه کنید، توالی توقف اضافه کنید، و پیام های انسان، هوش مصنوعی، سیستم، عملکرد و چت را اضافه کنید. این یک صرفه جویی در زمان در مقایسه با ویرایش همه این موارد در یک برنامه پایتون است.

فراموش نکنید که کلیدهای API خود را با استفاده از دکمه Secrets & API Keys به وب سایت اضافه کنید. توجه داشته باشید که اجراهای زمین بازی در یک پروژه جداگانه LangSmith ذخیره می شوند.

مثال LangSmith LLMCchain

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

تجزیه کننده یک زیر کلاس از کلاس BaseOutputParser است. الگوی پیام سیستم برای تماس ChatOpenAI یک مهندسی سریع نسبتاً استاندارد است.


from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
from langchain.chains import LLMChain
from langchain.schema import BaseOutputParser

class CommaSeparatedListOutputParser(BaseOutputParser):
    """Parse the output of an LLM call to a comma-separated list."""
    
    def parse(self, text: str):
        """Parse the output of an LLM call."""
        return text.strip().split(", ")

template = """You are a helpful assistant who generates comma separated lists.
A user will pass in a category, and you should generate 5 objects in that category in a comma separated list.
ONLY return a comma separated list, and nothing more."""
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template = "{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)

chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
chain = LLMChain(
    llm=ChatOpenAI(),
    prompt=chat_prompt,
    output_parser=CommaSeparatedListOutputParser()
)
chain.run("colors")

برگه اجرا برای زنجیره سطح بالا.

شکل ۶. برگه Run برای زنجیره سطح بالا، ورودی انسانی، خروجی تجزیه شده، تأخیر (زیر یک ثانیه) و نشانه های استفاده شده و همچنین زمان ساعت و وضعیت تماس را نشان می دهد.

>

غواصی به سمت تماس ChatOpenAI LLM اطلاعات بیشتری را ارائه می دهد که در شکل ۷ نشان داده شده است.

ورودی سیستم و خروجی تولید شده توسط LLM قبل از تجزیه.

شکل ۷. در سطح LLM، ورودی سیستم و خروجی تولید شده توسط LLM را قبل از تجزیه می بینیم.

ما حتی می‌توانیم اطلاعات بیشتری را از ابرداده نشان داده شده در شکل ۸ به دست آوریم.

فرداده فراخوانی ChatOpenAI.

شکل ۸. فراداده برای فراخوانی ChatOpenAI مدل استفاده شده (gpt-3.5-turbo)، دمای نمونه برداری (۰.۷)، و شماره نسخه زمان اجرا را به ما می گوید.

شروع سریع ارزیابی LangSmith

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


from langsmith import Client

example_inputs = [
  "a rap battle between Atticus Finch and Cicero",
  "a rap battle between Barbie and Oppenheimer",
  "a Pythonic rap battle between two swallows: one European and one African",
  "a rap battle between Aubrey Plaza and Stephen Colbert",
]

client = Client()
dataset_name = "Rap Battle Dataset"

# Storing inputs in a dataset lets us
# run chains and LLMs over a shared set of examples.
dataset = client.create_dataset(
    dataset_name=dataset_name, description="Rap battle prompts.",
)
for input_prompt in example_inputs:
    # Each example must be unique and have inputs defined.
    # Outputs are optional
    client.create_example(
        inputs={"question": input_prompt},
        outputs=None,
        dataset_id=dataset.id,
    )

from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain

# Since chains and agents can be stateful (they can have memory),
# create a constructor to pass in to the run_on_dataset method.
def create_chain():
    llm = ChatOpenAI(temperature=0)
    return LLMChain.from_string(llm, "Spit some bars about {input}.")

from langchain.smith import RunEvalConfig, run_on_dataset

eval_config = RunEvalConfig(
  evaluators=[
    # You can specify an evaluator by name/enum.
    # In this case, the default criterion is "helpfulness"
    "criteria",
    # Or you can configure the evaluator
    RunEvalConfig.Criteria("harmfulness"),
    RunEvalConfig.Criteria(
      {"cliche": "Are the lyrics cliche?"
      " Respond Y if they are, N if they're entirely unique."}
      )
  ]
)
run_on_dataset(
    client=client,
    dataset_name=dataset_name,
    llm_or_chain_factory=create_chain,
    evaluation=eval_config,
    verbose=True,
    project_name="llmchain-test-1",
)

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

در اینجا آمار ارزیابی، که در پایان اجرا در پایانه چاپ شده است:

است


Eval quantiles:
             ۰.۲۵  ۰.۵  ۰.۷۵  mean  mode
harmfulness  0.00  0.0   0.0  0.00   0.0
helpfulness  0.75  1.0   1.0  0.75   1.0
cliche       1.00  1.0   1.0  1.00   1.0

کسی از ایجاد اعلان‌های جنگ رپ لذت برد، همانطور که در مجموعه داده زیر نشان داده شده است:

 مجموعه داده کلید-مقدار.

شکل ۹. مجموعه داده کلید-مقدار ایجاد شده توسط call()client.create_dataset.

به‌علاوه، مجبور شدم آبری پلازا را که نقش شخصیت کمیک مرده را بازی می‌کرد، جستجو کنم. April Ludgate در پارک‌ها و تفریحات.

این کد از نام پروژه خود، llmchain-test-1 استفاده می‌کند، بنابراین ما در اینجا به دنبال نتایج می‌گردیم:

نتایج زنجیره ای LLM.

شکل ۱۰. اولین خط در هر جفت نتیجه زنجیره LLM و دومین خط نتیجه LLM است.

در اینجا نبرد رپ باربی و اوپنهایمر است که توسط gpt-3.5-turbo تولید شده است.

متن تولید شده توسط زنجیره LLM.

شکل ۱۱. این پایان متن نبرد رپ باربی/اپنهایمر است که توسط زنجیره LLM تولید شده است. هیچ جایزه ای نمی برد.

کتاب آشپزی LangSmith

در حالی که اسناد استاندارد LangSmith  اصول اولیه را پوشش می‌دهد، مخزن کتاب آشپزی LangSmith به الگوهای رایج و موارد استفاده در دنیای واقعی می پردازد. برای اجرای کد باید مخزن را کلون یا فورک کنید. کتاب آشپزی ردیابی کد شما را بدون LangChain (با استفاده از دکوراتور @traceable) پوشش می‌دهد. استفاده از LangChain Hub برای کشف، اشتراک گذاری و کنترل نسخه. تست و محک گذاری سیستم های LLM خود در پایتون و تایپ اسکریپت یا جاوا اسکریپت؛ استفاده از بازخورد کاربر برای بهبود، نظارت و شخصی سازی برنامه های خود؛ صادرات داده برای تنظیم دقیق؛ و داده های اجرا شده خود را برای تجزیه و تحلیل داده های اکتشافی صادر کنید.

نتیجه گیری

LangSmith پلتفرمی است که با LangChain یا به تنهایی کار می کند. در این مقاله، نحوه استفاده از LangSmith را برای اشکال‌زدایی، آزمایش، ارزیابی و نظارت بر زنجیره‌ها و عوامل هوشمند در برنامه LLM درجه تولید مشاهده کرده‌اید.