Generative AI/Language Model

LangChain for LLM Application Development

데이터 세상 2023. 7. 17. 23:16

LangChain

LLM을 사용하여 애플리케이션 생성을 단순화하도록 설계된 프레임워크

LLM 프롬프트의 실행과 외부 소스의 실행(계산기, 구글 검색, 슬랙 메시지 전송이나 소스코드 실행 등)을 엮어 연쇄(Chaining)하는 것

 

나의 질문과 LLM의 답변 사이에 여러가지 Tool들을 이용해 프롬프트 엔지니어링을 하는 것
그러한 과정을 반복해 원하는 답을 찾는 것

 

https://docs.langchain.com/docs/

 

🦜️🔗 LangChain | 🦜️🔗 LangChain

LangChain is a framework for developing applications powered by language models.

docs.langchain.com

 

Open-source development framework for LLM applications

Python and Javascript(TypeScript) packages

Focused on composition and modularity

key value adds:

  • Modular components
  • Use cases: Common ways to combine components

 

Language: Large Language Model의 Language

Chain: 모듈들을 체인으로 연결하여 다른 툴의 출력을 다음 툴의 입력으로 연결하는 방식

            ex) 검색 → OpenAI(LLM) → 계산

LLM을 이용해서 애플리케이션을 만들때 쓸 수 있는 툴/라이브러리 모음

모듈화로 쉽게 부품을 갈아끼울 수 있음

 

→ LLM은 홀로 사용하기에는 불충분하고 여러가지 소스와 지식을 결합해야 합니다.

한 API(LLM 포함)의 output이 다른 LLM의 input으로 들어가고, 또 그 LLM의 output이 다른 LLM의 input으로 들어가는 등 체인처럼 연결된다는 것으로 이해할 수 있습니다.

 

LangChain은 단순히 API 엑세스 하는 기능도 있지만 그 외에도 다양한 컴포넌트들이 준비되어 있으며, 아래와 같이 크게 두 가지 원칙에 기반하여 작성되었다고 합니다.

Be data-aware : 언어 모델을 다른 데이터 원본에 연결합니다.
Be agentic : 언어 모델이 해당 환경과 상호 작용할 수 있도록 허용합니다.

 

LangChain은 머신 러닝 스타트업인 Robust Intelligence에서 근무하던 Harrison Chase가 2022년 10월 오픈 소스 프로젝트로 시작했습니다. 이 프로젝트는 GitHub의 수백 명의 기여자의 개선, Twitter의 최신 토론, 프로젝트의 Discord 서버에서의 활발한 활동, 많은 YouTube 자습서 및 샌프란시스코와 런던의 모임을 통해 빠르게 인기를 얻었습니다.

 

2023년 4월, 새로운 스타트업은 Benchmark에서 1,000만 달러의 종자 투자를 발표한 지 일주일 만에 벤처 기업인 Sequoia Capital로부터 최소 2억 달러의 가치로 2,000만 달러 이상의 자금을 조달했습니다.

 

2023년 3월, LangChain은 Amazon, Google 및 Microsoft Azure 클라우드 스토리지를 포함한 시스템과의 통합을 포함했습니다.

뉴스, 영화 정보 및 날씨에 대한 API 래퍼 요약, 구문 및 의미 검사, 쉘 스크립트 실행을 위한 Bash 여러 웹 스크래핑 하위 시스템 및 템플릿 few-shot 학습 프롬프트 생성 지원;

코드에서 'todo' 작업 찾기 및 요약 Google 드라이브 문서, 스프레드시트 및 프레젠테이션 요약, 추출 및 생성

Google 검색 및 Microsoft Bing 웹 검색 OpenAI, Anthropic 및 Hugging Face 언어 모델 iFixit 수리 안내서 및 위키 검색 및 요약;

질문 답변, 문서 결합 및 질문 생성을 위한 MapReduce N-그램 중첩 점수;

PDF 파일 텍스트 추출 및 조작을 위한 PyPDF, pdfminer, fitz 및 pymupdf;

