הרצת סוכן AI מקומי עם Docker
בניסוי היום אני רוצה להראות איך להריץ סוכן AI מקומי עם דוקר. הסוכן הוא בסך הכל קוד TypeScript שמשתמש בספריית ה ai של ורסל והמודל איתו הוא מתקשר זה מודל מקומי.
אפשר לראות את קוד הדוגמה בגיטהאב: https://github.com/ynonp/docker-model-runner-demo
1. ארכיטקטורה
הראיתי פה לפני כמה ימים איך לבנות סוכן AI בעזרת הספריה של ורסל. בדוגמה ההיא הסוכן התחבר לרדיט והציע רעיונות לדיונים חדשים ותגובות לפי נושאים שהגדרנו מראש.
נכון, כל אחד יודע היום להריץ טייפסקריפט ו openai זמינים דרך API כך שאפשר להתחבר אליהם כמעט מכל מקום, אבל המפתח פה הוא ה"כמעט". בשביל לשלוט בסקייל של הסוכנים שלנו יש ייתרון להרצה מתוך דוקר, ואם אנחנו רוצים שהסוכנים גם ישתמשו במידע ארגוני רגיש או ירוצו On Prem אז יש ייתרון בשימוש ב LLM מקומי.
גירסאות חדשות של דוקר יודעות להריץ LLM מקומי ולחבר אותו לכל קונטיינר שרץ בתוך אותו compose, וזה מה שנראה בדוגמה היום.
2. קוד הסוכן
הלב של הדוגמה הוא הדוקר ולכן הסוכן עושה מעט מאוד, הוא צריך רק להתחבר למודל LLM מקומי ולשאול אותו שאלה. בעולם האמיתי כנראה תרצו שהסוכן ימשיך לרוץ ויתעורר פעם בכמה זמן עם cron או יטפל בבקשות HTTP. זה הקוד ב main.ts:
import { createOpenAICompatible } from "npm:@ai-sdk/openai-compatible";
import { generateText } from "npm:ai";
const aiRunner = createOpenAICompatible({
name: "ai",
baseURL: Deno.env.get("AI_RUNNER_URL")!,
});
const model = aiRunner(Deno.env.get("AI_RUNNER_MODEL")!);
export const askLocalLLMQuestion = async (
input: string,
) => {
const { text } = await generateText({
model,
prompt: input,
maxRetries: 0,
});
return text;
};
const input = `Tell me a story about your grandmother.`;
const localLLMResult =
await askLocalLLMQuestion(input);
console.log(localLLMResult);
שימו לב לשני משתני סביבה חשובים: המשתנה AI_RUNNER_MODEL
מחזיק את המודל והמשתנה AI_RUNNER_URL
מחזיק את ה URL לגישה למערכת ה LLM. שניהם הגיעו מדוקר מהקובץ docker-compose.yml
.
3. הקובץ docker-compose.yml
תחנה אחרונה בדוגמה היא הקובץ docker-compose.yml
וזה תוכנו:
services:
chat:
build: ./agent
depends_on:
- ai_runner
ai_runner:
provider:
type: model
options:
model: ai/smollm2
מאוד קצר ולדעתי קסום:
הקובץ מגדיר את הסוכן ואת ה LLM המקומי ומחבר ביניהם.
כל מה שצריך בשביל לבחור LLM אחר זה לשנות את שם המודל. כל השאר מגיע ליישום אוטומטית דרך משתני הסביבה.
דוקר דואג לבד להריץ את המודל ולשתף אותו בין היישומים שצריכים גישה.
ה LLM נגיש רק מתוך דוקר.
כאן אפשר למצוא רשימה של מודלים שנתמכים ב Docker ותוכלו להריץ: