ToCode: post #6034 — TG.ME

                "content": content,
}
)
return docs


ובהמשך אנחנו קוראים לפונקציה של מיילי שנקראת add_documents כדי לשמור את המסמכים בבסיס הנתונים:

docs = build_documents()
task = index.add_documents(docs)


ביצירת האינדקס אני שומר גם טבלה של מילים נרדפות. טבלה זו תעזור למצוא פוסטים קשורים גם כשלא השתמשו בשאלה באותן מילים בדיוק - וכן אתם כבר יכולים לראות את האתגר בבנייה, תחזוקה ושמירה של טבלה זו:

HEBREW_SYNONYMS: dict[str, list[str]] = {
# Singular plural
"טיפ": ["טיפים"],
"כלי": ["כלים"],
"שגיאה": ["שגיאות"],
"באג": ["באגים"],
"קוד": ["קודים"],
"פיצ׳ר": ["פיצ׳רים"],
"מודל": ["מודלים"],
"סוכן": ["סוכנים"],
"פרויקט": ["פרויקטים"],
"שאלה": ["שאלות"],
"תשובה": ["תשובות"],
"פתרון": ["פתרונות"],
"בעיה": ["בעיות"],
"דוגמה": ["דוגמאות"],
"קובץ": ["קבצים"],
"שפה": ["שפות"],
"כתבה": ["כתבות"],
"פוסט": ["פוסטים"],
# Common abbreviations / shortcuts
"בינה מלאכותית": ["AI", "ai", "ב״מ"],
"למידת מכונה": ["ML", "ml", "machine learning"],
"עיבוד שפה טבעית": ["NLP", "nlp"],
"ביג דאטה": ["big data"],
# English terms that appear in Hebrew text
"prompt": ["פרומפט", "פרומפטים", "הנדסת פרומפטים"],
"agent": ["אייג׳נט", "אייג׳נטים"],
"token": ["טוקן", "טוקנים"],
"API": ["api", "ממשק"],
"framework": ["פריימוורק", "פריימוורקים"],
"library": ["ספרייה", "ספריות"],
"debugging": ["דיבוג", "ניפוי שגיאות"],
"refactoring": ["ריפקטור", "ריפקטורינג", "שכתוב קוד"],
"testing": ["בדיקות", "טסטים", "טסט"],
"code review": ["קוד ריוויו", "סקירת קוד"],
"open source": ["קוד פתוח", "open-source"],
"CLI": ["cli", "שורת פקודה"],
"LLM": ["llm", "מודל שפה גדול", "מודלי שפה"],
"RAG": ["rag"],
"MCP": ["mcp"],
"VSCode": ["vs code", "ויזואל סטודיו קוד", "vs-code"],
"Git": ["git", "גיט"],
"GitHub": ["github", "גיטהאב"],
"Copilot": ["copilot", "קופיילוט"],
"Claude": ["claude", "קלוד"],
"Docker": ["docker", "דוקר"],
"Python": ["python", "פייתון"],
"JavaScript": ["javascript", "js", "ג׳אווה סקריפט"],
"TypeScript": ["typescript", "ts"],
"Ruby": ["ruby", "רובי"],
"Rails": ["rails", "ריילס"],
"React": ["react", "ריאקט"],
"Vue": ["vue", "ויו"],
}


חיפוש ושילוב התוצאות

ראינו בדוגמאות קודמות איך להגדיר לסוכן דף הוראות סטטי - כלומר טקסט של instructions שיסביר לסוכן מה צריך לעשות. בעבודה RAG דף ההוראות נבנה בצורה דינמית לפי השאילתה ולכן אנחנו משתמשים במנגנון נוסף של Pydantic AI Agents שנקרא Dynamic Instructions. מנגנון זה מאפשר לנו לשמור פונקציה בתור תוספת להוראות, פידנטיק יפעיל את הפונקציה ויוסיף את ערך ההחזר שלה לדף ההוראות. הפונקציה רצה בדיוק לפני שליחת ההודעה למודל ויש לה גישה לפרומפט ולתלויות של אותה בקשה.

נקרא את הקוד הבא מתוך הקובץ app.py:

@agent.instructions
async def inject_rag_context(ctx: RunContext[Deps]) -> str:
"""Search Meilisearch and attach the top matching posts to the prompt.

The filenames are also stored in ``ctx.metadata['rag_sources']`` so the
output validator can prepend them to the final answer.
"""
query = _extract_query(ctx.prompt)
if not query:
return ""

if ctx.metadata is None:
ctx.metadata = {}

results = ctx.deps.meili.index(INDEX_NAME).search(query, {"limit": ctx.deps.top_k})
hits = results.get("hits", [])
filenames = [hit["filename"] for hit in hits]
ctx.metadata["rag_sources"] = filenames

if not hits:
return (
"No relevant blog posts were found for this question. "
"Answer based on your general knowledge, but mention that no posts matched."
)

sections = [f"--- {hit['filename']} ---\n{hit['content']}" for hit in hits]
return (
f"Relevant blog posts found by Meilisearch: {', '.join(filenames)}. "
"Use the content below to answer the user's question. "
"Start your response by listing the filenames of the posts you used, "
GitHub
pydanticai-demos/09-blogsearch/app.py at main · ynonp/pydanticai-demos
Contribute to ynonp/pydanticai-demos development by creating an account on GitHub.
August 21, 2026 62 1