Python 및 JavaScript 코드 생성, 분석 및 디버깅 임베딩 및 데이터 개체를 캐시하기 위해 벡터 데이터베이스를 위배합니다.

Redis 캐시 데이터베이스 스토리지 API 요청을 위한 Python RequestsWrapper 및 기타 메서드 JSON 지원을 포함한 SQL 및 NoSQL 데이터베이스 Streamlit(로깅 포함) k-최근접 이웃 검색을 위한 텍스트 매핑;

시간대 변환 및 캘린더 작업 스레드 및 비동기 하위 프로세스 실행에서 스택 기호 추적 및 기록 및 Wolfram Alpha 웹사이트 및 SDK.

2023년 4월부터 50개 이상의 문서 유형 및 데이터 소스에서 읽을 수 있습니다.

 

 

Langflow

LangChain 설계를 위한 GUI 프로젝트

 

LangChain에는 사전 설정된 모듈(Module)이 존재하고 사용자는 이 모듀을 적절히 혼합하여 여러 구성 요소(Component)로 엮어낸 뒤 각 구성 요소 간의 파이프라인을 설정할 수 있습니다.

 

모듈에는 다양한 종류가 있으며 프레임워크 생태계의 발전에 따라 계속해서 증가하고 있습니다. 여러 개의 모듈이 모여 하나의 구성 요소를 이루고, 또 이렇게 모인 구성 요소가 체인을 이루어 마치 레고 블록을 쌓아 올리듯이 하나의 완성된 어플리케이션을 빌드하는 역할을 합니다.


Components

LangChain 사이트에서는 7개 카테고리의 컴포넌트들과 다양한 사용 사례들을 소개하고 있습니다.

Schema

  • ChatMessages
  • Document

 

Models

  • LLMs: 20+ integrations
  • Chat Models
  • Text Embedding Models: 10+ integrations

 

Prompts

  • Prompt
  • Prompt Templates: 챗봇 스타일 템플릿, ELI5 질문-답변 등 다양한 유형의 프롬프트를 위한 템플릿
  • Example Selectors: 5+ implementations
  • Output Parsers: 5+ implementations
    • Retry/fixing logic

 

Indexes

  • Document Loaders: 50+ implementations
  • Text Splitters: 10+ implementations
  • Vector Stores: 10+ integrations
  • Retrievers: 5+ integrations/implementations

 

Memory

  • Chat Message History

 

Chains

  • Prompt + LLM + Output parsing
  • Can be used as building blocks for longer chains
  • More application specific chains: 20+ types

 

Agents - Tools

LLMs를 사용하여 어떤 행동이 취해져야 하는지 결정하는 도구입니다.

웹 검색이나 계산기와 같은 도구를 사용할 수 있으며, 모든 것은 논리적인 연산 루프에 패키지화 됩니다.

  • Agent Types: 5+ types
    • Algorithms for getting LLMs to use tools
  • Agent Toolkits: 10+ implementations
    • Agents armed with specific tools for a specific application 

사전준비 (python 기준, 환경설정)

1. openai, langchain SDK 설치

$ pip install openai
$ pip install langchain

1-1) Optional: 구글 검색, 위키피디아, VectorStore, Huggingface Embedding 등 관련

$ pip install google-search-results
$ pip install wikipedia
$ pip install faiss-cpu # 오픈소스 벡터DB (Facebook, MIT license)
$ pip install sentence_transformers # HuggingFace Embedding 사용 위해서 필요
$ pip install tiktoken # Summarization 할때 필요

2. OpenAI API key

2-1) ChatOpenAI 생성 시

chat = ChatOpenAI(openai_api_key=openai_api_key)

2-2) 환경 변수 설정

export OPENAI_API_KEY="XXX-..."

2-3) jupyter notebook 사용 시, 환경 변수 설정

import os
os.environ["OPENAI_API_KEY"] = "..."

 


Schema

ChatMessages

