RAG Cookbook이 제공하는 더 많은 내용을 살펴보고 오늘날의 RAG 솔루션에 대해 더 깊이 이해해 보세요.

파란색 말풍선, 물음표 등 다양한 도형과 기호가 포함된 순서도.
개요

답변 생성은 대상 기업 데이터 소스 또는 텍스트 코퍼스에서 검색된 정보를 사용해 사용자 질문에 대한 응답을 생성하는 RAG 솔루션의 구성 요소입니다. 

고려 사항

모델 매개변수

오픈소스 LLM 이름 뒤에 붙는 숫자는 해당 모델의 파라미터 수를 나타냅니다.  예를 들어 Granite 3.0 8B Instruct는 80억 개의 파라미터를 가진 모델입니다.  파라미터는 모델이 입력 데이터를 어떻게 조작하고 이해하며 출력을 생성하는지를 조율하는 지휘자와 같다고 생각할 수 있습니다. 이들은 가중치나 편향의 형태로 나타날 수 있으며, 생성된 출력에서 특정 입력 특성이 얼마나 중요한지를 결정하는 데 영향을 미칩니다.

파라미터 수가 많을수록 일반적으로 모델의 복잡성과 적응성이 높아집니다(서로 다른 아키텍처 간에는 반드시 그렇다고 할 수는 없지만, 트랜스포머 아키텍처 내에서는 일반적으로 해당됩니다). 파라미터 수가 더 많은 대규모 언어 모델은 데이터에서 더 복잡한 패턴을 식별할 수 있으며, 이를 통해 더 풍부하고 정밀한 출력을 생성할 수 있습니다. 그러나 많은 경우와 마찬가지로 여기에도 트레이드오프가 존재합니다. 파라미터가 급격히 증가하면 더 높은 계산 요구 사항과 더 많은 메모리가 필요하며, 과적합 위험도 커집니다.

모델 유형: instruct vs. code, instruct vs. chat

Chat 모드는 대화형 컨텍스트를 위해 설계되었으며, instruct 모드는 특정 도메인의 자연어 처리 작업을 위해 설계되었습니다.

Chat 모드에서의 파인 튜닝은 LLM이 사용자에게 관련성이 높고 흥미로운 자연스럽고 일관된 응답을 더 잘 생성하도록 돕습니다. Instruct 모드에서의 파인 튜닝은 LLM이 다양한 유형의 지시를 더 잘 따르고 작업에 정확하고 적절한 출력을 생성하도록 돕습니다.

모델 설정

LLM은 응답이 생성되는 방식을 구성하기 위한 몇 가지 설정을 제공합니다.

  • “temperature” 설정은 모델 응답의 변동성이 얼마나 큰지를 결정합니다. 간단히 말해 temperature 값이 낮을수록 모델의 응답은 더 결정적이고 일관되게 됩니다. RAG 솔루션에서는 매우 낮은 temperature 값, 이상적으로는 0을 사용하는 것이 권장됩니다.
  • “max_tokens / max_new_tokens”는 모델이 응답에서 사용할 수 있는 토큰 수를 제한합니다(단어 하나는 대략 1.5개의 토큰에 해당합니다). 솔루션 개발자는 자신의 사용 사례에서 충분한 답변과 과도한 정보 사이의 균형을 맞출 수 있는 값을 찾기 위해 실험해야 하지만, Q&A RAG 솔루션에서는 일반적으로 100이 적절한 제한 값입니다.
  • 샘플링 전략은 모델이 응답에서 다음 토큰을 어떻게 선택하는지를 결정합니다. RAG 솔루션에서는 프롬프트에 대해 일관된 응답을 보장하기 위해 greedy 샘플링 전략을 사용하는 것이 좋습니다.

프롬프트 엔지니어링

먼저 생성 성능을 향상시키기 위한 프롬프트 규칙을 살펴보겠습니다.

규칙 #1: 단순하게 시작하세요

처음부터 매우 긴 프롬프트를 작성한 뒤 나중에 테스트하는 방식으로 시작하지 마세요.

예를 들어 다음과 같은 긴 프롬프트로 시작하지 마세요.

- S&P 1000에 포함된 주요 전자 기업의 재무 부서에서 일하고 있습니다. 핵심 주제, 트렌드, 감정을 파악하기 위해 분기 주주총회 회의록을 요약해야 합니다. 

번호가 매겨진 글머리표 목록 형식으로 응답하세요.

