Adventure Time - Finn 3
본문 바로가기

전체 글468

조건부 라우팅 # 사용자가 작성한 메시지의 감정 상태가 어떤지 파악해서 답변을 다르게 하는 예제를 작성. # 그래프의 흐름: '시작 노드 → 감정 파악 → 부정 답변 | 중립 답변 |긍정 답변 → 종료 노드' .importfrom dotenv import load_dotenvload_dotenv()from typing import Dict, Any, Literalfrom langgraph.graph import StateGraph, START, ENDfrom pydantic import BaseModel, Fieldfrom langchain_openai import ChatOpenAIfrom langchain_core.messages import SystemMessage, HumanMessageimport random.. 2026. 7. 19.
Hello LangGraph # [시작] --> [greeting]--> [Processing] --> [종료]from typing import Dict,Anyfrom langgraph.graph import StateGraph, START, ENDfrom pydantic import BaseModel, Fieldfrom IPython.display import Image, display '상태' 정의# 워크플로우 단계 정의class WorkflowStep: GREETING = 'GREETING' # 인사말 생성 단계 PROCESSING ='PROCESSING' # 생성된 인사말을 처리하고 메세지를 생성하는단계 # 그래프 상태정의# 그래프의 상태는 각 노드마다 참조가 가능한 전체 워크플로 상의 컨텍스트라고 볼수있.. 2026. 7. 18.
랭그래프의 핵심 개념 랭그래프에서 가장 중요한 개념은 상태(state), 노드(node), 에지(edge) 다상태(state)상태는 그래프 실행 과정에서 지속적으로 유지되는 데이터로 각 노드가 실행될 때마다 읽고 쓸 수 있습니다.이는 단순한 변수 전달을 넘어 전체 워크플로의 컨텍스트를 관리하는 중앙 저장소 역할을 합니다.상태는 일반적으로 TypedDict나 Pydantic 모델로 정의되어 타입 안정성을 보장합니다.노드(node)'노드' 는 그래프의 기본 실행 단위입니다. 각 노드는 특정 작업을 수행하는 함수나 에이전트를 나타내며, 다음과 같은 특징을 가집니다.현재 상태를 입력으로 받음특정 작업을 수행(LLM 호출, 데이터 처리, 외부 API 호출 등)업데이트된 상태를 반환(리턴)노드는 순수함수일 수도 있고, 부수 효과side.. 2026. 7. 18.
그래프 자료구조 랭그래프를 제대로 이해하려면 먼저 그래프 자료구조에 대한 기본 개념을 알아야한다 노드 & 엣지그래프는 노드와 엣지로 구정된 자료구조로 객체간의 관계를 표현하는데 매우 효과적이다 Directed vs Undirected그래프는 방향성에 따라 그래프 Directed Graph 와 무방향 그래프 Undirected Graph 로 나뉩니다.랭그래프는 방향 그래프를 기반으로 합니다. 이는 작업의 흐름이 특정 방향을 가지기 때문입니다. 예를 들어 A 작업이 완료된 후 B 작업이 실행되는 것을 그래프로 명확하게 표현할 수 있습니다. Cyclic vs. Acyclic 그래프의 또 다른 중요한 특성은 순환(cycle)의 존재 여부입니다. 순환이 없는 그래프를 DAG(Directed Acyclic Graph) 라고 하.. 2026. 6. 28.
LangGraph AI 에이전트는 주어진 목표를 달성하기 위해 주변 환경을 인지하고 스스로 판단하여 행동을 수행하는 자율적인 인공지능 시스템을 말한다. 단순히 사용자의 질문에 답을 생성하는 챗봇이나 일정한 규칙에 따라 동작하는 자동화 프로그램을 넘어 목표를 달성하기 위한 최선의 경로를 스스로 계획하고 실행한다는 점에서 차세대 AI 기술로 주목 받고 있다 AI 에이전트의 4대 핵심 요소목표 및 계획 수립 : 거대란 목표가 주어지면 이를 해결 가능한 작은 단위의 잡업으로 쪼갭니다. 과거의 실수를 돌아보고 계획을 수정하는 자기 반성 능력도 포함 됩니다. 기억 장치:단기 기억: 현재 진행중인 대화나 작업 맥락을 기억합니다.장기 기억 외부 데이터베이스나 벡터 DB를 활용해 오랜 시간이 지난 후에도 필요한 정보를 찾아내고 위지합니다.. 2026. 6. 27.
LangChain -RAG Chain 정리 StuffMap-ReduceMap-RerankRefineLLM 호출 수1회N+1회N회N회병렬 처리-✅✅❌대용량 문서❌✅✅✅문서 간 통합✅부분적❌✅속도가장 빠름중간중간가장 느림추천 상황소량·단순 QA대량 문서 요약단일 정답 검색복잡한 종합 질문실무에서는 대부분 Stuff → 문서가 많으면 Map-Reduce 또는 Refine 순으로 고려하는 것이 일반적입니다. 2026. 6. 11.
LangChain -RAG Refine Document Chain(순차적으로 읽으며 답변을 개선) [문서1] → LLM → 초안 답변 ↓[문서2] + 초안 → LLM → 개선된 답변 ↓ [문서3] + 개선된 답변 → LLM → 최종 답변첫 번째 문서로 초안을 만들고, 이후 문서를 하나씩 읽으면서 답변을 지속적으로 **정제(Refine)**합니다.장점단점문서 간 정보를 유기적으로 통합순차 처리라 병렬화 불가복잡한 질문에 높은 품질레이턴시가 가장 높음컨텍스트를 점진적으로 축적초반 문서가 결과에 더 큰 영향여러 문서의 정보를 종합해야 하는 복잡한 질문에 적합 from langchain_core.prompts import PromptTemplate# 초기 답변용 프롬프트initial_prompt = PromptTemplate.from_template.. 2026. 6. 10.
LangChain -RAG Map-Rerank Chain(문서 답변 생성 후 가장 높은 답변) [문서1] → LLM → (답변1, 확신도: 90%) ┐[문서2] → LLM → (답변2, 확신도: 60%) ┼→ 최고 점수 선택 → 최종 답변[문서3] → LLM → (답변3, 확신도: 75%) ┘각 문서마다 LLM이 답변과 함께 확신도 점수를 반환하고, 가장 높은 점수의 답변을 최종 선택합니다.장점단점가장 관련성 높은 답변 선택LLM 호출 횟수 많음노이즈 문서 영향 최소화확신도 점수가 항상 정확하지 않음단일 정답이 명확할 때 유리문서 간 종합이 필요한 경우 부적합정답이 특정 문서 하나에 집중되어 있을 때 유리 # Map 단계map_prompt = ChatPromptTemplate.from_template( """ 너는 질문-응답 평가 모델이다. 질문: {question} 문.. 2026. 6. 9.
LangChain -RAG Map-Reduce chain(문서 요약 최종 합산) "각 문서를 개별 요약 후 최종 합산"[문서1] → LLM → 중간답변1 ┐[문서2] → LLM → 중간답변2 ┼→ LLM → 최종 답변[문서3] → LLM → 중간답변3 ┘Map 단계: 각 문서에 대해 독립적으로 LLM을 호출해 중간 답변 생성Reduce 단계: 모든 중간 답변을 합쳐 최종 답변 생성장점단점문서 수에 제한 없음LLM 호출 횟수 많음 (비용↑)병렬 처리 가능 (Map 단계)레이턴시 높음대용량 문서에 적합문서 간 연관성 파악 어려움문서가 많고 병렬 처리가 가능할 때 사용 from langchain_core.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParserfrom langchain.. 2026. 6. 8.
LangChain -RAG Stuff Document Chain(모든 문서를 한번에) [문서1] + [문서2] + [문서3] + [질문] → LLM → 답변검색된 모든 문서를 하나의 프롬프트에 그대로 집어넣어 한 번의 LLM 호출로 답변을 생성합니다.장점단점구현이 단순하고 빠름문서가 많으면 컨텍스트 길이 초과LLM이 전체 맥락을 한번에 파악토큰 비용 증가가장 낮은 레이턴시긴 문서에 부적합소량의 짧은 문서에 최적. 가장 기본적인 방식 from langchain_openai import ChatOpenAIfrom langchain_core.documents import Documentfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.runnables import RunnablePassthroughllm = Cha.. 2026. 6. 7.
LangSmith https://www.langchain.com/langsmith LangSmith: AI Agent & LLM Observability PlatformComplete AI agent and LLM observability platform with tracing and real-time monitoring. Debug agents, find failures fast, and track costs and latency.www.langchain.com LangSmith 는 (LLM) 기반 애플리케이션의 개발, 디버깅, 테스트, 평가, 모니터링, 배포를 지원하는 통합 플랫폼 입니다 https://www.langchain.com/langsmith LangSmith를 사용하면 우리의 체인이 무엇을 하고 있는지 시.. 2026. 6. 6.
LangChain -RAG Vectors Embedding 과 VectorEmbedding는 사람이 읽는 텍스트를 컴퓨터가 이해(연산) 할 수 있는 숫자들(벡터)로 변환하는 작업이다.우리가 만든 Document 마다 각각의 벡터를 만들어 주게 될거다OpenAI는 크기가 최소 1000차원 이사으이 벡터를 제공해준다. 3개의 차원을 정의해보자첫번째 차원을 Masculinity (남성성)두번째 차원을 Femininity (여성성)세번째 차원을 Royalty (왕족스러움)이제 특정 단어에 대한 차원 값(점수)를 줘보자 Masculinity Femininity Royaltyking 0.9 0.1 1.0queen 0.1 0.9 1.0man 0.9 0.1 0.0wo.. 2026. 6. 5.
LangChain -RAG Splitter data를 split해야하는 이유.load()의 리턴값은 List[Document]그런데 직전에 로드했던 내용은 Document가 1개만 있다.len(loader.load())# 1 특정 질문에 답해야 하기 위해서, 필요한 파일의 일부분을 만들어 전달해야한다가령 Ministry of peace를 찾고자 한다면해당 키워드가 있는 문서들만 모델에 넘겨주면 된다.작은 조작들로 쪼개어 두면 필요한 것들을 찾기가 용이해진다.-prompt도 짧아질거다(적은 token 사용, 적은 비용.)그래서 문서를 쪼개두어야 한다.BaseDocumentTransformer│└── TextSplitter │ ├── CharacterTextSplitter │ ├── TokenTextSplitter │ .. 2026. 6. 4.
LangChain -RAG Data Loaders 읽어오기 렝체인에서 제공하는 다양한 decument Loader들이 있다.CSV, File Directory, HTML, JSON, Markdown, PDF등 예제 파일 준비출처는 조지오웰의 소설 '1984' Part1 Chapter1http://www.george-orwell.org/1984/0.html 1984 > Part 1, Chapter 1 1984 Part 1, Chapter 1 Part One 1 It was a bright cold day in April, and the clocks were striking thirteen. Winston Smith, his chin nuzzled into his breast in an effort to escape the vile wind, slipped qu.. 2026. 6. 4.
LangChain - RAG Retrieval Augmented Grneration (검색증강생성)사전 학습된 모델은 이미 낳은 데이터를 통해 학습한 상태이긴 하나...개인 DB나 회사내 문서와 같이 private 한 데이터 들에는 접근할수 없다그래서 RAG 를 사용한다! 1. Retrieval 단계private 으로 부터 제공된 data 를 사용하거나 탐색함으로써language model의 능력을 더 확장 2. Augmented GenrationModel로 하여금 우리가 보낸 문서 data 만을 가지고 답변할도록 할수도 있다.이를 통해 Model이 과거에 학습한 data를 참조하지 않게도 할 수 있다. RAG는 특정 라이브러리나 프레임워크 이름이 아니라 위와 같은 작업을 하는 기법을 일반적으로 통칭하는 용어 어떤 방식으로 RAG를.. 2026. 6. 3.
LangChain - Memory from langchain_core.prompts.chat import MessagesPlaceholderfrom langchain_core.runnables.passthrough import RunnablePassthroughllm = ChatOpenAI(temperature=0.1)chat_history = [] # 챗봇과 나눈 Message 들을 담을 것이다.prompt = ChatPromptTemplate.from_messages([ ('system',"You are a helpful AI talking to a human"), # 이전의 chat_history 내역이 여기에 들어오게ㅔ된ㄷ. # history 라는 키값으로 전달해주면 된다. MessagesPlaceholde.. 2026. 6. 2.
LangChain - Caching Caching 을 사용하면 모델의 응답을 저장할수 있다. 예를들어 똑같은 질문을 받는 상황이라면 그 때마다 답변생성할 필요 없이 이미 캐싱된 답변을 재사용 할수 있는 것이다 --> 비용절감! set_llm_cache(), InMemoryCachefrom langchain_core.globals import set_llm_cachefrom langchain_core.caches import InMemoryCache# 이와 같이 세팅하면 LLM의 모든 response가 메모리에 캐시 된다.set_llm_cache(InMemoryCache())chat = ChatOpenAI( temperature = 0.1,)# 시간 측정하는 함수import timefrom datetime import timedelt.. 2026. 5. 28.
Langchain - PromptTemplate 저장 / 읽어오기 load_prompt()prompt를 'JSON' 혹은 'YAML' 파일로 저장할수있다.json 파일# json 파일 생성with open('prompt.json','w') as f: f.write(""" { "_type":"prompt", "template":"What is the capital of {country}", "input_variables":["country"] } """) from langchain_core.prompts.loading import load_prompt# json 파일 -> PromptTemplate 객체prompt = load_prompt('./prompt.json')prompt.format(cou.. 2026. 5. 27.
LangChain - Template chat = ChatOpenAI( temperature=0.1, streaming=True, callbacks=[StreamingStdOutCallbackHandler()],) PromptTemplate : 기본# 방식 1t= PromptTemplate.from_template("What is the capital of {country}")t.format(country='France')# 방식 2 t2 = PromptTemplate( template = "What is the capital of {country}", input_variables=['country'], # 입력변수들을 promptTemplate에 알려주어야한다.)t2.format(country='France').. 2026. 5. 26.
LangChain - streaming = 과 callbacks ↑ 전부 실행 완료 될때까지 기다리는게 지루하다. 어떻게 진행되는지도 궁금하다. 진행되는 과정을 실시간으로 출력 할수 있다! Chat model 의 streaming= streaming 은 LLM model 의 응답(resposne) 이 생성되는 것을 실시간으로 보게 해줌. callbacks=[StreamingStdOutCallbackHandler()] 볼수 있는 문자(토큰)가 생길 때마다 print 해준다. callbacks 는 다양한 'event' 감지도 가능 LLM 이 작업을 시작했다거나, 끝냈다거나. 문자를 생성했다거나, 에러가 발생하거나.. from langchain_core.callbacks.streaming_stdout import StreamingStdOutC.. 2026. 5. 25.
LangChain - Chaining Chains 사용해보기 첫번째 chain 특정 요리에 대한 recipe 를 제공해주는 chef chain 두번째 chain 요리의 recipe를 받아서 채식주의자용 recipe 로 변환해주는 veg_chef chain 최종 chain 위 두개의 chain 을 연결한 chain 하나의 chain의 출력값이 다른 chain의 입력값으로 사용될 수 있다. # 첫번쨰 chainchef_prompt = ChatPromptTemplate.from_messages([ ('system',""" You are a world-class international chef. You create easy to follow recipes for any type of cuisines with easy to f.. 2026. 5. 24.
LangChain - LCEL LCEL ( LangChain Expression Language : 렝체인 표현 언어)LCEL는 LangChain 내에서 복잡한 표현식을 처맇고 모델과 상호작용을 더 강력하고 유연하게 만드는 기능을 제공코드양을 많이 줄여줌다양한 template과 LLM 호출서로 다른 응답을 함꼐 사용케함 chain 생성!'|' (pipe)연산자 사용.LangChain 의 핵심! chain = template | chat | CommaOutputParser()print(type(chain)) # Runnable 객체chain# # ChatPromptTemplate(input_variables=['max_items', 'question'], input_types={}, partial_variables={}, message.. 2026. 5. 23.
LangChain OutputParser Output Parser 란LLM(대형 언어 모델))에서 생성된 출력을 처리하고 원하는 형식으로 변환하는데 사용되는 유틸리티이다.이를 통해 생성하는 텍스트를 구조화된데이터로 변환하거나 특정 규칙에 따라 데이터를 추출할 수 있다.1. 출력 구조화모델의 텍스트 응답을 파싱하여 JSON, 딕셔너리, 목록과 같은 프로그래밍에서 사용 가능한 구조화된 데이터로 변환 한다.2. 출력 검증모델이 예상치 못한 출력을 반환할경우 적절한 에러 메시지를 제공하거나 기본값을 반환하도록 처리할 수 있다.3. 출력 표준화언어 모델의 출력이 항상 일관된 형식으로 제공되도록 보장한다. BaseOuputParser커스텀 OutputParser 를 정의해 사용from langchain_core.output_parsers.base impo.. 2026. 5. 19.
수열 추측하기 가장 윗줄에 1부터 N까지의 숫자가 한 개씩 적혀 있다. 그리고 둘째 줄부터 차례대로 파스칼 의 삼각형처럼 위의 두개를 더한 값이 저장되게 된다. 예를 들어 N이 4 이고 가장 윗 줄에 3 1 2 4 가 있다고 했을 때, 다음과 같은 삼각형이 그려진다. 3 1 2 4 4 3 6 7 9 16 N과 가장 밑에 있는 숫자가 주어져 있을 때 가장 윗줄에 있는 숫자를 구하는 프로그램을 작성하 시오. 단, 답이 여러가지가 나오는 경우에는 사전순으로 가장 앞에 오는 것을 출력하여야 한다. ▣입력설명 첫째 줄에 두개의 정수 N(1≤N≤10)과 F가 주어진다. N은 가장 윗줄에 있는 숫자의 개수를 의 미하며 F는 가장 밑에 줄에 있는 수로 1,000,000 이하이다. ▣출력설명 첫째 줄에 삼각형에서 가장 위에 들어갈 N.. 2026. 5. 18.
순열 구하기 1부터 N까지 번호가 적힌 구슬이 있습니다. 이 중 M개를 뽑아 일렬로 나열하는 방법을 모두 출력합니다. ▣입력설명 첫 번째 줄에 자연수 N(3 import sys# sys.stdin=open("input.txt","rt")# n,m = map(int,input().split())# n = int(input())# arr = list(map(int,input().split()))def DFS(L): global cnt if L == m: for j in range(L): print(res[j],end=' ') print() cnt +=1 else: for i in range(1,n+1): if ch[.. 2026. 5. 17.
동전교환 다음과 같이 여러 단위의 동전들이 주어져 있을때 거스름돈을 가장 적은 수의 동전으로 교환 해주려면 어떻게 주면 되는가? 각 단위의 동전은 무한정 쓸 수 있다.▣입력설명 첫 번째 줄에는 동전의 종류개수 N(1import syssys.stdin=open("input.txt","rt")# n,m = map(int,input().split())# n = int(input())# arr = list(map(int,input().split()))def DFS(i,sum): global res if i >res: return if sum > m: return if sum == m : if res > i: res = i else.. 2026. 5. 16.
LangChain 시작 open AI API 사용할거임OPENAI_API_KEY="sk-...".env 파일 만들어서 함환경변수 불러오기from dotenv import load_dotenvimport osload_dotenv()f'{os.environ['OPENAI_API_KEY'][:3]}...''sk-...' 1. LLM & Chat modelLangChain은 LLM 과 Chat model 두가지가 있다. LLM (Large Language Model)특징:1. 텍스트를 입력 받고 텍스트 툴력을 생성한다.2. 단순한 프롬프트 기반 입/출력을 처리하기 위한 모델3. 사용자가 입력한 텍스트를 분석하고, 그에 대한 결과 출력주요 사용 사례단일 질문-답변텍스트 생성간단한 프롬프트 처리를 위한 작업Chat Model특징:1. .. 2026. 5. 15.
중복순열 구하기 1부터 N까지 번호가 적힌 구슬이 있습니다.이 중 중복을 허락하여 M번을 뽑아 일렬로 나열 하는 방법을 모두 출력합니다.▣입력설명 첫 번째 줄에 자연수 N(3▣출력설명 첫 번째 줄에 결과를 출력합니다. 맨 마지막 총 경우의 수를 출력합니다.출력순서는 사전순으로 오름차순으로 출력합니다.▣입력예제 1 3 2▣출력예제 1 1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3 9import sys# sys.stdin=open("input.txt","rt")# n,m = map(int,input().split())# n = int(input())# arr = list(map(int,input().split()))def DFS(v): global cnt if v ==m: for i.. 2026. 5. 14.
합이 같은 부분집합(DFS : 아마존 인터뷰) N개의 원소로 구성된 자연수 집합이 주어지면, 이 집합을 두 개의 부분집합으로 나누었을 때 두 부분집합의 원소의 합이 서로 같은 경우가 존재하면 “YES"를 출력하고, 그렇지 않으면 ”NO"를 출력하는 프로그램을 작성하세요. 둘로 나뉘는 두 부분집합은 서로소 집합이며, 두 부분집합을 합하면 입력으로 주어진 원래의 집합이 되어 합니다. 예를 들어 {1, 3, 5, 6, 7, 10}이 입력되면 {1, 3, 5, 7} = {6, 10} 으로 두 부분집합의 합이 16으로 같은 경우가 존재하는 것을 알 수 있다.import sys# sys.stdin=open("input.txt","rt")# n,m = map(int,input().split())# n = int(input())# arr = list(map(int.. 2026. 5. 13.
부분집합 구하기(DFS) 자연수 N이 주어지면 1부터 N까지의 원소를 갖는 집합의 부분집합을 모두 출력하는 프로그램 을 작성하세요.import sys# sys.stdin=open("input.txt","rt")# n,m = map(int,input().split())# n = int(input())# arr = list(map(int,input().split()))def DFS(v): if v==n+1: for i in range(1,n+1): if ch[i]==1: print(i,end=' ') print() else: ch[v]=1 DFS(v+1) ch[v]=0 DFS(v+1)if __name_.. 2026. 5. 12.