ืืชืืื ืจืืื ื ืืื ืืืฆืข ืืืคืืฉ ืืงืกื ืืื ืืืช ืืืชืืจืื ืฉืื. ืืืื ื ืืฉืื ืขื RAG ืืืคืขื ื ืื ื ืื ืืข ืืืคืืฉ ืืงืืืจื ืื ืจืื ืืืืื ืืงืจืื ืื ืืข ืืื ืืืื ืืืืง ืืช ืืชืืฆืืืช.
โ ืืืืคืืฉ ืืงืกื ืืื ืืืืคืืฉ ืืงืืืจื
ืืืืืื ืฉืจืืื ื ืืชืืื ื ืืกืื ื ืืืคืฉ ืคืืกืืื ืฉืงืฉืืจืื ืืฉืืื ืฉืืฉืชืืฉ ืฉืืื. ืจืืื ื ืฉืื ืืืฉ ืื ืคืฉืื: ืืฉืชืืฉ ืืืื ืืืฉืชืืฉ ืืืืืื ื ืจืืคืืช, ืืืื ืืืืื ืืืืื ืืืืืืช ืฉื ืืฆืืืช ืืืืื ืคืืกืืื, ืืืื ืืืชืื ืืขืืจืืช ืฉื ืฉื ืืื ื ืืงืฆืืขื ืื ืื ืืืชืื ืืช ืฉื ืืืื ื ืืืื. ืืื ืืืฆืืื ืืืื ืื ื ื ืืฆื ืคืืกืืื ืื ืจืืืื ืืื ืื ืฉืื ื ืืฆื ืคืืกืืื ืื ืจืืืื ืืื.
ืืื ืืจืขืืื ืืช ืืจืืฉืื ืื ืฉืื ืฉืื ืืขืื ืืฉืืชืืืื ืืฉืื ืืืคืืฉืื ืืืืืื ืฉืคื ืืื ืืืฉืชืืฉ ืืืืื ืืฉืคื ืืื ืืืคืฉ ืืขืจืืื ืืืืื ืฉื ืืงืกื, ืืจืขืืื ืืื ืืื:
1. ืืื ืฉืืืื ืื ืืืื ืฉืคื ืืืืืช ืืืฉื ืืืขื ืืฉืืื, ื ืืื ืืืื ืืืื ืฉืคื ืืืืืช ืงืฉืจ ืกืื ืื ืืื ืืืืื ืืืฉืคืืื.
2. ืืฉืคืืื ืฉืืฉ ืืื ืืื ืงืฉืจ ืกืื ืื, ืืืืืจ ืื ืืืคืืขืื ืืจืื ืคืขืืื ืืื ืงืจืื ืืืืชื ืืงืกืืื ืืงืืืื ืืืงืืืจืื ืฉืืืจืืง ืืื ืืื ืงืื. ืืืืื ืืืฉืคืืื ืฉืืื ืืื ืืื ืงืฉืจ ืื ืฉืืฉ ืงืฉืจ ืืืฉ ืืงืืืื ืืืงืืืจืื ืฉืืืจืืง ืืื ืืื ืืืื.
3. ืืืขืจืืช ืฉืื ื ืชืืงื ืืงืกื ืืืื ืื ืื ืื ื ืจืืฆืื ืืืคืฉ, ืชืืืง ืืืชื ืืืฉืคืืื ืื ืงืืขืื ืงืฆืจืื ืืชืงืืื ืื ืงืืข ืงืฆืจ ืืืงืืืจ. ืืฉืืฉืชืืฉ ืืืืข ืขื ืฉืืื ื ืงืืื ืื ืืช ืืฉืืื ืฉื ืืืฉืชืืฉ ืืืงืืืจ ืืื ื ืืฆื ืืืืืจ ืืืืืข ืฉืื ื ืืช ืืืงืืืจืื ืฉืืื ืงืจืืืื ืืฉืืืช ืืืฉืชืืฉ. ืืื ืืืฉืคืืื ืฉืืฉ ืืื ืืช ืืงืฉืจ ืืกืื ืื ืืื ืืืง ืืฉืืืช ืืืฉืชืืฉ.
ืืจืขืืื ืืื ืืืื ื ืฉืืข ืืืืื ื ืืื ืืฉ ืื ืืืื ืืขืืืช. ืืชืืจ ืืชืืื ืื ืืจืืจ ืืื ืืืืง ืืงืกื ืืจืื ืืืฉืคืืื ืงืฆืจืื ืืื ืืงืืื ืืืชื ืืืงืืืจืื, ืื ืืจืืจ ืืื ืฉืืฉืืื ืชืืื ืงืฉืืจื ืกืื ืืืช ืืืืงื ืืืฉืคื ืืกืืื ืื ืืงืืืฆืช ืืฉืคืืื, ืืื ืืืื ืืืื ืืช ืืืืื ืืกืื ืื ืืืคื ืืืื ืงืืจืคืืก ืืงืกืืืืื. ืืฉ ืืืื ืฉืืืืช ืืืชืืืื ืขื ืืืชืืจืื ืืืื ืืื ืืื ืขื ืืืคืืฉ ืืงืกื ืืื ืื ืื ื ืื ืืืืจืื ืืื ืขื ื ืืกืืช ืงืกื ืืืืคืืฉ ืืืืืง ืืื ืขื ืืืกืฃ ืฉื ืืื ืืงืืช ืฉืืืื ืืขืืื ืืืืื ืื ืืขืืื ืืืืจื ืืื ืืขืจืืืช ืืืืชืืืช ืืฉืืื ืืื ืืืคืืฉ ืืงืืืจื, ืืืคืืฉ ืืงืกื ืืื ืืืื ืืงืก ืืืคืืฉ ืขื ืืืืืข ืืื ืืืืช ืืืฆืืื ืืขื ืืช ืืฉืืืืช ืฉื ืืฉืชืืฉืื.
โ ืื ืื ืื ื ืืื ืื
ืืืืืื ืืืื ืื ืื ื ืจืืฆืื ืืจืืืช ืืื ืขืืื ืืืคืืฉ ืืงืืืจื ืืื ืืืชืจ ืืื ืืืคืื ืืืืจืืช ืฉื ืืขืจืืช ืืื ืืืื ืืงืืชื ืืช ืืืืคืืฉ ืืกืื ืื ืืื ืงื ืฉืืฆืืชื - ืืืคืืฉ ืืืงืกื ืืจืื ืฉืืขืืื ืื ืืฉืชื ื ืืืฉ ืื ืืืืงื ืืืขืืช ืืคืกืืงืื, ืืื ืืชื "ื. ืืืืืื ืืืื ื ืืชืื ืืขืจืืช ืฉืืืงืืช ืฉืืื ืฉื ืืฉืชืืฉ ืืืืคืฉืช ืืชื "ื ืงืืขืื ืืขืื ืืืืื ืกืื ืื ืืฉืืื ืืื ืืขืืืจื ืืช ืืฉืืื ืืื ืขื ืืงืืขืื ืฉืื ืจืื ืจืืืื ืืื ืืืืื ืฉืคื ืืื ืืงืื ืชืฉืืื ืืฉืืื.
ืืืขืจืืช ืขืืืืช ืืืืคื ืืื:
1. ืชืืืื ืขืืืจืื ืขื ืื ืืชื "ื ืืืงืืืืื ืื ืงืืืฆื ืฉื 6 ืคืกืืงืื ืืืงืืืจ. ืืื ืืงืืืฆืืช ืื ื ืฉืืืจ ืืคืืคื ืฉื ืฉื ื ืคืกืืงืื ืืื ืฉืืืืข ืกืื ืื ืื ืืื ืืืืืื ืืืขืืจ ืืื ืงืืืฆืืช. ืืช ืืืงืืืจืื ืฉืืืจืื ืืืกืืก ื ืชืื ืื Postgres ืขื ืืจืืื ืืฉื pgvector ืฉืืืคืฉืจืช ืฉืืืจืช ืืงืืืจืื ืืืฉืืืื ืืื ืืื. ืื ืชืืืื ืื ืคืขืื ืฉืงืืจื ืืืฆืืจืช ืืืขืจืืช.
2. ืืฉืืืขืจืืช ืืืืืืจ ืืืงืืื ืฉืืื ืืืืฉืชืืฉืื, ืืงืืืืื ืื ืืืชื ืืืงืืืจ ืืืืคืฉืื 5 ืืงืืืจืื ืงืจืืืื ืื. ืืืฉืืื ืืืกืืก ืื ืชืื ืื ืืช ืืืงืกืืื ืฉืืชืืืืื ืืืงืืืจืื ืืื ืืฉืืืืื ืืื ืื'ืืื ื.
ืงืื ืืืืืื ืืืื ืืืื ืืชืืงืืืช ืืืืืืืืช ืืงืืฉืืจ:
https://github.com/ynonp/pydanticai-demos/tree/main/10-bible-vectordb
ืืืืื ืขืฆืื ื ืงืจื BAAI/bge-m3 ืืืคืฉืจ ืืืชืงืื ืืืชื ืืกืคืจืืืช ืคืืืชืื ืืชืื Hugging Face. ืื ืืืื ืกืื ืื ืืขืืจืืช ืืืื ืืชืืื ืืืงืกื ืฉืื ื. ืืืจื ืฉืืฉ ืื ืืช ืืืืื ืืืชืงื ืงืืืื ืฉื ืืงืกื ืืืงืืืจ ืืื ืืกื ืืื ืงืจืืืช ืคืื ืงืฆืื ืืคืืืชืื:
def embed_texts(texts: list[str]) -> list[list[float]]:
"""Embed a batch of texts, returning one 768-dim vector per text."""
embeddings = get_model().encode(texts, show_progress_bar=True)
return [vec.tolist() for vec in embeddings]
โ ืงืืืื ืืชื ื ืืืงืืืจืื
ืืงืืืื ืืืงืืืจืื ืืืืืฉ ืืงืืืฅ index.py.
ืืคืื ืงืฆืื ืืืขื ืืื ืช ืืงืืืฅ ื ืงืจืืช
build_chunks ืืื ืืงืื ืฉืื:def build_chunks(
verses: list[tuple[str, int, int, str]],
chunk_size: int,
overlap: int,
) -> list[dict]:
"""Group verses per (book, chapter) and split into overlapping windows."""
if chunk_size <= overlap:
raise ValueError(f"CHUNK_SIZE ({chunk_size}) must be greater than OVERLAP ({overlap})")
step = chunk_size - overlap
# Preserve file order while grouping by (book, chapter).
chapters: dict[tuple[str, int], list[tuple[int, str]]] = {}
order: list[tuple[str, int]] = []
for book, chapter, verse, text in verses:
key = (book, chapter)
