관리 메뉴

The Nirsa Way

[LLM] 컨텍스트 엔지니어링이란? (Context Engineering, RAG, Chunking, Embedding, Vector Search, Context Injection) 본문

AI Engineering/LLM

[LLM] 컨텍스트 엔지니어링이란? (Context Engineering, RAG, Chunking, Embedding, Vector Search, Context Injection)

KoreaNirsa 2025. 9. 15. 18:19
반응형

 

[LLM] 컨텍스트 엔지니어링이란? (Context Engineering)

LLM은 기본적으로 프롬프트를 기반으로 답변을 생성하게 되는데, 실제 서비스 환경에서는 특정 작업에 따른 정보를 제공하여 더 정확한 답변을 줄 수 있습니다. 즉, LLM이 응답을할 때 특정 도메인이나 상황에 맞춰 필요한 문맥(Context)을 공급하여 더 정확한 답변을 유도하는 기법을 의미합니다.

예를들어 사내에서 사용할 QA 챗봇을 만드는 상황에서 "우리 회사의 연차 규정을 알려줘" 라고 하면 일반적으로 다른 회사들이 사용하는 정보들을 기반으로 답변이 제공됩니다. 

// 간단한 예시
사용자 : 우리 회사의 연차 규정을 알려줘
답변 : 대한민국 근로기준법에 따르면 근로자는 1년에 15일 이상의 연차를 보장받습니다.

하지만 컨텍스트 엔지니어링을 적용하여 답변할 때 참고해야할 추가 문맥(Context)를 제공, 즉 회사 연차 규정이 적혀있는 문서를 제공한다면 회사에 맞춘 답변을 제공할 수 있게 됩니다.

// 간단한 예시 (컨텍스트 엔지니어링 적용)
사용자 : 우리 회사의 연차 규정을 알려줘
  - 사내 인사 규정 문서 검색
답변 : 우리 회사는 입사 1년 후 15일, 3년 이상 근속 시 20일, 최대 25일의 연차를 제공합니다

위의 예시와 같이 컨텍스트 엔지니어링이 적용된 사내 QA 챗 봇을 사용한다면 문서를 검색하여 "우리 회사"에 대한 연차 규정을 정확하게 확인하고 답변이 가능한 형태가 됩니다. 위의 예시를 조금만 더 자세히 한다면 다음과 같습니다.

  1. 사용자 입력 : "우리 회사의 연차 규정을 알려줘"
  2. 컨텍스트 검색 : 사내 DB 또는 문서에서 관련 컨텍스트(연차 규정) 검색
  3. 실제 LLM 입력 : 검색된 컨텍스트, 사용자가 입력한 프롬프트 등을 LLM에게 실제로 입력
  4. 답변 생성 : "우리 회사는 입사 1년 후 15일, 3년 이상 근속 시 20일, 최대 25일의 연차를 제공합니다"

컨텍스트 엔지니어링의 대표적인 기술 RAG

컨텍스트 엔지니어링에서 가장 대표적인 기술로써는 RAG(Retrieval-Augmented Generation)이 있습니다. 이는 위에서 살펴봣던 예시와 같이 DB나 문서를 검색하여 그 결과를 LLM 입력에 함께 넣어 답변을 생성하는 방식입니다.

RAG를 사용하게 되면 DB나 문서를 검색함으로써 모델 파라미터에 직접 학습시키지 않더라도 최신 정보 또는 도메인 지식을 활용할 수 있는 가장 큰 장점이 있습니다. 이로써 고객 지원 챗봇이나 제품 매뉴얼, 최신 뉴스 요약 등의 분야에서 활용될 수 있습니다.

동작 구조는 크게 5가지로 나뉘어 집니다.

 

1. 사용자 질문

가장 처음으로는 "우리 회사의 연차 규정을 알려줘"와 같이 사용자에게 질문을 받습니다.


2. Chunking

토큰 한계와 비용에 대한 문제로 긴 원문 자체를 넣기가 어렵기 때문에 효율을 위해 원문을 적절한 크기로 쪼개서 부분적으로 검색을 합니다. 즉 문서를 작은 단위로 나누는 작업단, 원문을 잘못 쪼갤 경우 문맥이 끊겨 정확도가 떨어지거나 불필요한 토큰이 낭비되는 단점이 있습니다.

※ 토큰이란?
LLM이 텍스트를 처리할 때 잘게 쪼개는 단위로써 보통 자주 쓰이는 단어나 문자열 패턴을 1토큰으로 지정합니다.
ex) ChatGPT is powerful!  →  ["Chat", "G", "PT", " is", " powerful", "!"]으로 나뉘어질 수 있으므로 6토큰

아래와 같은 원문이 있다고 가정하겠습니다.

