4. LangChain 기반 멀티스텝 AI 구현 검토 - 100-hours-a-week/20-real-wiki GitHub Wiki
-
단일 질문 처리에 적합
ConversationalRetrievalChain
은 대화 흐름(chat_history
)을 고려하는 구조로, 챗봇 서비스에 적합한 체인하지만 본 서비스는 사용자 질문 간 연속성이 없고, 대화 이력을 저장하지 않기 때문에, 매 질문을 독립적으로 처리하는
RetrievalChain
이 더 적합 -
다양한 문서 소스 대응 가능
RetrievalChain
은 PDF, 웹페이지, CSV 등 다양한 형식의 문서를 임베딩하여 벡터DB에 저장하고,이들을 기반으로 유사 문서를 검색해 응답을 생성할 수 있어 확장성과 범용성이 높음
따라서 문서 기반 질의응답 시스템 구현에 용이
- 화살표는
RetrievalChain
의 추론 방향 - 체인은
RetrievalChain
의 역할을 시각적으로 표현
사용자 질문
↓
질문 임베딩 (Embedding Model)
↓
벡터 DB에서 유사 문서 검색 (Retriever)
↓
검색된 문서 + PromptTemplate
↓
LLM 응답 생성 (LLM)
↓
최종 응답 반환
분류 | 도구 |
---|---|
문서 검색기 | VectorStoreRetriever |
프롬프트 구성기 | PromptTemplate |
LLM | Qwen2.5-7B-Instruct |
분류 | 도구 |
---|---|
임베딩 모델 | multilingual-e5-large-instruct |
벡터 데이터베이스 | FAISS |
검색 대상 문서 | markdown |
- 기능 소개
- Hugging Face에서 제공하는 고성능 임베딩 모델로, 다양한 언어(한국어 포함)를 처리 가능
- Instruct tuning이 적용되어 질의응답에 특화된 형태의 문장 임베딩을 생성함
- 사용 이유
- 한국어 등 비영어권 문서에 대한 임베딩 품질이 뛰어나, 다국어 환경에 적합
- 검색 기반 QA(RAG) 구조에서 질문과 문서 간 의미 유사도를 잘 파악하여 정확도 향상
- LLM의 생성 성능과 무관하게 검색 품질을 안정적으로 보완해줌
- 기능 소개
- Facebook AI에서 만든 벡터 유사도 검색 라이브러리
- 고차원 벡터 간의 거리 계산을 통해 유사한 항목을 빠르게 검색함
- 사용 이유
- 오픈소스로 로컬에서도 실행 가능하며, 검색 속도가 빠른 편
- 초기 비용 없이 벡터 기반 검색 시스템을 구성할 수 있어 실습·시제품 개발에 유리
- 대규모 문서에도 대응 가능하여 확장성 확보
- 기능 소개
- LangChain에서 제공하는 벡터 기반 문서 검색 컴포넌트
- 사용자의 질문 벡터와 유사한 문서 Top-k를 자동으로 검색
- 사용 이유
- FAISS 등 다양한 벡터 DB와 연동되어 빠르게 질의-문서 매칭 수행
- LangChain 내에서 RetrievalChain과 자연스럽게 연결되며, 모듈화되어 확장/유지보수에 용이
- 단순히 검색하는 것을 넘어 필터링, 우선순위 지정 등의 커스터마이징도 가능
- 기능 소개
- 텍스트 기반의 경량 마크업 언어로, 다양한 문서 구조(제목, 목록, 표, 코드블럭 등)를 간결하게 표현 가능
- GitHub, Notion, Jupyter 등 여러 플랫폼에서 기본 포맷으로 사용됨
- 사용 이유
- 문서의 계층 구조와 강조 포인트를 명확히 표현할 수 있어, LLM이 문맥을 잘 이해함
- HTML, PDF에 비해 가볍고 수정·관리하기 쉬워 실무에 적합
- 프롬프트 작성 시 구조화된 입력값으로 활용 가능
- 기능 소개
- LangChain에서 제공하는 프롬프트 자동 구성 도구
- 변수와 고정된 문장을 혼합해 일관성 있는 프롬프트를 쉽게 생성
- 사용 이유
- 검색된 문서와 질문을 LLM 입력 형식에 맞게 구성하여 최적화된 응답을 유도
- 프롬프트 구조를 코드처럼 템플릿화하여 재사용과 유지보수가 쉬움
- 잘 설계된 프롬프트는 LLM 성능을 극대화하는 핵심 요소 중 하나
자세한 내용은 👉 (링크) 참고
- 기능 소개
- Alibaba에서 공개한 78억(7.8B) 파라미터 규모의 중형 LLM
- Instruct 기반 튜닝이 적용되어 자연스러운 질의응답, 추론, 문서 생성이 가능함
- 사용 이유
- 한국어를 포함한 다양한 언어에서 안정적인 성능을 보이며, 비용 대비 품질이 우수함
- Hugging Face에서 쉽게 로드 가능하며, RAG 구조에 적합한 성능 보유
- Colab, 서버 환경 등 다양한 인프라에서도 활용 가능하며, 적당한 VRAM으로도 실행 가능
# 프롬프트 생성
prompt_template = PromptTemplate.from_template("""
You are an assistant for question-answering tasks.
Use the context below to answer the question.
Answer in Korean.
[질문]
{question}
[문서 내용]
{context}
[답변]
""")
# 체인 생성
chain = (
{"context":retriever, "question":RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
1. 사용자가 질문을 입력한다 → 예: "RAG에서 임베딩 모델은 왜 필요한가요?"
2. 질문을 벡터로 임베딩한다 → multilingual-e5 모델을 사용
3. 임베딩된 질문 벡터를 FAISS 벡터DB에 전달한다
4. FAISS는 벡터 간 유사도를 비교해 관련 있는 markdown 문서 청크들을 검색해온다
5. 검색된 문서들을 하나로 합쳐 context로 만든다 → stuff 방식 사용
6. PromptTemplate을 사용해 다음 형태로 프롬프트를 구성한다:
[질문] {question}
[참고 문서] {context}
7. 완성된 프롬프트를 Qwen2.5 LLM에 전달한다
8. Qwen2.5는 질문 + 문서를 바탕으로 답변을 생성한다
9. 생성된 답변을 사용자에게 반환한다
LangChain의 RetrievalChain
구조를 기반으로 한 다단계 추론 체인을 도입하여,
단순 질의응답이 아닌, 문서 기반의 신뢰성 있는 답변을 생성
-
정확도 향상
- 단순한 언어 모델 호출이 아닌, 사용자의 질문을 벡터화하여 관련 문서를 선행 검색함으로써, 답변의 정확도와 문서 기반 근거의 일치도를 높임
-
모듈화와 확장성
- 각 단계(질문 임베딩, 문서 검색, 프롬프트 구성, 답변 생성)가 분리되어 있어
기능별 튜닝 및 교체가 용이하며, 향후 다음과 같은 확장도 수월:
- 프롬프트 최적화 → 프롬프트만 교체
- LLM 변경 → 모델만 교체
- 필터링 기능 추가 → Retriever 확장
- 각 단계(질문 임베딩, 문서 검색, 프롬프트 구성, 답변 생성)가 분리되어 있어
기능별 튜닝 및 교체가 용이하며, 향후 다음과 같은 확장도 수월:
-
사용자 맞춤형 응답 구조화
- 사용자의 질문 패턴에 따라 프롬프트 또는 문서 필터링 로직을 커스터마이징하여, 공지사항 챗봇, 정책 문서 Q&A 등 다양한 목적에 맞게 분기 처리가 가능