조대협 314

Langchain을 이용한 LLM 애플리케이션 개발 #13 - Chain을 이용한 워크 플로우 구현 #1

Chain을 이용한, LLM 워크 플로우 구현 #1 조대협 (http://bcho.tistory.com) LLM 기반 애플리케이션을 개발할때, 한번의 LLM 호출로 결과를 낼 수 도 있지만, 복잡한 LLM 애플리케이션의 경우, LLM의 출력을 다시 다음 LLM의 입력으로 넣어서 LLM을 여러개를 연결해서 답변을 낼 수 도 있고, 입력 프롬프트에 따라서 알맞은 LLM이나 프롬프트를 선택하도록 분기 할 수 있다. 예를 들어 Python Coding을 해주는 LLM에서 API 파이썬 코드를 생성한 후에, 이 코드에 맞는 Unit Test 코드를 생성하는 LLM을 호출하거나, 아래 그림과 같이 학교 학생의 공부를 도와주는 챗봇에서 질문의 종류에 따라서, 영어,과학,수학 LLM을 선택적으로 호출하는 구조를 예로 ..

Langchain을 이용한 LLM 애플리케이션 개발 #12 - 큰문서를 나눠서 검색하기 (Parent-Child Chunking)

지금까지 살펴본 Retriever 들은, chunk 의 원본 문서 또는 문장을 저장할때 벡터 데이터 베이스에 text 필드에 저장하였다. 보통 한 문서 또는 한 문장은 여러개의 chunk로 분할되어 각각 저장되기 때문에 원본 Text가 중복되서 저장되는 문제점이 있고 이로 인하여 데이터 베이스 용량이 커지는 문제가 있다. 또는 원본 문서의 크기가 클때는 데이터 베이스 싱글 컬럼에 저장이 안될 수 도 있다. 이러한 문제를 해결하기 위한 구조를 parent-child chunking 이라고 하는데, langchain에서는 ParentDocumentRetriever 를 통해서 이 구조를 지원한다. 기본 원리는 chunk를 저장할때 chunk에 대한 원본 텍스트를 저장하지 않고, 원본 문서는 별도의 문서 저장소..

Langchain을 이용한 LLM 애플리케이션 개발 #11 - 벡터DB 검색 내용을 요약하기

