توسعهدهندگان اکنون میتوانند پارامتر seed
را در درخواستهای Chat Completion
استفاده کنند تا خروجیهای نسبتاً ثابتی دریافت کنند. لطفاً توجه داشته باشید که این ویژگی در مرحله بتا است و در حال حاضر فقط برای مدلهای gpt-4-1106-preview
و gpt-3.5-turbo-1106
و مدلهای بعد از آنها پشتیبانی میشود.
خروجی APIهای Chat Completions
و Completions
به طور پیشفرض غیر قطعی هستند (که به این معناست که خروجیهای مدل ممکن است از درخواست به درخواست متفاوت باشند)، اما اکنون با استفاده از چند پارامتر در سطح مدل، میتوانید خروجیها را تا حدی کنترل کنید. این امکان برای بازتولید نتایج و تستها بسیار مفید است.
پیادهسازی خروجیهای ثابت #
برای دریافت خروجیهای نسبتاً قطعی در درخواستهای API:
- پارامتر
seed
را به هر عدد صحیح دلخواه خود تنظیم کنید، اما از همان مقدار در تمام درخواستها استفاده کنید. به عنوان مثال، 12345. - سایر پارامترها (مثل
prompt
،temperature
،top_p
، و غیره) را در تمام درخواستها به مقادیر ثابتی تنظیم کنید. - در پاسخ، فیلد
system_fingerprint
را بررسی کنید. اثر انگشت سیستم یک شناسه برای ترکیب فعلی وزنهای مدل، زیرساخت و سایر گزینههای پیکربندی مورد استفاده سرورهای OpenAI برای تولید پاسخ است. این مقدار هر زمان که پارامترهای درخواست تغییر کند یا OpenAI پیکربندی زیرساختهایش را بهروزرسانی کند (که ممکن است چند بار در سال اتفاق بیفتد) تغییر میکند. - اگر
seed
، پارامترهای دیگر درخواست API، وsystem_fingerprint
در تمام درخواستها مطابقت داشته باشند، خروجیهای مدل عمدتاً یکسان خواهند بود. با این حال، هنوز احتمال کمی وجود دارد که پاسخها حتی وقتی پارامترهای درخواست وsystem_fingerprint
مطابقت دارند، متفاوت باشند که این به دلیل عدم قطعیت ذاتی مدلهاست.
مثال: تولید خروجی با یک seed
ثابت
#
در این مثال، ما نحوه تولید یک قطعه کوتاه با استفاده از یک seed
ثابت را نشان میدهیم. این میتواند به ویژه در سناریوهایی که نیاز به تولید نتایج ثابت برای تست، اشکالیابی یا برای برنامههایی که نیاز به خروجیهای ثابت دارند، مفید باشد.
Python SDK #
برای اجرای کدهای زیر ابتدا باید یک کلید API را از طریق پنل کاربری گیلاس تولید کنید. برای این کار ابتدا یک حساب کاربری جدید بسازید یا اگر صاحب حساب کاربری هستید وارد پنل کاربری خود شوید. سپس، به صفحه کلید API بروید و با کلیک روی دکمه “ساخت کلید API” یک کلید جدید برای دسترسی به Gilas API بسازید.
1!pip install --upgrade openai
2
3import openai
4import asyncio
5from IPython.display import display, HTML
6
7from utils.embeddings_utils import (
8 get_embedding,
9 distances_from_embeddings
10)
11
12GPT_MODEL = "gpt-3.5-turbo"
13
14async def get_chat_response(
15 system_message: str, user_request: str, seed: int = None, temperature: float = 0.7
16):
17 try:
18 messages = [
19 {"role": "system", "content": system_message},
20 {"role": "user", "content": user_request},
21 ]
22
23 response = openai.chat.completions.create(
24 model=GPT_MODEL,
25 messages=messages,
26 seed=seed,
27 max_tokens=200,
28 temperature=temperature,
29 )
30
31 response_content = response.choices[0].message.content
32 system_fingerprint = response.system_fingerprint
33 prompt_tokens = response.usage.prompt_tokens
34 completion_tokens = response.usage.total_tokens - response.usage.prompt_tokens
35
36 table = f"""
37 <table>
38 <tr><th>Response</th><td>{response_content}</td></tr>
39 <tr><th>System Fingerprint</th><td>{system_fingerprint}</td></tr>
40 <tr><th>Number of prompt tokens</th><td>{prompt_tokens}</td></tr>
41 <tr><th>Number of completion tokens</th><td>{completion_tokens}</td></tr>
42 </table>
43 """
44 display(HTML(table))
45
46 return response_content
47 except Exception as e:
48 print(f"An error occurred: {e}")
49 return None
50
51def calculate_average_distance(responses):
52 """
53 این تابع میانگین فاصله بین جاسازیهای پاسخها را محاسبه میکند.
54 فاصله بین جاسازیها معیاری برای شباهت پاسخها است.
55 """
56 # محاسبه جاسازیها برای هر پاسخ
57 response_embeddings = [get_embedding(response) for response in responses]
58
59 # محاسبه فاصلهها بین اولین پاسخ و بقیه
60 distances = distances_from_embeddings(response_embeddings[0], response_embeddings[1:])
61
62 # محاسبه میانگین فاصله
63 average_distance = sum(distances) / len(distances)
64
65 # بازگشت میانگین فاصله
66 return average_distance
ابتدا، بیایید چند نسخه مختلف از یک قطعه کوتاه در مورد “یک سفر به مریخ” بدون پارامتر seed
تولید کنیم. این رفتار پیشفرض است:
1topic = "a journey to Mars"
2system_message = "You are a helpful assistant."
3user_request = f"Generate a short excerpt of news about {topic}."
4
5responses = []
6
7async def get_response(i):
8 print(f'Output {i + 1}\n{"-" * 10}')
9 response = await get_chat_response(
10 system_message=system_message, user_request=user_request
11 )
12 return response
13
14responses = await asyncio.gather(*[get_response(i) for i in range(5)])
15average_distance = calculate_average_distance(responses)
16print(f"The average similarity between responses is: {average_distance}")
خروجی:
اکنون، بیایید همان کد را با یک seed
ثابت 123 و temperature
برابر با 0 اجرا کنیم و پاسخها و system_fingerprint
را مقایسه کنیم.
1SEED = 123
2responses = []
3
4async def get_response(i):
5 print(f'Output {i + 1}\n{"-" * 10}')
6 response = await get_chat_response(
7 system_message=system_message,
8 seed=SEED,
9 temperature=0,
10 user_request=user_request,
11 )
12 return response
13
14responses = await asyncio.gather(*[get_response(i) for i in range(5)])
15
16average_distance = calculate_average_distance(responses)
17print(f"The average distance between responses is: {average_distance}")
:خروجی
همانطور که مشاهده میکنیم، پارامتر seed
به ما امکان میدهد تا نتایج بسیار ثابتی تولید کنیم.
نتیجهگیری #
ما نشان دادیم چگونه میتوان با استفاده از مقدار seed
ثابت، خروجیهای ثابتی از مدل تولید کرد. این ویژگی به ویژه در سناریوهایی که بازتولید مهم است، مفید است. با این حال، توجه داشته باشید که اگرچه seed
ثبات را تضمین میکند، کیفیت خروجی را تضمین نمیکند. توجه داشته باشید که وقتی میخواهید خروجیهای قابل بازتولید استفاده کنید، باید seed
را به همان عدد صحیح در درخواستهای Chat Completions
تنظیم کنید. همچنین باید هر پارامتر دیگری مانند temperature
، max_tokens
و غیره را تطبیق دهید.