ToCode: post #6033 โ€” TG.ME

๐Ÿ“Œ ื™ื•ื 9 - ื—ื™ืคื•ืฉ ื‘ื‘ืœื•ื’ ื‘ืืžืฆืขื•ืช RAG ื•ื—ื™ืคื•ืฉ ื˜ืงืกื˜ ืžืœื

ื”ืจื‘ื” ืื ืฉื™ื ืฉื•ืžืขื™ื RAG ื•ืžื™ื“ ื—ื•ืฉื‘ื™ื ืขืœ ื—ื™ืคื•ืฉ ื•ืงื˜ื•ืจื™, ืื‘ืœ ื”ืืžืช ืฉ RAG ื”ื•ื ื”ืจื‘ื” ื™ื•ืชืจ ืžื–ื”. ื”ื™ื•ื ื ื“ื‘ืจ ืขืœ RAG ื“ืจืš ืžืฉื™ืžื” ืฉืœ ื—ื™ืคื•ืฉ ืคื•ืกื˜ื™ื ื‘ื‘ืœื•ื’ ื•ืžื—ืจ ื ืขื‘ื•ืจ ืœื“ื•ื’ืžื” ืขื ื—ื™ืคื•ืฉ ื•ืงื˜ื•ืจื™. ืฉืชื™ ื”ื“ื•ื’ืžืื•ืช ื™ื—ื“ ื™ื—ืฉืคื• ื—ืœืง ืžื”ืžื•ืจื›ื‘ื•ืช ื‘ื›ืชื™ื‘ืช ืกื•ื›ื ื™ื ืฉืฆืจื™ื›ื™ื ืœื”ื—ื–ื™ืจ ืชืฉื•ื‘ื•ืช ืžืชื•ืš ืžืื’ืจ ื™ื“ืข.

โœ ืืชื’ืจ ื”ืงื•ื ื˜ืงืกื˜

ื”ืชื—ืœื ื• ืืช ื”ืกื“ืจื” ืขื ื”ืกื•ื›ืŸ ื”ื‘ื•ื—ืŸ, ืกื•ื›ืŸ ืฉืžืงื‘ืœ ืžืืžืจ ื•ืžื™ื™ืฆืจ ืžืžื ื• 10 ืฉืืœื•ืช. ื‘ื”ืžืฉืš ืจืื™ื ื• ืืช ื”ืกื•ื›ืŸ ืฉืžื™ื™ืฆืจ ื ื™ื•ื–ืœื˜ืจ ื‘ืขื–ืจืช ื›ืœื™ื, ืื•ืชื• ืกื•ื›ืŸ ื—ื™ืคืฉ ื‘ืขืฆืžื• ื‘ืจืฉืช ืžืืžืจื™ื ืžืขื ื™ื™ื ื™ื ื•ื—ื™ื‘ืจ ืื•ืชื ืœื ื™ื•ื–ืœื˜ืจ. ืฉื ื™ ื”ืžืงืจื™ื ื”ื™ื• ื“ื•ื’ืžืื•ืช ืคืฉื•ื˜ื•ืช ืœืกื•ื›ื ื™ื ืฉืžื—ื–ื™ืจื™ื ืชืฉื•ื‘ื” ืขืœ ื‘ืกื™ืก ืžืื’ืจ ื™ื“ืข ื•ื‘ืฉื ื™ื”ื ื”ืขื‘ื•ื“ื” ื”ื™ืชื” ื“ื•ืžื”: ื”ืกื•ื›ืŸ ืงื™ื‘ืœ ืืช ื”ืžื™ื“ืข ื™ื—ื“ ืขื ื”ื‘ืงืฉื” ื•ื‘ืกื•ืฃ ื”ื—ื–ื™ืจ ืชืฉื•ื‘ื” ื›ืฉื‘ื—ืœื•ืŸ ื”ืงื•ื ื˜ืงืกื˜ ืฉืœื• ื”ื™ื• ื”ืžื™ื“ืข ื”ื“ืจื•ืฉ ืœื”ื—ืœื˜ื” ื•ื”ืฉืืœื” ืฉืœ ื”ืžืฉืชืžืฉ.

