LLM 21

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 #5- 캐싱을 이용한 API 비용 절감

Langchain 캐싱을 이용한 비용 절감 조대협 (http://bcho.tistory.com) LLM 애플리케이션을 개발하다보면 개발이나 테스트 단계에서 동일한 프롬프트로 반복해서 호출해야 하는 경우가 생긴다. 코딩을 하다가 에러가 나거나 아니면 테스트 결과를 보거나 할때는 동일 프롬프트로 동일 모델을 계속 호출하는데, 결과값은 거의 비슷하기 때문에, 계속해서 같은 질문을 호출하는 것은 비용이 낭비 된다. 같은 프롬프트라면 결과 값을 캐슁해놓고 개발에 사용해도 큰문제가 없다. Langchain에서는 동일(또는 유사) 프롬프트에 대해서 결과를 캐슁하여 API 호출을 줄일 수 있는 기능을 제공한다. 메모리 캐싱 캐싱을 저장하는 장소에 따라서 여러가지 캐싱 모델을 지원하는데, 가장 간단한 캐싱 모델은 로컬 ..

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와 같은 고급 추상화 ..

ChatGPT에 텍스트 검색을 통합하는 RAG와 벡터 데이터 베이스 Pinecone #8 임베딩 API 비교

임베딩 API 비교 및 선택 조대협 (http://bcho.tistory.com) 이 글에서는 접근이 쉽고 많이 사용되는 open ai의 임베딩 모델을 사용했지만, 여러 임베딩 모델들이 있고, 임베딩 모델 마다 성능이 다르며 임베딩의 목적또한 다르다. RAG 를 소개하는 글이기 때문에, 문서 검색 (Document Retrieval) 기능이 주요 유스 케이스이지만, 임베딩은 분류(Classification), 클러스터링(Clustering) 등 다양한 시나리오로 사용이 가능하다. 구글의 Vertex.AI 임베딩 모델의 경우, 임베딩의 목적에 따라서 임베딩 타입을 지정하게 할 수 있다. 출처 : https://cloud.google.com/vertex-ai/docs/generative-ai/embeddin..

ChatGPT에 텍스트 검색을 통합하는 RAG와 벡터 데이터 베이스 Pinecone #7 RAG 쿼리한 정보로 LLM에 질의하기

RAG 쿼리한 정보로 LLM에 질의하는 프롬프트 조대협(http://bcho.tistory.com) RAG 구조를 이용해서 원하는 정보를 저장하고, 검색했으면 이를 LLM에 전달해서 답변을 생성하게 해야 한다. LLM에 컨텍스트 정보를 전달하기 위해서는 프롬프트를 사용하는데, 이때 LLM이 컨텍스트 정보 이외의 정보, 예를 들어 LLM 자체가 알고 있는 정보를 이용해서 유추한 답변을 만들어 낼 수 있기 때문에, 이를 방지하기 위한 프롬프팅이 필요하다. 아래는 RAG에서 추출한 정보를 기반으로 질의를 하는 프롬프트 예제이다. You are an intelligent assistant helping the users with their questions on {{company | research papers..

ChatGPT에 텍스트 검색을 통합하는 RAG와 벡터 데이터 베이스 Pinecone #1

ChatGPT에 텍스트 검색을 통합하는 RAG와 벡터 데이터 베이스 Pinecone #1 조대협 (http://bcho.tistory.com) RAG의 개념 Open AI의 ChatGPT나 Google의 PaLM 모델, 메타의 LLama 모델과 같은 LLM 모델은 학습 당시에 지식을 저장하여 뉴럴 네트워크 상에 그 지식을 담고 있다. 그래서 학습 당시까지의 지식을 기반으로한 질문에 대해서는 답변을할 수 있지만, 학습이 되지 않은 데이터나 또는 그 이후 나온 데이터에 대해서는 답변을 할 수 없는 제약을 가지고 있다. 또한 잘못된 정보를 학습하여, 잘못된 답을 내놓는 경우가 있을 수 있는데, 이를 Hallucination (환상)효과라고 한다. 이러한 두 문제를 해결하려면 최신의 데이터와 질문에 대한 답을 ..

생성형 AI ChatGPT/Bard LLM에서 프롬프팅을 이용한 공격/방어 방법

LLM 프롬프트 공격 방법 조대협(http://bcho.tistory.com) 일반적으로 LLM을 이용해서 애플리케이션을 개발할때 Lang Chain과 같은 프레임웍을 사용한 후에, 프롬프트 템플릿을 사용하여 제약이나 LLM의 역할등을 정의하고, 그 다음에 사용자에게 입력 받은 프롬프트를 삽입하여 전체 프롬프트를 만들어 낸다. 아래와 같은 구조가 되는데, {llm role}{llm mission} {context} {user prompt} {constraint} 예를 들면 다음과 같은 쇼핑몰 도움이 챗봇이라고 할때 다음과 같은 구조가 될 수 있다고 하자. {너는 쇼핑몰 상품 추천 쳇봇이다.} {너의 목표는 사용자의 입력을 받아서, 적절한 상품을 추천해주는 것이다.} : 여기서 LLM 모델은 쇼핑몰 쳇봇으..