우리 회사는 입사 1년 후 15일의 연차를 지급합니다.
3년 이상 근속한 직원에게는 20일 10년 이상 근속한 직원에게는 25일의 연차를 지급합니다.
연차는 근로기준법을 준수하며 개인 사정에 따라 분할 사용이 가능합니다.

이에 대한 원문을 Chunking할 때 토큰 길이, 문장/문단 기준, 재귀 분할 등 여러가지가 있지만 단순히 문자열을 기준으로 한다는 가정하에 chunk, overlap을 사용하는데 간단히는 chunk과 overlap을 문자열 기준으로 적용한다면 chunk는 자를 문자열의 수, overlap은 앞 청크의 뒷부분을 겹칠 문자열의 수가 됩니다.

chunk 단위로 쪼개게 되면  문장이 중간에 잘려서 의미가 끊길 수 있기 때문에 겹치는 부분으로 문장을 자연스럽게 연결시켜주는 징검다리 역할을 수행해주는 것이 overlap 입니다. 만약 chunk=40, overlap=10으로 설정한다면 아래와 같은 결과를 얻을 수 있습니다.

40자를 기준으로 문서를 쪼게고, 앞 청크의 뒷부분을 overlap 만큼(10자) 다음 청크에서 반복시켜서 문장을 자연스럽게 연결시켜주게 됩니다. 아래의 예시에서는 ( ) 으로 표현된 것이 overlap으로 인해 다시 등장한 문자열입니다.

[Chunk 1] 우리 회사는 입사 1년 후 15일의 연차를 지급합니다. 3년 이상 근속한
[Chunk 2] ( 3년 이상 근속한) 직원에게는 20일 10년 이상 근속한 직원에게는 25
[Chunk 3] (한 직원에게는 25)일의 연차를 지급합니다. 연차는 근로기준법을 준수하며
[Chunk 4] (기준법을 준수하며 )개인 사정에 따라 분할 사용이 가능합니다.

3. Embedding (텍스트 → 숫자 좌표화)

임베딩에서는 텍스트를 벡터로 바꾸게 됩니다. 즉 텍스트를 숫자 좌표(벡터)로 바꾸는 기술로써 같은 문장 끼리는 벡터 공간에서 가깝게, 다른 뜻이라면 멀게 배치가 됩니다.

간단히는 지도를 생각해보시면 되는데, 서울(37.5, 127)과 인천(37.4, 126.7)의 좌표는 가깝고 부산(35.1, 129.0)과는 먼것을 생각하시면 됩니다. 이에 따라 벡터도 숫자 좌표를 기준으로 같은 문장끼리는 가까운 곳에, 다른 문장끼리는 먼 곳에 배치하는 기술입니다.

예를들어 아래와 같이 텍스트를 벡터로 변환하게 됩니다. (숫자는 임의로 작성했습니다) 

텍스트: "우리 회사의 연차 규정을 알려줘"
질문 벡터: [0.011, -0.030, 0.543, ...]

텍스트: "우리 회사는 입사 1년 후 15일의 연차를 지급합니다. 3년 이상 근속한"
Chunk 1 벡터: [0.012, -0.028, 0.551, ...]

텍스트: "( 3년 이상 근속한) 직원에게는 20일 10년 이상 근속한 직원에게는 25"
Chunk 2 벡터: [0.010, -0.033, 0.561, ...]

텍스트: "(한 직원에게는 25)일의 연차를 지급합니다. 연차는 근로기준법을 준수하며"
Chunk 3 벡터: [0.015, -0.035, 0.575, ...]

텍스트: "(기준법을 준수하며 )개인 사정에 따라 분할 사용이 가능합니다."
Chunk 4 벡터: [0.025, -0.061, 0.864, ...]

텍스트: "퇴직금 정산 방법"
벡터: [0.234, 0.481, -0.112, ...]

이러한 결과를 봣을 때 "우리 회사의 연차 규정을 알려줘"과 "우리 회사는 입사 1년 후 15일의 연차를 지급합니다. 3년 이상 근속한"는 아주 가깝게 배치되어 있어 의미가 비슷하다고 판단할 수 있으며, "퇴직금 정산 방법"의 경우 멀게 배치되어 있어 다른 의미를 가지고 있다고 판단할 수 있는 근거로 활용될 수 있습니다.

이는 아래의 벡터 검색(Vector Search)에서 활용됩니다.


4. Vector Search (질문과 가장 가까운 청크 찾기)

벡터 검색에서는 질문과 가장 가까운 청크를 찾습니다. 질문 벡터와 각각의 청크 벡터들을 비교하여 코사인 유사도를 확인하여 이에 대한 정렬 결과를 가지고 답변에 활용할 문맥(Context)으로 활용되게 됩니다.

이와 같이 코사인 유사도에 따라 Top 4로 정렬을 한다면 Chunk 1 > Chunk 2 > Chunk 3 > Chunk 4로 정렬되게 됩니다. "퇴직금 정산 방법"에 대한 벡터는 코사인 유사도가 매우 떨어지므로 제외되는 방식 입니다.

