일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- tool_calls
- chat_history
- subgraph
- add_subgraph
- toolnode
- 강화학습
- removemessage
- agenticrag
- Python
- conditional_edges
- langgraph
- rag
- 강화학습의 수학적 기초와 알고리듬 이해
- LangChain
- 강화학습의 수학적 기초와 알고리듬의 이해
- pinecone
- RecSys
- 밑바닥부터 시작하는 딥러닝
- REACT
- update_state
- Docker
- 추천시스템
- fastapi
- summarize_chat_history
- langgrpah
- rl
- tool_call_chunks
- Ai
- adaptive_rag
- 밑바닥부터시작하는딥러닝 #딥러닝 #머신러닝 #신경망
- Today
- Total
목록Today I Learned (10)
타임트리

PostgreSQL 컨테이너가 172.17.0.3이라는 가상 IP를 가지고 있고, 내부적으로 5432 포트에서 PostgreSQL 서비스를 제공하고 있다고 가정하자. 외부에서 이 컨테이너에 접속하려면 다음과 같은 단계를 거쳐야 한다:외부 클라이언트 → 내 PC(서버)의 IP에 접근할 수 있어야 한다.내 PC에서 받은 요청을 컨테이너의 5432 포트로 전달해줘야 한다.1번을 위해서는 공유기나 라우터에서 공인 IP의 특정 포트를 내 PC의 포트로 포트포워딩해야 한다.2번은 도커에서 -p 옵션을 통해 호스트와 컨테이너 간 포트 매핑(port binding) 을 설정함으로써 해결할 수 있다.예를 들어 아래와 같은 명령어로 컨테이너를 실행한다고 하자:docker run -p 3001:5432 postgres 이렇..

도커는 컨테이너 간/외부와의 통신을 위해 가상 네트워크를 사용한다. 가상 네트워크는 물리적인 네트워크 장비 없이, 하나의 서버 내에서 논리적으로 정의된 네트워크이며, 이 네트워크 망안에서 컨테이너들끼리 서로 통신하거나 외부의 서버와도 통신할 수 있다. 도커를 설치하면 기본적으로 가상의 브릿지 네트워크인 docker0가 자동으로 생성한다. 이 가상의 라우터/공유기 역할을 하는docker0 브릿지는 172.17.0.1의 가상 IP 주소를 할당 받는다. (보통 공유기가 192.168.0.1의 사설 IP를 할당 받듯이). 그리고 컨테이너가 실행될 때, 이 브릿지 네트워크 범위 내에서 고유한 IP 주소를 자동으로 할당한다. 예를 들어, 컨테이너 A를 실행하면, docker0의 네트워크의 주소 범위에서 A에게 IP..
FastAPI에서 알아보는 동기와 비동기 처리의 차이FastAPI를 통해 동기(Synchronous)와 비동기(Asynchronous) 처리의 차이점에 대해 알아보자. 실제 코드 예제와 함께 이 두 가지 처리 방식의 동작 원리를 자세히 살펴본다.동기와 비동기의 기본 개념동기 처리 (Synchronous)여러 개의 스레드를 사용하여 작업을 병렬(Parallelism)로 처리각 요청마다 새로운 스레드가 할당됨→ FastAPI에서는 def로 정의하면 호출 시 내부적으로 ThreadPoolExecutor를 활용해 관리되어 여러 스레드에 동시 처리 가능 (병렬성)비동기 처리 (Asynchronous)단일 스레드에서 이벤트 루프를 통해 동시성(Concurrency)을 구현I/O 작업 중에 다른 작업을 처리할 수 있..
최근 LangGraph를 활용하여 멀티 에이전트를 구축하는 사례가 증가하고 있다. 이를 어떻게 배포하는 게 좋을까 구글링을 해보면 대부분 streamlit 등을 이용한 방법이 나온다. 그런데 이를 실제 서비스로 제공하기 위해서는 백엔드와 프론트엔드가 분리된 구조에서 배포하는 방법을 이해하는 것이 중요하다. 이번 글에서는 FastAPI를 활용하여 LangGraph 애플리케이션을 서빙하고, Docker를 이용해 손쉽게 배포하는 방법을 다룬다.1. 프로젝트 구조프로젝트의 디렉토리 구조는 아래와 같다../├── Dockerfile├── graph.png├── main.py├── requirements.txt├── graph│ ├── edges.py│ ├── graph.py│ └── nodes.py└..
앞선 게시물들에서 살펴본 것처럼 동시성이란 여러 작업을 스위칭하며 처리하는 것을 의미한다. 따라서 동시성 프로그램을 사용하면 네트워크 I/O와 같이 요청/응답 과정에서 효율적으로 코드를 설계할 수 있다. 그런데 여기서 생각해볼 점이 있다. 기존처럼 순차적으로 진행했던 동기적 코드보다 항상 비동기적 코드가 좋을까? 정답은 그렇지 않다는 것이다. 예를 들어, CPU 연산이 많은 프로그램을 생각해보자. 이러한 경우 하나의 CPU가 쭉 계산하는 것과 여러 스레드에 동시성으로 작업하는 것과 차이가 없을 것이다. 오히려 여러 excutor로 작업을 할당하는 연산이 추가되어 더 오래 걸릴 것이라 예상할 수 있다. 이러한 경우에는 동시성 보다는 병렬성으로 작업을 수행해야 속도를 향상시킬 수 있다. 그런데 파이썬은 ..

