๊ฐ๋ :
LangChain์ ๋ฒกํฐ ์ ์ฅ์ ์ข ๋ฅ:
์ฃผ์ ๊ธฐ๋ฅ:
์ฌ์ฉ ์ฌ๋ก:
pip install langchain-chroma
/ poetry add langchain-chroma
# ๋ฒกํฐ ์ ์ฅ์์ ๋ฌธ์๋ฅผ ์ ์ฅํ ๋ ์ ์ฉํ ์๋ฒ ๋ฉ ๋ชจ๋ธ
from langchain_huggingface.embeddings import HuggingFaceEmbeddings
embeddings_model = HuggingFaceEmbeddings(model_name="BAAI/bge-m3")
# ๋ฒกํฐ ์ ์ฅ์ ์์ฑ
from langchain_chroma import Chroma
chroma_db = Chroma(
collection_name="ai_sample_collection", # ๋ฒกํฐ์ ์ฅ์ ์ด๋ฆ
embedding_function=embeddings_model, # ์ฌ์ฉํ ์๋ฒ ๋ฉ ๋ชจ๋ธ
persist_directory="./chroma_db", # ์ ์ฅ ๊ฒฝ๋ก
)
chroma_db
๋ผ๋ ํด๋๊ฐ ์์ฑ๋๋ฉด์ uuid
๋ฌธ์์ด๋ก ์ ์ฅ์๊ฐ ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.# ํ์ฌ ์ ์ฅ๋ ์ปฌ๋ ์
๋ฐ์ดํฐ ํ์ธ
chroma_db.get()
- ์ถ๋ ฅ
{'ids': [],
'embeddings': None,
'documents': [],
'uris': None,
'data': None,
'metadatas': [],
'included': [<IncludeEnum.documents: 'documents'>,
<IncludeEnum.metadatas: 'metadatas'>]}
vector_store.add_documents(documents, ids)
from langchain_core.documents import Document
# ๋ฌธ์ ๋ฐ์ดํฐ - (ํ
์คํธ, ์์ค)
documents = [
("์ธ๊ณต์ง๋ฅ์ ์ปดํจํฐ ๊ณผํ์ ํ ๋ถ์ผ์
๋๋ค.", "AI ๊ฐ๋ก "),
("๋จธ์ ๋ฌ๋์ ์ธ๊ณต์ง๋ฅ์ ํ์ ๋ถ์ผ์
๋๋ค.", "AI ๊ฐ๋ก "),
("๋ฅ๋ฌ๋์ ๋จธ์ ๋ฌ๋์ ํ ์ข
๋ฅ์
๋๋ค.", "๋ฅ๋ฌ๋ ์
๋ฌธ"),
("์์ฐ์ด ์ฒ๋ฆฌ๋ ์ปดํจํฐ๊ฐ ์ธ๊ฐ์ ์ธ์ด๋ฅผ ์ดํดํ๊ณ ์์ฑํ๋ ๊ธฐ์ ์
๋๋ค.", "AI ๊ฐ๋ก "),
("์ปดํจํฐ ๋น์ ์ ์ปดํจํฐ๊ฐ ๋์งํธ ์ด๋ฏธ์ง๋ ๋น๋์ค๋ฅผ ์ดํดํ๋ ๋ฐฉ๋ฒ์ ์ฐ๊ตฌํฉ๋๋ค.", "๋ฅ๋ฌ๋ ์
๋ฌธ")
]
# Document ๊ฐ์ฒด ์์ฑ
doc_objects = []
for content, source in documents:
doc = Document(
page_content=content,
metadata={"source": source},
)
doc_objects.append(doc)
# ์์ฐจ์ ID ๋ฆฌ์คํธ ์์ฑ
doc_ids = [f"DOC_{i}" for i in range(1, len(doc_objects) + 1)]
# ๋ฌธ์๋ฅผ ๋ฒกํฐ ์ ์ฅ์์ ์ ์ฅ
added_doc_ids = chroma_db.add_documents(documents=doc_objects, ids=doc_ids)
# ๋ฒกํฐ ์ ์ฅ์์ ์ ์ฅ๋ ๋ฌธ์๋ฅผ ํ์ธ
print(f"{len(added_doc_ids)}๊ฐ์ ๋ฌธ์๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ฒกํฐ ์ ์ฅ์์ ์ถ๊ฐ๋์์ต๋๋ค.")
print(added_doc_ids)
- ์ถ๋ ฅ
5๊ฐ์ ๋ฌธ์๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ฒกํฐ ์ ์ฅ์์ ์ถ๊ฐ๋์์ต๋๋ค.
['DOC_1', 'DOC_2', 'DOC_3', 'DOC_4', 'DOC_5']
# ์ ์ฅ๋ ๋ฌธ์ ๊ฒ์
query = "์ธ๊ณต์ง๋ฅ๊ณผ ๋จธ์ ๋ฌ๋์ ๊ด๊ณ๋?"
results = chroma_db.similarity_search(query, k=2)
print(f"\n์ฟผ๋ฆฌ: {query}")
print("๊ฐ์ฅ ์ ์ฌํ ๋ฌธ์:")
for doc in results:
print(f"- {doc.page_content} [์ถ์ฒ: {doc.metadata['source']}]")
- ์ถ๋ ฅ
์ฟผ๋ฆฌ: ์ธ๊ณต์ง๋ฅ๊ณผ ๋จธ์ ๋ฌ๋์ ๊ด๊ณ๋?
๊ฐ์ฅ ์ ์ฌํ ๋ฌธ์:
- ๋จธ์ ๋ฌ๋์ ์ธ๊ณต์ง๋ฅ์ ํ์ ๋ถ์ผ์
๋๋ค. [์ถ์ฒ: AI ๊ฐ๋ก ]
- ๋ฅ๋ฌ๋์ ๋จธ์ ๋ฌ๋์ ํ ์ข
๋ฅ์
๋๋ค. [์ถ์ฒ: ๋ฅ๋ฌ๋ ์
๋ฌธ]
# ํ์ฌ ์ ์ฅ๋ ์ปฌ๋ ์
๋ฐ์ดํฐ ํ์ธ
chroma_db.get()
- ์ถ๋ ฅ
{'ids': ['DOC_1', 'DOC_2', 'DOC_3', 'DOC_4', 'DOC_5'],
'embeddings': None,
'documents': ['์ธ๊ณต์ง๋ฅ์ ์ปดํจํฐ ๊ณผํ์ ํ ๋ถ์ผ์
๋๋ค.',
'๋จธ์ ๋ฌ๋์ ์ธ๊ณต์ง๋ฅ์ ํ์ ๋ถ์ผ์
๋๋ค.',
'๋ฅ๋ฌ๋์ ๋จธ์ ๋ฌ๋์ ํ ์ข
๋ฅ์
๋๋ค.',
'์์ฐ์ด ์ฒ๋ฆฌ๋ ์ปดํจํฐ๊ฐ ์ธ๊ฐ์ ์ธ์ด๋ฅผ ์ดํดํ๊ณ ์์ฑํ๋ ๊ธฐ์ ์
๋๋ค.',
'์ปดํจํฐ ๋น์ ์ ์ปดํจํฐ๊ฐ ๋์งํธ ์ด๋ฏธ์ง๋ ๋น๋์ค๋ฅผ ์ดํดํ๋ ๋ฐฉ๋ฒ์ ์ฐ๊ตฌํฉ๋๋ค.'],
'uris': None,
'data': None,
'metadatas': [{'source': 'AI ๊ฐ๋ก '},
{'source': 'AI ๊ฐ๋ก '},
{'source': '๋ฅ๋ฌ๋ ์
๋ฌธ'},
{'source': 'AI ๊ฐ๋ก '},
{'source': '๋ฅ๋ฌ๋ ์
๋ฌธ'}],
'included': [<IncludeEnum.documents: 'documents'>,
<IncludeEnum.metadatas: 'metadatas'>]}
vector_store.update_document(document_id, document)
# ์
๋ฐ์ดํธํ ๋ฌธ์ ์์ฑ
updated_document_1 = Document(
page_content="์ธ๊ณต์ง๋ฅ์ ์ปดํจํฐ ๊ณผํ์ ํต์ฌ ๋ถ์ผ ์ค ํ๋๋ก, ๊ธฐ๊ณํ์ต๊ณผ ๋ฅ๋ฌ๋์ ํฌํจํฉ๋๋ค.",
metadata={"source": "AI ๊ฐ๋ก "},
)
updated_document_2 = Document(
page_content="๋จธ์ ๋ฌ๋์ ๋ฐ์ดํฐ๋ก๋ถํฐ ํ์ตํ์ฌ ์์ธก๊ณผ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ์ธ๊ณต์ง๋ฅ์ ํ์ ๋ถ์ผ์
๋๋ค.",
metadata={"source": "AI ๊ฐ๋ก "},
)
updated_document_3 = Document(
page_content="๋ฅ๋ฌ๋์ ๋จธ์ ๋ฌ๋์ ํ ์ข
๋ฅ๋ก, ์ฌ์ธต ์ ๊ฒฝ๋ง์ ์ฌ์ฉํ์ฌ ํ์ตํฉ๋๋ค.",
metadata={"source": "๋ฅ๋ฌ๋ ์
๋ฌธ"},
)
# ๋จ์ผ ๋ฌธ์ ์
๋ฐ์ดํธ
chroma_db.update_document(document_id="DOC_1", document=updated_document_1)
# ์ฌ๋ฌ ๋ฌธ์ ํ ๋ฒ์ ์
๋ฐ์ดํธ
chroma_db.update_documents(
ids=["DOC_2", "DOC_3"],
documents=[updated_document_2, updated_document_3]
)
vectorstore.delete(ids)
# ๋ฌธ์ id๋ฅผ ์ง์ ํ์ฌ ์ญ์
chroma_db.delete(ids=["DOC_5"])
# ์ปฌ๋ ์
ํ์ธ
chroma_db.get()
- ์ถ๋ ฅ
{'ids': ['DOC_1', 'DOC_2', 'DOC_3', 'DOC_4'],
'embeddings': None,
'documents': ['์ธ๊ณต์ง๋ฅ์ ์ปดํจํฐ ๊ณผํ์ ํต์ฌ ๋ถ์ผ ์ค ํ๋๋ก, ๊ธฐ๊ณํ์ต๊ณผ ๋ฅ๋ฌ๋์ ํฌํจํฉ๋๋ค.',
'๋จธ์ ๋ฌ๋์ ๋ฐ์ดํฐ๋ก๋ถํฐ ํ์ตํ์ฌ ์์ธก๊ณผ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ์ธ๊ณต์ง๋ฅ์ ํ์ ๋ถ์ผ์
๋๋ค.',
'๋ฅ๋ฌ๋์ ๋จธ์ ๋ฌ๋์ ํ ์ข
๋ฅ๋ก, ์ฌ์ธต ์ ๊ฒฝ๋ง์ ์ฌ์ฉํ์ฌ ํ์ตํฉ๋๋ค.',
'์์ฐ์ด ์ฒ๋ฆฌ๋ ์ปดํจํฐ๊ฐ ์ธ๊ฐ์ ์ธ์ด๋ฅผ ์ดํดํ๊ณ ์์ฑํ๋ ๊ธฐ์ ์
๋๋ค.'],
'uris': None,
'data': None,
'metadatas': [{'source': 'AI ๊ฐ๋ก '},
{'source': 'AI ๊ฐ๋ก '},
{'source': '๋ฅ๋ฌ๋ ์
๋ฌธ'},
{'source': 'AI ๊ฐ๋ก '}],
'included': [<IncludeEnum.documents: 'documents'>,
<IncludeEnum.metadatas: 'metadatas'>]}
similarity_search
query = "์ธ๊ณต์ง๋ฅ๊ณผ ๋จธ์ ๋ฌ๋์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?"
results = chroma_db.similarity_search(
query,
k=2,
filter={"source": "AI ๊ฐ๋ก "}
)
print("์ ์ฌ๋ ๊ฒ์ ๊ฒฐ๊ณผ:")
for doc in results:
print(f"- {doc.page_content} [์ถ์ฒ: {doc.metadata['source']}]")
- ์ถ๋ ฅ
์ ์ฌ๋ ๊ฒ์ ๊ฒฐ๊ณผ:
- ๋จธ์ ๋ฌ๋์ ๋ฐ์ดํฐ๋ก๋ถํฐ ํ์ตํ์ฌ ์์ธก๊ณผ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ์ธ๊ณต์ง๋ฅ์ ํ์ ๋ถ์ผ์
๋๋ค. [์ถ์ฒ: AI ๊ฐ๋ก ]
- ์ธ๊ณต์ง๋ฅ์ ์ปดํจํฐ ๊ณผํ์ ํต์ฌ ๋ถ์ผ ์ค ํ๋๋ก, ๊ธฐ๊ณํ์ต๊ณผ ๋ฅ๋ฌ๋์ ํฌํจํฉ๋๋ค. [์ถ์ฒ: AI ๊ฐ๋ก ]
similarity_search_with_score
query = "๋ฅ๋ฌ๋์ ์ด๋ค ๋ถ์ผ์์ ์ฌ์ฉ๋๋์?"
results = chroma_db.similarity_search_with_score(
query,
k=2,
filter={"source": "AI ๊ฐ๋ก "}
)
print("์ ์๊ฐ ํฌํจ๋ ์ ์ฌ๋ ๊ฒ์ ๊ฒฐ๊ณผ:\n")
for doc, score in results:
print(f"- ์ ์: {score:.4f}")
print(f" ๋ด์ฉ: {doc.page_content}")
print(f" [์ถ์ฒ: {doc.metadata['source']}]")
print()
- ์ถ๋ ฅ
์ ์๊ฐ ํฌํจ๋ ์ ์ฌ๋ ๊ฒ์ ๊ฒฐ๊ณผ:
- ์ ์: 0.7292
๋ด์ฉ: ์ธ๊ณต์ง๋ฅ์ ์ปดํจํฐ ๊ณผํ์ ํต์ฌ ๋ถ์ผ ์ค ํ๋๋ก, ๊ธฐ๊ณํ์ต๊ณผ ๋ฅ๋ฌ๋์ ํฌํจํฉ๋๋ค.
[์ถ์ฒ: AI ๊ฐ๋ก ]
- ์ ์: 0.8394
๋ด์ฉ: ๋จธ์ ๋ฌ๋์ ๋ฐ์ดํฐ๋ก๋ถํฐ ํ์ตํ์ฌ ์์ธก๊ณผ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ์ธ๊ณต์ง๋ฅ์ ํ์ ๋ถ์ผ์
๋๋ค.
[์ถ์ฒ: AI ๊ฐ๋ก ]
similarity_search_with_relevance_scores
query = "๋ฅ๋ฌ๋์ ์ด๋ค ๋ถ์ผ์์ ์ฌ์ฉ๋๋์?"
results = chroma_db.similarity_search_with_relevance_scores(
query,
k=2,
filter={"source": "AI ๊ฐ๋ก "}
)
print(f"์ฟผ๋ฆฌ: {query}")
print("\n๊ฒ์ ๊ฒฐ๊ณผ (๊ด๋ จ์ฑ ์ ์ ํฌํจ):")
for doc, score in results:
print(f"- ๊ด๋ จ์ฑ ์ ์: {score:.4f}")
print(f" ๋ด์ฉ: {doc.page_content}")
print(f" [์ถ์ฒ: {doc.metadata['source']}]")
print()
- ์ถ๋ ฅ
์ฟผ๋ฆฌ: ๋ฅ๋ฌ๋์ ์ด๋ค ๋ถ์ผ์์ ์ฌ์ฉ๋๋์?
๊ฒ์ ๊ฒฐ๊ณผ (๊ด๋ จ์ฑ ์ ์ ํฌํจ):
- ๊ด๋ จ์ฑ ์ ์: 0.4844
๋ด์ฉ: ์ธ๊ณต์ง๋ฅ์ ์ปดํจํฐ ๊ณผํ์ ํต์ฌ ๋ถ์ผ ์ค ํ๋๋ก, ๊ธฐ๊ณํ์ต๊ณผ ๋ฅ๋ฌ๋์ ํฌํจํฉ๋๋ค.
[์ถ์ฒ: AI ๊ฐ๋ก ]
- ๊ด๋ จ์ฑ ์ ์: 0.4065
๋ด์ฉ: ๋จธ์ ๋ฌ๋์ ๋ฐ์ดํฐ๋ก๋ถํฐ ํ์ตํ์ฌ ์์ธก๊ณผ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ์ธ๊ณต์ง๋ฅ์ ํ์ ๋ถ์ผ์
๋๋ค.
[์ถ์ฒ: AI ๊ฐ๋ก ]
chroma_db2 = Chroma(
collection_name="ai_sample_collection",
embedding_function=embeddings_model,
persist_directory="./chroma_db",
)
chroma.sqlite3
ํ์ผ์์ collections
๋ฅผ ํ์ธํ๋ฉด id
, name
, dimension
๋ฑ ํ์ธ์ด ๊ฐ๋ฅํ๋ค.