학습일지/AI

[AIFactory 세미나] ChatGPT Learning Day - LangChain 설명 (1) - 컴포넌트

inspirit941 2023. 4. 17. 18:30
반응형

ChatGPT에 날개를 달아줄 LangChain (1) - 컴포넌트

https://www.youtube.com/live/JBcWvMeOAes?feature=share 


LangChain 발전속도가 진짜 빠름.

스크린샷 2023-04-12 오후 7 50 37

  • 내가 가진 정보를 학습시키거나
  • 다른 서비스와 연동하거나
  • 내가 정한 시나리오대로 활용하기

 

스크린샷 2023-04-14 오후 8 02 57



보통은 언어모델을 호출할 때 API call / 모델 자체를 직접 호출하는 식. LangChain은 아래 두 가지 문제를 해결하기 위해 만들어졌다.

  • 외부 데이터를 모델에 인식시키기 - 너가 학습한 데이터 말고, 내가 제공하는 데이터를 써라.
  • 타 시스템과의 상호작용하는 애플리케이션 개발

 

컴포넌트

스크린샷 2023-04-14 오후 9 54 23

 

스크린샷 2023-04-14 오후 9 56 43



얘네 특징: 문서 보기가 힘들다. 업데이트 속도도 빠른 편이고..

크게 두 가지로 나뉨.

  • Component: LangChain 구성 모듈을 설명함.
    • 모듈 활용한 usecase 소개
  • 사용사례.

확장성이 아주 뛰어남.

Scheme

스크린샷 2023-04-14 오후 9 58 21



LangChain에서 사용할 수 있는 기본적인 타입과 스키마.

  • Text: 언어모델의 기본 인터페이스가 텍스트이므로
  • ChatMessage: chatGPT와 동일
    • SystemChatMessage: ai 시스템에게 지시하는 사항
    • HumanChatMessage: 사용자에게 입력받는 정보
    • AiChatMessage: ai 시스템의 출력 메시지
  • Example: 샘플. input / output을 한 쌍으로 묶은 것.
    • train / assessment에 사용 가능. fine tuning이라던가
  • Document: 비구조화된 데이터 조각.
    • page_component: 데이터 내용
    • metadata

Model

스크린샷 2023-04-14 오후 10 03 08



LLMs (대규모 언어모델) - OpenAI도 이 중 하나. 언어모델도 선택지가 여러 개 있음.

  • 보통 input / output 둘 다 문자열

ChatModel

  • input은 채팅 메시지 목록 (과거의 대화내역도 전부 전달하는 식)
  • output은 ai가 응답한 메시지

Text Embedding Model

  • 텍스트 넣어서 임베딩 결과만 출력하는 것.
  • 임베딩을 어떻게 하느냐도 성능 차이를 발생시킨다. 어떤 임베딩을 쓰느냐에 따라 모델도 달라진다.
    • 문장 간 유사도라거나...

Prompt

스크린샷 2023-04-17 오전 11 41 51

 

모델에 원하는 명령어를 입력하는 방법.

  • 기존 방법은 '프로그래밍'이었다면, 자연어를 입력할 수 있음.
  • 모델을 똑바로 이해하려면 프로그래밍 + 프롬프트 둘 다 봐야 함..
  • PromptValue: 자연어로 된 프롬프트 입력값
  • PromptTemplate: PromptValue의 공통부분을 묶어서 프로그래밍에 쓰기 위한 객체.
  • ExampleSelector: 프롬프트에 예시문도 포함한 것
  • OutputParser: 단순 plain text return이 아니라 structured data를 얻고 싶을 때 사용. 서비스에서는 중요할 것 같음.
    • 어떤 형식으로 출력시킬 것인지
    • 출력 format 설정 / 재시도 로직 등.

Index