ืœืžื ื’ื ื•ืŸ ื”ื–ื” ื‘ื“ื™ื•ืง ืื ื—ื ื• ืงื•ืจืื™ื RAG ืฉื–ื” ืจืืฉื™ ืชื™ื‘ื•ืช ืฉืœ Retrieval-augmented generation. ืžื™ืœืช ื”ืžืคืชื— ืฉืœ RAG ื”ื™ื Retrieval, ื”ืžืขืจื›ืช ืžื•ืฉื›ืช ืืช ื”ืžื™ื“ืข ื”ืจืœื•ื•ื ื˜ื™, ืžื•ืกื™ืคื” ืื•ืชื• ืœื—ืœื•ืŸ ื”ืงื•ื ื˜ืงืกื˜ (ื–ื” ื” Augmented) ื•ืžืคืขื™ืœื” ืืช ื”ืžื•ื“ืœ ื›ื“ื™ ืœื™ื™ืฆืจ ืชืฉื•ื‘ื”.

ื‘ืฉืชื™ ื”ื“ื•ื’ืžืื•ืช ืฉื”ืฆื’ืชื™ ืœื ื”ื™ื™ื ื• ืฆืจื™ื›ื™ื ืœื”ืชืœื‘ื˜ ืื™ื–ื” ืžื™ื“ืข ืœื”ื›ื ื™ืก ืœื—ืœื•ืŸ ื”ืงื•ื ื˜ืงืกื˜. ื”ืกื•ื›ืŸ ื”ื‘ื•ื—ืŸ ื”ื™ื” ืฆืจื™ืš ืืช ื”ืžืืžืจ ื•ื–ื” ืžื” ืฉื”ื•ื ืงื™ื‘ืœ. ืกื•ื›ืŸ ื”ื ื™ื•ื–ืœื˜ืจ ื”ื™ื” ืฆืจื™ืš ืื™ื–ืฉื”ื ืžืืžืจื™ื ื•ืžื™ืœื ืœืขืฆืžื• ืืช ื”ื—ืœื•ืŸ. ืžืขืจื›ื•ืช RAG ื™ื•ืชืจ ืžืขื ื™ื™ื ื•ืช ื”ืŸ ืžืขืจื›ื•ืช ืฉืฆืจื™ื›ื•ืช ืœื”ื—ืœื™ื˜ ื‘ืฆื•ืจื” ื“ื™ื ืžื™ืช ื•ืœืคื™ ื‘ืงืฉืช ื”ืžืฉืชืžืฉ ืื™ื–ื” ืžื™ื“ืข ืœื”ื›ื ื™ืก ืœื—ืœื•ืŸ ื”ืงื•ื ื˜ืงืกื˜ ืœืคื ื™ ืฉืคื•ื ื™ื ืœืžื•ื“ืœ.

ืžืขืจื›ืช RAG ืžื•ืจื›ื‘ืช ืœื›ืŸ ืชืžื™ื“ ืžืžืกืคืจ ื—ืœืงื™ื - ื”ื—ืœืง ืฉืœ ื”ืกื•ื›ืŸ ื•ื”ื—ืœืง ืฉืžื—ืคืฉ ืœืขื‘ื•ืช ืืช ื‘ืงืฉืช ื”ืžืฉืชืžืฉ ืขื ืžื™ื“ืข ืžืžืื’ืจ ื”ื™ื“ืข. ืฉื™ืžื• ืœื‘ ืฉื›ืœ ื—ืœืง ื”ื•ื ืขืฆืžืื™, ื”ืกื•ื›ืŸ ื”ื›ื™ ื˜ื•ื‘ ื‘ืขื•ืœื ืœื ื™ืฆืœื™ื— ืœืขื ื•ืช ื ื›ื•ืŸ ืื ืœื ืชืชื ื• ืœื• ืืช ื”ืžื™ื“ืข, ื•ื”ืžื™ื“ืข ื”ื›ื™ ืจืœื•ื•ื ื˜ื™ ืœื ื™ืขื–ื•ืจ ืื ื”ืกื•ื›ืŸ ืœื ืžืฆืœื™ื— ืœื”ื‘ื™ืŸ ืื•ืชื•. ื”ืจื‘ื” ืคืขืžื™ื ื ืจืฆื” ืœืฉืœื‘ ื’ื ืื•ืคืฆื™ื” ืœื—ื™ืคื•ืฉ ื”ืžืฉืš, ื›ืœื•ืžืจ ื ื™ืชืŸ ืœืกื•ื›ืŸ ืžื™ื“ืข ืจืืฉื•ื ื™ ื•ื›ืœื™ื ื›ื“ื™ ืœืžืฉื•ืš ืžื™ื“ืข ื ื•ืกืฃ.

