๐ช ์ฅ๊ณ ๋ฌธ์ ๋ชจ๋ธ ์์ฑ ๋ฐ ๋ง์ด๊ทธ๋ ์ด์ ยถ
๋ณ๊ฒฝ ํ์ผ์ ํ ๋ฒ์ ๋ฎ์ด์ฐ๊ธฐ ํ์ค๋ ค๋ฉด, pyhub-git-commit-apply ์ ํธ๋ฆฌํฐ ์ค์นํ์ ํ์, ํ๋ก์ ํธ ๋ฃจํธ์์ ์๋ ๋ช ๋ น ์คํํ์๋ฉด ์ง์ ์ปค๋ฐ์ ๋ชจ๋ ํ์ผ์ ๋ค์ด๋ฐ์ ํ์ฌ ๊ฒฝ๋ก์ ๋ฎ์ด์ฐ๊ธฐํฉ๋๋ค.
python -m pyhub_git_commit_apply https://github.com/pyhub-kr/django-webchat-rag-langcon2025/commit/73f88f1c792f1d49a136046e228707ce404dc105
uv
๋ฅผ ์ฌ์ฉํ์ค ๊ฒฝ์ฐ
uv run pyhub-git-commit-apply https://github.com/pyhub-kr/django-webchat-rag-langcon2025/commit/73f88f1c792f1d49a136046e228707ce404dc105
์ฅ๊ณ ์ฑ ์์ฑ ๋ฐ ๋ฑ๋กยถ
chat
์ฑ์ ์์ฑํฉ๋๋ค.
python manage.py startapp chat
chat/urls.py
ํ์ผ์ ์๋ ๋ด์ฉ์ผ๋ก ์์ฑํฉ๋๋ค.
chat/urls.py
ยถfrom django.urls import path
from . import views
urlpatterns = []
mysite/urls.py
ํ์ผ์ chat/urls.py
ํจํด์ ํฌํจ์ํค๊ณ ,
๋ฃจํธ URL ์์ฒญ์ chat/
์ฃผ์๋ก ์ด๋์ํค๊ฒ ์ต๋๋ค.
mysite/urls.py
๋ฎ์ด์ฐ๊ธฐยถ 1from django.apps import apps
2from django.contrib import admin
3from django.urls import include, path
4from django.views.generic import RedirectView
5
6urlpatterns = [
7 path("admin/", admin.site.urls),
8 path("chat/", include("chat.urls")),
9 path("", RedirectView.as_view(url="/chat/")),
10]
11
12
13if apps.is_installed("debug_toolbar"):
14 urlpatterns = [
15 path("__debug__/", include("debug_toolbar.urls")),
16 ] + urlpatterns
chat
์ฑ์ ํ๋ก์ ํธ์ ๋ฑ๋กํ์ฌ ํ์ฑํํฉ๋๋ค.
mysite/settings.py
ยถINSTALLED_APPS = [
# ...
'pyhub.rag',
'chat',
]
RAG๋ฅผ ์ํ ๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก์์ SQLiteยถ
SQLite๋ ๋จ์ํ ํ ์คํธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ทธ์น์ง ์์ต๋๋ค.
SQLite์ ์๋ ค์ง์ง ์์ ์ด์ผ๊ธฐ
SQLite์ ์๋ ค์ง์ง ์์ ์ด์ผ๊ธฐ
๋ฏธ๊ตญ ํด๊ตฐ ๊ตฌ์ถํจ์ ๋ค์ด๊ฐ๋, ์ ํฌ ์ค ํผํด๋ ์ ์ด๋ ํผํผํ๊ฒ ๋์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก์ ๊ฐ๋ฐ
SQLite๋ฅผ Primary DB๋ก ์ฌ์ฉํด๋ณด์ ๋ถ?
SQLite๋ ๋ก์ปฌ ์บ์ ๋ชฉ์ ์ผ๋ก๋ ์ ๋ง ๋๋ด์ฃผ๊ฒ ํธํ๋๊ตฐ์.
SQLite๊ฐ ์ ๋ง ์ข๊ณ ํธํ๊ธด ํฉ๋๋ค๋ง, ์์ ์น์ฌ์ดํธ๋ ํํธ๊ฐ ๋ง์ง ์์ SaaS์์๋ ๊ฐ๋ฅํ๊ณ , ์์ ์ ์ํฉ์ ๋ํ ํ๋จ์์ด ๋ฌดํฑ๋๊ณ ์ ํํ๋ ๊ฑด ์ํํฉ๋๋ค.
GNโบ: ์น ์๋ฒ ์ ์ ์ฝํ ์ธ ์ ์ฅ์๋ก SQLite ์ฌ์ฉ
GNโบ: ๋ถ์ฐํ SQLite: ํจ๋ฌ๋ค์์ ์ ํ์ธ๊ฐ ๊ณผ์ฅ๋ ์ ์ ์ธ๊ฐ?
SQLite๋ ๋งค์ฐ ๋น ๋ฆ. ์ฑ๊ธ ~40โฌ/m ์ผ๋ฐ ์๋ฒ์์ ๋์์ ~168,000 ์ฝ๊ธฐ์ ~8000 ์ฐ๊ธฐ๋ฅผ ์ง์ํ ์ ์์
ํ๋ ์ด์์ ๋จธ์ ์ด ํ์ํ ์ํฉ์์์ SQLite ํ์ฉ? ์ฃผ๋ง ํ๋ก์ ํธ๊ฐ ํญ๋ฐ์ ์ธ ์ธ๊ธฐ๋ฅผ ์ป์ด ๋น ๋ฅด๊ฒ ํ์ฅํด์ผ ํ ์๋ ์์
SQLite๋ ๋จ์ํ ๋ฐฑ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋๋ผ ์์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ํ๋ณด๋๊ณ ์์
SQLite๋ ์ ๋ง ๋๋ผ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด์ง๋ง ๋๋ถ๋ถ์ ํ์ SQLite๋ฅผ ํผํ๊ณ ๋์ PostgreSQL์ ์ ํํ๋ ๊ฒ์ด ์ข์
์ ์์ ์ฃผ์ฅ๋๋ก ๋๋ถ๋ถ์ ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ SQLite๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณต์ก์ฑ๋ง ์ฆ๊ฐ์ํฌ ๋ฟ ์ค์ง์ ์ธ ์ด์ ์ด ์์ด ๋ณด์. ์ด๋ฏธ ๊ฒ์ฆ๋๊ณ ์ฑ์ํ PostgreSQL๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋์ ์ ํ์ผ ๊ฒ์.
GNโบ: ๋น์ ์ด ์๋ง๋ SQLite๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์
SQLite๋ SQL ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ ์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋จ์ผ ํ์ผ์ ์ ์ฅํ์ฌ ๊ฐ๋จํ๊ณ ๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก ๋ชจ๋์ ๊ฐ๋จํ ์๋ฃจ์ ์ ๊ณต
SQLite๋ ๋จ์ผ ํ์ผ ๊ตฌ์กฐ๋ก ์ธํ ์ ๋ก ์ง์ฐ ์๊ฐ ์ ๊ณต, โn+1 ๋ฌธ์ โ ๊ฐ์ ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ฟผ๋ฆฌ ์ ๊ฐ์์ ๋ํ ๊ฐ๋ฐ์์ ๊ฑฑ์ ๊ฐ์
SQLite๋ ๋จ์ํ ํ์ผ์ด๋ฉฐ ๋์ผํ ์ฑ์ ์ฌ๋ฌ ์ธ์คํด์ค๋ฅผ ๋ฌธ์ ์์ด ์คํํ ์ ์์ผ๋ฏ๋ก ๊ฐ๋ฐ ๋ฐ ํ ์คํธ ๊ณผ์ ์ ๋จ์ํ
SQLite๋ ์ค์๊ฐ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ๊ตฌ๋ ์ง์ ๋ถ๊ฐ, ์ธ๋ถ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ์ ์ฐ๊ฒฐ ํ์ฉ ๋ถ๊ฐ, Postgres์ฉ TimescaleDB์ ๊ฐ์ ํ๋ฌ๊ทธ์ธ ์ง์ ๋ถ๊ฐ, ์ด๊ฑฐํ ์ง์ ๋ถ๊ฐ ๋ฑ ์ผ๋ถ ์ ํ ์ฌํญ ์กด์ฌ
์ด๋ฌํ ์ ํ ์ฌํญ์๋ ๋ถ๊ตฌํ๊ณ , ์ ์๋ ์ฑ๋ฅ, ๋จ์ํ, ๋น์ฉ ์ด์ ์ผ๋ก ์ธํด SQLite๊ฐ ๋๋ค์์ ์น ๊ฐ๋ฐ์์๊ฒ ์ ํฉํ ์๋ฃจ์ ์ด๋ผ๊ณ ์ฃผ์ฅ
(Rails World 2024) ์คํ๋ ํค๋ ธํธ - ๋ ์ผ์ฆ ์ฐฝ์์ David Heinemeier Hansson
>50x compute, 100x memory, +2TB NVMe : ํ๋์จ์ด๋ ์ถฉ๋ถํ ๋นจ๋ผ์ก๊ณ (20๋ ์ ์ ๋นํด ๋์ผ๊ฐ๊ฒฉ, x100+), 1๋์ ๋ฌผ๋ฆฌ๋จธ์ ์ผ๋ก๋ ์ ๋งํผ์ ์๋น์ค๋ฅผ ํด๋ผ ์ ์์ผ๋ฉฐ, SQLite๋ฅผ ์ฌ์ฉํจ์ผ๋ก์ ๊ด๋ฆฌ ๋น์ฉ์ ์ค์ผ ์ ์๋ค.
์น์๋น์ค์์์ ๋ฉ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋๋๋ผ๋, ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ํ์ฉํ ์๋ ์๊ณ , RAG์ฉ ๋ฌธ์๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋ณด์กฐ DB๋ก์ ํ์ฉ์ ์ด๋ ์ ๊ฐ์?
์ฅ๊ณ ๋ Router ๊ธฐ๋ฅ์ ํตํด ๋ชจ๋ธ ๋ณ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ์คํธ/์์ง์ ์ฟผ๋ฆฌ ํ์์ ๋์ ์ผ๋ก ์ ํํ ์ ์์ต๋๋ค.
SQLite๋ ํ์ผ ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ฏ๋ก, ๋ฌธ์ ํ ์ด๋ธ ํ์ผ์ ๋ค๋ฅธ ๋จธ์ ์ผ๋ก ๋ณต์ฌํ๊ณ ์ฝ๊ธฐ์ ์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก์ ๊ฒฝ๋ก๋ง ๋ง์ถฐ์ฃผ๋ฉด OK.
๋ฒ๋ก์ ๊ฐ์ ๋ฐ์ดํฐ๋ค์ด ์์ฃผ ๋ณ๊ฒฝ๋์ง ์๋ ๋ฐ์ดํฐ๋ค์ ํนํ ํจ๊ณผ์
๋ฌธ์/์๋ฒ ๋ฉ์ด ์ ๋ฐ์ดํธ๋๋ฉด, ๋ค์ ์ ๋ฐ์ดํธ๋ DB ํ์ผ๋ง ๋ณต์ฌํ๋ฉด OK.
ํธ๋ํฝ์ด ์ค์์ ์ง์ค๋์ง ์๊ณ , ๋ถ์ฐ๋๋ ํจ๊ณผ.
์ฐธ๊ณ : ์ฅ๊ณ 5.1 ์ด์์์ SQLite ์ต์ ํ ์ค์
SQLite๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ผ์ ๋ํ ์ฐ๊ธฐ ์์ ์ ์ ์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฝ(lock)์ ๊ฑธ๊ธฐ ๋๋ฌธ์, ๋์์ฑ์ด ํ์ํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ฑ๋ฅ ๋ณ๋ชฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด WAL(Write-Ahead Logging) ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
WAL ๋ชจ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ์ฌํญ์ ๋ณ๋์ ๋ก๊ทธ ํ์ผ์ ๋จผ์ ๊ธฐ๋กํ ํ ๋์ค์ ๋ฉ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ผ์ ์ ์ฉํ๋ ๋ฐฉ์์ผ๋ก, ์ฝ๊ธฐ ์์ ๊ณผ ์ฐ๊ธฐ ์์ ์ด ์๋ก ์ฐจ๋จ๋์ง ์๋๋ก ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋์์ฑ์ด ํฌ๊ฒ ํฅ์๋๋ฉฐ, ํนํ ์ฝ๊ธฐ ์์ ์ด ๋ง์ RAG ์์คํ ์์ ํจ๊ณผ์ ์ ๋๋ค.
์๋ ์ค์ ์์ PRAGMA journal_mode = WAL;
๋ถ๋ถ์ด ๋ฐ๋ก ์ด WAL ๋ชจ๋๋ฅผ ํ์ฑํํ๋ ์ค์ ์
๋๋ค. ์ด ์ค์ ์ด ์์ผ๋ฉด ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์์ ์ ๊ทผํ ๋ โdatabase is lockedโ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋๋ค.
๋ํ PRAGMA synchronous = NORMAL;
์ค์ ์ ๋ฐ์ดํฐ ์์ ์ฑ๊ณผ ์ฑ๋ฅ ์ฌ์ด์ ๊ท ํ์ ๋ง์ถ๋ ์ค์ ์ผ๋ก, ํธ๋์ญ์
์ปค๋ฐ ์ ๋์คํฌ ๋๊ธฐํ ๋น๋๋ฅผ ์กฐ์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ธ ``FULL``๋ณด๋ค ์ฑ๋ฅ์ด ํฅ์๋๋ฉด์๋ ์ ์ ํ ์์ ์ฑ์ ์ ์งํฉ๋๋ค.
์๋๋ ์ฅ๊ณ 5.1๋ถํฐ ์ง์ํ๋ init_command
์ต์
์ ์ฌ์ฉํ ๊ฒ์ด๋ฉฐ, 5.1 ๋ฏธ๋ง์์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
mysite/settings.py
ยถ 1# Database
2# https://docs.djangoproject.com/en/5.1/ref/settings/#databases
3
4DATABASES = {
5 "default": env.db("DATABASE_URL", default=f"sqlite:///{BASE_DIR / 'db.sqlite3'}"),
6}
7# ๋ชจ๋ SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํด ์์ง ๋ณ๊ฒฝ ๋ฐ ์ต์ ํ ์ต์
์ ์ฉ
8for db_name in DATABASES:
9 if DATABASES[db_name]["ENGINE"] == "django.db.backends.sqlite3":
10 DATABASES[db_name]["ENGINE"] = "pyhub.db.backends.sqlite3"
11
12 DATABASES[db_name].setdefault("OPTIONS", {})
13
14 # https://gcollazo.com/optimal-sqlite-settings-for-django/
15 DATABASES[db_name]["OPTIONS"].update({
16 "init_command": (
17 "PRAGMA foreign_keys=ON;"
18 "PRAGMA journal_mode = WAL;"
19 "PRAGMA synchronous = NORMAL;"
20 "PRAGMA busy_timeout = 5000;"
21 "PRAGMA temp_store = MEMORY;"
22 "PRAGMA mmap_size = 134217728;"
23 "PRAGMA journal_size_limit = 67108864;"
24 "PRAGMA cache_size = 2000;"
25 ),
26 "transaction_mode": "IMMEDIATE",
27 # "transaction_mode": "EXCLUSIVE",
28 })
์ธ๋ฒ ํด์๋ก ๋ฌธ์ ๋ชจ๋ธ ์์ฑยถ
django-pyhub-rag
๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ 2๊ฐ์ ์ถ์ํ ๋ฌธ์ ๋ชจ๋ธ์ ์ง์ํฉ๋๋ค.
SQLiteVectorDocument
์ถ์ํ ๋ชจ๋ธ :sqlite-vec
ํ์ฅ ๋ฐฑ์๋PGVectorDocument
์ถ์ํ ๋ชจ๋ธ :pgvector
ํ์ฅ ๋ฐฑ์๋
๋ ์ถ์ํ ๋ฌธ์ ๋ชจ๋ธ์ ๋ชจ๋ ๋ํดํธ๋ก 1536 ์ฐจ์ embedding
ํ๋๋ฅผ ๊ฐ์ง๋ฉฐ text-embedding-3-small
์๋ฒ ๋ฉ ๋ชจ๋ธ์ ์ฌ์ฉํฉ๋๋ค.
chat/models.py
ยถ1from pyhub.rag.models.sqlite import SQLiteVectorDocument
2
3class TaxLawDocument(SQLiteVectorDocument):
4 pass
chat/models.py
ยถ 1from pyhub.rag.models.postgres import PGVectorDocument
2
3class TaxLawDocument(PGVectorDocument):
4 class Meta:
5 indexes = [
6 PGVectorDocument.make_hnsw_index(
7 "chat_taxlawdoc_idx", # ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์์ ์ ์ผํ ์ด๋ฆ์ผ๋ก ์ง์ ํ์
์ผ ํฉ๋๋ค.
8 # "vector", # field type
9 # "cosine", # distance metric
10 ),
11 ]
์ธ๋ฑ์ค๋ฅผ ์ง์ ํ๋ฉด ์ ์ฌ ๋ฌธ์ ๊ฒ์ ์๋๋ฅผ ํฅ์์ํฌ ์ ์์ต๋๋ค.
sqlite-vec
ํ์ฅ์์๋ ๋ณ๋ ์ธ๋ฑ์ค ์ค์ ์ ์๊ณ ํ ์ด๋ธ ์์ฑ ์์distance_metric=cosine
์ต์ ์ ์ง์ ํฉ๋๋ค.pgvector
ํ์ฅ์์๋ ์ธ๋ฑ์ค๋ฅผ ์ง์ํ๋ฏ๋ก, Cosine Distance ๋ฑ ๊ฑฐ๋ฆฌ ๊ฒ์์ ์ฌ์ฉํ์ค ์ธ๋ฑ์ค๋ฅผ ์ง์ ํด์ฃผ์ธ์.
pgvector
์์ ์ง์ํ๋ ์ธ๋ฑ์ค ํ์
RAG #02. ์ค์ : ์ธ๋ฒ RAG๋ฅผ ์ํ pgvector ์๋ฒ ๋ฉ ํํ ๋ฆฌ์ผ์ ์ฅ๊ณ ๋ชจ๋ธ์ pgvector ์ ์ฉ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋ง์ฝ 2000 ์ฐจ์์ ์ด๊ณผํ ์๋ฒ ๋ฉ์ด ํ์ํ ๊ฒฝ์ฐ embedding
ํ๋๋ฅผ ์ฌ์ ์ํ๊ณ , text-embedding-3-large
์๋ฒ ๋ฉ ๋ชจ๋ธ์ ์ฌ์ฉํฉ๋๋ค.
sqlite-vec
์์๋ ์ธ๋ฑ์ค ์ง์ ์ด ์๊ณ , ํ
์ด๋ธ ์์ฑ ์์ distance_metric=cosine
์ต์
์ ์ง์ ํฉ๋๋ค.
chat/models.py
ยถ1from pyhub.rag.fields.sqlite import SQLiteVectorField
2from pyhub.rag.models.sqlite import SQLiteVectorDocument
3
4class TaxLawDocument(SQLiteVectorDocument):
5 embedding = SQLiteVectorField(
6 dimensions=3072,
7 editable=False,
8 embedding_model="text-embedding-3-large",
9 )
PGVectorField
๋ด๋ถ์์๋ 2000์ฐจ์ ์ดํ์์๋ vector
ํ์
์ผ๋ก ์์ฑ๋๊ณ , 2000์ฐจ์์ ์ด๊ณผํ ๊ฒฝ์ฐ halfvec
ํ์
์ผ๋ก ์์ฑ๋ฉ๋๋ค.
์ธ๋ฑ์ค ํ์
๋ ํ๋ ํ์
์ ๋ง๊ฒ ์ง์ ํด์
์ผ๋ง ํฉ๋๋ค.
chat/models.py
ยถ 1from pyhub.rag.fields.postgres import PGVectorField
2from pyhub.rag.models.postgres import PGVectorDocument
3
4class TaxLawDocument(PGVectorDocument):
5 embedding = PGVectorField(
6 dimensions=3072,
7 editable=False,
8 embedding_model="text-embedding-3-large",
9 )
10
11 class Meta:
12 indexes = [
13 PGVectorDocument.make_hnsw_index(
14 "chat_taxlawdoc_idx",
15 "halfvec", # 2000์ฐจ์ ์ด๊ณผ ์์๋ halfvec ํ์
16 "cosine", # ๊ฑฐ๋ฆฌ ๊ฒ์์ ์ฌ์ฉํ์ค ์ธ๋ฑ์ค ํ์
17 ),
18 ]
์ค๋นํ ์ธ๋ฒ ํด์๋ก ๋ฐ์ดํฐ๋ 3072 ์ฐจ์ ์๋ฒ ๋ฉ์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก, ์ ์ฝ๋์ฒ๋ผ embedding
ํ๋๋ฅผ ์ฌ์ ์ํ์ฌ 3072 ์ฐจ์ ์๋ฒ ๋ฉ์ ์์ฑํฉ๋๋ค.
๊ฒฝ๊ณ
SQLiteVectorDocument
๋ชจ๋ธ๊ณผ PGVectorDocument
๋ชจ๋ธ์ ๊ฑฐ์ ๋์ผํ ์ฝ๋์ด์ง๋ง,
๋ง์ด๊ทธ๋ ์ด์
๋ด์ญ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ ๋ง์ด๊ทธ๋ ์ด์
ํ์ผ์ ๋ค์ ์์ฑํ์
์ผ ํฉ๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ยถ
๋ง์ด๊ทธ๋ ์ด์ ํ์ผ์ ์์ฑํ๊ณ (์์ ์ง์์ด ์์ฑ), ์ํ๋ SQL ๋ฌธ์ ํ์ธํ๊ณ (์์ ๋ด์ญ ํ์ธ), ๋ง์ด๊ทธ๋ ์ด์ ์ ์ํํฉ๋๋ค (์์ ์ํ).
python manage.py makemigrations chat
python manage.py sqlmigrate chat 0001_initial
python manage.py migrate

ํ
์ด๋ธ ์์ฑ ์์ CREATE VIRTUAL TABLE
์ฟผ๋ฆฌ๋ก ๊ฐ์ ํ
์ด๋ธ์ด ์์ฑ๋จ์ ํ์ธํ์ค ์ ์๊ณ ,
embedding
ํ๋๋ฅผ float[3072]
ํ์
์ผ๋ก ์ฐจ์์์ ๋ง๊ฒ ์์ฑ๋จ์ ํ์ธํ์ค ์ ์์ต๋๋ค.

embedding
ํ๋๋ 3072์ฐจ์์ผ๋ก์ 2000์ฐจ์์ด ๋๊ธฐ์ halfvec
ํ์
์ผ๋ก ์์ฑ๋ฉ๋๋ค.
2000์ฐจ์ ์ดํ๋ vector
ํ์
์ ์ฌ์ฉํ ์ ์์ต๋๋ค.