동시성은 Concurrency, 병렬성은 Parallelism을 번역한 용어로 둘은 다른 개념이다. 이 둘의 차이에 대해서 알아보자.먼저 동시성과 병렬성의 정의는 다음과 같다.동시성(concurrency): 한 번에 여러 작업을 동시에 다루는 것 (switch의 개념)병렬성(parallelism): 한 번에 여러 작업을 병렬적으로 처리하는 것 (at the same time의 개념)좀 더 쉽게 말하면, 동시성은 시간과 관계없이 여러 작업이 처리되고 있는 상태를 만족하는 것을 의미하고, 병렬성은 시간상 동시에 처리되고 있는 것을 의미한다. 아직 조금 헷갈리는 것 같다. 주문을 받아 요리사가 요리를 하는 예시를 통해 이해해보자. 현재 상황은 요리사에게 ["파스타", "피자", "스테이크"] 주문이 들어온 상..
프로그램의 사전적 정의는 어떤 문제를 해결하기 위해 컴퓨터에게 주어지는 처리 방법과 순서를 기술한 일련의 명령문의 집합체이다. 즉, 간단히 말해 개발자가 작성한 코드들을 의미한다.이러한 프로그램은 보조메모리(HDD, SDD)와 같은 저장장치에 보관되고 있다가 사용자가 실행하면 해당 프로그램 코드들이 주메모리(RAM)에 적재되어 작업이 진행된다. 이때 프로그램이 RAM에 올라온 상태가 되면 이를 프로세스(process) 라고 한다.프로그램: 명령문이 저장장치에 저장된 정적인 상태프로세스: 실행을 위해 프로그램이 RAM에 올라온 동적인 상태이처럼 프로그램을 실행하여 프로세스가 생성되면, CPU는 프로세스가 해야할 작업을 수행한다. 이때, CPU가 처리하는 프로세스의 작업 단위를 스레드(thread) 라고 한..
먼저 코루틴을 보기 전에, 루틴을 정의하고 이로부터 파생되는 메인 루틴과 서브 루틴을 살펴보자.루틴: 일련의 명령 즉, 코드의 흐름메인 루틴: 프로그램의 메인 코드 흐름서브 루틴: 하나의 진입점(args)과 하나의 탈출점(return)이 있는 루틴으로, 흔히 아는 함수나 메서드 (메인 루틴의 보조)그럼 메인 루틴과 서브 루틴의 관점에서 이전에 작성했던 코드를 다시 살펴보자. 아래 코드에서 메인 루틴은 if __name__=="__main__" 절의 내용이며, 여기서 main()과 delivery() 두 개의 서브 루틴이 존재한다.import time# 서브 루틴 1def delivery(name, mealtime): print(f"{name}에게 배달 완료") time.sleep(mealtim..