ื‘ื“ื•ื’ืžื” ื”ื™ื•ื ื ื‘ื ื” ืกื•ื›ืŸ ืฉื™ื•ื“ืข ืœืขื ื•ืช ืขืœ ืฉืืœื•ืช ืœืคื™ ืคื•ืกื˜ื™ื ืžื”ื‘ืœื•ื’ ื”ื–ื”. ืื ื—ื ื• ื ื‘ื ื”:

1. ืกืงืจื™ืคื˜ ืฉืžื•ืจื™ื“ ืืช ื”ืคื•ืกื˜ื™ื ืžื”ื‘ืœื•ื’ ื•ืžืื ื“ืงืก ืื•ืชื ืœื‘ืกื™ืก ื ืชื•ื ื™ื ื”ืžื™ื•ืขื“ ืœื—ื™ืคื•ืฉ ื‘ืฉื Meilisearch.
2. ืงื•ื“ ืคื™ื™ืชื•ืŸ ืฉืžืงื‘ืœ ืฉืืœืช ืžืฉืชืžืฉ ื•ืžื—ืคืฉ ื‘ Meilisearch ืื™ื–ื” ืคื•ืกื˜ื™ื ืขืฉื•ื™ื™ื ืœื”ื™ื•ืช ืจืœื•ื•ื ื˜ื™ื ืœืฉืืœื” ื–ื• (ืื™ื–ื” ืคื•ืกื˜ื™ื ืžื›ื™ืœื™ื ืžื™ืœื™ื ืžื”ืฉืืœื”).
3. ืงื•ื“ ืกื•ื›ืŸ ืฉืžืงื‘ืœ ืคื•ืกื˜ื™ื ืžื”ื‘ืœื•ื’ ื•ืฉืืœืช ืžืฉืชืžืฉ ื•ืขื•ื ื” ืขืœ ื”ืฉืืœื” ืœืคื™ ืžื” ืฉื›ืชื•ื‘ ื‘ืคื•ืกื˜ื™ื.

ืฉืœื•ืฉืช ื”ื—ืœืงื™ื ืžื”ื•ื•ื™ื ืžืขืจื›ืช RAG ื•ื™ืœืžื“ื• ืื•ืชื ื• ืขืœ ื”ืืชื’ืจื™ื ื‘ื‘ื ื™ื™ืช ืžืขืจื›ืช ื›ื–ื•.

โœ ื™ืฆื™ืจืช ื”ืžื™ื“ืข

ืฉืœื‘ ืจืืฉื•ืŸ ื‘ืžืขืจื›ืช ื”ื•ื ื™ืฆื™ืจืช ืžืื’ืจ ื”ืžื™ื“ืข. ื‘ื“ื•ื’ืžื” ืฉืœื ื• ื ืชื—ื™ืœ ืขื ื”ืกืงืจื™ืคื˜ download-data.py ืฉืžื•ืจื™ื“ ืืช ื›ืœ ื”ืคื•ืกื˜ื™ื ืžื”ืืชืจ ืœืงื‘ืฆื™ markdown ืžืงื•ืžื™ื™ื. ื–ื” ืงืœ ื›ื™ ืื ื™ ืžืžื™ืœื ืžืคืจืกื ืืช ื”ืคื•ืกื˜ื™ื ื’ื ื‘ HTML ื•ื’ื ื‘ Markdown ื•ืœื›ืŸ ื”ืงื•ื“ ืฆืจื™ืš ืœืจื•ืฅ ืขืœ ื“ืฃ ืื• ื“ืคื™ ืื™ื ื“ืงืก ืžื”ื‘ืœื•ื’, ืœืืกื•ืฃ ืืช ื”ืงื™ืฉื•ืจื™ื ืœืคื•ืกื˜ื™ื ื•ืื– ืœื”ื•ืจื™ื“ ืื•ืชื ื‘ืœื™ ืœื”ืขืžื™ืก ืขืœ ื”ืฉืจืช. ื–ืืช ื”ืคื•ื ืงืฆื™ื” ื”ืžืจื›ื–ื™ืช:

async def run(count: int) -> None:
DATA_DIR.mkdir(parents=True, exist_ok=True)
semaphore = asyncio.Semaphore(MAX_CONCURRENCY)

async with httpx.AsyncClient(
headers={"User-Agent": USER_AGENT},
follow_redirects=True,
timeout=30.0,
) as client:
slugs = await collect_slugs(client, count, semaphore)
if len(slugs) < count:
print(f"warning: only {len(slugs)} posts found (requested {count})")

# The slug list is the download queue; the semaphore enforces at most
# MAX_CONCURRENCY concurrent requests.
await asyncio.gather(
*[download_post(client, slug, semaphore) for slug in slugs]
)

print(f"done: downloaded {len(slugs)} posts to {DATA_DIR}/")


ื”ืกืงืจื™ืคื˜ ืœื•ืงื— ืžื”ืžืฉืชืžืฉ ืžืกืคืจ ืคื•ืกื˜ื™ื ืœื”ื•ืจื™ื“ ื•ืฉื•ืžืจ ืืช ื›ื•ืœื ื‘ืชื™ืงื™ื™ืช data.

โœ ืฉืžื™ืจืช ื”ืคื•ืกื˜ื™ื ื‘ื‘ืกื™ืก ื ืชื•ื ื™ื ืœื—ื™ืคื•ืฉ

ืื—ืจื™ ืฉื™ืฉ ืœื ื• ืžืื’ืจ ืžื™ื“ืข ืื ื—ื ื• ืจื•ืฆื™ื ืœืื ื“ืงืก ืื•ืชื• ื›ืœื•ืžืจ ืœืฉืžื•ืจ ืืช ื”ืžื™ื“ืข ื‘ืฆื•ืจื” ืฉื™ื”ื™ื” ืงืœ ืœืื—ื–ืจ ืืช ื”ืคื•ืกื˜ื™ื ื”ืจืœื•ื•ื ื˜ื™ื ืœืฉืืœื•ืช ืžืฉืชืžืฉื™ื. ื–ื” ืชืคืงื™ื“ื• ืฉืœ ื”ืกืงืจื™ืคื˜ ื‘ืงื•ื‘ืฅ index.py

ืžื ื•ืข ื”ื—ื™ืคื•ืฉ ืžื™ื™ืœื™ ืฉื•ืžืจ ืื•ื‘ื™ืงื˜ื™ื ื•ื™ื•ื“ืข ืœื—ืคืฉ ื‘ื˜ืงืกื˜ ืฉืœื”ื. ื”ืคื•ื ืงืฆื™ื” ื”ืจืืฉื•ื ื” ืงื•ืจืืช ืืช ื”ืงื‘ืฆื™ื ืžื”ื“ื™ืกืง ืœืจืฉื™ืžื” ื‘ื–ื›ืจื•ืŸ:

def build_documents() -> list[dict[str, str]]:
"""Read every ``.md`` file in ``data`` and build Meilisearch documents."""
docs: list[dict[str, str]] = []
for path in sorted(DATA_DIR.glob("*.md")):
content = path.read_text(encoding="utf-8")
docs.append(
{
"id": path.stem,
"filename": path.name,
"title": _extract_title(content),
GitHub
pydanticai-demos/09-blogsearch/download-data.py at main ยท ynonp/pydanticai-demos
Contribute to ynonp/pydanticai-demos development by creating an account on GitHub.
August 21, 2026 65 1