استفاده پیشرفته
این بخش تکنیکهای پیشرفته را برای ویژگیها و موارد استفاده خاص API پوشش میدهد.
تکمیل چت
- حفظ تاریخچه مکالمه: تاریخچه مکالمه مرتبط را برای زمینه شامل کنید، اما مراقب محدودیتهای توکن باشید.
- محدود کردن طول مکالمه: تاریخچههای بسیار طولانی توکنهای بیشتری مصرف میکنند و گاهی اوقات میتوانند منجر به از دست دادن زمینه قبلی توسط مدل شوند. در صورت نیاز، خلاصهسازی یا کوتاه کردن تاریخچه را در نظر بگیرید.
- استفاده از فراخوانی تابع / ابزارها: برای استخراج دادههای ساختاریافته یا تعامل با سیستمهای خارجی، از پارامتر
toolsبرای دریافت خروجیهای JSON قابل اعتماد یا فعال کردن اقدامات استفاده کنید.
# مثال استفاده از ابزارها (قبلا فراخوانی تابع)
functions = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "دریافت وضعیت آب و هوای فعلی در یک مکان معین",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "شهر و ایالت، به عنوان مثال سانفرانسیسکو، کالیفرنیا",
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "واحد دما",
},
},
"required": ["location"],
},
},
}
]
response = client.chat.completions.create(
model="gpt-5.5",
messages=[{"role": "user", "content": "هوای بوستون چطور است؟"}],
tools=functions,
tool_choice="auto", # یا نام یک تابع را مشخص کنید
)
# پردازش پاسخ، که ممکن است شامل فراخوانی ابزار باشد
message = response.choices[0].message
if message.tool_calls:
# رسیدگی به فراخوانی ابزار...
passنسخه معادل Responses API
وقتی مدل انتخابی از /v1/responses پشتیبانی میکند، این نسخه را کنار مثال Chat Completions استفاده کنید. messages به input منتقل میشود و متن نهایی از response.output_text خوانده میشود.
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["AVALAI_API_KEY"],
base_url="https://api.avalai.ir/v1",
)
tools = [
{
"type": "function",
"name": "get_current_weather",
"description": "Get the current weather in a given location.",
"parameters": {
"type": "object",
"properties": {"location": {"type": "string"}},
"required": ["location"],
"additionalProperties": False,
},
}
]
response = client.responses.create(
model="gpt-5.5",
input="هوای بوستون چطور است؟",
tools=tools,
)
for item in response.output:
if item.type == "function_call":
print(item.name, item.arguments)
print(response.output_text)messages→input- پیام سیستمی →
instructionsیا آیتمdeveloper choices[0].message.content→response.output_text- برای ابزارها و خروجیهای چندوجهی،
response.outputرا بر اساسtypeبررسی کنید.
تعبیهسازیها (Embeddings)
- نرمالسازی بردارها: هنگام استفاده از تعبیهسازیها برای جستجوی شباهت (به عنوان مثال، با شباهت کسینوسی)، بردارها را به طول واحد نرمالسازی کنید تا مقایسهها دقیق باشند.
- استفاده از کاهش ابعاد: برای تجسم تعبیهسازی با ابعاد بالا، تکنیکهایی مانند t-SNE یا UMAP میتوانند آنها را به فضای 2D یا 3D نگاشت کنند.
- قطعهبندی را در نظر بگیرید: برای تعبیهسازی اسناد طولانی، متن را به قطعات کوچکتر و معنیدار (مانند پاراگرافها یا بخشها) قبل از تولید تعبیهسازیها تقسیم کنید.
import numpy as np
# نرمالسازی بردارها
def normalize(v):
norm = np.linalg.norm(v)
if norm == 0:
return v
return v / norm
# محاسبه شباهت کسینوسی بین بردارهای نرمالشده
def cosine_similarity(a_norm, b_norm):
return np.dot(a_norm, b_norm)
# مثال استفاده (با فرض اینکه 'emb_a' و 'emb_b' بردارهای تعبیهسازی هستند)
# norm_a = normalize(emb_a)
# norm_b = normalize(emb_b)
# similarity = cosine_similarity(norm_a, norm_b)تولید تصویر
- جزئی و مشخص باشید: هرچه جزئیات بیشتری در پرامپت ارائه دهید، تصویر تولید شده احتمالا به دیدگاه شما نزدیکتر خواهد بود. توضیحات اشیا، تنظیمات، سبک، حالت، ترکیببندی و غیره را شامل کنید.
- سبک و رسانه را مشخص کنید: به صراحت سبک هنری مورد نظر (مثلا "فتورئالیستی"، "نقاشی امپرسیونیستی"، "هنر سایبرپانک"، "طرح آبرنگ") یا رسانه (مثلا "نقاشی دیجیتال"، "عکس"، "خمیری") را ذکر کنید.
- روی پرامپتها تکرار کنید: تولید تصویر عالی اغلب نیاز به اصلاح دارد. نتایج را تجزیه و تحلیل کنید و پرامپت خود را بر این اساس تنظیم کنید. در صورت نیاز برای حذف عناصر، پرامپتهای منفی اضافه کنید.
پرامپت خوب:
نقاشی دیجیتال دقیق از یک جنگل زیستتاب در شب، با قارچهای غولپیکر درخشان، نهرهای درخشان و موجودات عرفانی پنهان در سایهها، به سبک هنر مفهومی فانتزی.پرامپت کمتر مؤثر:
یک جنگل جادویی.خروجیهای قابل تکرار
تکمیلهای چت به صورت پیشفرض غیرقطعی هستند (به این معنی که خروجیهای مدل ممکن است از یک درخواست به درخواست دیگر متفاوت باشند). با این حال، میتوانید با استفاده از پارامتر seed و نظارت بر فیلد پاسخ system_fingerprint به خروجیهای سازگارتری دست یابید.
برای دریافت خروجیهای تقریبا قطعی در فراخوانیهای API:
- پارامتر
seedرا به هر عدد صحیح دلخواه تنظیم کنید و از همان مقدار در درخواستها استفاده کنید - اطمینان حاصل کنید که تمام پارامترهای دیگر (مانند
promptیاtemperature) در همه درخواستها دقیقا یکسان هستند
توجه داشته باشید که قطعیت همچنان ممکن است تحت تاثیر تغییرات ضروری در پیکربندیهای مدل قرار گیرد. فیلد system_fingerprint به پیگیری این تغییرات کمک میکند - اگر این مقدار بین پاسخها متفاوت باشد، ممکن است به دلیل تغییرات سطح سیستم، خروجیهای متفاوتی مشاهده کنید.
# مثال استفاده از پارامتر seed برای خروجیهای قابل تکرار
response1 = client.chat.completions.create(
model="gpt-5.5",
messages=[{"role": "user", "content": "یک شعر کوتاه درباره کوهها بنویس"}],
seed=123456, # تنظیم یک مقدار seed مشخص
)
# system_fingerprint را میتوان بررسی کرد
fingerprint = response1.system_fingerprint
print(f"اثر انگشت سیستم: {fingerprint}")
# استفاده از همان seed و پارامترها باید نتایج مشابهی تولید کند
response2 = client.chat.completions.create(
model="gpt-5.5",
messages=[{"role": "user", "content": "یک شعر کوتاه درباره کوهها بنویس"}],
seed=123456, # همان seed قبلی
)نسخه معادل Responses API
وقتی مدل انتخابی از /v1/responses پشتیبانی میکند، این نسخه را کنار مثال Chat Completions استفاده کنید. messages به input منتقل میشود و متن نهایی از response.output_text خوانده میشود.
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["AVALAI_API_KEY"],
base_url="https://api.avalai.ir/v1",
)
response = client.responses.create(
model="gpt-5.5",
instructions="You are a helpful assistant.",
input="یک شعر کوتاه درباره کوهها بنویس",
)
print(response.output_text)messages→input- پیام سیستمی →
instructionsیا آیتمdeveloper choices[0].message.content→response.output_text- برای ابزارها و خروجیهای چندوجهی،
response.outputرا بر اساسtypeبررسی کنید.
مدیریت توکنها
مدلهای زبانی متن را در قالب بخشهایی به نام توکن میخوانند و مینویسند. در زبان انگلیسی، یک توکن میتواند به کوتاهی یک کاراکتر یا به بلندی یک کلمه باشد (مثلا a یا apple)، و در برخی زبانها توکنها میتوانند حتی کوتاهتر از یک کاراکتر یا بلندتر از یک کلمه باشند.
به عنوان یک قاعده کلی، ۱ توکن تقریبا معادل ۴ کاراکتر یا ۰.۷۵ کلمه در متن انگلیسی است.
تعداد کل توکنها در یک فراخوانی API بر موارد زیر تاثیر میگذارد:
- هزینه فراخوانی API شما، زیرا به ازای هر توکن هزینه پرداخت میکنید
- مدت زمان فراخوانی API شما، زیرا نوشتن توکنهای بیشتر زمان بیشتری میبرد
- آیا فراخوانی API شما اصلا کار میکند یا خیر، زیرا کل توکنها باید کمتر از حداکثر پنجره زمینه مدل باشد
هم توکنهای ورودی و هم توکنهای خروجی در این مقادیر محاسبه میشوند. به عنوان مثال، اگر فراخوانی API شما از ۱۰ توکن در ورودی پیام استفاده کرده و ۲۰ توکن در خروجی پیام دریافت کرده باشد، برای ۳۰ توکن صورتحساب دریافت خواهید کرد.
برای مشاهده تعداد توکنهای استفاده شده در یک فراخوانی API، فیلد usage را در پاسخ API بررسی کنید:
response = client.chat.completions.create(
model="gpt-5.5", messages=[{"role": "user", "content": "سلام، حالت چطور است؟"}]
)
# بررسی استفاده از توکن
print(f"توکنهای پرامپت: {response.usage.prompt_tokens}")
print(f"توکنهای تکمیلی: {response.usage.completion_tokens}")
print(f"کل توکنها: {response.usage.total_tokens}")نسخه معادل Responses API
وقتی مدل انتخابی از /v1/responses پشتیبانی میکند، این نسخه را کنار مثال Chat Completions استفاده کنید. messages به input منتقل میشود و متن نهایی از response.output_text خوانده میشود.
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["AVALAI_API_KEY"],
base_url="https://api.avalai.ir/v1",
)
response = client.responses.create(
model="gpt-5.5",
instructions="You are a helpful assistant.",
input="سلام، حالت چطور است؟",
)
print(response.output_text)messages→input- پیام سیستمی →
instructionsیا آیتمdeveloper choices[0].message.content→response.output_text- برای ابزارها و خروجیهای چندوجهی،
response.outputرا بر اساسtypeبررسی کنید.
برای مکالمات طولانی، توجه داشته باشید که اگر به محدودیت توکن مدل نزدیک شوند، ممکن است پاسخها قطع شوند. به عنوان مثال، یک مکالمه که نزدیک به حداکثر محدودیت توکن مدل باشد، فضای بسیار محدودی برای پاسخ خواهد داشت.
جزئیات پارامترها
جریمههای فرکانس و حضور
از جریمههای فرکانس و حضور میتوان برای کاهش احتمال نمونهبرداری از توالیهای تکراری توکنها استفاده کرد:
- جریمه فرکانس: تکرار توکنهای خاص را بر اساس فرکانس موجود آنها در متن تولید شده کاهش میدهد
- جریمه حضور: تکرار هر توکنی که در متن تولید شده ظاهر شده است را کاهش میدهد
مقادیر منطقی برای ضرایب جریمه حدود ۰.۱ تا ۱ است اگر میخواهید نمونههای تکراری را کمی کاهش دهید. برای سرکوب قویتر تکرار، میتوانید ضرایب را تا ۲ افزایش دهید، اما این ممکن است به طور قابل توجهی کیفیت نمونه را کاهش دهد. مقادیر منفی میتوانند احتمال تکرار را افزایش دهند.
# مثال استفاده از جریمههای فرکانس و حضور
response = client.chat.completions.create(
model="gpt-5.5",
messages=[{"role": "user", "content": "یک پاراگراف با واژگان متنوع بنویس"}],
frequency_penalty=0.7, # کاهش تکرار توکنهای خاص
presence_penalty=0.5, # کاهش تکرار هر توکنی که ظاهر شده است
)نسخه معادل Responses API
وقتی مدل انتخابی از /v1/responses پشتیبانی میکند، این نسخه را کنار مثال Chat Completions استفاده کنید. messages به input منتقل میشود و متن نهایی از response.output_text خوانده میشود.
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["AVALAI_API_KEY"],
base_url="https://api.avalai.ir/v1",
)
response = client.responses.create(
model="gpt-5.5",
instructions="You are a helpful assistant.",
input="یک پاراگراف با واژگان متنوع بنویس",
)
print(response.output_text)messages→input- پیام سیستمی →
instructionsیا آیتمdeveloper choices[0].message.content→response.output_text- برای ابزارها و خروجیهای چندوجهی،
response.outputرا بر اساسtypeبررسی کنید.
احتمالات لگاریتمی توکن
برای توکن خروجی در جایگاه t، احتمال لگاریتمی آن برابر log p(token_t | context, previous tokens) است. با گرفتن نمای این مقدار، احتمال شرطی مدل برای آن توکن در همان جایگاه به دست میآید. این مقدار احتمال درست بودن پاسخ یا دستهبندی نیست؛ حتی یک توکن با احتمال بسیار بالا نیز میتواند نتیجهای نادرست را نشان دهد.
برای دستهبندی، از برچسبهای کوتاهی استفاده کنید که انتظار میرود هرکدام یک توکن باشند، ساختار پاسخ را اعتبارسنجی کنید و نتایج نامطمئن یا بدساخت را برای بررسی انسانی بفرستید:
import math
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["AVALAI_API_KEY"],
base_url="https://api.avalai.ir/v1",
)
LABELS = {
"A": "account_access",
"B": "billing",
"C": "technical_issue",
"D": "other",
}
EXAMPLE_THRESHOLD = 0.85
ticket = "I was charged twice for the same invoice."
response = client.chat.completions.create(
model="gpt-5.5",
messages=[
{
"role": "system",
"content": (
"Classify the support request. Return exactly one label with no extra text: "
"A=account access, B=billing, C=technical issue, D=other."
),
},
{"role": "user", "content": ticket},
],
temperature=0,
logprobs=True,
top_logprobs=4,
)
choice = response.choices[0]
token_logprobs = (
choice.logprobs.content if choice.logprobs and choice.logprobs.content else []
)
raw_label = choice.message.content or ""
if len(token_logprobs) != 1:
result = {
"decision": "human_review",
"reason": "missing_or_multitoken_logprobs",
}
else:
selected_token = token_logprobs[0]
label = raw_label.strip()
if label not in LABELS or selected_token.token.strip() != label:
result = {
"decision": "human_review",
"reason": "unexpected_label",
}
else:
token_likelihood = math.exp(selected_token.logprob)
result = {
"decision": (
"accept" if token_likelihood >= EXAMPLE_THRESHOLD else "human_review"
),
"label": LABELS[label],
"token_likelihood": token_likelihood,
}
print(result)EXAMPLE_THRESHOLD فقط یک مقدار نمونه است، نه توصیهای برای محیط عملیاتی. آستانههای مختلف را روی یک مجموعه نگهداشتهشده و برچسبخورده ارزیابی کنید و مقدار نهایی را بر اساس اهداف precision و recall ویژه همان کاربرد، هزینه پذیرش اشتباه و حجم بررسی انسانی انتخاب کنید. کالیبراسیون logprob میتواند با تغییر مدل، پرامپت، مجموعه برچسبها، زبان و توزیع داده تغییر کند؛ پس پس از هرکدام از این تغییرات، ارزیابی را دوباره اجرا کنید.
برای یک دنباله، logprob توکنها را با هم جمع کنید و سپس نمای مجموع را بگیرید تا احتمال مشترک دنباله به دست آید. این امتیاز به طور طبیعی خروجیهای کوتاهتر را ترجیح میدهد. میانگین logprob هر توکن یا perplexity به صورت exp(-average_logprob) میتواند اثر طول را کاهش دهد، اما این معیارها فقط برای مقایسه نسبی در یک تنظیم کنترلشده با مدل و پرامپت یکسان مفید هستند؛ هیچکدام درستی را اندازهگیری نمیکنند.
این راهنما برای AvalAI از مثال رسمی استفاده از logprobs در OpenAI Cookbook و مخزن گیتهاب openai/openai-cookbook اقتباس شده است.