ContextualCompression을 이용하여, 벡터 데이터베이스의 검색 내용을 요약하고 중복 제거하기 조대협 (http://bcho.tistory.com) 벡터 데이터 베이스에서 관련된 문서를 찾아온 후에, 이 문서의 내용을 프롬프트에 컨텍스트로 삽입하여 LLM에 전달해야 한다. 그런데 LLM은 입력 사이즈에 대한 한계가 있기 때문에, 검색해온 문서의 크기가 클 경우에는 입력사이즈 제한에 걸려서 프롬프트에 삽입하지 못할 수 있다. 프롬프트에 넣을 수 있는 사이즈라 하더라도, 원본 문서는 질문에 대한 답변을 줄 수 있는 정보뿐만 아니라 관련없는 텍스트가 많이 포함되어 있을 수 있다. 이런 문제를 해결하는 방법중의 하나는 LLM을 이용하여 검색된 문서를 질의와 상관있는 정보 위주로 요약해서 프롬프트에 ..

Langchain을 이용한 LLM 애플리케이션 개발 #9 - RAG를 이용한 문서 참조. 문서 저장하기

LLM은 학습 당시의 데이터만 기억하고 있기 때문에 학습 이후에 데이터에 대한 질의에 답변할 수 없고, LLM의 고질적인 문제인 환상(Halluciation)효과를 방지하기 위해서는 Ground Truth(진실)에 해당하는 외부 문서를 참조해서 답변하도록 하는것이 좋다. 이러한 구조를 RAG (Retrieval Agumentated Generation) 이라고 하는데, 이번글에서는 Langchain을 이용하여 RAG를 구현하는 방법에 대해서 알아보자. 이 구조를 이해하기 위해서는 벡터 임베딩, 유사도 검색, 벡터데이터 베이스에 대한 선수 지식이 필요한데, 아래 글을 참고하기 바란다. 1. RAG와 벡터데이터 베이스 Pinecone 2. 임베딩과 유사도 검색 3. Pinecone 둘러보기 4. 텍스트 임베..

Langchain을 이용한 LLM 애플리케이션 개발 #8 - 프롬프트 예제 선택기

프롬프트 예제 선택기를 이용한 동적으로 프롬프트 삽입하기 조대협 (http://bcho.tistory.com) 프롬프트를 통한 정확도를 높이기 위한 기법인 프롬프트 튜닝에서 가장 큰 효과를 볼 수 있는 방식이 프롬프트에 질문과 답변에 대한 예제를 추가하는 방법이다. 이렇게 질문과 답변 예제를 추가 하는 방식을 N-Shot 프롬프팅이라고 한다. 예제가 없는 경우 Zero-Shot 프롬프팅, 2개의 예제가 있는 경우 2-Shot 프롬프팅이라고 한다. 보통 2~3개의 예제만 있어도 답변을 정확도를 크게 높일 수 있다. 프롬프트에 예제를 정적으로 미리 추가해놓을 수 도 있지만 질문의 내용이나 종류에 따라서 동적으로 질문에 대한 예시를 선택하여 프롬프트에 삽입하면 좀 더 좋은 결과를 얻을 수 있다. 특히 챗봇처럼..

LLM 애플리케이션 개발을 위한 Langchain #7-PromptTemplate

Langchain - PromptTemplate 조대협 (http://bcho.tistory.com) LLM 기반 애플리케이션 개발에서 가장 중요한 것중의 하나가 프롬프트 엔지니어링이다. 프롬프트를 잘 만들어서 원하는 답변을 얻어야 하는데, 프롬프트 템플릿은 프롬프트를 재 사용할 수 있도록 해주고, 여러 프롬프트를 구조화하여, 적절한 프롬프트를 생성할 수 있도록 한다. 프롬프트 템플릿은 개념적으로 이해하기 쉬운 스트링(문자열) 연산이지만, 잘 사용하면 강력한 기능이 될 수 있기 때문에 숙지하기 바란다. 프롬프트 템플릿은 프롬프트를 생성하기 위한 템플릿이다. 예를 들어 “Tell me about {city_name} city” 라는 템플릿이 있으면, {city_name}은 가변 변수가 되고, 프롬프트를 생..

LLM 애플리케이션 개발을 위한 Langchain #6-Chat Model

Langchain에서 채팅 모델 사용하기 조대협 (http://bcho.tistory.com) 텍스트 LLM 모델이 단일 입력에 대한 단일 출력을 지원하는 모델이라면, Chat 모델은 기존의 대화 히스토리를 기반으로 해서 질문에 대한 답변을 출력하는 시나리오 이다. 이를 위해서 LangChain은 4가지 메시지 타입을 지원하는데, SystemMessage, HumanMessage, AIMessage가 주로 사용된다. SystemMessage : SystemMessage는 챗봇 에게 개발자가 명령을 내리기 위해서 사용하는 메시지이다. 예를 들어 쳇봇이 “여행가이드 역할을 하며, 여행에 관련되지 않은 질문은 답변하지 말아라" 라는 등의 역할에 대한 명령이나 대화에 대한 가이드라인이나 제약 사항을 설정할 수 ..

LLM 애플리케이션 개발을 위한 Langchain - #3 Model 및 호출 방법

Langchain Model 컴포넌트와 호출 방법 조대협 (http://bcho.tistory.com) Model은 Langchain 에서 ChatGPT나 PaLM 모델을 추상화한 객체이다. 보통 LLM모델들이 문장을 완성하는 LLM 기능 (질문에 대한 답변, 문서 요약, 아이디어 제공 등등)의 모델과, 사람과 상호작용을 하는 채팅을 위한 두 가지 모델을 제공한다. Langchain도 마찬가지로 이 두 가지 모델에 대한 추상화 계층을 제공하고 있다. LLM은 입력된 프롬프트의 명령에 따라 답변을 내는 모델이다. ChatGPT, PaLM API등의 LLM 모델에 대한 추상화 객체를 제공한다. LLM 모델 객체를 생성하는 방법은 모델 제공자에 따라 다르며, 특히 모델 제공자에 따라서 지원하는 튜닝 가능한 패..

LLM 애플리케이션 개발을 위한 Langchain - #2 주요 컴포넌트

Langchain의 주요 구성 요소 소개 조대협 (http://bcho.tistory.com) Langchain이 어떤 컴포넌트로 구성되어 있는지 살펴보자. 2023년 12월 현재 Langchain 라이브러리는 많은 업데이트가 있어서 이전 버전에 비교해서 컴포넌트 구성이나 기능이 다소 변경되었다. Langchain을 구성하는 주요 컴포넌트로는 Model, Prompt Template, Output Parser, Chain, Agent, Retrieval이 있다. 각각의 컴포넌트에 대해서 살펴보자. Model 먼저 Model 컴포넌트는 LLM 모델을 추상화하여 제공한다. 모델 컴포넌트는 입력으로 들어온 프롬프트에 대해서 텍스트 답변을 리턴하는 기능을 제공한다. Langchain은 다양한 LLM 모델을 지원..

LLM 애플리케이션 개발을 위한 Langchain #1-소개

LLM 애플리케이션 개발을 위한 Langchain 프레임웍 #1 소개와 ChatGPT, PaLM2 예제 조대협 (http://bcho.tistory.com) 배경 Open AI의 ChatGPT나 구글의 PaLM2와 같은 LLM 모델의 경우에는 LLM을 이용하여 서비스를 개발하기 위한 SDK를 제공한다. 이 SDK를 이용해서 애플리케이션을 직접 개발해도 되겠지만, SDK의 기능들을 추상화한 프레임웍을 사용한다면 조금 더 쉽게 애플리케이션을 개발할 수 있다. 예를 들어 데이터베이스들도 각각의 SDK를 제공하지만 자바와 같은 언어에서 개발을 할때는 JDBC와 같은 추상화 프레임웍을 사용하여 데이터베이스 종류에 상관없이 단일 프레임웍을 사용하여 개발할 수 있도록 하고, 더 나아가서는 JPA와 같은 고급 추상화 ..