LLM은 사람의 언어를 잘 흉내내는 언어 모델이고 LLM을 원동력으로 하는 애플리케이션을 구축하기 위해서는 당연하게도 단순 언어 모델 개발 이상의 작업이 요구된다.
즉, 언어 모델과 여러 기능 간의 연결이 필요한데 랭체인(LangChain)은 언어 모델(Language model)과 외부 도구를 마치 사슬(Chain)처럼 엮어 결합시켜 이러한 통합을 간소화하도록 설계된 애플리케이션 개발 프레임워크다.
먼저 사람이 어떤 문제를 풀 때 사고하고 추론하는 경우를 생각해 보자.
이처럼 사람의 사고를 제대로 흉내내기 위해서는 여러 도구와 기법들이 총 망라되어 처리해 주어야 한다. 랭체인은 이러한 일을 도와주는 여러 개발 프레임워크 중 하나다.
랭체인을 활용해서 복잡한 문제를 갈라서 처리하면 문제를 해결하는데 도움이 될 수 있다. 마치 Chain of Thoughts 프롬프트 기법처럼 언어 모델은 복잡한 사고가 요구하는 질문에 대하여 도출 과정을 풀어서 처리해야 좋은 성능을 발휘한다.
복잡한 문제를 프로그래밍적으로 분리해서 처리하는 것을 도와주고 이를 크게 보면 두가지로 나눌 수 있다. 하나는 분리된 생각들이 순서를 가지고 서로 연결되어 있는 것이고, 다른 하나는 경우의 수를 가지고 갈라서 처리하는 것이다.
1. 생각을 연결해서 처리하기(SequentailChain)
위와 같이 단계적으로 진행해야 하는 건에 대해서는 랭체인 모듈 중 SequentialChain 함수를 사용하여 전단계의 출력 값을 다음 단계의 입력 값으로 연결을 효율적으로 할 수 있도록 도와준다.
위와 같이 단계적으로 진행해야 하는 건에 대해서는 랭체인 모듈 중 SequentialChain 함수를 사용하여 전단계의 출력 값을 다음 단계의 입력 값으로 연결을 효율적으로 할 수 있도록 도와준다.
2. 경우의 수를 구분해서 처리하기(Routing)
사용자의 질문 의도에 따라서 각각 다른 방식으로 답변할 수 있도록 한다.
에이전트를 구현할 때 LLM에게만 의존하는 것이 아니라 내가 가진 데이터를 기반으로 답변하게 하고 싶을 때 RAG(Retrieval Augmented Generation)을 구현한다. 사용자가 프롬프트를 입력하면 그 질문 내용과 가장 관련성이 높은 내용을 내가 가진 지식저장소(Vector database)에서 찾아서 해당 내용을 프롬프트에 추가하여 LLM에게 물어 보는 방식으로 구현하는 것이다.
이를 위해서 벡터 DB (vector database)를 사용한다. 내가 가진 데이터를 약 1500차원(ChatGPT 기준)의 vector로 변환하는 과정을 임베딩(embedding)이라고 한다. 임베딩 결과물을 벡터 DB에 저장하고 RAG할 때 마다 불러서 사용한다.
인간이 추론할 때 자신의 지식 뿐만 아니라 외부의 정보를 참고하여 사고하는 것과 유사한 방식으로 “행동”(검색, 연산)과 “추론”의 상호작용을 통해서 답을 찾아가는 기법을 ReAct 기법이라고 한다. 랭체인에서는 plan_and_execute라는 모듈 형태로 구현 되어 있으며, 사용자의 질문 내용을 가지고 검색, 연산 등 답을 얻는데 필요한 함수에 대한 계획을 세우고 실행하는 형태로 구성되어 있다. 이렇게 함으로써 현재의 LLM이 감당하지 못하는 부분에 대해서 외부 함수를 사용할 수 있게 지원한다.