그렇다면 최종적으로 벡터 검색에 의해 정렬된 내용은 아래와 같습니다.

[Chunk 1] 우리 회사는 입사 1년 후 15일의 연차를 지급합니다. 3년 이상 근속한
[Chunk 2] ( 3년 이상 근속한) 직원에게는 20일 10년 이상 근속한 직원에게는 25
[Chunk 3] (한 직원에게는 25)일의 연차를 지급합니다. 연차는 근로기준법을 준수하며
[Chunk 4] (기준법을 준수하며 )개인 사정에 따라 분할 사용이 가능합니다.

5. Context Injection (컨텍스트 주입 및 프롬프트 구성)

이제 컨텍스트를 주입합니다. 최종적으로 아래와 같은 프롬프트가 구성될 수 있으며 토큰 절약을 위해 중복되는 표현(overlap 등)은 정리하여 주입해도 좋습니다.

// 내부 시스템 프롬프트
[System]
너는 우리 회사 HR 정책을 안내하는 어시스턴트야.
아래 '컨텍스트'에 근거해 답하고 근거가 없으면 "문서에 근거가 없습니다"라고 말해야 하며
가능하면 출처(청크 번호/문장)를 괄호로 표시하도록 해

[Instruction]
사용자의 질문에 맞게 핵심만 간결히 요약해서 답변해

// 벡터 검색으로 찾은 청크 4개를 컨텍스트 주입
[Context]
[Chunk 1] 우리 회사는 입사 1년 후 15일의 연차를 지급합니다. 3년 이상 근속한
[Chunk 2] ( 3년 이상 근속한) 직원에게는 20일 10년 이상 근속한 직원에게는 25
[Chunk 3] (한 직원에게는 25)일의 연차를 지급합니다. 연차는 근로기준법을 준수하며
[Chunk 4] (기준법을 준수하며 )개인 사정에 따라 분할 사용이 가능합니다.

// 사용자 질문
[User]
우리 회사의 연차 규정을 알려줘

6. 답변 생성

이제 LLM이 컨텍스트를 참고하여 답변을 제공 합니다.

우리 회사는 입사 1년 후 15일의 연차를 부여하며
3년 이상 근속 시 20일, 10년 이상 근속 시 25일을 부여합니다.
연차는 근로기준법을 준수하여 분할 사용을 할 수 있습니다.

마무리

마지막으로 컨텍스트 엔지니어링에 대해 요약하며 포스팅을 마치도록 하겠습니다.

 

A. 컨텍스트 엔지니어링 이란?

LLM이 응답을할 때 특정 도메인이나 상황에 맞춰 필요한 문맥(Context)을 공급하여 더 정확한 답변을 유도하는 기법을 의미합니다


B. 왜 필요한가?
  1. 정확성 향상 : 회사/제품/내부 규정과 같은 도메인 지식 반영
  2. 최신성 유지 : 모델을 학습시키지 않아도 최신 문서 반영 가능
  3. 일관성 확보 : DB/문서를 근거로 답변하므로 일관성 확보

C. 자주 사용되는 대표 상황 3가지
  1. 사내 QA : 인사/보안/IT 규정 챗봇
  2. 고객 지원 : 매뉴얼/FAQ/회사 정책에 근거하여 답변
  3. 지식 검색 : 위키/노션/사내 문서를 바탕으로 요약 또는 답변

D. 아주 간단히 보는 컨텍스트 엔지니어링의 흐름
  1. 질문 수신
  2. 관련 DB/문서 검색 (RAG 등)
  3. 검색하여 찾은 조각을 프롬프트에 주입(컨텍스트 주입)
  4. 근거 기반 답변 생성

E. 프롬프트 엔지니어링 vs 컨텍스트 엔지니어링 간단 비교


F. 자주 하는 오해
Q. 프롬프트만 잘 짜면 충분하지 않나? 컨텍스트 엔지니어링이 필요한 이유?
A. 내부 규정 또는 최신 정보, 특정 도메인에 대한 지식은 AI 모델에 의존해야 하므로 한계가 존재함

Q. 컨텍스트와 파인튜닝은 같은 것인가?
A. 파인튜닝은 AI 모델을 다시 학습하는 개념이며
   컨텍스트는 검색한 문서의 조각을 프롬프트에 붙여주는 행위에 가깝습니다.
   
Q. 그렇다면 컨텍스트 엔지니어링은 무조건 좋은것인가?
A. 문서 자체가 부정확하는 등 품질이 떨어지면 답변의 퀄리티 또한 같이 떨어집니다.
   컨텍스트 엔지니어링의 핵심은 좋은 문서가 기반이 되어야 합니다.
반응형