๐ LangChain์ RecursiveCharacterTextSplitter
๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์กฐํฉ ํ
์คํธ
test_cases = [
{"chunk_size": 200, "chunk_overlap": 50, "title": "Test Doc Case 1", "db_path": "test_faiss_db_case1"},
{"chunk_size": 300, "chunk_overlap": 100, "title": "Test Doc Case 2", "db_path": "test_faiss_db_case2"},
{"chunk_size": 500, "chunk_overlap": 200, "title": "Test Doc Case 3", "db_path": "test_faiss_db_case3"},
{"chunk_size": 400, "chunk_overlap": 150, "title": "Test Doc Case 4", "db_path": "test_faiss_db_case4"},
]
๐ก ์คํ ๊ณผ์
1. ๊ฐ ์ผ์ด์ค๋ณ๋ก ๋ฌธ์๋ฅผ ์๋ฒ ๋ฉํ์ฌ FAISS DB์ ์ ์ฅ.
2. ๋์ผํ ์ง๋ฌธ์ ์
๋ ฅํ๊ณ , LangChain์ similarity_search_with_score
๋ฅผ ์ฌ์ฉํด ๊ฒ์๋ ๋ฌธ์์ ์ ์ฌ๋ ์ ์ ๋น๊ต.
3. ๊ฒ์๋ ๋ฌธ์๊ฐ ์๋ ์ง๋ฌธ๊ณผ ์ผ๋ง๋ ๊ด๋ จ์ด ์๋์ง ์ ์ฑ์ ์ผ๋ก ๋ถ์.
๐ก ํ ์คํธ ๊ฒฐ๊ณผ
Chuck Size | Overlap | ๊ฒ์ ์ ํ๋ | ๊ฒ์ ์๋ | ๋ฌธ๋งฅ ์ ์ง |
---|---|---|---|---|
200 | 50 | โ ๋ฎ์ | โ ๋น ๋ฆ | โ ๋ฌธ๋งฅ ๋๊น |
300 | 100 | โ ๋์ | โ ๋น ๋ฆ | โ ๋ฌธ๋งฅ ์ ์ง |
400 | 150 | โญ ๋ณดํต | โญ ์ค๊ฐ | โ ๋ฌธ๋งฅ ์ ์ง |
500 | 200 | โ ๋์ | โ ๋๋ฆผ | โ ๋ฌธ๋งฅ ์ ์ง |
๐ ๊ฒฐ๊ณผ์ ์ผ๋ก, chunk_size=300
, chunk_overlap=100
์ด ๊ฐ์ฅ ์ต์ ์ ๊ฐ์์ ๋ฐ๊ฒฌ!
โ
Chunk Size & Overlap์ด ๊ฒ์ ์ฑ๋ฅ์ ์ผ๋ง๋ ์ค์ํ์ง ๋ผ์ ๋ฆฌ๊ฒ ๊นจ๋ฌ์.
โ
์ฒ์์๋ 500, 200
์ด ์ข์ ๋ณด์์ง๋ง, ์๋๊ฐ ๋๋ฌด ๋๋ ค ์ค์ฌ์ฉ์ ๋ถ์ ํฉ.
โ
์ต์ ์ 300, 100
์ค์ ํ, ๊ฒ์ ์ฑ๋ฅ์ด ๋ํญ ๊ฐ์ ๋จ โ ์ ํ๋ ์์น + ๋น ๋ฅธ ๊ฒ์ ์๋ ํ๋ณด!
๐ก ์ด ์คํ์ ํตํด ์ป์ ์ธ์ฌ์ดํธ
top-k
๊ฒ์์ด ์๋๋ผ, ์ ์ ํ ์ฒญํฌ ์ฌ์ด์ฆ ์กฐ์ ์ด LLM ์๋ต ํ์ง์๋ ํฐ ์ํฅ์ ์ค๋ค. โ
์๋ฒ ๋ฉ์ ํ ๋ ์ ์ ํ Chunk Size๋ฅผ ์ ํํ๋ ๊ฒ์ด ๊ฒ์ ์ฑ๋ฅ์ ํต์ฌ์ด๋ค!
โ
๊ฒ์ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด ๋ฌด์กฐ๊ฑด ํฐ ์ฒญํฌ๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ ๋ต์ด ์๋๋ค.
โ
์ค์ ๋ฐ์ดํฐ์
์ ๋ง๋ ์ต์ ์ ์ค์ ์ ์ฐพ๊ธฐ ์ํด์๋ ์ฌ๋ฌ ํ
์คํธ ์ผ์ด์ค๋ฅผ ๋ง๋ค์ด ์คํํ๋ ๊ณผ์ ์ด ํ์๋ค.
โ
LangChain์ similarity_search_with_score
๋ ๊ฒ์๋ ๋ฌธ์์ ์ฐ๊ด์ฑ์ ํ์ธํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ๋ค.
1) ๋ฌธ์ ์ ํฉ๋ ํ๋จ ๋ก์ง ์ถ๊ฐ
๐ก ์ ์ฉํ ์ต์ ํ ๊ธฐ๋ฒ
1๏ธโฃ ๊ฒ์๋ ๋ฌธ์๋ค์ score ๊ฐ
์ ํ๊ท ๋ด๊ณ , ์ต๊ณ ์ ๊ณผ ๋น๊ต.
2๏ธโฃ ์ต์ 3๊ฐ์ ๋ฌธ์๊ฐ ์ฐธ๊ณ ๋๋๋ก ์ค์ ํ๊ณ ,
def filter_documents(documents, min_docs=3, top_percentile=0.3):
# ๋ฌธ์๋ค์ ์ ์๋ฅผ ์ ๋ ฌ
documents.sort(key=lambda x: x["score"], reverse=True)
# ์ต๊ณ ์ ๊ณผ ํ๊ท ์ ์ ๊ณ์ฐ
max_score = documents[0]["score"]
avg_score = sum([doc["score"] for doc in documents]) / len(documents)
# ์์ 30% ๋ฌธ์๋ฅผ ์ฐ์ ์ ์
top_n = max(int(len(documents) * top_percentile), min_docs)
selected_docs = [doc for doc in documents[:top_n]]
# ํ๊ท ๋ณด๋ค ๋ฎ์ ์ ์๋ฅผ ๊ฐ์ง ๋ฌธ์ ํํฐ๋ง
final_docs = [doc for doc in selected_docs if doc["score"] >= avg_score]
return final_docs
๐ ๊ฒฐ๊ณผ์ ์ผ๋ก, ์๋ฏธ ์๋ ๋ฌธ์๋ง ํํฐ๋งํ์ฌ LLM์ด ๋ณด๋ค ์ ํํ ๋ต๋ณ์ ์์ฑํ๋๋ก ๊ฐ์ !
๐ ๋ฒกํฐ DB๋ ์ง์ ํ์ธํ ์ ์์ด์ ํ
์คํธ ์ ๋ขฐ๋๋ฅผ ํ๋ณดํ๋ ๊ฒ์ด ์ค์ํ๋ค.
๐ก ํ
์คํธ ๋ฐฉ๋ฒ:
1๏ธโฃ ์น ๋ฌธ์๋ฅผ ์๋ฒ ๋ฉํ ํ, ์ธ๋ถ์ ์ธ ์ง๋ฌธ์ ์
๋ ฅํ์ฌ ๊ด๋ จ ๋ฌธ์ ๊ฒ์ ํ
์คํธ.
2๏ธโฃ ๊ฒ์๋ ๋ฌธ์๋ค์ด ์ด๋ป๊ฒ ์ ํ๋๋์ง ๋ก๊ทธ๋ฅผ ์ฐ์ด ํ์ธํ๋ฉฐ ์ต์ ํ ์งํ.
3๏ธโฃ ์ฌ๋ฌ Threshold ์ค์ ์ ์คํํ์ฌ, ์ ํฉํ ๋ฌธ์ ํํฐ๋ง ๊ธฐ์ค์ ์ฐพ์.
๐ ์คํ ๋ฐ์ดํฐ ์์ (๋ก๊ทธ ๋ถ์ ๊ฒฐ๊ณผ)
๋ฌธ์ | Score | ์ฐธ๊ณ ์ฌ๋ถ |
---|---|---|
๋ฌธ์ A | 0.92 | โ ์ฌ์ฉ |
๋ฌธ์ B | 0.88 | โ ์ฌ์ฉ |
๋ฌธ์ C | 0.85 | โ ์ฌ์ฉ |
๋ฌธ์ D | 0.72 | โ ํํฐ๋ง๋จ (ํ๊ท ์ดํ) |
๋ฌธ์ E | 0.70 | โ ํํฐ๋ง๋จ (ํ๊ท ์ดํ) |
๐ ๊ฒฐ๊ณผ:
โ
๋ฒกํฐ DB๋ ์ง์ ๋ณด์ด์ง ์์ผ๋ฏ๋ก, ๋ก๊ทธ๋ฅผ ์ฐ์ด ํ์ธํ๋ ๊ณผ์ ์ด ํ์์ ์ด๋ค.
โ
์ํ์ ์ธ ์ ๊ทผ์ด ์ค์ํ๋ค โ Score ๊ธฐ๋ฐ ํํฐ๋ง ๋ก์ง์ ์ ์ฉํ๋ฉด์ ์ ์ ํ ๊ธฐ์ค์ ์ฐพ๋ ๊ฒ์ด ํต์ฌ์ด์๋ค.
โ
Threshold ์ค์ ์ ๋จ์ํ ์ ์ ๊ฐ์ด ์๋๋ผ, ๋์ ์ผ๋ก ์กฐ์ ๋ ํ์๊ฐ ์๋ค.
โ
์ต์ ํ ๊ณผ์ ์ ์ง์์ ์ผ๋ก ์ด๋ฃจ์ด์ก์ผ๋ฉฐ, ๋ฐ๋ชจ ๋๊น์ง ๊ณ ๋ฏผ์ด ์ด์ด์ก๋ค.
โ
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฐ๋ชจ์๋ ๋ฐ์๋์ง ๋ชปํ์ง๋ง, AI ๊ฒ์ ์ต์ ํ์ ๋ํ ๊น์ ๊ณ ๋ฏผ์ ๊ฒฝํํ ์ ์์๋ค.
๐ก ๊ฐ์ ๋ฐฉํฅ
1๏ธโฃ AI์ ์ญํ ์ ๋ ๋ช
ํํ๊ฒ ์ ์
2๏ธโฃ ๋ํ ํ๋ฆ์ ์ ์ดํ ์ ์๋๋ก ์ง์นจ ์ถ๊ฐ
3๏ธโฃ ํ๋กฌํํธ ๋ด๋ถ์ ๋ํ ๊ธฐ์ต ์ ์ง ๋ก์ง ๋ฐ์
๐ ํ๋กฌํํธ ์คํ์ ์ํ ํ๊ฐ ๋ฐฉ๋ฒ
๐ ํ ์คํธ ๊ฒฐ๊ณผ ๋น๊ต
ํ ์คํธ | ๊ธฐ์กด ํ๋กฌํํธ ์๋ต | ๊ฐ์ ๋ ํ๋กฌํํธ ์๋ต | ๊ฒฐ๊ณผ |
---|---|---|---|
์ฌ์ฉ์์ ์ด๋ฆ์ ๊ธฐ์ตํ๋์ง | "Hello! How can I help?" (๊ธฐ์ต ์ํจ) | "Sure, Gahee! What would you like to know?" (์ด๋ฆ ๊ธฐ์ต) | โ ๊ฐ์ ๋จ |
์ ๋ณด๊ฐ ์์ ๋ ๋ฐ์ | "I'm not sure." (์งง๊ณ ๋ถ์น์ ) | "Iโm sorry, I couldnโt find that information in the documents I have. I recommend reaching out to the support team." (์น์ ํ๊ณ ์๋ด ์ ๊ณต) | โ ๊ฐ์ ๋จ |
์ฐ์๋ ์ง๋ฌธ์ ๋ํ ๋ฌธ๋งฅ ์ ์ง | "Can you clarify?" (๋ฌธ๋งฅ ์ดํด ๋ถ์กฑ) | "Based on your last question about [topic], hereโs more informationโฆ" (๋ฌธ๋งฅ ์ ์ง O) | โ ๊ฐ์ ๋จ |
์๋ต์ ์ ๋ฌธ์ฑ & ๊ฐ๊ฒฐํจ | "Sure! Here's a long explanationโฆ" (์ฅํฉํจ) | "Here's a concise summary: [์ ๋ณด]. Let me know if you need more details!" (๊ฐ๊ฒฐ & ๋ช ํ) | โ ๊ฐ์ ๋จ |
๐ ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ์ ๋ ํ๋กฌํํธ๋ฅผ ์ ์ฉํ์ ๋:
โ
AI์๊ฒ ์ญํ ๊ณผ ๋ชฉํ๋ฅผ ๋ช
ํํ๊ฒ ์ ์ํด์ค์ผ ํ๋ค.
โ
"์ด๋ค ์ํฉ์์ ์ด๋ค ๋ฐฉ์์ผ๋ก ๋ตํด์ผ ํ๋์ง" ๊ตฌ์ฒด์ ์ผ๋ก ๋ช
์ํ๋ฉด AI์ ์๋ต ํ์ง์ด ์ข์์ง๋ค.
โ
LLM์ด ๋จ์ํ ๋ํ ๋งฅ๋ฝ์ ๊ธฐ์ตํ๋ค๊ณ ํด์ ์ข์ ๋ต๋ณ์ ์์ฑํ๋ ๊ฒ์ ์๋๋ค! โ ํ๋กฌํํธ์์ ๋งฅ๋ฝ์ ์ด๋ป๊ฒ ํ์ฉํ ์ง ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช
ํด์ผ ํ๋ค.
โ
์ด๋ก ์ ์ผ๋ก ๊ด์ฐฎ์ ๋ณด์ด๋ ํ๋กฌํํธ๋ ์ค์ ํ
์คํธ๊ฐ ํ์๋ค!
1๏ธโฃ ๊ธฐ์กด ํ๋กฌํํธ์์๋ ํ์ฌ ๋ฌธ์์ ๊ด๋ จ๋ ์ง๋ฌธ์ด ์๋๋ฉด AI๊ฐ ๋ฌด์กฐ๊ฑด ๊ฑฐ์ ์๋ต์ ํจ.
2๏ธโฃ ์ ๋ณด ์ ๊ณต ์ ์ถ์ฒ(Reference)๊ฐ ํฌํจ๋์ง ์์ ์ ๋ขฐ์ฑ ๋ถ์กฑ.
๐ก ๊ธฐ์กด:
๐ก ๊ฐ์ ํ:
๐ ์ถ๊ฐ๋ ํ๋กฌํํธ ๊ท์น:
โ
์ผ์์ ์ธ ์ง๋ฌธ (Casual Conversation) โ AI๊ฐ ๋ถ๋๋ฝ๊ฒ ๋ํ ๊ฐ๋ฅ.
โ
๋ฌธ์ ๊ธฐ๋ฐ ์ ๋ณด (Informational Response) โ ๊ณต์ ๋ฌธ์ ์ฐธ๊ณ ํ์ฌ ์๋ต ์์ฑ.
๐ก ์๋ก์ด ํ๋กฌํํธ ๊ท์น ์ถ๊ฐ:
๐ ํ๋กฌํํธ ๊ฐ์ ๋ด์ฉ:
You are a friendly and knowledgeable company service assistant chatbot designed to provide accurate information and support.
1. If the user asks about official company documents, provide a fact-based response and cite the reference documents used.
- Example: "Based on [Document Name], here is the information: ..."
2. If the question is casual or unrelated to company documents, engage in a friendly and natural conversation.
3. You must classify your response as either "informational" or "casual":
- If "informational", append the referenced documents at the end of your response.
- If "casual", simply respond naturally without citing references.
๐ ์์ ์๋ต ๋น๊ต (๊ฐ์ ์ vs ํ)
์ง๋ฌธ | ๊ธฐ์กด ์๋ต | ๊ฐ์ ๋ ์๋ต |
---|---|---|
"์ ์ฌ ๋ญ ๋จน์์ด?" | "์ฃ์กํฉ๋๋ค, ๊ด๋ จํ ์ง๋ฌธ์ด ์๋๋๋ค." | "์ค๋ ์ ์ฌ ๋ฉ๋ด ์ถ์ฒํด๋๋ฆด๊น์? ๐" |
"์ฐ๋ฆฌ ํ์ฌ์ ์ฐ์ฐจ ์ฌ์ฉ ๊ท์ ์ด ๋ญ์ผ?" | "์ฐ๋ฆฌ ํ์ฌ์ ์ฐ์ฐจ ๊ท์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค..." | "๐ ์ถ์ฒ: Employee Handbook 2023 \n ์ฐ์ฐจ ๊ท์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค..." |
"๋์ ๊ทผ๋ฌด ์๊ฐ์ ๋ช ์๋ถํฐ ๋ช ์๊น์ง์ผ?" | "์ฃ์กํฉ๋๋ค, ๊ด๋ จํ ์ง๋ฌธ์ด ์๋๋๋ค." | "๊ทผ๋ฌด ์๊ฐ์ 9AM - 6PM์ ๋๋ค. (๐ ์ถ์ฒ: HR Policy 2024)" |
๐ ๊ฒฐ๊ณผ:
โ
AI๊ฐ ๋ฌธ๋งฅ์ ํ์
ํ์ฌ ์ ์ฐํ๊ฒ ์๋ตํ ์ ์๊ฒ ๋จ!
โ
ํ์ฌ ๋ฌธ์ ๊ธฐ๋ฐ ์๋ต์์๋ ์๋์ผ๋ก ์ฐธ๊ณ ๋ฌธํ์ ์ถ๊ฐํ์ฌ ์ ๋ขฐ์ฑ ํ๋ณด!
๐ ํ
์คํธ ๋ฐฉ๋ฒ
1๏ธโฃ ์ผ์์ ์ธ ์ง๋ฌธ์ ์
๋ ฅํ์ฌ AI๊ฐ ์์ฐ์ค๋ฝ๊ฒ ์๋ตํ๋์ง ํ์ธ.
2๏ธโฃ ์ ๋ณด ๊ธฐ๋ฐ ์ง๋ฌธ์ ์
๋ ฅํ๊ณ , ์ถ์ฒ(Reference)๊ฐ ํฌํจ๋๋์ง ํ
์คํธ.
3๏ธโฃ ์๋ชป๋ ์๋ต์ด ๋์ค์ง ์๋๋ก ํ๋กฌํํธ๋ฅผ ์กฐ์ ํ๋ฉฐ ์ต์ ํ.
๐ ์ค์ ์คํ ๊ฒฐ๊ณผ ๋ถ์ (๋ก๊ทธ ๊ธฐ๋ฐ ํ ์คํธ ์งํ)
์ง๋ฌธ ์ ํ | AI ์๋ต (๊ฐ์ ์ ) | AI ์๋ต (๊ฐ์ ํ) | ๊ฐ์ ์ฌ๋ถ |
---|---|---|---|
์ผ์ ๋ํ | "์ฃ์กํฉ๋๋ค, ๊ด๋ จํ ์ง๋ฌธ์ด ์๋๋๋ค." | "์ข์ ์ง๋ฌธ์ด๋ค์! ์ด๋ค ์ ์ด ๊ถ๊ธํ์ ๊ฐ์?" | โ ์์ฐ์ค๋ฌ์ด ๋ํ ๊ฐ๋ฅ |
ํ์ฌ ๊ท์ ์ง๋ฌธ | "์ฌ๊ธฐ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์." (์ถ์ฒ ์์) | "๐ ์ถ์ฒ: Company Handbook 2024 \n ์ฌ๊ธฐ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์." | โ ์ ๋ขฐ์ฑ ํฅ์ |
๋น์ฆ๋์ค ๊ด๋ จ ์ง๋ฌธ | "์ด ์ ๋ณด๋ ์์ต๋๋ค." | "์ ๊ฐ ์ฐพ์ ์ ์๋ ์ ๋ณด๊ฐ ์์ง๋ง, HR ํ์ ๋ฌธ์ํด๋ณด๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค." | โ ์น์ ํ ๊ฐ์ด๋ ์ถ๊ฐ |
๐ ๊ฒฐ๊ณผ:
โ
ํ๋กฌํํธ์์ AI์ "์ญํ "์ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ ์ํ๋ฉด ์๋ต ํ์ง์ด ํฅ์๋๋ค!
โ
์๋ต ์ ํ(Classification)์ ๋ช
ํํ๊ฒ ์ง์ํ๋ฉด AI๊ฐ ์ํฉ์ ๋ง๊ฒ ๋ ์์ฐ์ค๋ฝ๊ฒ ๋์ํ๋ค.
โ
์ถ์ฒ๋ฅผ ํฌํจํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ฌ์ฉ์๊ฐ AI์ ์๋ต์ ๋ ์ ๋ขฐํ ์ ์๊ฒ ๋๋ค.
โ
AI๊ฐ ๋๋ฌด ๋ฑ๋ฑํ๋ฉด ์ฌ์ฉ์ ๊ฒฝํ์ด ๋จ์ด์ง๋ฏ๋ก, "Casual"ํ ๋ํ ๊ธฐ๋ฅ๋ ์ค์ํ๋ค!
โ
ํ๋กฌํํธ๋ ํ ๋ฒ ๋ง๋ค๊ณ ๋๋๋ ๊ฒ ์๋๋ผ, ์ง์์ ์ผ๋ก ์คํํ๊ณ ๊ฐ์ ํด์ผ ํ๋ค.
1๏ธโฃ ๊ธฐ์กด์๋ ๋จ์ํ ํ ์คํธ๋ง ๋ฒกํฐ DB์ ์ ์ฅํ๋ ๋ฐฉ์
2๏ธโฃ ์ญ์ ๋ฐ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ด ์ด๋ ค์
3๏ธโฃ AI ์๋ต ์์ฑ ์ ์ฐธ๊ณ ๋ฌธํ ์ ๋ณด ์ ๊ณต ํ์
๐ก 1) ๋ฒกํฐ DB์ ์ ์ฅํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๊ฐ์
๐ ํ
์คํธ๋ฟ๋ง ์๋๋ผ, ๋ฌธ์์ ์ถ์ฒ(title) ๋ฐ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ์ ์ฅ!
from langchain.schema import Document
# ๊ธฐ์กด ๋ฐฉ์ (๋จ์ ํ
์คํธ ์ ์ฅ)
text = "This is a sample document about AI."
faiss.add_texts([text])
# ๊ฐ์ ๋ ๋ฐฉ์ (๋ฌธ์ ์ ๋ณด + ๋ฉํ๋ฐ์ดํฐ ํฌํจ)
document = Document(
page_content="This is a sample document about AI.",
metadata={
"title": "AI Research Paper 2023",
"source": "https://example.com/ai-research",
}
)
faiss.add_documents([document])
๐ ๊ฒฐ๊ณผ:
โ
๋ฒกํฐ DB์์ ๊ฒ์๋ ๋ฌธ์์ ์ถ์ฒ(title)๊น์ง ํจ๊ป ๋ฐํ ๊ฐ๋ฅ!
โ
๋ฌธ์์ ์ถ์ฒ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ ๊ด๋ฆฌ(์ญ์ , ์
๋ฐ์ดํธ)๊ฐ ๊ฐ๋ฅํด์ง.
๐ก 2) ๋ฌธ์ ID ๊ธฐ๋ฐ ์ญ์ ๊ธฐ๋ฅ ์ถ๊ฐ
๐ ๋ฒกํฐ DB์์ ํน์ ๋ฌธ์๋ฅผ ์ญ์ ํ ์ ์๋๋ก title
์ ID์ฒ๋ผ ํ์ฉ
# ๋ฒกํฐ DB์์ ํน์ ๋ฌธ์ ์ญ์
def delete_document_by_title(faiss, title):
docs = faiss.similarity_search_with_score(title, k=10)
for doc, score in docs:
if doc.metadata.get("title") == title:
faiss.delete(doc) # ํน์ ๋ฌธ์๋ง ์ญ์
๐ ๊ฒฐ๊ณผ:
โ
๋ถํ์ํ ๋ฌธ์๋ฅผ ์์ฝ๊ฒ ์ญ์ ํ ์ ์๋ ๊ธฐ๋ฅ ์ถ๊ฐ!
โ
๋ฒกํฐ DB์์ ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ํ ์ ์๊ฒ ๋จ.
๐ก 3) AI๊ฐ ์ฐธ๊ณ ๋ฌธํ์ ์๋์ผ๋ก ํฌํจํ ์ ์๋๋ก ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ ๋ฆฌ
๐ ๊ฒฐ๊ณผ:
โ
๋ด๊ฐ ์ง์ ์๋ต์ ์ถ์ฒ๋ฅผ ์ถ๊ฐํ์ง ์์๋, ํ๋กฌํํธ๋ฅผ ํตํด AI๊ฐ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ!
โ
์ ๋ณด ์ ๊ณต์ด ํ์ํ ๊ฒฝ์ฐ ์ฐธ๊ณ ๋ฌธํ์ด ํฌํจ๋๋ฉด์ ์ ๋ขฐ๋ ํฅ์.
๐ ๋ฐ์ดํฐ ๊ด๋ฆฌ๊ฐ ์ฌ์์ง!
๐ AI ์๋ต์ ์ ๋ขฐ์ฑ ํฅ์!
๐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ๋ฉด์ ์์คํ ์ค๊ณ์ ๋ํ ๊น์ ๊ณ ๋ฏผ์ ํ ์ ์์์!
โ
ํ
์คํธ๋ง ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ, ๋ฉํ๋ฐ์ดํฐ๊น์ง ๊ณ ๋ คํด์ผ ๋ฐ์ดํฐ ๊ด๋ฆฌ๊ฐ ์ฌ์์ง๋ค.
โ
๋ฒกํฐ DB๋ ๊ด๊ณํ DB์ ๋ค๋ฅด๊ฒ ID ๊ธฐ๋ฐ ์ญ์ ๊ฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์, ID์ฒ๋ผ ์ฌ์ฉํ ํ๋๋ฅผ ํฌํจํ๋ ๊ฒ์ด ์ค์ํ๋ค.
โ
AI์ ์๋ต ์ ๋ขฐ์ฑ์ ๋์ด๊ธฐ ์ํด์๋ ์ฐธ๊ณ ๋ฌธํ(title)์ ํจ๊ป ์ ๊ณตํ ์ ์๋๋ก ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๋ฆฌํด์ผ ํ๋ค.
โ
๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ฏผํ๋ ๊ณผ์ ์ด ๊ฒฐ๊ตญ ์ ์ฒด์ ์ธ ๊ฒ์ & ์๋ต ํ์ง ๊ฐ์ ์ผ๋ก ์ด์ด์ง๋ค!