LLM과 상호 작용하는 가장 기본이 되는 인터페이스입니다.

현재는 System, Human, AI 3종류의 사용자를 지원합니다.

  • System : AI에게 해야 할 일을 알려주는 배경 컨텍스트
  • Human : 사용자 메세지
  • AI : AI가 응답한 내용을 보여주는 상세 메세지

 

Document

텍스트와 메타데이터를 담고있는 객체입니다.

 


Models

LLMs(Large Language Models)

텍스트 문자열을 입력하고, 텍스트 문자열을 출력하는 모델입니다.

LangChain은 LLM 공급자가 아니며, 인터페이스만 제공합니다.

 

LLM 모듈은 Langchain의 엔진입니다.

각기 다른 언어 모델 혹은 언어 모델 제공 서비스가 가진 API를 Langchain의 다른 여러 모듈에서 사용할 수 있도록 정규화한 인터페이스로 제공하는 역할을 합니다.

 

모듈에 연결할 LLM은 어떤 종류의 모델이라고 상관없습니다.

OpenAI, Huggingface의 Inference API로 호스팅하고 있는 모델, 로컬에서 실행중인 LLaMa 기반 모델 등 모두 가능합니다.

 

하나의 어플리케이션에서 다양한 LLMs를 사용할 수 있습니다.

요구사항에 따라 필요한 모델을 사용하는 방식으로 어플리케이션을 잘 구성하면 불필요한 리소스 낭비를 줄이고 비용을 절감할 수 있습니다.

 

import { ChatOpenAI } from 'langchain/chat_models';

export const gpt4Model = new ChatOpenAI({
  temperature: 0.6,
  modelName: 'gpt-4',
  verbose: true,
  streaming: true,
});

 

Chat Models

채팅 모델은 언어 모델의 변형으로, 내부적으로는 언어 모델을 사용하지만 노출되는 인터페이스는 약간 다릅니다.

현재보다 나은 추상화를 위해서 지속적으로 개선이 이뤄지고 있습니다.

 

Text Embedding Models

텍스트를 벡터 (텍스트의 의미를 담고 있는 일련의 숫자)로 변경합니다.

주로 두 텍스트를 함께 비교할 때 사용합니다.

 


Prompts

모델을 프로그래밍하는 새로운 방법을 프롬프트를 사용하는 것입니다.

다른 데이터 유형(이미지, 오디오) 등을 고려하여 추상화 작업이 진행되고 있으며, 현재는 텍스트를 처리합니다.

 

Prompt Templates

Prompt Template은 사전 설정된 Prompt에 지정된 변수를 쉽게 넣을 수 있도록 구성한 템플릿 모듈입니다.

사용자로부터 일련의 매개변수를 가져와 프롬프트를 생성할 수 있는 텍스트 문자열이 포함되어 있습니다.

 

Example Selector

프롬프트에서 상황에 맞는 정보를 동적으로 배치할 수 있는 예제 중에서 쉽게 선택할 수 있는 방법을 제공합니다.

 

Output Parser

일반적으로 LLM은 텍스트를 출력합니다. 하지만 보다 구조화된 정보를 얻고 싶을 수 있습니다.

출력 파서를 이용하여 LLM 응답을 구조화할 수 있습니다.

출력 파서는 두 가지 컨셉을 가지고 있습니다.

  • Format instructions: 원하는 결과의 포맷을 지정하여 LLM에 알려줍니다.
  • Parser: 원하는 텍스트 출력 구조(보통 JSON)을 추출하도록 합니다.

 


Indexes

인덱스는 LLM이 다른 소스에서 문서를 쉽게 가져올 수 있도록 하는 방법입니다.

문서 작성을 위한 유틸리티 함수, 다양한 유형의 Index, 그리고 이러한 Index를 체이닝하여 사용합니다.

 

Document Loader

특정 문서나 웹페이지, 이메일, 파워포인트, 워드, 유튜브, 트위터 등에서 텍스트 정보를 긁어오는 로드하는 역할입니다.

