[AIFactory 세미나] ChatGPT Learning Day - LangChain 설명 (1) - 컴포넌트
ChatGPT에 날개를 달아줄 LangChain (1) - 컴포넌트
https://www.youtube.com/live/JBcWvMeOAes?feature=share
LangChain 발전속도가 진짜 빠름.
- 내가 가진 정보를 학습시키거나
- 다른 서비스와 연동하거나
- 내가 정한 시나리오대로 활용하기
보통은 언어모델을 호출할 때 API call / 모델 자체를 직접 호출하는 식. LangChain은 아래 두 가지 문제를 해결하기 위해 만들어졌다.
- 외부 데이터를 모델에 인식시키기 - 너가 학습한 데이터 말고, 내가 제공하는 데이터를 써라.
- 타 시스템과의 상호작용하는 애플리케이션 개발
컴포넌트
얘네 특징: 문서 보기가 힘들다. 업데이트 속도도 빠른 편이고..
크게 두 가지로 나뉨.
- Component: LangChain 구성 모듈을 설명함.
- 모듈 활용한 usecase 소개
- 사용사례.
확장성이 아주 뛰어남.
Scheme
LangChain에서 사용할 수 있는 기본적인 타입과 스키마.
- Text: 언어모델의 기본 인터페이스가 텍스트이므로
- ChatMessage: chatGPT와 동일
- SystemChatMessage: ai 시스템에게 지시하는 사항
- HumanChatMessage: 사용자에게 입력받는 정보
- AiChatMessage: ai 시스템의 출력 메시지
- Example: 샘플. input / output을 한 쌍으로 묶은 것.
- train / assessment에 사용 가능. fine tuning이라던가
- Document: 비구조화된 데이터 조각.
- page_component: 데이터 내용
- metadata
Model
LLMs (대규모 언어모델) - OpenAI도 이 중 하나. 언어모델도 선택지가 여러 개 있음.
- 보통 input / output 둘 다 문자열
ChatModel
- input은 채팅 메시지 목록 (과거의 대화내역도 전부 전달하는 식)
- output은 ai가 응답한 메시지
Text Embedding Model
- 텍스트 넣어서 임베딩 결과만 출력하는 것.
- 임베딩을 어떻게 하느냐도 성능 차이를 발생시킨다. 어떤 임베딩을 쓰느냐에 따라 모델도 달라진다.
- 문장 간 유사도라거나...
Prompt
모델에 원하는 명령어를 입력하는 방법.
- 기존 방법은 '프로그래밍'이었다면, 자연어를 입력할 수 있음.
- 모델을 똑바로 이해하려면 프로그래밍 + 프롬프트 둘 다 봐야 함..
- PromptValue: 자연어로 된 프롬프트 입력값
- PromptTemplate: PromptValue의 공통부분을 묶어서 프로그래밍에 쓰기 위한 객체.
- ExampleSelector: 프롬프트에 예시문도 포함한 것
- OutputParser: 단순 plain text return이 아니라 structured data를 얻고 싶을 때 사용. 서비스에서는 중요할 것 같음.
- 어떤 형식으로 출력시킬 것인지
- 출력 format 설정 / 재시도 로직 등.
Index
- 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
- Chain: 여러 컴포넌트를 감싸는 Wrapper 클래스.
- LLMChain: 체인 컴포넌트 중 가장 일반적인 유형
- 보통 LLMModel / ChatbotModel 둘 중 하나를 골라 씀
- 사용할 언어모델, PromptTemplate, 출력 parser 세 개를 묶어서 Chain으로 씀.
- 입력값 받아서 PromptTemplate 구성
- 모델에 전달
- 출력결과를 outputParser로 파싱한 후 사용자에게 전달
- Index-Related Chain: index로 저장한 고유 데이터와 LLM 결합
- 문서에서 질문 찾아서 답변할 경우 씀.
- Prompt Selector: 모델이나 서비스에 맞는 prompt를 자동으로 지정할 수 있게 해줌.
Index-Related Chain 부가설명
- Stuffing : index에서 확인한 관련 데이터를 전부 모델에 지문으로 넣어서 전달
- MapReduce
- Refine
- Map-Rerank: 응답한 답변 가지고 다시 Rank -> 가장 우선순위 높은 답변을 반환함.
보통 병렬처리할 때 쓰는 용어들.
Memory
대화 과정에서 데이터를 저장하고 검색하는 것
- 모델이 응답한 결과만 저장하거나
- 모든 대화내역을 토대로 상태를 업데이트하거나.
단기: 단일 대화의 맥락을 위해 데이터를 전달함
장기: 대화 사이에 특정 정보를 가져오고 업데이트하는 것
ChatMessageHistory
- 대화 목록 전체를 다 넣을 수는 없을 때, 지난 대화를 vector DB에 넣은 뒤 유사도 높은 것만 query해서 쓴다던지...
Agent
사용자 입력값에 따라 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 에서 확인할 수 있다.
내가 따라해본 예시