
https://www.arxiv.org/abs/2407.16833 RAG vs LC의 결과를 보여주는 논문이다. LC는 확실히 성능면에서는 뛰어나지만, Token 값이 비싸고, RAG는 LC에 비해 한참 성능이 떨어진다. 그래서 해당 논문은 둘을 합친 Self-Route라는 기법을 제시했다. 개념은 간단하다. RAG가 retriever를 통해 unaswerable이라는 결론을 내놓으면, LC로 가고, 아니면 그냥 End로 끝낸다.이걸 어떻게 구현하냐면, LangGraph로 구현하면 가능하다. 코드를 보기에 앞서서 그래프로 간략하게 구현해보면 다음과 같다.요지는 retriever를 다르게 쓰는 것이다. llm_answer로 바로 줄 수도 있지만, 그렇게 되면 Unanswerable이 지속적으로 나올 수 있..

지난 시간엔 LagnChain의 LangGraph를 만들어보았다. 이번에는 LangChain에서 Agent를 만들어보자. 예제 코드는 여기에서 볼 수 있다.Agent는 간단하다. 지난 시간에 배운 LangGraph에서 분기 노드를 자동으로 결정해주는 녀석이라고 보면 된다. Tool이라고 하는 각각의 함수들이 존재하고, 해당 Tool을 사용하면서 사용자의 답을 해결할 때까지 지속적으로 돌아간다.Web상의 정보도 찾을 수 있고, PDF에서의 정보도 찾을 수 있다. 다만 이 Tool을 질문 Query에 따라 자동으로 Agent가 결정하는 형식이다. Tools 정의하기from langchain_community.document_loaders import WebBaseLoaderfrom langchain_comm..

지난 포스팅에서 배웠던 LangGraph를 활용하여 기본적인 워크플로우를 제작한다. 이론은 간단하기에, 재정정보 AI 검색 알고리즘 경진대회에서 썼던 코드를 리팩토링하여 사용하였다. 자세한 코드는 이곳에서 볼 수 있다. DB 만들기일단 예제와 다르게 retriever와 DB가 들어 있는 FAISS를 만든다.왜냐하면 LangGraph의 시작은 결국 Retriever 부터 시작하기 때문에 그렇다. 그렇기에 DB는 일단 만들어져 있어야 한다. 대략적으로 요약하자면, pdf를 가져와서 청킹하고 임베딩 한다고 생각하면 된다.def process_pdfs_from_dataframe(df, base_directory): """딕셔너리에 pdf명을 키로해서 DB, retriever 저장""" pdf_data..
노드, 엣지, 상태관리를 통해 Agentic Work Flow를 가진다. 노드 = 각각의 상태. 실행하고자 하는 하나의 함수라고 보면 된다.엣지 = 어디서부터 어디로 보낼 것인가?두 개 이상의 엣지 구현 가능상태 = 현재의 상태 값을 저장 및 전달하는 데 활용 순환 연산 기능으로 쉽게 흐름을 제어 Conditional Edge : 조건부 흐름 제어를 할 수 있게 해주는 엣지. 분기 처리가 가능하다.Human-in-the-loop : 사람이 직접 개입해서 정하게 하는 것도 가능하다. 상태(State)TypeDict : 일반 파이썬 dict에 타입헌팅을 추가. 쉽게 말하면 dictionary모든 값을 다 채우지 않아도 된다.새로운 노드에서 값을 덮어쓰기(Overwrite) 방식으로 채운다. 어떤 식으로 업데..
자바 17버전부터 추가된 문법들입니다. 텍스트 블록여러 줄의 텍스트를 작성할 때 """로 감싼 텍스트를 사용해서 여러 줄의 텍스트를 표현할 수 있습니다. String query17 = """ SELECT * FROM "items" WHERE "status" = "SALE" ORDER BY "price"; """; formatted() 메서드값을 파싱하기 위해서 사용합니다. 해당 기능이 없었을 때 아주 불편했다고 합니다.(확실히 다른 언어에 비교해서 힘들었을 것 같긴 합니다.)String textBlock17 ="""{ "id : %d "name" : %s,}""".formatted(2, "juice") 레코드레코드는 데이터 전달을 목적으로 하는 객체를 더 빠르고 간편하게 만듭니다.레..
전 포스트에서 만들었던 SpringBootDeveloper 패키지를 우클릭하여 New - Class를 선택하고 TestController.java 파일을 만들어봅시다. 그리고 다음과 같이 코드를 입력합니다.package me.shinsunyoung.springbottdeveloper;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class TestController { @GetMapping("/test") public String test() { return "Hello, wo..