rag 11

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. 텍스트 임베..

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 #6 임베딩을 위한 효과적 문장 분리 방법

임베딩을 위한 효과적 문장 분리 방법 조대협(http://bcho.tistory.com) 임베딩에서 알고리즘도 중요하지만 가장 중요한 것중 하나는 어떻게 문서를 파편으로 잘라낼것인가? (이를 영어로 Chunking이라고 한다.) 이다. 임베딩은 텍스트를 고정된 크기의 벡터로 변경하는 것이기 때문에, 긴 문단을 작은 벡터로 임베딩하게 되면 디테일한 의미를 잃어버릴 수 있고, 반대로 작은 문장으로 임베딩을 하면, 검색시 문장에 대한 정확도는 올라가겠지만, 문장이 짧아서 문장 자체가 가지고 있는 정보가 부족하게 된다. 그래서 적절한 Chunk 사이즈를 찾아내는 방법이 중요한데, 이를 Chunking strategy (문서 파편화 전략)이라고 한다. 이 글에서는 몇가지 대표적인 Chunking 방식과, 같이 활..

ChatGPT에 텍스트 검색을 통합하는 RAG와 벡터 데이터 베이스 Pinecone #5 ChatGPT에서 Pinecone 에 저장된 문서를 기반으로 답변하기

ChatGPT에서 Pinecone 에 저장된 문서를 기반으로 답변하기 조대협 (http://bcho.tistory.com) 지난 글에서 간단한 Pinecone의 사용방법에 대해서 알아보았다. 이번글에서는 텍스트를 임베딩하여 Pinecone에 저장하고, 이를 검색하는 방법에 대해서 소개한다. import pinecone import os import openai # Set your OpenAI API key openai.api_key = "{your API Key}" input_directory = "./golf_rule_paragraph" def extract_info_from_file(file_path): with open(file_path, 'r', encoding='utf-8') as file: #..

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

OpenAI Embedding 모델을 이용하여 텍스트 임베딩 하기 조대협 (http://bcho.tistory.com) 앞의 글에서 Pinecone 데이터베이스를 이용하여 벡터 데이터를 어떻게 저장하는지 알아보았다. 그러면 텍스트나 이미지와 같은 데이터를 어떻게 벡터데이터로 변환하는 지를 알아보도록 하겠다. 이렇게 원본 데이터를 벡터로 변환하는 과정을 임베딩이라고 한다. 임베딩의 개념과 임베딩된 데이터에 대한 검색 방법은 https://bcho.tistory.com/1400 글을 참고하기 바란다. 데이터를 임베딩하는 방법은 간단하게 API를 사용하면 되는데, OpenAI의 경우 다양한 임베딩 API 를 제공한다. 1 세대 모델은 다음과 같다. 요즘은 “text-embedding-ada-002” 모델을 주..

ChatGPT에 텍스트 검색을 통합하는 RAG와 벡터 데이터 베이스 Pinecone #3 Pinecone 둘러보기

ChatGPT에 텍스트 검색을 통합하는 RAG와 벡터 데이터 베이스 Pinecone #3 Pinecone 둘러보기 조대협 (http://bcho.tistory.com) Pinecone은 클라우드 매니지드 벡터 데이터 베이스로 구글,Azure,AWS 클라우드를 모두 지원한다. 여러가지 인스턴스 타입이 있으며, 최대 4천만 벡터까지 저장이 가능하다. 개발/테스트를 위한 프리티어가 있고 API키만 발급 받으면 손쉽게 사용할 수 있기 때문에, Langchain, ChatGPT와 함께 많이 사용되고 있다. 오늘은 Pinecone을 사용하는 방법에 대해서 알아보도록 한다. 먼저 pinecone.io 사이트에 접속해서 우측 상단의 Sign up 메뉴를 이용하여 회원 가입을 한후에, 사이트에 로그인한다. 로그인 후에 ..