일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 밑바닥부터 시작하는 딥러닝
- conditional_edges
- rag
- 강화학습의 수학적 기초와 알고리듬의 이해
- update_state
- 강화학습의 수학적 기초와 알고리듬 이해
- REACT
- langgraph
- RecSys
- lcel
- removemessage
- LangChain
- 강화학습
- rl
- summarize_chat_history
- chat_history
- langgrpah
- conditional_edge
- humannode
- subgraph
- tool_calls
- Python
- toolnode
- pinecone
- 추천시스템
- add_subgraph
- tool_binding
- human-in-the-loop
- 밑바닥부터시작하는딥러닝 #딥러닝 #머신러닝 #신경망
- Ai
- Today
- Total
목록분류 전체보기 (41)
타임트리
LangGraph는 기존의 Naive RAG 나 Advance RAG와는 달리 노드 단위로 흐름을 조절할 수 있다.특히 노드를 기준으로 중간에 interrupt를 걸 수 있다. (interrupt_before, interrupt_after)이러한 기능을 활용해서 중간에 사람이 개입하여 판단할 수 있도록 만들 수 있다!왜 human-in-the-loop 이 필요하지?Agent를 전적으로 신뢰할 수 없을 때, 사람이 개입해야 할 필요가 있다.일부 작업에 대해서는 의도대로 실행되고 있는지 확인하기 위해 실행하기 전 사람이 직접 개입하여 "승인" 절차를 도입하고 싶을 수 있다. 이번에는 이전까지 살펴봤던 검색 Tool을 가진 그래프를 활용하고 LLM이 생성한 검색 쿼리가 적절한지 판단하도록 만들어보자.(Lang..
LangGraph에서 Tool을 사용하기 위해서는 ToolNode가 정의되어야 한다LangChain에서 Tool은 결국 invoke 메서드를 갖는 하나의 클래스로 정의만약 Custom이 필요한 경우, langchain_core.tools의 BaseTool를 상속받는 클래스를 정의하면 됨!추상 메서드 _run을 정의클래스 변수 name, description, args_schema 3가지를 정의LLM에 Tool을 주는 방법은 다음과 같다!STEP1. Tool 리스트 정의from utils.custom_tools import TavilySearch# 검색도구 생성web_search = TavilySearch(max_results=1)tools = [tool]STEP2. llm에 tool 리스트 바인딩from..
이번에는 https://sean-j.tistory.com/38 에서 만든 간단한 rag 파이프라인을 구현된 chain 대신, 직접 프롬프트를 작성하고 LCEL 로 RAG 파이프라인을 구성해보자. 랭체인은 복잡한 체인을 쉽게 구현할 수 있도록 LangChain Expression Language(LCEL)을 제공한다. 기본적으로 Runnable 인터페이스를 따르는 LCEL 객체들을 파이프 연산자(|)으로 연결하는 형태로 작성할 수 있는데, 이때 앞 객체의 output을 다음 객체의 input으로 전달한다. 그리고 Runnable은 입력을 받아 출력을 만드는 인터페이스라고 생각하면 된다. 이때 Runnable은 공통적으로 invoke, batch, stream 등의 메서드를 갖고 있어야 한다. 또, 모든..
LLM이 사전 학습한 정보를 벗어난 데이터의 범위를 벗어나는 경우, 원하는 대답을 얻을 수 없다. 또한, 생성 모델의 한계상 할루시네이션이 발생해 정확한 정보를 얻기 어려울 때도 있다. 우리가 원하는 정보를 얻기 위해 LLM을 Supervised fine-tuning하거나, Instruction fine-tuning을 하거나, RAG를 사용할 수 있다. SFT의 경우, 현실적으로 비용 문제 때문에 접근성이 떨어지기 때문에 제외하고 Instruction fine-tuning이나 RAG를 사용하게 된다. Instruction fine-tuning은 LLM을 Instruction-output 데이터셋으로 사용자 질의와 답변을 align 시켜주는 방법이다. RAG는 사용자 질문 의도에 적절한 외부 문서를 가..
LLM의 input은 String type으로 넣어줘야 한다. 이를 위해 랭체인에서 제공하는 document_loaders는 pdf, notion, ppt 등의 여러 형식을 불러오고 LLM에 제공할 수 있도록 전처리를 도와준다. 기본적으로 document_loaders의 클래스들은 load 메소드를 사용해, 여러 형태의 데이터를 알맞게 parsing해서 Document 객체를 원소로 갖는 리스트를 반환한다. 이때, Document 객체는 page_content와 metadata를 클래스 변수로 갖는다. 랭체인의 document_loaders의 클래스들이 어떤 형태로 각 문서를 처리하고 값을 반환하는지 TextLoader와 CSVLoader의 소스코드를 살펴보자.TextLoaderclass TextLoa..
AgentExecutor는 While Loop! 랭체인이 제공하는 모듈인 에이전트는 일종의 동적 Chain으로 ReAct 기반 프롬프트로부터 action을 정하고 tool을 활용하며 상호작용할 수 있도록 한다. 예를 들어, 주어진 문자열의 길이를 반환하는 함수를 Tool로 사용하는 Agent를 만들고, 수행하면 다음과 같다.# zero-shot ReAct Agent example@tooldef get_text_length(text: str) -> int: """주어진 문자열의 길이를 반환하는 함수""" text = text.strip("'\n") return len(text)if __name__ == "__main__": llm = ChatOpenAI() prompt = hu..
앞선 게시물들에서 살펴본 것처럼 동시성이란 여러 작업을 스위칭하며 처리하는 것을 의미한다. 따라서 동시성 프로그램을 사용하면 네트워크 I/O와 같이 요청/응답 과정에서 효율적으로 코드를 설계할 수 있다. 그런데 여기서 생각해볼 점이 있다. 기존처럼 순차적으로 진행했던 동기적 코드보다 항상 비동기적 코드가 좋을까? 정답은 그렇지 않다는 것이다. 예를 들어, CPU 연산이 많은 프로그램을 생각해보자. 이러한 경우 하나의 CPU가 쭉 계산하는 것과 여러 스레드에 동시성으로 작업하는 것과 차이가 없을 것이다. 오히려 여러 excutor로 작업을 할당하는 연산이 추가되어 더 오래 걸릴 것이라 예상할 수 있다. 이러한 경우에는 동시성 보다는 병렬성으로 작업을 수행해야 속도를 향상시킬 수 있다. 그런데 파이썬은 ..
동시성은 Concurrency, 병렬성은 Parallelism을 번역한 용어로 둘은 다른 개념이다. 이 둘의 차이에 대해서 알아보자.먼저 동시성과 병렬성의 정의는 다음과 같다.동시성(concurrency): 한 번에 여러 작업을 동시에 다루는 것 (switch의 개념)병렬성(parallelism): 한 번에 여러 작업을 병렬적으로 처리하는 것 (at the same time의 개념)좀 더 쉽게 말하면, 동시성은 시간과 관계없이 여러 작업이 처리되고 있는 상태를 만족하는 것을 의미하고, 병렬성은 시간상 동시에 처리되고 있는 것을 의미한다. 아직 조금 헷갈리는 것 같다. 주문을 받아 요리사가 요리를 하는 예시를 통해 이해해보자. 현재 상황은 요리사에게 ["파스타", "피자", "스테이크"] 주문이 들어온 상..