نحوه دستیابی به خروجی ساختاری در کلود 3.7: سه رویکرد عملی


نویسنده (ها): امری الیاهو لوی

در ابتدا منتشر شده در به سمت هوش مصنوعیبشر

نحوه دستیابی به خروجی ساختاری در کلود 3.7: سه رویکرد عملی

TL ؛ دکتر – کد کامل را می توان یافت در اینجا

در قارچ، ما در حال ایجاد یک عامل بررسی کد AI هستیم که تجزیه و تحلیل استاتیک را با آن ترکیب می کند LLMS برای استدلال عمیق در مورد کد. در طول راه ، خروجی ساختار یافته ضروری است ، به خصوص هنگامی که زنجیره ای از خروجی های مدل یا ادغام در سیستم های بزرگتر. به عنوان بخشی از آن سفر ، ما مدام مدلهای جدید را ارزیابی و ادغام می کنیم تا ببینیم که چگونه آنها در خطوط لوله پیچیده و واقعی عملکرد دارند.

Anthropic اخیراً منتشر شده است کلود غزل 3.7 توجه بسیاری را به دلیل استدلال پیشرفته و درک کد مورد توجه قرار داده است. اما اگر در حال ساخت برنامه های Genai در طبیعت هستید ، یک صید وجود دارد: خروجی ساختاری به روشی که ممکن است هنگام استفاده از حالت قدرتمند “تفکر گسترده” خود انتظار داشته باشید ، کار نمی کند.

خروجی ساختاری در درجه تولید بسیار مهم است LLM سیستم – توانایی دریافت پاسخ های سازگار و تجزیه و تحلیل که به یک طرحواره تعریف شده پایبند هستند. این که آیا شما در حال مسیریابی خروجی LLM به سیستم های پایین دست هستید یا گردش کار عامل ماژولار ، به متن آزاد نیاز دارید-به ساختار نیاز دارید که بتوانید به آن اعتماد کنید.

این پست از طریق خروجی ساختاری ، چرا در تولید اهمیت دارد و سه روش عملی برای دستیابی به آن با Sonnet 3.7. ما شامل نمونه های پایان به پایان با استفاده از لانگچین و AWS بستر برای کمک به دیگران در حمل و نقل برنامه های Genai در این مبادله حرکت می کنند.

عکس توسط تامیلهاگان در بی تظاهر کردن

“خروجی ساختاری” چیست؟

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

خروجی ساختاری چگونه کار می کند؟

به طور کلی ، سه روش مختلف برای دستیابی به خروجی ساختاری وجود دارد:

  1. از مدل بخواهید که به یک طرح از پیش تعریف شده پایبند باشد.
  2. از نسل محدود استفاده کنید.
  3. از تماس با عملکرد (ابزار) استفاده کنید.

بیایید در مورد هر کدام بحث کنیم.

مدل را به انجام این کار سوق دهد

این ساده ترین رویکرد اما همچنین قابل اعتماد ترین است. شما به سادگی به مدل دستور می دهید که پاسخ خود را در یک قالب خاص مانند JSON برگرداند. البته می توانید چند نمونه را اضافه کنید ، و سپس سعی کنید پاسخ را مستقیماً به JSON تجزیه کنید.

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

رمزگشایی محدود

همچنین گاهی اوقات “حالت JSON” نامیده می شود. در این رویکرد ، محدودیتی در نشانه ها وجود دارد که این مدل مجاز به تولید در یک نقطه خاص از زمان است. یعنی با توجه به طرح خروجی مورد نظر ، آن را به یک دستور زبان بدون متن که نمایانگر طرحواره است [1]بشر سپس ، هنگام تولید نشانه NTH ، مدل فقط از نشانه هایی که مجاز به تولید آن مطابق دستور زبان است ، انتخاب می کند.

به عنوان مثال ، اگر مدل قبلاً تولید کرده است:

{“key”: “val

مجاز به تولید آن نیست } نشانه همانطور که باید نقل قول ها را ببندد " در val(یا “نامه” بیشتری تولید کنید) به منظور JSON معتبر.

