문서 기반 질의응답 봇
PDF를 수집하고, 임베딩하고, 검색하고, 생성하는 RAG 봇을 완성해보세요. 상용 에이전트의 ‘Hello World’입니다.
문서 기반 질의응답 봇은(는) CoddyKit의 무료 AI Agents 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Agents 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.
이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.
프로젝트 목표
자체 문서(PDF, Markdown 등)에서 질문에 답하는 챗봇을 구축합니다. 이는 운영 에이전트의 "헬로 월드"와 같은 프로젝트이며, 어느 팀에서나 즉시 유용하게 사용할 수 있습니다.
아키텍처
- 수집: 문서 불러오기 → 청크로 나누기 → 임베딩 → 벡터 데이터베이스에 저장
- 질의: 질문 임베딩 → 상위 K개 청크 검색 → 프롬프트에 삽입 → LLM 호출
- 인용: 청크에 ID를 붙여 형식화하고 LLM에 인용하도록 요청
Step 1: Load and Chunk
from langchain.text_splitter import RecursiveCharacterTextSplitter
from pypdf import PdfReader
text = ''
for page in PdfReader('handbook.pdf').pages:
text += page.extract_text() + '\n'
splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100)
chunks = splitter.split_text(text)
print(f'{len(chunks)} chunks')Step 2: Embed and Store
import chromadb
from openai import OpenAI
oai = OpenAI()
chroma = chromadb.PersistentClient(path='./db')
collection = chroma.get_or_create_collection('handbook')
resp = oai.embeddings.create(model='text-embedding-3-small', input=chunks)
vectors = [d.embedding for d in resp.data]
collection.add(ids=[f'c{i}' for i in range(len(chunks))], embeddings=vectors, documents=chunks)Step 3: Query Function
def query(question, k=4):
qvec = oai.embeddings.create(model='text-embedding-3-small', input=question).data[0].embedding
res = collection.query(query_embeddings=[qvec], n_results=k)
return res['documents'][0]Step 4: Build the Prompt
def make_prompt(question, chunks):
context = '\n\n'.join(f'[{i+1}] {c}' for i, c in enumerate(chunks))
return f'''
Using only the context below, answer the question.
If the answer is not present, say so.
Cite the source like [1], [2], etc.
Context:
{context}
Question: {question}
Answer:
'''
print(make_prompt("What is the return policy?", ["Returns accepted within 30 days.", "Item must be unused."]))
Step 5: Generate
def answer(question):
chunks = query(question)
prompt = make_prompt(question, chunks)
response = oai.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}],
temperature=0,
)
return response.choices[0].message.content
print(answer('What is our refund policy?'))UI에 연결하기
FastAPI와 간단한 HTML 페이지(또는 Streamlit)로 감싸면 작동하는 앱이 완성됩니다.
# pip install fastapi uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.post('/ask')
def ask(payload: dict):
return {'answer': answer(payload['question'])}대화 기록 추가하기
여러 차례에 걸친 질문과 답변에서는 메시지를 유지하고 프롬프트에 전달합니다:
messages = [{'role': 'system', 'content': 'You are a doc Q&A assistant.'}]
def chat(user_input):
messages.append({'role': 'user', 'content': user_input})
chunks = query(user_input)
context_msg = {'role': 'system', 'content': f'Context:\n{chr(10).join(chunks)}'}
response = oai.chat.completions.create(
model='gpt-4o-mini',
messages=[messages[0], context_msg] + messages[1:]
)
answer = response.choices[0].message.content
messages.append({'role': 'assistant', 'content': answer})
return answer흔한 문제
- 청크가 너무 크거나 작음 — 500~800 토큰부터 시도합니다
- 출처 인용이 없음 — 사용자는 출처 없는 답변을 신뢰하지 않음
- K가 너무 큼 — 토큰을 낭비하고 주의가 분산됨
- 대화 기록을 포함한 질문 전체를 임베딩함 — 최신 사용자 질문만 임베딩해야 함
출처 링크 추가하기
메타데이터에 출처 URL을 저장하고 답변에 표시합니다:
metadata = [{'source': 'handbook.pdf', 'page': i} for i in range(len(chunks))]
# In the prompt, include 'source: <url>' so the LLM can produce clickable references.평가하기
사용자의 실제 질문 20개를 수집합니다. 봇이 올바르게 답했는지 직접 표시하고, 이를 첫 평가 세트로 사용합니다.
배포하고 반복 개선하기
이 봇은 운영 환경에서 일반적인 질문의 80%를 처리합니다. 틀린 20%를 바탕으로 반복 개선하십시오. 일반적으로 더 나은 청크 분할이나 재순위화가 필요합니다.
출처 인용
프롬프트에 출처 ID를 포함하고 LLM에 인용하도록 요청하는 이유는 무엇일까요?
정리
약 50줄로 RAG 봇을 만들 수 있습니다. 배포하고 평가한 뒤, 청크 분할과 검색을 반복 개선하십시오. 이 패턴은 수많은 에이전트 앱에서 반복해서 사용됩니다.
AI 튜터와 함께 AI Agents을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 60
- 레슨
- 239
자주 묻는 질문
“문서 기반 질의응답 봇” 강의는 무료인가요?
네 — “문서 기반 질의응답 봇” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Agents 강의 전체를 잠금 해제할 수 있습니다. AI Agents 강의에는 총 4개의 강의가 포함되어 있습니다.
“문서 기반 질의응답 봇”에서 뭘 배우나요?
PDF를 수집하고, 임베딩하고, 검색하고, 생성하는 RAG 봇을 완성해보세요. 상용 에이전트의 ‘Hello World’입니다. 브라우저에서 직접 실행하는 실습 코드로 AI Agents을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
AI Agents을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 AI Agents은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“문서 기반 질의응답 봇” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 AI Agents 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 AI Agents 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 문서 기반 질의응답 봇
- 코드 설명 에이전트
- 웹 탐색 연구 에이전트
- DB용 SQL 어시스턴트