| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- C++
- gameplay tag
- 언리얼엔진
- stride
- local prediction
- CTF
- gameplay effect
- 게임개발
- widget
- ability task
- UI
- gas
- os
- linear regression
- 언리얼 엔진
- animation
- attribute
- 보안
- MAC
- 게임 개발
- 유니티
- unity
- Unreal Engine
- photon fusion2
- listen server
- gameplay ability system
- Replication
- Aegis
- rpc
- Multiplay
- Today
- Total
Replicated
LangChain, LangGraph 본문
Ollama
- 사용자가 자신의 컴퓨터에 대규모 언어 모델을 쉽게 설치하고 실행할 수 있도록 돕는 도구
- 인터넷 연결 없이도 로컬 환경에서 AI 모델을 활용할 수 있게 해주며 복잡한 LLM 기능을 더 쉽게 사용할 수 있도록 감싸주는 래퍼 역할
- 허깅페이스에서 모델을 직접 다운로드하여 사용하는 것보다 훨씬 빠른 처리 속도 제공
Prompt Engineering
Prompt
- 사용자가 LLM에게 질의 시 제공하는 지침이나 입력의 집합
- 모델의 응답을 안내하고 문맥을 이해하며, 질문에 답하거나 문장을 완성하거나 대화를 나누는 등 관련성 있고 일관된 언어 기반 출력을 생성하는데 도움을 주는 역할
- 하지만 일반적으로 사용자들이 일반적인 질문을 하게 되면 원하는 결과가 나오지 않는 경우가 많음
- prompt engineering이 필요
Prompt engineering
- 목표: 사용자의 의도와 원하는 결과를 전달하는 프롬프트를 만들어 모델의 성능, 정확성, 유용성을 극대화
구성 요소
Instructions
- 모델에게 무엇을 해야 하는지, 제공된 경우 외부 정보를 어떻게 사용해야 하는지, 쿼리와 어떻게 처리해야 하는지, 출력물을 어떻게 구성해야 하는지
External Information or context(s)
- 모델에 대한 추가 지식의 원천. 프롬프트에 수동으로 삽입될 수 있고, 벡터 데이터베이스를 통해 검색된 정보일 수도 있고, 다른 수단을 통해 가져올 수도 있음
User input or query
- 사용자가 시스템에 입력한 쿼리
Output indicator
- 생성될 텍스트의 시작을 나타냄. (출력의 유형이나 형식을 지정)
효율적인 프롬프트의 예
역할(Role)
목표(Goal)
맥락(Context)
지시사항(Instructions)
제약사항(Constraints)
결과설정(Output)
- 형식
- 길이
- 톤 & 매너
Chain-of-Thought(CoT) Prompting
- 복잡한 작업에서 언어 모델의 성능을 향상시키기 위해 사용되는 기술
- 언어 모델이 답을 찾아가는 과정에서 생각을 말로 표현하거나(think aloud) 단계별 추론 과정(step-by-step reasoning)을 따르도록 유도하는 방식으로 구성
- 문제를 제기하는 것 뿐만 아니라 문제를 해결하기 위해 취할 수 있는 일련의 논리적 단계를 포함하여 프롬프트를 구성
Few-shot prompting
- 대규모 언어 모델에서 새로운 작업이 수행될 때, 몇 개의 예시를 제공하여 모델이 작업의 맥락과 요구 사항을 이해하도록 하는 기법
- 모델이 특정 작업을 배우기 위해 대량의 데이터나 사전 훈련 없이도 효과적으로 작동할 수 있게 도움을 줌
장점
빠른 학습 : 모델이 새로운 작업에 대해 빠르게 적응해야 할 때
적은 데이터 : 많은 예시를 제공할 수 없는 상황에서 유용
일관성 유지 : 모델이 특정 스타일이나 형식을 일관되게 유지해야 할 때
zero-shot prompting : 예시 제공 없이 질의
one ~ : 하나의 예시
Few ~ : 몇 개의 예시
LangChain
- 언어 모델을 활용하여 애플리케이션과 파이프라인을 신속하게 구축할 수 있는 플랫폼
LangChain 프레임워크의 구성
랭체인 라이브러리
- 파이썬과 자바스크립트 라이브러리를 포함
- 다양한 컴포넌트의 인터페이스와 통합, 이 컴포넌트들을 체인과 에이전트로 결합할 수 있는 기본 런타임, 그리고 체인과 에이전트
랭체인 템플릿
- 다양한 작업을 위한 쉽게 배포할 수 있는 참조 아키텍처 모음
- 개발자들이 특정 작업에 맞춰 빠르게 애플리케이션을 구축할 수 있도록 지원
랭서브
- 랭체인 체인을 REST API로 배포할 수 있게 하는 라이브러리
- 개발자들은 자신의 애플리케이션을 외부 시스템과 쉽게 통합 가능
랭스미스
- 개발자 플랫폼으로 LLM 프레임워크에서 구축된 체인을 디버깅, 테스트, 평가, 모니터링 가능
- 랭체인과의 원활한 통합을 지원
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama import ChatOllama
template = """
당신은 QA(Question-Answering)을 수행하는 Assistant입니다.
{question}에 대해 설명하세요
5문장 이내로 으로 답변하세요.
"""
prompt = ChatPromptTemplate.from_template(template)
llm_model = ChatOllama(model="PetrosStav/gemma3-tools:4b")
rag_chain = prompt | llm_model
def answer_for(question):
print("Answer :")
for chunk in rag_chain.stream({"question": question}):
print(chunk.content, end="", flush=True)
print("\n")
랭체인 예시
template = """
당신은 QA(Question-Answering)을 수행하는 Assistant입니다.
{month}에 적합한 {event}를 추천해 주세요.
5문장 이내로 으로 답변하세요.
"""
이렇게 여러 변수를 전달도 가능
chat prompt
- ChatPromptTemplate은 대화형 상황에서 여러 메시지 입력을 기반으로 단일 메시지 응답을 생성하는데 사용
- 대화형 모델이나 챗봇 개발에 주로 사용
- 입력은 여러 메시지를 원소로 갖는 리스트로 구성, 각 메시지는 역할(role)과 내용(content)으로 구성
메시지의 유형
- SystemMessage : 시스템의 기능을 설명
- HumanMessage : 사용자의 질문
- AIMessage : AI 모델의 응답을 제공 (대화의 history를 기억시키는 역할)
- FunctionMessage : 특정 함수 호출의 결과
- ToolMessage : 도구 호출의 결과
대화의 유형
- 싱글턴(single-turn) : 바로 직전의 질문에만 대답
- 멀티턴(multi-turn) : 이전 대화를 계속 기억해 나가면서 대화를 이어나가는 것, 전체 대화의 맥락을 이해
* 멀티턴 구현 시 기본적인 답변 기능에 이전 대화 기록 저장 기능 추가 필요
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama import ChatOllama
message = [
("system", "너는 여행관련 전문가야."), # 역할 부여
("system", "너는 한국어로 대화해."), # 작업지시
("placeholder", "{chat_history}"), # 대화이력 저장
("user", "{user_input}"), # 사용자 입력
]
chat_prompt = ChatPromptTemplate.from_messages(message)
placeholder : 원하는 위치에 동적으로 삽입될 메시지를 추가하기 위한 기능
- 여기선 이전 대화 히스토리를 저장하는데 사용
llm_model = ChatOllama(model="PetrosStav/gemma3-tools:4b")
rag_chain = chat_prompt | llm_model
chat_history = [
("ai", "안녕하세요, 저는 여행 전문가 브라이언 입니다. 반갑습니다."),
("user", "안녕, 나는 길동이야"),
("user", "나는 여행을 좋아해. 너는 어떤 여행지를 추천해줄 수 있어?"),
("ai", "세계 여러 나라의 여행지를 추천해 줄 수 있습니다. "),
]
def answer_for(user_input):
chat_history.append(
("human", user_input,)
)
whole_answer = ""
for chunk in rag_chain.stream({"chat_history": chat_history, "user_input": user_input}):
print(chunk.content, end="", flush=True)
whole_answer += chunk.content
chat_history.append(
("ai", whole_answer,)
)
print("\n")
이런식으로 히스토리까지 연결 가능
LangGraph
- 기존 랭체인의 장점은 유지하면서도 더 복잡하고 상태(State)를 가진 다단계 추론 프로세스(Agentic Workflow)를 명확하게 정의하고 제어하기 위해 등장
- 랭체인이 LLM 애플리케이션 개발을 위한 도구 상자 역할을 했다면 LangGraph는 그 도구들을 조합하여 유한 상태 기계 형태의 복잡한 추론 흐름을 구현하는데 초점
랭체인의 한계와 해결책
복잡한 제어 흐름의 구현 어려움
-> 유연한 그래프 구조를 통해 조건부 분기, 루프, 순환 구조를 쉽게 정의
상태 관리의 불투명성
-> 중앙 집중식 상태 객체를 통해 워크플로우 전체의 상태 변화를 명확하게 추적하고 관리
순환 추론의 비효율성
-> 에이전트가 도구를 호출하고 결과를 관찰한 후 다시 행동을 결정하는 복잡한 루프 구조를 기본 요소로 지원하여 효율성을 높임
시각화 및 디버깅의 어려움
-> 그래프 구조 덕분에 워크플로우의 흐름을 시각적으로 파악하고 디버깅하기 쉬워짐
랭그래프 등장 배경
- 결국 워크플로우 간 상태관리를 하며 플로우를 더 쉽게 작성할 수 있도록 하는 프레임워크
- 랭체인 에이전트는 Production 용도에는 적합하지 않다는 권고, 랭그래프 사용을 권장함
| 비고 | LangChain | LangGraph |
| prompt | Reasoning 과정 직접 작성 | 단순한 Agent 역할 부여 |
| ReAct의 구현 | 프롬프트로 정의 + 랭체인 내부 구현 |
LangGraph로 구현 |
| Function Call | 프롬프트를 이용해서 LLM이 툴을 사용하게 유도 | LLM 학습 당시 구현한 Tool Call API 사용 |
| Tool 사용 가능 모델 | 모든 모델 | Tool Call이 가능한 모델 |
Tool Calling (도구 호출)
- 자체적으로 수행할 수 없는 작업을 식별
- 필요한 데이터를 얻거나 작업을 수행하기 위해 외부 도구에 작업을 위임
- 도구에서 얻은 결과를 활용하여 사용자에게 응답을 생성
도구 호출을 사용하는 이유
- LLM은 실시간 정보에 접근 불가
- 외부 도움 없이는 특수 작업을 수행할 수 없음
- 도구 호출을 통해 다른 시스템과 협업하여 한계 극복
도구 호출 처리 과정
1. 사용자 입력 : 사용자가 AI가 직접 답을 알지 못하거나 외부 데이터가 필요할 수 있는 질문 제공
2. 도구 식별 : 모델은 질문에 답하기 위해 도구를 사용해야 함을 감지
3. 도구 요청 : 모델은 도구에 대한 요청을 형식화
4. 도구 실행 : 도구는 요청을 처리하고 결과를 반환
5. 응답 구성 : AI는 도구의 응답을 사용자 친화적인 답변으로 통합
LangGraph 정의 단계
- State 정의
- 노드 정의
- 그래프 정의
- 그래프 컴파일
- 그래프 시각화
'학부 > 딥러닝' 카테고리의 다른 글
| RAG, MCP (0) | 2025.12.10 |
|---|---|
| AI Agent, Context Engineering (0) | 2025.12.08 |
| Hugging face (0) | 2025.12.07 |
| 자연어 처리 : Seq2Seq, Attention, Transformer (0) | 2025.12.07 |
| 자연어 처리 : RNN, LSTM (0) | 2025.12.07 |