این رویکرد عالی است ، اگرچه برخی از تحقیقات نشان می دهد که ممکن است به عملکرد و کیفیت مدل آسیب برساند [2]بشر همچنین ، غزل 3.7 انسان شناسی از این گزینه پشتیبانی نمی کند.

فراخوانی عملکرد/ابزار

در این رویکرد ، مدل ها برای تولید خروجی های ساختاری که مشخص می کنند کدام عملکرد را برای تماس و با چه استدلالی مشخص می کنند ، تنظیم شده اند. فراخوانی عملکرد از طریق تنظیم دقیق آموخته می شود و به مدل اجازه می دهد تا تصمیم بگیرد که چه موقع و چگونه می تواند عملکردهای خارجی را بر اساس زمینه مکالمه فراخوانی کند.

به عنوان مثال ، ما می توانیم به مدل اطلاع دهیم که web_search عملکرد موجود ، که طول می کشد queryبه عنوان یک ورودی ، که باید یک رشته معتبر باشد. بنابراین انتظار می رود که این مدل یک تماس با عملکرد معتبر (استفاده از ابزار) از طرح زیر تولید کند:

{"function": "web_search", "arguments": {"query": "when did Claude Sonnet 3.7 come out?" }

این حالت پشتیبانی شده توسط مدل های انسان شناسی است!

حال اگر در مورد آن فکر می کنید ، اگر یک مدل می داند چگونه با پایبندی به طرحواره خود ، تماس های عملکردی با کیفیت را تولید می کند ، در واقع می توان از آن برای تولید هر طرح استفاده کرد. در واقع ، این همان چیزی است که انسان شناسی توصیه می کند [4]:

ابزارها لزوماً نیازی به توابع سمت مشتری ندارند-شما می توانید از ابزارهایی در هر زمان که می خواهید مدل JSON را که به دنبال یک طرح ارائه شده است ، بازگرداند. “

به هر حال ، اگر شما یک کاربر Langchain هستید ، وقتی خروجی ساختاری را برای مدل های انسان شناسی ارائه می دهید ، در پشت صحنه به “تماس با عملکرد” ​​ترجمه می شود.

کلود غزل 3.7

Sonnet 3.7 آخرین مدل توسط Anthropic است که شامل قابلیت های استدلال پیشرفته است. در واقع ، می توان در یکی از دو حالت با Sonnet 3.7 کار کرد: با یا بدون تفکر گسترده به گفته انسان شناسی [5]، بدون اینکه فکر کنید به عنوان یک نسخه بهبود یافته 3.5 که ما می شناسیم و دوست داریم عمل می کند ، و با تفکر این امکان را می دهد که فکر کند و تأمل کند (تا آستانه نشانه هایی که می توانید تنظیم کنید) و فقط پس از آن پاسخ خواهد داد. به نظر می رسد این رویکرد خود را اثبات می کند زیرا در معیار Ader بسیار زیاد است [6]بشر

باشه … صید چیست؟

هنگامی که تفکر گسترده روشن است – Sonnet 3.7 برخی از ویژگی هایی را که ما از آنها استفاده می کردیم ، به ویژه فراخوانی ابزار اجباری پشتیبانی نمی کند. یا به عبارت دیگر (مقدمه ما را به یاد بیاورید) از خروجی ساختاری پشتیبانی نمی کند.

در واقع ، و با استناد به بسته بندی Langchain به منبع منبع انسان شناسی [7]

خروجی ساختاری انسان شناسی به فراخوانی ابزار اجباری متکی است ، که هنگام فعال کردن “تفکر” پشتیبانی نمی شود

به طور دقیق ، همانطور که اسناد انسان شناسی بیان می کنند ، علاوه بر “استفاده از ابزار اجباری” ، همچنین دما ، TOP_P یا TOP_K پشتیبانی نمی شوند.

چه کاری می توانیم انجام دهیم؟

من 3 روش مختلف را برای دستیابی به خروجی ساختار یافته با Sonnet 3.7 معرفی می کنم.

به منظور کشف راه های مختلف ، من از Langchain با مدل های انسان شناسی از طریق AWS Bedrock استفاده می کنم – اما با انسان شناسی به عنوان ارائه دهنده یکسان خواهد بود.

بیایید فرض کنیم که ما می خواهیم این مدل بتواند یک داستان کوتاه را در برخی از موضوعات ارائه شده ایجاد کند و همچنین ژانر آن را تعیین کند.

from typing import Any
from dotenv import load_dotenv
from langchain_aws import ChatBedrockConverse
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnablePassthrough, RunnableParallel
from pydantic import BaseModel, Field

load_dotenv('.env')

class Story(BaseModel):
"""A short story with its genre"""
content: str = Field(description='A very short story')
genre: str = Field(description='The genre of the story')

حالت “بدون تفکر”

در این رویکرد ، ما خواهیم کرد نه از حالت تفکر گسترده غزل 3.7 استفاده کنید. بدون فکر کردن ، ما می توانیم از طریق تماس ابزار ، خروجی های ساختاری قابل اعتماد دریافت کنیم.

def no_thinking_mode() -> Story:
"""
Example of structured output without extended thinking mode.
This approach disables Claude's extended thinking capabilities but allows
for direct structured output via forced tool calling.
"""

prompt = PromptTemplate.from_template('Create a very short story about: {topic} and determine its genre')

llm = ChatBedrockConverse(
model_id='us.anthropic.claude-3-7-sonnet-20250219-v1:0',
region_name='us-east-2',
additional_model_request_fields={'thinking': {'type': 'disabled'}},
)
structured_llm = llm.with_structured_output(Story)
chain = prompt | structured_llm

res = chain.invoke({'topic': 'Harry Potter'})
assert isinstance(res, Story)
return resp

به یاد داشته باشید ، Langchain در اینجا “کار” را برای ما انجام می دهد و این را به یک تماس عملکردی با طرح مورد نظر ترجمه می کند.

حالت “امیدوارم ساختار یافته”

در این روش ، ما از حالت تفکر استفاده خواهیم کرد و برای خروجی ساختاری “خوب” می خواهیم.

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

در مثال زیر ، Langchain این کار را برای ما انجام خواهد داد ، اما افزایش خواهد یافت OutputParserExceptionاگر نتواند این کار را انجام دهد.

def hopefully_structured_mode() -> Story:
"""
Example of attempting structured output with extended thinking enabled.
It'll not use forced tool calling and will try to parse the response into the provided schema.
Will raise `OutputParserException` if it fails.
"""

prompt = PromptTemplate.from_template(
"""Create a very short story about: {topic} and determine its genre.
IMPORTANT: Your response must be formatted as valid JSON with two fields:
1. content: That is, the story content
2. genre: The genre of the story
"""

)
llm = ChatBedrockConverse(
model_id='us.anthropic.claude-3-7-sonnet-20250219-v1:0',
region_name='us-east-2',
additional_model_request_fields={'thinking': {'type': 'enabled', 'budget_tokens': 2000}},
)
structured_llm = llm.with_structured_output(Story) # will try to parse the result according to the provided schema
chain = prompt | structured_llm

res = chain.invoke({'topic': 'Harry Potter'})
assert isinstance(res, Story)
return res

حالت “عقل و ساختار”

در این رویکرد به Sonnet 3.7 اجازه می دهیم آنچه را که در آن خوب است ، استدلال کند ، و سپس از LLM دیگری استفاده کنید (مثلاً هیکو) برای ساختار خروجی آن. این فرایند دو مرحله ای بهترین ها را در هر دو جهان اما با هزینه پیچیدگی و تأخیر اضافی به شما می دهد.

def reason_and_structure_mode(inputs: dict[str, Any] = None) -> Story:
"""
Example of a two-stage approach: reasoning with Sonnet-3.7 followed by structuring with Haiku.
This approach leverages Sonnet's extended thinking for content generation, then
uses Haiku to transform the output into a structured format.
"""

reasoning_prompt = PromptTemplate.from_template('Create a very short story about: {topic}')
reasoning_llm = ChatBedrockConverse(
model_id='us.anthropic.claude-3-7-sonnet-20250219-v1:0',
region_name='us-east-2',
additional_model_request_fields={'thinking': {'type': 'enabled', 'budget_tokens': 2000}},
)
reasoning_chain = reasoning_prompt | reasoning_llm

structuring_prompt = PromptTemplate.from_template(
'Structure the provided story into the requested schema and assign "genre" to be {genre}. Story: {reasoning_output}'
)
structuring_llm = ChatBedrockConverse(
model_id='us.anthropic.claude-3-5-haiku-20241022-v1:0',
region_name='us-east-2',
)
structuring_llm = structuring_llm.with_structured_output(Story)
structuring_chain = structuring_prompt | structuring_llm

# Sometimes, we'll want to pass some of the inputs params directly to the "structuring model", not only the output of the reasoning model.
# In order to support that, we'll create a "dummy" function, that just gets the inputs and returns them.
# Then, we can run both the reasoning chain and the dummy function in parallel, and feed the structuring llm both:
#
# /-> reasoning_chain -> reasoning_output \
# input_params -> merge_inputs -> structuring_llm
# \-> dummy_function -> original_params /
reason_then_structure_chain = (
RunnableParallel(
reasoning_output=reasoning_chain,
original_inputs=RunnablePassthrough(),
)
| RunnableLambda(lambda x: prepare_structuring_inputs(x['original_inputs'], x['reasoning_output']))
| structuring_chain
)

inputs = {'topic': 'Harry Potter', 'genre': 'fantasy'}
res = reason_then_structure_chain.invoke(inputs)
assert isinstance(res, Story)
return res

def prepare_structuring_inputs(original_inputs: dict[str, Any], reasoning_output: str) -> dict[str, Any]:
"""
Prepares inputs for the structuring model by combining original inputs with reasoning output.
"""

return {
**original_inputs, # Pass original inputs as-is
'reasoning_output': reasoning_output, # Add reasoning chain output
}

کد کامل را می توان یافت در اینجابشر

به طور خلاصه ، در حالی که Sonnet 3.7 قابلیت استدلال قوی را ارائه می دهد ، دستیابی به تولید ساخت یافته قابل اعتماد در تولید می تواند مشکل باشد ، به خصوص با حالت تفکر گسترده. با استفاده از رویکردهایی مانند حالت تفکر ، فوری دقیق یا ترکیب استدلال با یک مدل ساختاری جداگانه ، می توانید به طور موثری در مورد این محدودیت ها کار کرده و خروجی های ساختاری را در برنامه های Genai خود ادغام کنید. این روشها یک روش عملی برای اطمینان از ادغام یکپارچه در خطوط لوله در دنیای واقعی ارائه می دهند.

منابع

[1] https://openai.com/index/introducing-tructureduredured–in-the-api/
[2] بگذارید آزادانه صحبت کنم؟ مطالعه ای در مورد تأثیر محدودیت های قالب در عملکرد مدلهای بزرگ زبان: https://arxiv.org/abs/2408.02442
[3] https://huggingface.co/learn/agents-course/bonus-unit1/what-is-function-calling
[4] https://docs.anthropic.com/en/docs/build-with-claude/tool-use/overview#json-output
[5] https://www.anthropic.com/news/claude-3-7-sonnet
[6] https://aider.chat/docs/leaderboards/
[7]https://github.com/langchain-ai/langchain/blob/blob/47ded80b64fa8bd5d3d2f8cab0fe17fd668 9019/libs/شرکا/شرکا/انسان شناسی/langchain_anthropic/chat_models.py#l1187

منتشر شده از طریق به سمت هوش مصنوعی



منبع: https://towardsai.net/p/machine-learning/how-to-achieve-structured-output-in-claude-3-7-three-practical-approaches