ToCode: post #6038 — TG.ME

        if key not in chapters:
chapters[key] = []
order.append(key)
chapters[key].append((verse, text))

chunks: list[dict] = []
for book, chapter in order:
entries = chapters[(book, chapter)]
for start in range(0, len(entries), step):
window = entries[start : start + chunk_size]
if not window:
continue
first_verse = window[0][0]
last_verse = window[-1][0]
verses_range = str(first_verse) if first_verse == last_verse else f"{first_verse}-{last_verse}"
chunk_text = " ".join(text for _, text in window)
chunks.append(
{
"book": book,
"chapter": chapter,
"verses_range": verses_range,
"chunk_text": chunk_text,
}
)
# Stop once the window has consumed the tail of the chapter.
if start + chunk_size >= len(entries):
break
return chunks


הפונקציה רצה על הטקסט ואוספת קבוצות של 6 פסוקים מכל קבוצה יוצרת chunk. כל chunk כזה מחזיק את הספר ממנו הוא נלקח, הפרק, איזה פסוקים הוא מכיל ואת הטקסט המלא.

בהמשך אני מריץ את הפקודה:

embeddings = embed_texts([c["chunk_text"] for c in chunks])


כדי ליצור את כל הוקטורים ואז את הלולאה הבאה כדי לשמור הכל בבסיס הנתונים:

    rows = [
(
chunk["book"],
chunk["chapter"],
chunk["verses_range"],
chunk["chunk_text"],
embedding,
)
for chunk, embedding in zip(chunks, embeddings)
]
with conn.cursor() as cur:
cur.execute(f"TRUNCATE {TABLE} RESTART IDENTITY")
cur.executemany(
f"INSERT INTO {TABLE} (book, chapter, verses_range, chunk_text, embedding) "
"VALUES (%s, %s, %s, %s, %s)",
rows,
)
conn.commit()


חיפוש וקטורי

החיפוש מבוצע בקובץ app.py בפונקציה inject_rag_context. זה הקוד הרלוונטי:

embedding = embed_query(query)
with ctx.deps.conn.cursor() as cur:
cur.execute(
f"""
SELECT book, chapter, verses_range, chunk_text
FROM {TABLE}
ORDER BY embedding <=> %s
LIMIT %s
""",
(embedding, ctx.deps.top_k),
)
hits = cur.fetchall()


את התוצאה שולחים לסוכן וזה כל הסיפור.

עכשיו אתם

1. הריצו את המערכת אצלכם. שאלו שאלות ובדקו האם הסוכן מצא את הקטעים הרלוונטים וענה תשובות מדויקות.
2. מצאו שאלות שהסוכן מצליח לפתור ושאלות אחרות שהוא לא מצליח. על כל שאלה שהוא לא הצליח נסו לחשוב איפה היתה הבעיה.
3. בדקו מודלים אחרים של Embedding. האם יש הבדל בתוצאות? נסו למצוא מודל טוב יותר מזה שאני מצאתי.
4. שלבו חיפוש טקסט מלא במערכת כך שהסוכן יקבל גם את הקטעים שקרובים סמנטית וגם 5 קטעים שמכילים הכי הרבה מילים משותפות עם השאלה. שימו לב איך זה משנה את התוצאות.
GitHub
pydanticai-demos/10-bible-vectordb/app.py at main · ynonp/pydanticai-demos
Contribute to ynonp/pydanticai-demos development by creating an account on GitHub.
👍1🔥1
August 22, 2026 80