🧪 اعتبار سنجی خروجی های آمازون (NOVA) با استفاده از Openai Evals + SFN + CDK

وقتی در حال ساخت با LLM هایی مانند Amazon Bedrock's Nova هستید ، یک سوال سخت وجود دارد که در نهایت باید با آن روبرو شوید:
“چگونه می دانم که پاسخ های مدل من اساساً شیب AI نیست؟”
ما گذشته از جایی هستیم که پاسخ های چشم به اندازه کافی خوب است – ما نیاز داریم اعتبار سنجی خودکار در زمان اجرا، در حالت ایده آل که متناسب با یک پشته بدون سرور ، سازگار با تولیدبشر
بنابراین بیایید آن را سیم کشی کنیم:
- ✍ نوا (از طریق بستر آمازون) پاسخی ایجاد می کند
- 📊 API جدید Evals Openai پاسخ را درجه بندی می کند
- 🤖 توابع مرحله + لامبدا آن را ارکستر کنید
- 🧱 CDK همه چیز را مستقر می کند
- ✅ و ما پاسخ ها را با گذشت زمان دنبال می کنیم تا بهبود یابد
بیایید برویم کودک تمام پشته ، به سبک Eval
معماری سطح بالا
ما چیزهایی را که Typescript Down XD را حفظ خواهیم کرد
پشته CDK
در اینجا یک تنظیم CDK برهنه (در TypeScript) برای استقرار همه چیز وجود دارد
const evalNotificationTopic = new sns.Topic(this, 'EvalNotificationTopic');
evalNotificationTopic.addSubscription(
new snsSubscriptions.EmailSubscription('your-email@example.com')
);
const getNova = new NodejsFunction(this, 'NovaFn', {
entry: 'lambda/getNovaResponse.ts',
environment: { REGION: 'us-east-1' }
});
const validateFn = new NodejsFunction(this, 'ValidateFn', {
entry: 'lambda/validateWithOpenAI.ts',
environment: {
OPENAI_API_KEY: process.env.OPENAI_API_KEY!,
}
});
const notifyTask = new tasks.SnsPublish(this, 'Notify', {
topic: evalNotificationTopic,
message: stepfunctions.TaskInput.fromText('Evaluation complete. Review results in OpenAI dashboard.'),
resultPath: stepfunctions.JsonPath.DISCARD,
});
const flow = new StepFunction(this, 'EvalFlow', {
definition: Chain
.start(new LambdaInvoke(this, 'Generate', { lambdaFunction: getNova }))
.next(new LambdaInvoke(this, 'Eval', { lambdaFunction: validateFn }))
.next(notifyTask)
});
این پشته CDK چه چیزی کاهش می یابد؟
- 2 برهدا
- یک گردش کار عملکردی
- یک SNS
بیایید آن را تجزیه کنیم
📦 لامبدا 1 – پاسخ نوا (getNovaResponse.ts
)
const input = event.prompt ?? "What is the capital of France?";
const command = new ConverseCommand({
modelId: "amazon.nova-lite-v1:0",
messages: [{ role: "user", content: [{ text: input }] }],
inferenceConfig: { temperature: 0.5 },
});
const result = await client.send(command);
const output = result.output?.message?.content?.[0]?.text;
چیزی مانند:
{
"prompt": "What is the capital of France?",
"completion": "The capital of France is Paris."
}
🔍 Lambda 2 – Eval with Openai (validateWithOpenAI.ts
)
const evalRequest = {
run_spec: {
eval_name: "cot-correctness",
args: {
samples_jsonl: [{
input: prompt,
completion: completion,
ideal: ["Paris"]
}]
}
}
};
سپس ارسال به:
https://api.openai.com/v1/evals/runs
شما برمی گردید runId
، که می توانید برای نتایج از آن نظرسنجی کنید (یا در صورت لزوم می توانید به طور خودکار با استفاده از حالت عملکرد مرحله دیگر صبر کنید)
📊 سناریوهای شبیه سازی شده
بیایید چند نمونه را اجرا کنیم و آنها را با استفاده از cot-correctness
Eval:
سریع | خروجی نوا | مورد انتظار | نمره EVAL |
---|---|---|---|
پایتخت فرانسه چیست؟ | پاریس پایتخت فرانسه است. | پاریس | ✅ پاس |
ریشه مربع 64 چیست؟ | ریشه مربع 64 8 است. | 8 | ✅ پاس |
چه کسی در جام جهانی 2022 پیروز شد؟ | فرانسه در جام جهانی 2022 پیروز شد. | وابسته به آرژانتین | ❌ شکست |
17 + 26 چیست؟ | این 33 خواهد بود. | 43 | ❌ شکست |
فتوسنتز را در 1 جمله تعریف کنید. | فتوسنتز این است که گیاهان چگونه غذا درست می کنند. | معقول | ✅ پاس |
🔁 چگونه می توان در هنگام عدم موفقیت بهبود یافت
وقتی ارزیابی شما انجام نشود ، در اینجا کاری است که می توانید انجام دهید:
1 تنظیمات استنتاج را تنظیم کنید
- دمای پایین تر برای پاسخ های قطعی
- افزایش
topP
برای خلاقیت گسترده تر (فقط در صورت لزوم)
2 طراحی سریع را بهبود بخشید
- What’s 17 + 26?
+ What’s 17 + 26? Answer only with the number
3 RUCHRIC EVAL خود را ارتقا دهید
از Evals خاص تر استفاده کنید (به عنوان مثال cot-accuracy
با exact-match
با qa-relevance
) یا موارد سفارشی ایجاد کنید تا دامنه خود را منعکس کنید
4 زنجیره ای از حالت آزمایش مجدد
در توابع مرحله ، Evals را با یک جریان مجدد با استفاده از یک مدل سریع یا مدل Fallback بسته بندی نکرد
این همه افراد XD است