BIBLIOGRAPHY
Related Notes
History
|2025-03-28 Fri 09:03|
@user μ΄ νλ‘μ νΈμμ RAGμ μν μ?
@assistant μ΄ νλ‘μ νΈμμ RAG(Retrieval-Augmented Generation)λ μΈλΆ μ§μ μμ€λ₯Ό νμ©ν΄ μμ±ν AIμ μλ΅ μ νμ±κ³Ό κ΄λ ¨μ±μ λμ΄λ μν μ ν©λλ€. μ£Όμ κΈ°λ₯μ λ€μκ³Ό κ°μ΅λλ€:
-
μ 보 κ²μ¦
- μ€μκ°/λλ©μΈ νΉν λ°μ΄ν° κ²μμ ν΅ν΄ νꡬμ μλ΅(hallucination) κ°μ
-
λμ μ§μ νμ₯
- λͺ¨λΈ μ¬νμ΅ μμ΄ μ΅μ μ 보 λ°μ κ°λ₯
-
컨ν μ€νΈ κ°ν
- μ§λ¬Έ κ΄λ ¨ λ¬Έμ μΆμΆ β μμ± λ¨κ³μ λ¬Έλ§₯ μ 보 μ 곡
-
λΉμ© ν¨μ¨μ±
- λκ·λͺ¨ λͺ¨λΈ νμΈνλ λλΉ λ¦¬μμ€ μ μ½
λλ©μΈ νΉν DBλ μ΅μ μλ£λ₯Ό λ°μν΄μΌ νλ κ³Όμ νΉμ±μ, RAGλ₯Ό ν΅ν΄ μ λ’°μ±κ³Ό νμ₯μ±μ λμμ ν보νλ κ΅¬μ‘°λ‘ μλν©λλ€.
@user κ΄λ ¨λ μ½λλ₯Ό μ 리ν΄μ€
@assistant RAG ꡬνμ μν ν΅μ¬ μ½λ ꡬ쑰 μμμ λλ€. (Python/PyTorch κΈ°μ€)
# 1. μμ‘΄μ± μ€μΉ
!pip install transformers faiss-cpu sentence-transformers
# 2. ν΅μ¬ μ»΄ν¬λνΈ
from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration
from sentence_transformers import SentenceTransformer
import faiss
# 3. λ°μ΄ν° μ€λΉ
documents = [
"λλ©μΈ νΉν λ¬Έμ 1 λ΄μ©...",
"λλ©μΈ νΉν λ¬Έμ 2 λ΄μ©...",
# ... μΈλΆ μ§μ μμ€
]
# 4. μλ² λ© μμ±
encoder = SentenceTransformer('all-MiniLM-L6-v2')
doc_embeddings = encoder.encode(documents)
# 5. FAISS μΈλ±μ€ ꡬμΆ
index = faiss.IndexFlatL2(doc_embeddings.shape[1])
index.add(doc_embeddings)
# 6. RAG νμ΄νλΌμΈ
class RAGSystem:
def __init__(self):
self.tokenizer = RagTokenizer.from_pretrained("facebook/rag-sequence-nq")
self.retriever = RagRetriever.from_pretrained(
"facebook/rag-sequence-nq",
index=index,
encoder=encoder
)
self.generator = RagSequenceForGeneration.from_pretrained("facebook/rag-sequence-nq", retriever=self.retriever)
def query(self, question):
inputs = self.tokenizer(question, return_tensors="pt")
outputs = self.generator.generate(**inputs)
return self.tokenizer.decode(outputs[0], skip_special_tokens=True)
# 7. μ€ν μμ
rag = RAGSystem()
result = rag.query("νλ‘μ νΈμμ RAGμ μν μ?")
print(f"μλ΅: {result}")μ£Όμ μ‘°μ ν¬μΈνΈ:
documents: μ€μ λλ©μΈ μ§μ DBλ‘ κ΅μ²΄ νμ- μλ² λ© λͺ¨λΈ:
multi-qa-mpnet-base-dot-v1λ± λλ©μΈ νΉν λͺ¨λΈλ‘ λ³κ²½ κ°λ₯ - μμ± λͺ¨λΈ:
facebook/bart-largeλ± λ€λ₯Έ seq2seq λͺ¨λΈ νμ© κ°λ₯ - νμ΄νΌνλΌλ―Έν°: chunk_size, top_k κ° μ‘°μ μΌλ‘ κ²μ λ²μ μ μ΄
μ€μ μ΄μ νκ²½μμλ Elasticsearchλ Pinecone λ±μ λ²‘ν° DBλ₯Ό μ¬μ©νκ³ λΉλκΈ° μ²λ¦¬ ꡬ쑰λ₯Ό μΆκ°νλ κ²μ΄ μΌλ°μ μ λλ€. λ°μ΄ν° μ μ²λ¦¬ λ¨κ³μμ λ¬Έμ₯ λΆν λ° μ κ·ν κ³Όμ μ΄ νμμ μΌλ‘ μꡬλ©λλ€.
@user μ΄ νλ‘μ νΈμμ RAG κΈ°μ μ μ΄λμ μ΄λ»κ² μ¬μ©νλκ°?
@assistant μ΄ νλ‘μ νΈμμ RAG κΈ°μ μ ꡬ체μ μ μ© ν¬μΈνΈμ λ°©μμ λ€μκ³Ό κ°μ΅λλ€:
1. μ μ© μμ β λλ©μΈ νΉν Q&A μμ€ν
- μ λ¬Έ μ©μ΄/νλ‘μΈμ€κ° ν¬ν¨λ μ¬μ©μ μ§μ β λ¬Έμ κΈ°λ° μ νν μλ΅ μμ±
β μ€μκ° λ¬Έμ λΆμ
- μ λ‘λλ PDF/ν μ€νΈ νμΌ β μλ μμ½ λ° ν¬λ‘μ€μ²΄ν¬
β λμ μ§μ κ΄λ¦¬
- λ§€μΌ μ λ°μ΄νΈλλ κ·μ λ¬Έμ β μ¬νμ΅ μμ΄ μ΅μ μ 보 λ°μ
β μ¬μ©μ μ§μ μ±λ΄
- λ΄λΆ λ§€λ΄μΌ κΈ°λ° μ€λ₯ μ΅μνλ μλ΄ μμ€ν
2. κΈ°μ μ ꡬν λ°©μ
# ν΅μ¬ μ²λ¦¬ νλ¦ μμ
def rag_workflow(query):
# βΆ κ²μκΈ°(Retriever)
relevant_docs = vector_db.search(query, top_k=3) # FAISS/Elasticsearch
# β· μ¦κ° 컨ν
μ€νΈ μμ±
context = "\n".join([doc['content'] for doc in relevant_docs])
# βΈ μμ±κΈ°(Generator)
prompt = f"μ§λ¬Έ: {query}\nμ°Έκ³ λ¬Έμ: {context}\nλ΅λ³:"
return llm.generate(prompt) # BART/T5 κΈ°λ°3. μμ€ν ν΅ν© ν¬μΈνΈ
- λ°μ΄ν° μμ€: λ΄λΆ Confluence β RAG μΈλ±μ± νμ΄νλΌμΈ μ°λ
- κ²μ μ΅μ ν: μ¬μ©μ λ‘κ·Έ κΈ°λ° κ²μ κ°μ€μΉ λμ μ‘°μ (λΆκ° κΈ°λ₯)
- κ²μ¦ λ μ΄μ΄: μμ±λ μλ΅ β μ¬μ μ μλ κ·μΉ κΈ°λ° νν°λ§
4. λλ©μΈ λ§μΆ€ν μ‘°μ
- μλ² λ© λͺ¨λΈ: KoBERT κΈ°λ° νκ΅μ΄ νΉν λ²μ μ¬μ©
- μ²ν¬ μ λ΅: λλ©μΈ μ§μ ꡬ쑰μ λ§μΆ κ³μΈ΅μ λΆν (μΉμ > λ¬Έλ¨)
- νκ° λ©νΈλ¦: μ νλ μΈ λλ©μΈ μ λ¬Έκ° κ²μ¦ μ μ λ°μ
μ€μ μ΄μ νκ²½μμ μ¬μ©μ μ§μ μ ν λΆλ₯ λͺ¨λΈμ μ ννμ¬ RAG μ μ© μ¬λΆλ₯Ό κ²°μ νλ νμ΄λΈλ¦¬λ μν€ν μ²λ₯Ό μ±ννκ³ μμ΅λλ€. μλ΅ μμ± νμ²λ¦¬μμ μλνλ μ¬μ€ κ΄κ³ κ²μ¦ λͺ¨λμ΄ μΆκ°λ‘ λμνλ κ²μ΄ νΉμ§μ λλ€.
@user μ¬μ©μκ° μμ±ν λ ΈνΈλ€μ μ΄λ»κ² νμ©νλμ§ κ΄λ ¨ κΈ°μ μ μ€λͺ ν΄μ€
@assistant μ¬μ©μ λ ΈνΈλ₯Ό νμ©ν κ°μΈνλ RAG μμ€ν ꡬν κΈ°μ μ μ€λͺ λ립λλ€:
1. λ ΈνΈ μμ§ λ° μ μ²λ¦¬
# Markdown/Org-mode λ
ΈνΈ νμ± μμ
def parse_notes(note_files):
notes = []
for file in note_files:
with open(file, 'r') as f:
content = f.read()
# λ©νλ°μ΄ν° μΆμΆ(νκ·Έ, μμ±μΌ λ±)
metadata = extract_metadata(content)
notes.append({
'content': clean_text(content),
'metadata': metadata
})
return notes- κΈ°μ μμ:
- λ‘컬 νμΌ/ν΄λΌμ°λ λκΈ°ν(Evernote, Notion API μ°λ)
- λ§ν¬λ€μ΄ ν€λ κΈ°λ° κ³μΈ΅ ꡬ쑰 νμ±
- κ°μΈμ©μ΄ μ¬μ μμ±(μ¬μ©μ κ³ μ λͺ μ¬ μΆμΆ)
2. λ§₯λ½ κΈ°λ° μλ² λ©
# μ¬μ©μ νΉν μλ² λ© λͺ¨λΈ
class PersonalEmbedder:
def __init__(self, base_model='paraphrase-multilingual-MiniLM-L12-v2'):
self.base_model = SentenceTransformer(base_model)
self.user_terms = load_user_glossary() # μ¬μ©μ μ μ μ©μ΄ μ¬μ
def encode(self, text):
# μ¬μ©μ μ©μ΄ 보μ
text = replace_user_terms(text, self.user_terms)
return self.base_model.encode(text)- μ΅μ ν ν¬μΈνΈ:
- κ°μΈ λ¨μΆμ΄/μ½μ΄ μ²λ¦¬ (μ: βλ΄νλ‘μ νΈβ β βκ°μΈ λΈλ‘κ·Έ κ°νΈ νλ‘μ νΈβ)
- μκ° κ°μ€μΉ: μ΅κ·Ό λ ΈνΈμ λμ κ°μ€μΉ λΆμ¬
3. κ°μΈ μ§μ κ·Έλν ꡬμΆ
graph LR A[μ¬μ©μ λ ΈνΈ] --> B(κ°μ²΄ μΆμΆ) B --> C[μΈλ¬Ό/μ₯μ/κ°λ ] C --> D[κ΄κ³ μΆμΆ] D --> E((μ§μ κ·Έλν)) E --> F[RAG μλ΅ μμ±]
- νμ© κΈ°μ :
- SpaCy κΈ°λ° κ°μ²΄ μΈμ
- λ ΈνΈ κ° λ§ν¬ λΆμμ ν΅ν κ΄κ³λ μμ±
4. λμ κ²μ μ΅μ ν
def retrieve_personal_notes(query, user_context):
# κ²μ λ²μ μ ν (μ: "μ
무" νκ·Έκ° μλ λ
ΈνΈλ§)
if 'work' in user_context.current_tags:
filter = {'tags': 'work'}
return vector_db.search(
query,
filter=filter,
time_weight=0.3 # μ΅κ·Ό μλ£ μ°μ
)- κ°μΈν μμ:
- μ¬μ©μ νλ ν¨ν΄ κΈ°λ° κ²μ λ²μ μλ μ‘°μ
- λΉλ² μ κ·Ό λ ΈνΈ μΊμ±
5. μλ΅ μμ± μμ
μ¬μ©μ μ§μ: βμ§λλ¬μ κΈ°λ‘ν AWS μ€μ λ°©λ² μ°Ύμμ€β
RAG λμ κ³Όμ :
- μκ° νν°(
last_modified > 2023-11-01) μ μ© - βAWSβ + βμ€μ β ν€μλ κ°μ€ κ²μ
- μ¬μ©μκ° μμ£Ό μ°Έμ‘°νλ λ ΈνΈ μμΌλ‘ μ λ ¬
- μμ±λ μλ΅μ μλ³Έ λ ΈνΈ λ§ν¬ μλ 첨λΆ
6. 보μ λ° νλΌμ΄λ²μ
- λ‘컬 λ¨Έμ μμλ§ μ²λ¦¬λλ μ¨λλ°μ΄μ€ μν€ν μ²
- λ―Όκ° μ 보 λ§μ€νΉ (μ:
[ν¬λ λ΄μ ]νκ·Έ λ΄μ© μλ νν°λ§)
μ΄ μμ€ν μ μ¬μ©μκ° *μμ£Ό μλ μ 보*(μ: μ체 κ°λ°ν μ½λ μ€λν«)λ *κ°μΈμ λ§₯λ½μ΄ νμν μ§μ*(μ: βλ΄κ° μ 리ν κΉμΉμ°κ° λ μνΌβ)μ νΉν ν¨κ³Όμ μ λλ€. λ ΈνΈ λ³κ²½μ¬νμ μ€μκ°μΌλ‘ λ°μλλ©°, μ¬μ©μ νΌλλ°±μ ν΅ν΄ κ²μ μ νλλ₯Ό μ§μμ μΌλ‘ κ°μ ν©λλ€.
@user
Comments