Replicated

LangChain, LangGraph 본문

학부/딥러닝

LangChain, LangGraph

라구넹 2025. 12. 8. 01:02

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