생성형 AI 데이터 사이언티스트 직무를 시작하게 되었다.
모르는 용어나 기술이 대부분이라 많이 어렵고 힘든 것 같다.
그래도 천천히, 차근차근 혼자서라도 공부하고 정리해가다보면 괜찮지 않을까?
이 글은 내가 다른 분들이 활발하게 소통을 하는 걸 지켜보며
(난 그 당시에는 아무것도 이해를 하지 못해 듣기만 하고,, 망했다는 생각이 들어서 멘붕상태였다 🤔)
조용히 필기해두어 구글링과 리서치를 진행하여 정리해둔 것이다.
내가 생각한 DS와는 많이 달랐다
그래서 되게 혼란스럽고 어려워서 버틸 수 있을까 하는 의문이 계속 든다
그래도 어떡해 해야지,,
그래서 둘째날부터 구글링을 하며 해당 페이지들은 다 저장해두고 따로 노션에 기록을 해두었다

이런 형식으로 이해하고 접근하기 쉽게 정리해두었다..
갈수록 많아져서 .. 많이 걱정된다
그래도 할 수 있지 않을까
작년 sw 개발 직무 인턴도 초반에는 정말 어렵고 힘들어서 포기하고 싶었지만
꾸준히 공부하고 정리하는 습관을 통해 프로젝트를 잘 마무리할 수 있었으니까..!
이 글은 내가 핵심 부분 정리만 붙여놓고, 다음부터는 깔끔하게 전문적으로 작성해보고 싶다
1. CoT
👌 (사고 중..) → CoT(Chain of Thought): 답변 전에 사고를 하고 답변한다 → 성능 올라간다
2. Embedding
👌 임베딩은 텍스트만 가능하다
3. Parsing
👌 파싱: 데이터 소스에서 관련 정보를 추출하고 쉽게 분석할 수 있는 구조화된 형식으로 변환
4. Chunking
👌 청킹: 대용량의 데이터를 더 작은 단위로 나누는 과정
4-1. Token
5. RAG (Retrieval-Augmented Generation)
👌 RAG: “검색 기반 생성” 방식의 AI 아키텍처로, 단순히 모델이 모든 답을 기억하거나 생성하는 게 아니라, 외부 지식(문서, DB 등)을 검색 해서 활용한 후, 그 결과를 바탕으로 응답을 생성하는 방법
5-1. Contextual Retrieval
👌 Contextual Retrieval은 위 문제를 해결하기 위한 방법으로, 두 가지 기술을 사용
5-2. BM25
👌 BM25: 주어진 쿼리에 대해 문서와의 연관성을 평가 하는 랭킹 함수 알고리즘
5-3. BoW (Bag of Words)
👌 BoW: 단어들의 순서는 전혀 고려하지 않고, 단어들의 출현 빈도(frequency) 에만 집중하는 텍스트 데이터의 수치화 표현 방법
BoW를 만드는 과정을 두 가지 과정으로 생각해보자
6. ChromaDB
✔ chromadb: 벡터 데이터베이스
✔ 7. LangGraph
Langgraph: 대규모 언어 모델(LLM)을 활용한 복잡한 워크플로우와 의사결정 프로세스를 구현하기 위한 파이썬 프레임워크
✔ 8. RAGAS
RAGAS: RAG 파이프라인의 정량적 평가 를 지원하는 오픈 소스 프레임워크
✔ 9. GraphDB
성능 높이기 위해 graphDB
✔ 10. Streamlit
streamlit: Python 스크립트를 통해 데이터 시각화, 대화형 웹 애플리케이션, 대시보드 등을 손쉽게 만들 수 있음
Q. contextual retrieval은 어떻게 청크에 문맥 정보를 추가하는 거야?
A. Contextual Retrieval에서 말하는 문맥 정보 추가는, 각 청크(chunk)를 벡터화하기 전에 그 청크가 어디서 왔는지, 어떤 의미를 갖는지를 알려주는 배경정보 (context)를 같이 붙여서 벡터화하는 걸 말합니다.
✅ 왜 문맥(Context)이 중요한가?
예를 들어, 다음과 같은 청크가 있다고 해볼게요:
"15일의 연차가 제공됩니다."
이 문장은 혼자 있으면 무슨 말인지 모호합니다.
하지만 아래처럼 문맥이 같이 주어지면, 의미가 명확해지죠:
[출처: 인사 규정 2장 연차 규정]
"15일의 연차가 제공됩니다."
→ 이 문서를 임베딩할 때, 이 문맥 정보까지 포함해서 벡터화하면 질문-응답 일치율이 훨씬 올라갑니다.
✅ Contextual Retrieval에서 문맥 정보를 어떻게 추가하나요?
🎯 핵심:
청크를 단독으로 임베딩하지 않고, 주변 정보(제목, 섹션, 문서 경로 등)를 같이 붙여서 임베딩
🔧 예시: 청크에 문맥 추가 방식
💡 기본 방식 (문맥 없음)
chunk = "15일의 연차가 제공됩니다."
✅ Context 포함 방식
context = "출처: 인사규정 > 연차정책\n"
chunk_with_context = context + chunk
→ 이 chunk_with_context를 임베딩하면 더 의미 있는 벡터가 만들어집니다.
## 코드 예시
title = "인사 규정"
section = "2장 연차 정책"
text_chunk = "15일의 연차가 제공됩니다."
chunk_with_context = f"{title} / {section}\n{text_chunk}"
embedding = model.encode(chunk_with_context)
| 문맥 정보 종류 | 예시 |
|---|---|
| 문서 제목 | “인사 규정” |
| 섹션 제목 | “2. 연차 정책” |
| 상위 본문 | “회사 내 모든 직원은…” |
| 문서 경로 / URL | hr_docs/policies/annual_leave.md |
| 생성 일자 / 작성자 | "작성자: HR팀 (2023)" |
| 사용자 타입 | "대상: 정규직 직원" |
🧠 왜 이게 중요한가?
같은 내용이라도 문맥이 다르면 벡터 의미가 달라짐
| 항목 | 설명 |
|---|---|
| Contextual Retrieval | 문서 청크에 주변 문맥을 함께 포함시켜 벡터화하는 기법 |
| 목적 | 문맥을 알면 더 정밀한 검색 가능 |
| 방법 | 제목, 섹션, 경로 등 메타데이터를 청크 앞에 붙여서 임베딩 |
| 효과 | 검색 정확도 ↑, LLM 응답 품질 ↑ |