각 항목이 완전한 문장으로 구성되도록 합니다.
할루시네이션을 를 생성하지 마세요. 오직 트랜스크립트에 포함된 정보만 사용하여 답하세요.

다음은 요약할 회의록입니다.

하지만 다음과 같이 시작하세요.

- 다음 회의록에 포함된 핵심 주제를 요약하세요.

규칙 #2: 점진적으로 변경하세요

모델 파라미터를 크게 변경하지 마세요. 

대부분의 경우

  • Temperature와 Repetition penalty의 작은 변화만으로도 눈에 띄는 영향을 줄 수 있습니다.
  • 큰 변화 뒤에는 작은 변화로도 달성할 수 있는 성공이 종종 숨겨져 있습니다.

다음과 같은 엔지니어링 원칙을 적용하세요.

  • 한 번에 하나의 파라미터만 변경하세요. 각 변경 사항을 개별적으로 검증하세요.
  • 의도한 효과가 없는 변경은 되돌리세요. 이전 값으로 되돌리세요.
  • 기본값에서 변경하는 경우에는 그에 대한 충분한 설명이 있어야 합니다.

규칙 #3: 교차 검증하세요

프롬프트가 실패하도록 만들어 보세요.  프롬프트를 한 번만 테스트하고 성공했다고 판단하지 마세요. 프롬프트에 대해 수십 번의 테스트를 수행하세요.

  • 고객이 문제를 발견하기 전에 먼저 프롬프트의 취약점을 찾아보세요.

테스트 데이터 세트를 만들고 계속해서 예시를 추가하세요.  각 POC 릴리스 이후에는 프롬프트가 계속 제대로 작동하는지 다시 테스트하세요.

규칙 #4: 복잡한 추출 작업은 단일 프롬프트로 수행할 수 없습니다.

걱정할 필요 없습니다. watsonx.ai를 사용하면 여러 프롬프트를 병렬로 처리할 수 있습니다.

6개의 프롬프트와 3개의 섹션으로 구성된 금융 보고서 분석 순서도.

규칙 #5: 프롬프트 체인

작업을 더 작은 하위 작업으로 나누세요.

캘리포니아 와인 산지로 여행을 계획하는 과정을 보여주는 순서도.

규칙 #6: 작업 분류(또는 프롬프트 아키텍처)

프로세스의 각 단계를 여러 프롬프트와 해당 작업에 특화된 모델로 분리하세요.

사용자 요청부터 기업 데이터까지의 과정을 보여주는 멀티 LLM 어시스턴트 순서도.

규칙 #7: granite.13b.chat.v

Chat 모델은 instruct 모델과 다른 프롬프트 설계가 필요합니다.

시스템 프롬프트와 일반 프롬프트가 포함된 모델별 지시 형식을 보여주는 스크린샷.
인컨텍스트 학습을 위한 일반 프롬프트 스크린샷.
RAG 모델별 형식을 위한 프롬프트.

규칙 #8: 모델과 재미있게 실험해 보세요

우리는 일에서만큼이나 실험과 놀이를 통해서도 많은 것을 배웁니다.  최신 LLM을 사용해 보고 평소 업무 범위를 벗어난 작업으로 모델에 도전해 보세요.

LLM이 수행할 가능성이 높은 작업을 선택하세요.

  • 새에 관한 4문장의 시를 작성하세요.
  • 채팅 과제: 좋아요, 이제 개에 대해 이야기해 보세요.
  • Midori라는 이름의 새에 관한 재미있는 이야기를 5문장 미만으로 들려주세요.
  • 채팅 과제: 새의 이름을 Charlie로 바꾸고 파란색을 추가하며 전체를 7문장으로 만들어 보세요.
  • 다음 질문에 단어 10개만 사용해 답하세요. “왜 하늘은 파란가요?”
  • 채팅 과제: 좋아요. 사실처럼 들리지만 실제로는 사실이 아닌 이유를 말해 보세요.

프롬프트를 연결하는 방식을 실험하기 위해 다단계 상호작용을 추가해 보세요.

시스템 프롬프트와 사용자 프롬프트

시스템 프롬프트를 수정하는 것은 사용자 프롬프트를 수정하는 것만큼 중요합니다. 시스템 프롬프트는 응답의 품질, 톤 등 다양한 측면에서 큰 차이를 만들어 낼 수 있습니다. 시스템 프롬프트는 상호작용의 컨텍스트를 설정하여 모델의 동작을 안내하고 일관성을 보장하며 사용자 프롬프트는 대화의 구체적인 내용을 결정합니다. 성능을 향상시키기 위해 시스템 프롬프트를 수정할 수 있는 기능은 매우 중요합니다.

