생성형 ai 22

LLM 애플리케이션 아키텍처 (1/2)

LLM 애플리케이션 아키텍처 (1/2) 조대협 (http://bcho.tistory.com) ChatGPT나, Gemini 모델과 같은 LLM 을 이용한 애플리케이션을 개발하는 형태를 보면, 보통 LLM에 프롬프트 엔지니어링을 사용한 프롬프트를 입력으로 사용하고, 리턴을 받아서 사용한다. 그리고 약간 발전된 형태의 경우에는 파인 튜닝을 사용하거나, 아주 발전된 형태는 외부 문서 저장소를 사용하는 형태 정도의 수준으로 개발한다. 즉 LLM을 한번 정도 호출하는 정도의 구조를 가지고 있다. 그러나 운영환경에 올라가는 LLM 기반의 애플리케이션의 구조는 이것보다 훨씬 복잡하다. 아래 그림은 LLM 애플리케이션의 아키텍처 예시이다. 단순하게 프롬프트를 작성해서 LLM을 한번만 호출하는 것이 아니라, 여러 예제를..

#20. ChatGPT에서 대화 히스토리 유지하기

조대협 (http://bcho.tistory.com) 노트 : 이글은 LLM 개발 프레임웍 Langchain의 일부 글입니다. 연재 글은 https://bcho.tistory.com/category/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%83%80%20%26%20%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D/%EC%83%9D%EC%84%B1%ED%98%95%20AI%20%28ChatGPT%20etc%29 를 참고하세요. LLM 기반의 챗봇 에서는 질문에 대한 답변을 기존의 대화의 내용이나 컨텍스트(문맥)을 참고하는 경우가 많다. 예를 들어, “서울에서 유명한 여행지는 어디야?” 라는 질문 후에, “그 근처에 맛있는 식당이 어디있어?” 라고 질문을 하면 챗봇은 서울의 유..

카테고리 없음 2024.02.21

#19 ChatGPT에서 질문과 관련된 웹페이지 크롤링하기

조대협 (http://bcho.tistory.com) Langchain 에서 Agent가 사용하는 Tool을 사용자가 쉽게 개발해서 추가할 수 있다. 이번 예제에서는 DuckDuckSearch Tool을 이용하여, 질문에 관련된 웹사이트를 검색한후, 그 중 한 웹사이트의 내용을 크롤링해서 웹페이지 내용을 읽어온후에, 이를 요약하는 예제를 만들어 본다. 이를 위해서 웹페이지를 크롤링하는 툴을 BeautifulSoup 을 이용해서 만들어 본다. 커스텀 툴을 정의하는 방법은 몇가지가 있는데, 이 예제에서는 데코레이터를 사용하는 방법과 StructuredTool을 사용하는 방법 두가지를 살펴보자. 먼저 decorator를 사용하는 방법이다. HEADERS = { 'User-Agent': 'Mozilla/5.0 ..

#18.LangSmith를 이용한 Langchain agent 내부 동작 구조 이해

앞의 예제는 agent를 생성할때 initialize_agent를 사용하는 방식으로 Langchain 0.1.0 까지는 지원하지만 deplicate 될 예정이고 새 버전의 create_react_agent 함수를 사용하기를 권장하고 있다. create_react_agent를 사용하려면 직접 agentExecutor도 선언해야 하고, 프롬프트도 정의해야하기 때문에 기존 방식에 비해서 다소 번거롭지만 좀 더 많은 컨트롤을 할 수 있다. 이번에는 create_react_agent를 이용하는 방식을 설명하면서 내부적으로 agent가 어떻게 동작하는지를 자세하게 살펴보고, 더불어서 langsmith 모니터링 툴을 이용하여, agent에서 내부의 동작을 어떻게 모니터링하고 추적하는지에 대해서 알아보록 한다. Lan..

Langchain을 이용한 LLM 애플리케이션 구현 - #15 자연어로 SQL 쿼리하기

자연어로 SQL 생성하기 조대협 (http://bcho.tistory.com) 지금까지 살펴본 Chain 은 모두 LLMChain으로, 입력값을 프롬프트에 삽입하여 모델에 입력해서 결과를 리턴하는 형태였다. Chain 기능을 통해서 연결될 수 있는 체인은 LLMChain 뿐만 아니라 단순하게 출력값을 포맷팅 하는 체인이나, 아니면 문서 파일을 읽어드리는 체인등 여러가지 용도의 체인이 있을 수 있다. 또한 필요하다면 개발자가 직접 체인을 만들어서 사용할 수 도 있다. 이러한 체인들을 유틸리티 체인이라고 한다. 유틸리티 체인중에서 대표적인 체인인 create_sql_query_chain을 알아보자. 이 체인은 데이터베이스의 스키마를 기반으로 입력된 질문을 SQL로 변환해주는 역할을 한다. 이 예제는 미국의 ..

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 애플리케이션 개발 #10- 벡터 DB 검색하기

벡터데이터 베이스 검색하기 조대협 (http://bcho.tistory.com) 앞의 포스트에서 pinecone 벡터데이터베이스에 임베딩된 chunk를 저장하였으면, 이제 이 chunk를 검색하는 방법을 살펴보자. 아래 예제는 langchain을 이용하지 않고, pinecone의 search API를 직접 사용해서 검색하는 방법이다. import pinecone import openai import os from langchain.embeddings.openai import OpenAIEmbeddings #Connect database pinecone.init(api_key="{YOUR_PINECONE_APIKEY}", environment="gcp-starter") vectordb = pinecone...

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

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