스크린샷 2023-04-17 오전 11 51 34

 

  • Document Loader: html, pdf 등 다양한 방식의 문서를 로드할 수 있음.
  • Text Splitters: 문서를 '의미론적으로 관련된' 단위로 분할하기 위한 컴포넌트. 문서 특성에 맞게 분할.
    • 몇 문장으로 분할할 것인지를 입력값으로 받는다.
  • VectorStores: 입력값을 embedding해서 만들어진 vector를 생성, 저장, 관리, 검색할 수 있도록 기능을 제공하는 저장소.
    • 문장으로 저장하는 것 vs Vector로 저장 -> vector 저장 시 문장 간 유사도 검사에 유리함.
    • DB연동 됨. SQLChain (자연어 입력하면 sql query 변환해서 날려줌). 단, 예제도 그렇고 sqlChain 결과물도 그다지 좋지 않음.
  • Retrievers: 문서와 언어 모델을 연결하기 위한 인터페이스.

Q. 한글 pdf 로드 -> prompt 지정하면 글자제한으로 막힌다.

  • pdf 로드해서 vectorSpace에 저장, 사용자가 입력했을 시 입력값과 유사한 것들만 추출해서 prompt에 넣는 식으로 사용해야 함.

Chain

스크린샷 2023-04-17 오전 11 58 48

 

  • Chain: 여러 컴포넌트를 감싸는 Wrapper 클래스.
  • LLMChain: 체인 컴포넌트 중 가장 일반적인 유형
    • 보통 LLMModel / ChatbotModel 둘 중 하나를 골라 씀
    • 사용할 언어모델, PromptTemplate, 출력 parser 세 개를 묶어서 Chain으로 씀.
      • 입력값 받아서 PromptTemplate 구성
      • 모델에 전달
      • 출력결과를 outputParser로 파싱한 후 사용자에게 전달
  • Index-Related Chain: index로 저장한 고유 데이터와 LLM 결합
    • 문서에서 질문 찾아서 답변할 경우 씀.
  • Prompt Selector: 모델이나 서비스에 맞는 prompt를 자동으로 지정할 수 있게 해줌.
Index-Related Chain 부가설명

스크린샷 2023-04-17 오후 12 30 03

 

  • Stuffing : index에서 확인한 관련 데이터를 전부 모델에 지문으로 넣어서 전달
  • MapReduce
  • Refine
  • Map-Rerank: 응답한 답변 가지고 다시 Rank -> 가장 우선순위 높은 답변을 반환함.

보통 병렬처리할 때 쓰는 용어들.

Memory

스크린샷 2023-04-17 오후 12 32 44

 

대화 과정에서 데이터를 저장하고 검색하는 것

  • 모델이 응답한 결과만 저장하거나
  • 모든 대화내역을 토대로 상태를 업데이트하거나.

단기: 단일 대화의 맥락을 위해 데이터를 전달함

장기: 대화 사이에 특정 정보를 가져오고 업데이트하는 것

ChatMessageHistory

  • 대화 목록 전체를 다 넣을 수는 없을 때, 지난 대화를 vector DB에 넣은 뒤 유사도 높은 것만 query해서 쓴다던지...

Agent

스크린샷 2023-04-17 오후 12 54 58

 

사용자 입력값에 따라 Chain을 변경하고 싶을 때 사용. 보통 하나의 Chain은 '어떤 업무를 담당한다'는 성격을 가지고 있는데, 사용자의 요구사항에 따라 적용할 Chain을 자동 변경하는 것.

  • Tools
  • Toolkits
  • Agents
    • 사용자의 입력을 받고
    • 어떤 Action을 취할 것인지 선택
    • 사용자 입력값의 response를 어떻게 처리할 것인지 Wrapper 포함.
  • AgentExecuter: 위 컴포넌트를 조합해서 실행하는 로직.
    • agent 호출 / action과 action input 받기
    • action 수행할 때 참조해야 할 tool 호출
    • tool의 출력값 참조해서 agent에 결과 리턴

Q. query 보낼 때 문법에 맞는 문장인지가 얼마나 중요한가?

  • 문법보다는 '얼마나 상세히, 오해의 여지가 없도록 구체적인 direction을 주었느냐' 가 답변에 영향을 주는 것 같음.

코드 예시는 https://aifactory.space/learning/2359/discussion/243 에서 확인할 수 있다.

 

 

내가 따라해본 예시

 

반응형