GPT4의 최대 입력 토큰은 32,768개로 약 64,000 단어 분량의 값을 입력할 수 있습니다.

 

Document Loader 전체 목록

https://python.langchain.com/docs/modules/data_connection/document_loaders/

더보기

 

Text Splitters

문서의 내용이 길어서 LLM에 한번에 입력이 어려운 경우, 문서를 잘게 쪼개야 합니다.

이 경우 텍스트 분할기를 이용하여 도움을 받을 수 있습니다.

 

Vector Stores

벡터를 저장하는 데이터베이스와 관련된 기능입니다.

벡터 저장소 작업의 핵심 부분은 일반적으로 임베딩을 통해 생성되는 벡터를 만드는 것입니다.

 

Embedding & Vector Store

Embedding은 문서를 LLM에 입력하면 나오는 특징 벡터, Neural Network의 특정 메모리를 읽어서 만듭니다. 보통 512개 이상의 float로 만들어집니다.
의미상 비슷한 input이 들어갔을 때, 나오는 특징 벡터가 유사한 특징을 갖고, 거리상 가깝게 됩니다.

OpenAI에서 text를 넣으면 Embedding을 돌려주는 API를 제공합니다. (단, 비용 발생)
기본적으로 사용되는 OpenAI API는 비용이 발생하므로 로컬에서 HuggingfaceEmbeddings를 이용하면 GPU 가속도 지원합니다.
 
Vector Database는 Embedding 벡터와 텍스트를 저장하는 DB입니다.
특징 벡터와 텍스트를 저장하고 파일에 저장합니다.

  • Pinecone 서비스 (유료, 무료 제한적)
  • FAISS (페이스북, 오픈소스, 로컬)
  • Embeddings -> 텍스트를 저장
  • Embeddings로 검색할 수 있으며, 거리상 가장 가까운 항목을 가져올 수 있음. (거리를 구하는 방법은 여러 가지)
  • 유사한 의미를 갖는 텍스트에 대한 Embedding 벡터는 거리상 가까움.

 

Retrievers

리트리버 인터페이스는 문서를 쉽게 결합할 수 있는 일반 인터페이스입니다.

 

ChatGPT Plugin Retriever

 

VectorStore Retrierver

 

 


Memory

기본적으로 체인과 에이전트는 상태를 저장하지 않습니다. 즉, 쿼리가 수행되면 독립적으로 처리합니다.

Memory 컴포넌트는 LLM이 정보를 기억할 수 있도록 지원합니다. 간단하게는 과거 채팅 히스토를 기억할 수도 있고, 더 복잡한 정보를 검색할 수도 있습니다.

즉, ChatAPI는 stateless이기 때문에 그 전에 대한 기억을 하기 위한 메모리 저장 기능입니다.

 

Memory 컴포넌트 목록

https://python.langchain.com/docs/modules/memory/

 

Chat Message History

ChatMessageHistory 클래스는 Human, AI 메세지를 저장한 다음 모두 가져올 수 있습니다.

 


Chains

다양한 LLM을 호출하는데 사용되는 컴포넌트입니다.

 

Sequential Chains

LLMChaing을 이용하여 LLM 출력을 다른 LMM의 입력으로 사용할 수 있도록 합니다.

 

Summarize Chains

Load된 Document를 이용하여 LLM으로 요약합니다.

한번에 처리가 어려운 문서를 나눠서 요약할 수도 있습니다.

from langchain.chains.summarize import load_summarize_chain

chain = load_summarize_chain(chat, chain_type="map_reduce", verbose=True)
chain.run(docs[1:3])

 

chain_type

  • "stuff": LLM 한 번에 다 보냄. 길면 오류.
  • "map_reduce": 나눠서 요약, 전체 요약본 다시 요약
  • "refine": (요약 + 다음 문서) => 요약
  • "map_rerank": 점수 매겨서 중요한 것으로 요약

 


Agents

