반응형
이번 글에서는 NVIDA DLI Course에서 수행한 과정에서 LLMs 특성과 그를 보완하기 위한 방법에 대해서 작성합니다. 프롬프트엔지니어링이 무엇인지 그리고 Langchian으로 어떤 클래스와 메소드를 이용해서 구현하는지 알아보겠습니다.
1. LLM이 무엇인가?
- LLM은 2017년 Google 발표한 Transformer를 기반으로하는 딥러닝 아키텍처. 핵심은 문맥을 이해하기 위해 단어 간의 관계를 계산하여 토크나이징과 벡터화를 이용하여 정보를 추상화
- 딥러닝은 행렬과 가중치로 데이터를 저장. 음악 믹서로 비교하자면, 보컬,드럼,베이스에 대한 소리를 조절하는 슬라이더가 있고, 그 슬라이더의 위치(가중치)를 바꾸면서 음악을 만들어내는 것과 같음. 수십개의 슬라이더의 조합이 행렬이라고 할 수 있음
- 이 가중치는 사전 학습(Pretrain)때 정해지므로 내부 규칙이자 고정된 노하우. 내가 프롬프트를 한다고 해서 이 고정된 규칙이 변하는게 아니라 context window가 계속 추가하고 변화되기 때문에 결과값이 변하는 것처럼 느껴지는 것
- LLM의 특징
- 장점: 강력한 기능과 광범위한 활용성
- 단점: 할루시네이션에 대한 문제
2. LLM의 단점의 보완 대책
-
- 프롬프트 엔지니어링: 원하는 응답을 얻기 위해 효과적으로 소통하는 방식
- Chain of Thought: LLM이 복잡한 문제를 중간 단계로 분해하여 생각하도록 유도하는 복잡한 추론 능력을 향상시킴. 명시적인 예시 / 단계별로 생각을 유도 / 작업 과정을 보여주게 하여 보완
- 검색 증강 생성(RAG): LLM의 지식 한계를 보완하기 위해 외부 지식과 LLM을 결합하는 기술, 문맥적으로 관련성 높은 응답을 제공. 이 때 코사인 유사도를 통해 의미 유사도를 벡터 검색함
- 가드레일: 신뢰있는 LLM을 구축하기 위한 제약조건과 규칙. 부적절한/유해한 응답을 방지
3. What is Langchain?
LangChain은 이러한 기반 어플리케이션 개발을 간소화하고 유연하게 만드는 오픈소스 프레임워크. 상당한 추상화를 제공하여 초보자도 쉽게 접근할 수 있는 장점이 있으나, 지나친 추상화로 인한 디버깅이 힘든 단점이 존재하기도 함
- 핵심 개념
- Runnable: LLM의 인스턴스로, 기본 작업 단위. RunnableLambda를 이용해 사용자정의함수를 Runnable로 변환 가능
- LCEL: LangChainExpressionLanguage Runnable을 체인으로 구성하는 선언적인 방ㅇ식 제공
- 표준화된 메소드: invoke, batch, stream 표준 호출 메소드를 제공합니다.
- 프롬프트 엔지니어링 기법 지원
- 역할 기반 메시지: ChatPromptTemplate.from_messages 메소드를 사용하여 Human, AI, System 와 같은 역할 기반 메시지를 명시적으로 정의
- 퓨삿 프롬프팅: FewShotChatMessagePromptTemplate 모델 동작에 영향에 미치는 예시를 사전에 제공할 수 있음
- 프롬프트 엔지니어링 관련 Lanchain 디렉토리
#langchain_core
runnables.base # Runnable
├── Runnable : 기본 단위
├── RunnableLambda: 함수를 Runnable로 변환
├── RunnableParallel:
│
langchain_core.prompts.chat
├── ChatPromptTemplate
│ ├── from_messages(): reate a chat prompt template from a variety of message formats.
│ # 튜플 형식, "SystemMessage" 등의 키워드 사용 가능
├── few_shot.FewShotPromptTemplate: fewshot 제공
│
output_parsers.string
├──StrOutputParser: llm이 반환하는 결과를 문자형으로 변환
#llm api class
langchain_google_genai
├──ChatGoogleGenerativeAI
│ ├──invoke()
│ ├──stream()
│ ├──batch()
4. 용어집(Glossary)
대분류 | 소분류 | 설명 |
Prompt Engineering |
Prompt Engineering | LLM의 가진 본질적인 특성 할루시네이션을 제어하고 원하는 결과를 도출하기 위한 방방법 |
Prompting | LLM에게 작업을 지시하는 행위 그 자체 | |
Prompt Template | 프롬프트의 구조를 미리 만들어 놓고 변수를 주입항여 재사용성을 높이는 도구 | |
System Messages and System Context | 모델의 역할, 성격, 행동 지침을 설정하는 시스템 레벨의 지시어 | |
Chain-of-Thought | 모델이 복잡한 문제를 풀 때, 생각 과정을 단계별로 서술하게 항여 정확도를 높이는 프롬프트 기법 | |
Few-shot Classification | 몇 가지 예시(few-shot)을 프롬프트에 포함하여 모델이 특정 패턴이나 분류 기준을 학습하게 하는 기법 | |
Prompt Injection | 악의적인 사용자가 프롬프트를 조작하여 개발자가 의도하지 않은 동작을 유도하는 보안 공격 | |
개발 프레임워크 및 도구 | LangChain | LLM을 외부 데이터 및 다른 서비스와 쉽게 연동하여 어플리케이션을 만들도록 돕는 개발 프레임워크 |
LCEL | Langchain의 여러 컴포넌트(Runnable)을 파이프라인으로 직관적으로 연결할 수 있게 하는 선언형 문법 | |
Runnables | LCEL을 구성하는 기본 단위 | |
Gradio and Chatbots | 머신러닝 모델의 UI를 빠르게 만들어 프로토 타이핑하고 공유할 수 있는 도구 | |
Pydantic | Python에서 데이터 유효성검사와 구조화를 쉽게 해주는 라이브러리 | |
고급 어플리케이션 패턴 | Agents | LLM과 RAG를 포함한 다양한 기술(플러그인, API)을 활용하여 사용자의 질문을 처리하고 실제 행동을 수행할 수 있는 인공지능 시스템 |
Retrieval Augmented Generation (RAG) | LLM의 추상화된 벡터에 의존하지 않고 외부 데이터베이스에서 정보를 검색하여 답변을 생성(Generation)하는 기술 | |
Structured Data Generation | LLM이 단순 텍스트가 아닌 JSON/XML 등 정해진 형식의 구조화된 데이터를 생성하도록 하는 작업 | |
LLM 모델 및 동작 제어 |
SOTA LLM models (ChatGPT, LlamaX, etc.) | 현재 최고 성능을 보이는 모델들 |
Temperature | 모델 답변 생성시 무작위성을 조절하는 파라미터, 높을수록 창의적 | |
Instruction fine tuning | 특정 작업이나 스타일에 맞게 응답하도록 사전 학습된 LLM을 명령어 데이터셋으로 학습시키는 과정. zero-shot에도 잘 작동할 수 있게됨 | |
Hallucinations | 다음 단어를 예측하는 LLM의 특징 때문에 일어나는 현상이며, 실제로 사실이 아닌데 사실 인 것처럼 말하는 현상 | |
데이터 처리 및 인프라 | JSON | JavaScript Object Notion.key-value 쌍으로 이루어진 데이터 교환 포맷. |
Streaming vs. Batching | 스트리밍은 결과가 생성되는 즉시 실시간으로 전송하는 방식, 배치는 한 번에 처리하는 방식 | |
Nvidia NIM | NVIDIA Inference Microservice, 쿠버네틱스 기반 마이크로서비스 세트 |
5. 참고할만한 자료
반응형
'Data Science > LLM' 카테고리의 다른 글
Prompt Engineering DLI course 후기와 AI assistant로 학습 부스팅하기 (0) | 2025.06.27 |
---|---|
Langchain 시작하기, invoke, batch, stream, template (1) | 2025.06.20 |