시스템 프롬프트

시스템 프롬프트는 상호작용 전반에서 AI의 동작을 안내하는 기본 지침을 제공합니다. 또한 모델의 역할, 톤, 윤리적 기준을 설정합니다. 구분자(Delimiters)를 사용하면 모델이 프롬프트를 더 잘 이해하도록 돕고 프롬프트 인젝션을 방지할 수 있습니다. 구분자는 프롬프트에서 사용자 입력이 어디에 삽입되는지 명시하여 사용자 입력의 시작과 끝을 모델이 식별할 수 있도록 도와줍니다. 구분자는 프롬프트 인젝션을 방지하는 데에도 도움이 됩니다. 구분자는 , """ , < > , ` 와 같은 다양한 형태를 사용할 수 있습니다.

다음은 Granite 모델의 시스템 프롬프트 예시입니다.

<|system|>\nGranite Chat은 IBM이 개발한 AI 언어 모델입니다. 신중한 어시스턴트입니다. 지침을 신중하게 따릅니다. 도움이 되며 해롭지 않고 윤리적 지침을 따르며 긍정적인 행동을 장려합니다. 인사말(예: hi, hello, g’day, morning, afternoon, evening, night, what’s up, nice to meet you, sup 등)에는 항상 “Hello! I am Granite Chat, created by IBM. How can I help you today?”라고 응답합니다. 그 외의 다른 말은 하지 말고 대화를 시작하지 마세요. {instruction}\n{session_history}<|user|>\n{query}\n<|assistant|>\n

사용자 프롬프트

사용자 프롬프트는 모델에서 원하는 응답을 얻기 위해 사용자가 제공하는 구체적인 지시 또는 질문입니다. 모델이 작업을 이해할 수 있도록 명확하고 간결하게 작성해야 합니다.

IBM 툴

Prompt Lab

Prompt Lab은 파운데이션 모델을 사용해 작업하고 프롬프트 엔지니어링을 통해 프롬프트를 구축할 수 있도록 지원하는 IBM 플랫폼입니다. Prompt Lab에서는 사용자가 프롬프트 편집기에서 Chat, Freeform 또는 Structured 모드를 사용해 파운데이션 모델과 상호 작용할 수 있습니다. 이러한 다양한 옵션을 통해 질문 응답, 콘텐츠 생성 및 요약, 텍스트 분류 및 추출을 포함한 다양한 자연어 처리(NLP) 작업을 지원할 수 있도록 최적의 모델 구성을 설계할 수 있습니다.

Prompt Lab을 시작하는 방법과 관련된 모든 정보는 공식 Prompt Lab 사이트를 참조하세요.

InstructLab

RAG 솔루션의 정확도를 향상하기 위한 새로운 전략 중 하나는 데이터 코퍼스에 맞게 파인 튜닝된 생성 모델을 사용하는 것입니다. 이 방식은 여러 가지 이유로 엔드투엔드 정확도를 향상시킬 수 있습니다.  가장 중요한 이유는 생성 단계가 검색 결과를 개선하고 심지어 수정할 수 있는 능력을 제공하기 때문입니다.  또한 기업 비즈니스 콘텐츠에 맞게 튜닝할 수 있기 때문에 기업에 보다 특화된 관련 답변을 제공할 수 있습니다.

InstructLab을 시작하는 방법과 관련된 모든 정보는 공식 InstructLab Repository를 참조하세요.

Granite

Granite 3.0에는 Granite 3.0 8B Instruct, 2B Instruct, 8B Base, 2B Base와 같은 다양한 모델이 포함되어 있으며, 이 모델들은 12개 자연어와 116개 프로그래밍 언어에 걸쳐 12조 개 이상의 토큰으로 학습되었습니다. 이 모델들은 학술 및 기업 벤치마크 모두에서 주요 공급자의 유사한 규모 모델과 동등하거나 그 이상의 성능을 보이며, 언어 이해, 코드 생성, 문서 요약과 같은 작업에서 강력한 성능을 보여줍니다.

Granite 3.0 차별화 요소

투명성과 안전성

IBM의 투명성과 안전성에 대한 노력은 Granite 3.0 기술 보고서에서 학습 데이터 세트, 필터링 및 큐레이션 프로세스를 상세히 공개한 점에서 분명하게 드러납니다. 이 모델들은 허용적인 Apache 2.0 라이선스로 공개되어 기업 고객과 더 넓은 AI 커뮤니티에 유연성과 자율성을 제공합니다. 또한 Granite Guardian 3.0 모델은 포괄적인 위험 및 유해성 감지 기능을 제공하며, 시장의 다른 안전성 모델보다 뛰어난 성능을 보입니다.

효율성과 비용 효율성

Granite 3.0 모델은 비용 효율성을 고려해 설계되어 기업이 훨씬 낮은 비용으로 최첨단 모델 수준의 성능을 달성할 수 있도록 합니다. 협업 기반의 오픈소스 접근 방식인 InstructLab을 활용하면 더 작은 모델을 특정 작업에 맞게 파인 튜닝할 수 있으며, 대형 모델과 비교해 비용을 3배에서 23배까지 줄일 수 있습니다. Granite 3.0 3B-A800M 및 1B-A400M과 같은 Mixture of Experts(MoE) 아키텍처 모델은 성능 저하를 최소화하면서 높은 추론 효율을 제공하므로, 지연 시간이 짧아야 하는 애플리케이션과 CPU 기반 배포에 적합합니다.

멀티모달 기능 및 향후 업데이트

2024년 말까지 Granite 3.0 모델은 확장된 128K 컨텍스트 윈도우와 이미지 입력, 텍스트 출력 작업을 포함한 멀티모달 문서 이해 기능을 지원할 것으로 예상됩니다. 이러한 확장은 다양한 기업 사용 사례에서 모델의 활용도를 더욱 높일 것입니다.

에코시스템 통합

Granite 3.0 모델은 IBM의 watsonx.ai를 포함한 여러 플랫폼에서 사용할 수 있습니다. 또한 Hugging Face, Google Cloud의 Vertex AI, NVIDIA NIM 마이크로서비스, Ollama, Replicate에서도 제공되어 개발자가 다양한 배포 옵션을 활용하고 기존 워크플로와 원활하게 통합할 수 있도록 합니다. 요약하면 IBM의 Granite 3.0 모델은 최첨단 성능, 강력한 안전 기능, 그리고 폭넓은 에코시스템 지원을 결합한 강력하고 투명하며 비용 효율적인 기업용 AI 솔루션을 제공합니다.

Granite을 시작하는 방법과 관련된 모든 정보는 공식 Granite 사이트를 참조하세요.

팁 및 권장 사항

프롬프트 개선

LLM에 제출되는 프롬프트의 내용과 구조는 생성되는 응답의 품질과 정확도에 큰 영향을 미칠 수 있습니다.

여섯 가지 프롬프트 유형

프롬프트는 크게 여섯 가지 유형으로 나눌 수 있습니다.

키워드 기반

키워드 기반 질의는 이름 그대로 해당 주제와 관련된 키워드로만 구성된 프롬프트입니다. 예를 들어 다음과 같은 프롬프트가 있습니다.

고지대에서 초콜릿 케이크를 굽는 최적의 시간은 얼마인가요?

다음과 같은 키워드로 줄일 수 있습니다.

굽는 시간 초콜릿 케이크 고지대

키워드 기반 프롬프트는 일반적으로 더 넓은 범위이면서 주제 중심적인 응답을 생성하며 검색된 보강 텍스트와의 관련성이 높은 경우가 많습니다. 이 방식은 운영자 지원 챗봇과 같이 폭넓고 정보 중심적인 응답이 필요한 솔루션에서는 유용할 수 있지만 간결한 대화형 응답이 필요한 솔루션에서는 지나치게 많은 정보를 생성할 수 있습니다.

비교형

비교형 프롬프트는 프롬프트에 포함된 하나 이상의 주제나 개념을 비교하도록 LLM에 요청합니다. 예:

규칙과 역할 할당의 차이는 무엇인가요?

비교형 프롬프트는 생성 모델과 지원 코퍼스에 모든 개념에 대한 정보가 있고 개념을 비교할 수 있는 명확한 기준이나 자료가 있을 때 유용합니다. 이러한 조건이 없으면 비교형 프롬프트는 비논리적이거나 효과적이지 않은 응답을 생성할 가능성이 높습니다.

집합형

집합형 프롬프트는 하나의 프롬프트에서 두 개 이상의 개념이나 질문을 결합하도록 모델에 요청합니다. 예:

권한과 권한 그룹을 어떻게 생성하나요?

집합형 프롬프트는 질문 자체에 내재된 모호성 때문에 일반적으로 LLM이 처리하기 더 어렵습니다.   

  • 처리 시간을 최소화하기 위해 여러 개념을 병렬로 실행하는 것에 관한 것인가요?
  • 서로를 보완하는 개념에 관한 것인가요?
  • 일련의 단계로 작업을 수행하는 방법을 설명하려는 의도인가요? 

이러한 모호성을 해결하기 위해 일반적으로 집합형 프롬프트를 여러 개의 단일 주제 프롬프트로 나누거나 원하는 응답을 명확히 설명하는 추가 컨텍스트를 제공하는 것이 권장됩니다.

모호한 프롬프트

모호한 프롬프트는 여러 가지 방식으로 해석될 수 있는 프롬프트입니다. 예:

역할이란 무엇인가요?

이 프롬프트는 연기에서의 역할과 유명 배우들의 역할에 대한 설명, IT 보안 솔루션에서의 역할, 또는 조직에서의 역할에 대한 응답을 생성할 수 있습니다. 이러한 불확실성 때문에 모호한 프롬프트는 대부분의 솔루션에서 적절하지 않으며 LLM이 원하는 주제에 집중하도록 추가적인 세부 정보와 컨텍스트를 포함해 수정해야 합니다.

일탈형

RAG 솔루션의 맥락에서 일탈형 프롬프트는 지원 문서 코퍼스에 답이 존재하지 않는 프롬프트를 의미합니다. 이는 LLM에 내재된 지식을 기반으로 한 환각 또는 즉흥적인 응답이나 코퍼스에서 낮은 관련성의 검색 결과에 기반한 부적절한 응답으로 이어질 수 있습니다.

모든 사용 사례(예: 대화형 챗봇)에서 일탈형 응답을 완전히 방지하는 것은 불가능할 수 있지만 솔루션 개발자는 선택 목록을 통해 사용자 입력을 제한하여 이를 최소화할 수 있습니다. 예: “I can help you with…”와 같은 문장 뒤에 미리 정의된 주제 버튼을 나열하거나 사용자 안내 문구와 모델 응답에서 설명적 또는 지시적 표현을 사용하여 사용자를 안전한 응답 방향으로 유도할 수 있습니다.

간접형

간접형 프롬프트는 키워드가 코퍼스에 직접 존재하지는 않지만 해당 키워드의 동의어가 존재하는 경우의 프롬프트입니다. 간접형 프롬프트는 프롬프트 키워드에 대한 동의어의 수와 그 동의어가 얼마나 명확한 질의로 이어지는지에 따라 신뢰성이 달라지기 때문에 솔루션 개발자에게 어려운 과제가 될 수 있습니다.

개발자는 키워드의 모호성을 제거하기 위해 블랙리스트 기반 질의 필터링 메커니즘을 구현하거나 문제가 되는 키워드를 명확한 동의어나 표현으로 대체하는 것이 권장됩니다.

좋은 프롬프트 작성 방법

좋은 프롬프트를 만드는 일은 과학이면서 동시에 예술에 가깝지만 더 나은 프롬프트와 결과를 만들어 내는 여러 가지 검증된 방법이 있습니다.

좋은 프롬프트의 특징

  • 목표 도메인과 관련성이 있으며 원하는 출력의 내용과 톤이 명확하고 구체적으로 드러나도록 충분한 세부 정보와 컨텍스트를 포함합니다.

  • 대상 사용자에 맞게 작성됨 기업 재무 분석가를 위한 응답은 개인 금융 고객을 위한 응답과 톤, 구조, 내용이 크게 다를 수 있습니다. 좋은 프롬프트에는 다음과 같은 지시(“You are a mid-level financial analyst. Generate a report…”) 또는 대상 독자를 명확히 나타내는 표현(“… 금융 용어에 대한 지식이 없는 개인 금융 고객을 위해 작성됨”)이 포함됩니다.

  • 특정 사용 사례를 위해 설계됨 좋은 프롬프트는 특정 사용 사례를 염두에 두고 설계되어야 하며 생성된 응답이 어디에서 어떻게 사용될지에 대한 세부 정보를 포함해야 합니다(“… 이 응답은 여행사 운영자를 위한 여행 산업 잡지에 게시될 예정입니다”). 이러한 정보는 생성되는 응답의 톤, 언어, 스타일에 영향을 미칩니다.

더 알아보기

IBM에서 최신 기술 패턴, 솔루션 아키텍처, 아키텍처 관련 자료를 확인하세요.

  1. IBM Architecture Center로 이동
기고자

Vicky Kuo, Chris Kirby, Luke Major, Atin Chandel, Brant Li, Evan Wheldon

업데이트: 2024년 11월 15일