사용자 입력에 따라 Agent는 여러 도구 중 호출할 수 있는 경우 도구를 결정할 수 있습니다.

Agent는 LLM을 사용하여 수행할 작업과 순서를 결정합니다. 이 과정에서 도구를 사용하여 출력을 관찰하거나 사용자에게 반환할 수 있습니다.

 

Agent는 Langchain에서 가장 핵심적인 역할을 하는 모듈일 뿐 아니라, 가장 복잡하고 정교한 사고 작업의 실행을 담당하는 모듈입니다.

Agent의 개념은 몇가지 핵심적인 생성 인공지능 논문에 그 뿌리를 두고 있으며, 새로운 접근 방법이 제시될 때 마다 거기에 맞추어 계속해서 개선되고 있습니다.

 

Agent는 주체적으로 주어진 자원을 활용하여 어떤 작업을 실행하는 역할을 합니다.

 

Action Agent

1. Action planning / Reasoning

자신에게 주어진 Task를 수행하기 위해, 주어진 도구(Tools)와 현재 상황을 토대로 사고(Thought)하여 필요한 다음 행동을 설계합니다.

2. 설계가 끝났다면 현재 필요한 Action을 적절한 Input과 함께 수행합니다.

3. Chain of Thought

Action의 수행이 끝나면 그 수행 결과를 분석(Observation)하고, 분석한 결과와 현재까지 수행했던 Action의 결과를 토대로 1~3의 작업을 반복합니다.

4. 결과를 분석하여 Task가 완료되었거나 완료 가능하다면 작업 수행을 완료하고 종료합니다.

 

Plan-and-Execute Agent

현재 단계의 Action만 추론하는게 아닌 전체 실행의 단계를 처음부터 모두 구상하여 단계별로 실행합니다.

 

 

Agent: 어떤 툴을 어떤 순서로 실행할지 결정하는 역할(LLM 이용)

Tool: 특정 일을 하는 역할. 예) 구글 검색, DB 조회, Python 실행/계산

 

Tools

구글 검색, 데이터베이스 조회, Python REPL 등을 이용할여 현재 문자열을 입력받아 결과값을 출력합니다.

OpenAI Plugins와 유사한 영역입니다.

 

Tool은 Agent가 각 Action을 수행할 때 사용할 수 있도록 추상화된 일종의 함수입니다.

Agent는 자신이 사용할 수 있는 Tool의 목록을 아래 값과 함께 프롬프트의 일부로 전달 받게 됩니다.

  • Tool의 이름
  • 해당 Tool의 Description (어떤 역할을 수행하는 Tool인지, Input은 어떻게 전달해야 하는지 등)
interface Tool {
  call(arg: string): Promise<string>;

  name: string;

  description: string;
}

Langchain에 정의된 Tool의 Interface는 위와 같습니다. 간단하지만 유연하며, 문자열으로 결과 값을 반환하기만 한다면 call 내부에서 어떤 동작을 수행해도 좋습니다.

여러가지 다른 모듈로 구성된 복잡한 Agent마저도 다른 Agent에게 Tool의 형태로 제공될 수 있으며, 이 간단하지만 강력한 Interface가 Langchain의 활용 가능성을 무궁무진하게 끌어올리는 요소 중 하나입니다.


Conclusion

LangChain은 아주 빠른 속도로 개발되고 있는 프로젝트 입니다. 그러나, 그 자체가 완벽한 솔루션은 아닙니다.

LLM 역시 확률 모델이기 때문에 포맷을 마음대로 어겨서 대답하는 경우도 있고, 끝없이 chaining하기도 합니다.

뿐만 아니라, 툴의 output이 완전치 못하거나, 검색 결과가 엉망이거나 온전하지 않는 경우들도 있습니다.

 

그럼에도, LangChain 같은 프레임워크를 이용해서 LLM을 이용한 애플리케이션 개발을 위한, 프롬프트 엔지니어링 작업이 가능하다는 부분에서는 기대가 크다고 할 수 있을거 같습니다.


References

반응형