
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이 지속적으로 나올 수 있..

지난 포스팅에서 배웠던 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) 방식으로 채운다. 어떤 식으로 업데..