벡터 데이터베이스
* 벡터 데이터베이스(Vector Database)는 데이터를 수치화한 벡터 형태로 저장하고, 유사한 벡터를 빠르게 검색할 수 있도록 설계된 데이터베이스입니다.
* 주로 문서, 이미지, 음성, 동영상 등의 비정형 데이터를 임베딩(embedding) 기법을 사용해 벡터로 변환한 후 저장하며, 최근접 이웃 검색(Nearest Neighbor Search, NNS) 알고리즘을 통해 입력된 벡터와 가장 유사한 벡터를 효율적으로 찾습니다.
* 대표적인 벡터 데이터베이스로는 FAISS, Milvus, Pinecone, Weaviate 등이 있으며, RAG(Retrieval-Augmented Generation) 시스템에서 검색 성능을 높이기 위해 자주 사용됩니다.
2. 벡터 데이터베이스 검색
* 벡터 데이터베이스에서 검색을 수행할 때, 일반적으로 유사도 검색(Similarity Search)과 MMR(Maximal Marginal Relevance) 검색 두 가지 방식이 사용됩니다.
* 두 방법 모두 RAG(Retrieval-Augmented Generation) 시스템에서 중요한 역할을 합니다.
파이스 유사도 검색
* FAISS(Facebook AI Similarity Search)는 Meta(에서 개발한 오픈소스 벡터 검색 라이브러리로, 대규모 벡터 데이터를 효율적으로 검색할 수 있도록 설계되었습니다.
* 특히 유클리드 거리(Euclidean Distance)와 코사인 유사도(Cosine Similarity) 기반의 최근접 이웃 검색(Nearest Neighbor Search, NNS)을 최적화하여 빠른 검색 속도를 제공합니다.
* FAISS는 GPU 가속을 지원하며, 수십억 개의 벡터에 대해 고속 검색이 가능하므로, 이미지 검색, 추천 시스템, RAG(Retrieval-Augmented Generation) 등 다양한 AI 애플리케이션에서 널리 사용됩니다.
* 또한, IVF(Inverted File Index), HNSW(Hierarchical Navigable Small World) 등 다양한 인덱싱 기법을 제공하여 메모리 사용량을 줄이고 검색 속도를 더욱 향상시킬 수 있습니다.
예시 1)
# langchain-community 패키지 설치
!pip install langchain-community
예시 2)
# 필요한 패키지들 import 해줌
# 긴 텍스트를 다루기 쉽게 일정 길이로 자르는 기능을 제공
from langchain.text_splitter import CharacterTextSplitter
# 텍스트를 벡터 형태로 변환하여 의미를 파악할 수 있게 도와줌
from langchain.embeddings.openai import OpenAIEmbeddings
# 생성된 임베딩 벡터들을 효율적으로 저장하고 검색할 수 있는 기능을 제공
from langchain.vectorstores import FAISS
# 질문에 대한 답변을 생성하기 위해 텍스트 자료를 처리하고 연결하는 역할
from langchain.chains.question_answering import load_qa_chain
# OpenAI의 LLM(대형 언어 모델)을 활용하여 다양한 텍스트 작업을 수행
from langchain.llms import OpenAI
# OpenAI API 호출 시, 호출 비용이나 토큰 사용량 등을 모니터링할 수 있는 콜백 함수를 제공
from langchain.callbacks import get_openai_callback
# IPython 환경에서 JSON 데이터를 보기 좋게 출력하기 위한 도구
from IPython.display import JSON
예제 3)
# 문장을 생성해줌
text = """생성형 인공지능 또는 생성형 AI는 프롬프트에 대응하여 텍스트, 이미지, 기타 미디어를 생성할 수 있는 일종의 인공지능 시스템이다.
단순히 기존 데이터를 분석하는 것이 아닌, 새로운 콘텐츠를 만드는 데 초점을 맞춘 인공지능 분야를 말한다. 2022년경부터 본격적으로 유명해지기 시작했다.
데이터 원본을 통한 학습으로 소설, 이미지, 비디오, 코딩, 음악, 미술 등 다양한 콘텐츠 생성에 이용된다. 한국에서는 2022년 Novel AI 등, 그림 인공지능의 등장으로 주목도가 높아졌으며, 해외에서는 미드저니, 챗GPT등 여러 모델을 잇달아 공개하면서 화제의 중심이 되었다.
보통 딥러닝 인공지능은 학습 혹은 결과 출력 전 원본 자료를 배열 자료형[2] 숫자 데이터로 변환하는 인코딩 과정이 중요한데, 생성 AI의 경우 인공지능의 출력 데이터를 역으로 그림, 글 등의 원하는 형태로 변환시켜주는 디코딩 과정 또한 필요하다.
사실상 인공지능의 대중화를 이끈 기술로써, 해당 기술이 인공지능에 대한 사람들의 전반적인 인식을 매우 크게 바꿔놨다고 해도 과언이 아니다.
"""
예제 4)
# CharacterTextSplitter을 사용하여 텍스트를 청킹(작은 조각들)하는 설정
# 이 도구는 긴 텍스트를 manageable한 크기로 나누어 후속 작업을 쉽게 할 수 있게 도와줌
splitter = CharacterTextSplitter(
separator='\n', # 텍스트를 분할할 때 줄바꿈('\n')을 기준으로 나눔
chunk_size=300, # 각 청크의 최대 길이를 300자로 설정
chunk_overlap=50, # 청크 간에 50자의 중복을 허용하여 문맥의 연속성을 유지
length_function=len # 텍스트 길이 측정 시 파이썬의 내장 함수인 len을 사용
)
예제 5)
# 주어진 텍스트(text 변수에 저장된 문자열)를 미리 정의한 splitter를 이용해 청킹
# 즉, 텍스트를 설정한 기준(줄바꿈, 청크 크기, 청크 간 중복 등)에 따라 작은 조각들로 나눔
chunks = splitter.split_text(text)
print(chunks)
예제 6)
# 자신의 api key를 붙혀줌
api_key='sk-자신의 api키'
예제 7)
# faiss-cpu 와 tiktoken 패키지 설치
!pip install faiss-cpu
!pip install tiktoken
OpenAI Embedding Model
* OpenAI Embedding Model은 텍스트 데이터를 고차원 벡터로 변환하는 임베딩(Embedding) 모델로, 주어진 문장이나 단어의 의미적 유사성을 벡터 공간에서 표현할 수 있도록 합니다.
* OpenAI의 임베딩 모델은 주로 코사인 유사도(Cosine Similarity)나 유클리드 거리(Euclidean Distance)를 활용하여 텍스트 간 유사도를 측정하며, 검색, 추천 시스템, 문서 클러스터링, RAG(Retrieval-Augmented Generation) 등의 AI 애플리케이션에서 사용됩니다.
* 대표적인 모델로는 text-embedding-ada-002가 있으며, 이는 성능과 비용 효율성이 뛰어나 벡터 데이터베이스(Pinecone, Chroma, FAISS 등)와 함께 활용됩니다.
링크 주소 : https://platform.openai.com/docs/guides/embeddings
예제 1)
# 임베딩 모델
embeddings = OpenAIEmbeddings(model='text-embedding-ada-002', api_key=api_key)
# 텍스트 임베딩을 FAISS에 저장
knowledge_base = FAISS.from_texts(chunks, embeddings)
print(knowledge_base)
-->
<langchain_community.vectorstores.faiss.FAISS object at 0x7e362b5675d0>
예제 2)
# '생성형 AI란?'이라는 질문을 question 변수에 저장
question = '생성형 AI란?'
# knowledge_base(지식 데이터베이스)에서 질문과 관련된 문서를 유사도 검색 방식으로 찾음
# 이때, 벡터 임베딩을 활용해 질문과 문서들 간의 유사도를 계산하여 가장 관련성이 높은 문서들을 반환
references = knowledge_base.similarity_search(question)
# 검색된 문서들을 출력
references
--->
[Document(id='a000ebff-9f80-421d-8c55-e04da081b3b4', metadata={}, page_content='생성형 인공지능 또는 생성형 AI는 프롬프트에 대응하여 텍스트, 이미지, 기타 미디어를 생성할 수 있는 일종의 인공지능 시스템이다.\n단순히 기존 데이터를 분석하는 것이 아닌, 새로운 콘텐츠를 만드는 데 초점을 맞춘 인공지능 분야를 말한다. 2022년경부터 본격적으로 유명해지기 시작했다.'),
Document(id='f9eefee7-33f5-47e2-a1fc-ddb81732d3fa', metadata={}, page_content='데이터 원본을 통한 학습으로 소설, 이미지, 비디오, 코딩, 음악, 미술 등 다양한 콘텐츠 생성에 이용된다. 한국에서는 2022년 Novel AI 등, 그림 인공지능의 등장으로 주목도가 높아졌으며, 해외에서는 미드저니, 챗GPT등 여러 모델을 잇달아 공개하면서 화제의 중심이 되었다.\n보통 딥러닝 인공지능은 학습 혹은 결과 출력 전 원본 자료를 배열 자료형[2] 숫자 데이터로 변환하는 인코딩 과정이 중요한데, 생성 AI의 경우 인공지능의 출력 데이터를 역으로 그림, 글 등의 원하는 형태로 변환시켜주는 디코딩 과정 또한 필요하다.'),
Document(id='3e157378-50f7-4d0b-80c9-1f9370960f09', metadata={}, page_content='사실상 인공지능의 대중화를 이끈 기술로써, 해당 기술이 인공지능에 대한 사람들의 전반적인 인식을 매우 크게 바꿔놨다고 해도 과언이 아니다.')]
예제 3)
from langchain.chat_models import ChatOpenAI
# ChatOpenAI 클래스를 사용하여 OpenAI의 대화형 모델(gpt-3.5-turbo)을 초기화
# api_key는 OpenAI API 인증 키로, 이를 통해 API 사용 권한을 확인
llm = ChatOpenAI(model_name='gpt-3.5-turbo', api_key=api_key)
# load_qa_chain 함수를 사용해 질문-응답 체인을 생성
# chain_type='stuff'는 검색된 모든 문서들을 한 번에 모델에 입력하여 처리하는 방식을 의미
chain = load_qa_chain(llm, chain_type='stuff')
# get_openai_callback()를 사용하여 API 호출 시 사용되는 토큰 수나 비용 등의 정보를 모니터링
with get_openai_callback() as cb:
# 생성된 체인을 실행
# input_documents에는 유사도 검색을 통해 가져온 문서들(references)을 입력
# question에는 사용자가 정의한 질문(여기서는 '생성형 AI란?')을 입력
response = chain.run(input_documents=references, question=question)
print(cb)
--->
<ipython-input-15-b4aeea865359>:3: LangChainDeprecationWarning: The class `ChatOpenAI` was deprecated in LangChain 0.0.10 and will be removed in 1.0. An updated version of the class exists in the :class:`~langchain-openai package and should be used instead. To use it run `pip install -U :class:`~langchain-openai` and import as `from :class:`~langchain_openai import ChatOpenAI``.
llm = ChatOpenAI(model_name='gpt-3.5-turbo', api_key=api_key)
<ipython-input-15-b4aeea865359>:4: LangChainDeprecationWarning: This class is deprecated. See the following migration guides for replacements based on `chain_type`:
stuff: https://python.langchain.com/docs/versions/migrating_chains/stuff_docs_chain
map_reduce: https://python.langchain.com/docs/versions/migrating_chains/map_reduce_chain
refine: https://python.langchain.com/docs/versions/migrating_chains/refine_chain
map_rerank: https://python.langchain.com/docs/versions/migrating_chains/map_rerank_docs_chain
See also guides on retrieval and question-answering here: https://python.langchain.com/docs/how_to/#qa-with-rag
chain = load_qa_chain(llm, chain_type='stuff')
<ipython-input-15-b4aeea865359>:6: LangChainDeprecationWarning: The method `Chain.run` was deprecated in langchain 0.1.0 and will be removed in 1.0. Use :meth:`~invoke` instead.
response = chain.run(input_documents=references,
Tokens Used: 782
Prompt Tokens: 559
Prompt Tokens Cached: 0
Completion Tokens: 223
Reasoning Tokens: 0
Successful Requests: 1
Total Cost (USD): $0.0012845
예제 4)
# 응답 출력
print(response)
--->
생성형 AI는 프롬프트에 대응하여 텍스트, 이미지, 기타 미디어를 생성할 수 있는 인공지능 시스템으로, 새로운 콘텐츠를 만드는 데 초점을 맞춘 인공지능 분야를 말합니다. 이 기술은 데이터 원본을 통한 학습으로 소설, 이미지, 비디오, 코딩, 음악, 미술 등 다양한 콘텐츠를 생성하는 데 사용됩니다.생성 AI는 인코딩과 디코딩 과정을 거쳐 출력 데이터를 변환시켜주는데, 2022년경부터 본격적으로 유명해지기 시작했습니다.
2-2. 크로마 유사도 검색
* 크로마(Chroma)는 빠르고 가벼운 오픈소스 벡터 데이터베이스로, LLM 기반 애플리케이션에서 검색 및 유사도 기반 검색을 쉽게 구현할 수 있도록 설계되었습니다.
* Python 기반으로 사용이 간편하며, 데이터 저장 및 검색을 위해 코사인 유사도, 유클리드 거리, 내적(Dot Product) 등의 거리 측정 방식을 지원합니다.
* Chroma는 LangChain, OpenAI API 등과의 연동이 용이하여 RAG(Retrieval-Augmented Generation) 시스템 구축에 자주 사용되며, 로컬 및 클라우드 환경에서 간편하게 실행할 수 있는 것이 장점입니다.
* 또한, in-memory 및 persistent 저장 방식을 지원하여 성능과 데이터 지속성을 유연하게 조절할 수 있습니다.
예시 1)
# pdf 패키지 설치
!pip install pypdf
예시 2)
from langchain.document_loaders import PyPDFLoader # PDF 파일을 로드
# 각 PDF 파일에 대해 로더 객체를 생성합니다.
loaders = [
PyPDFLoader("스마트농업_육성사업_추진현황과_개선과제.pdf"),
PyPDFLoader("차세대 한국형 스마트팜 개발.pdf")
]
# 로드된 문서들을 저장할 빈 리스트를 생성
docs = [ ]
# 각 로더를 순회하면서 해당 PDF 파일의 내용을 로드
# loader.load()는 PDF 파일의 텍스트 내용을 추출하여 리스트 형태로 반환
# 반환된 문서 리스트를 docs 리스트에 추가
for loader in loaders:
docs.extend(loader.load())
예시 3)
# docs 리스트의 처음 5개 문서를 슬라이싱하여 확인
docs[:5]
-->
[Document(metadata={'producer': 'DBPortal Corp. TangoPDFBatch.128', 'creator': 'PScript5.dll Version 5.2.2', 'creationdate': '2022-06-13T17:06:21+09:00', 'moddate': '2022-07-04T15:47:11+09:00', 'title': '', 'source': '스마트농업_육성사업_추진현황과_개선과제.pdf', 'total_pages': 142, 'page': 0, 'page_label': '1'}, page_content='스마트농업 육성사업 추진현황과 개선과제\n2\n0\n2\n2\n·\n6\n·\n1\n5\n2022. 6. 15.\n스마트농업 육성사업 \n추진현황과 개선과제\n국회예산정책처┃사업평가\nAnalysis on the status and \nfuture development of \nSmart Farming projects\n변재연'),
Document(metadata={'producer': 'DBPortal Corp. TangoPDFBatch.128', 'creator': 'PScript5.dll Version 5.2.2', 'creationdate': '2022-06-13T17:06:21+09:00', 'moddate': '2022-07-04T15:47:11+09:00', 'title': '', 'source': '스마트농업_육성사업_추진현황과_개선과제.pdf', 'total_pages': 142, 'page': 1, 'page_label': '2'}, page_content='스마트농업 육성사업\n추진현황과 개선과제'),
Document(metadata={'producer': 'DBPortal Corp. TangoPDFBatch.128', 'creator': 'PScript5.dll Version 5.2.2', 'creationdate': '2022-06-13T17:06:21+09:00', 'moddate': '2022-07-04T15:47:11+09:00', 'title': '', 'source': '스마트농업_육성사업_추진현황과_개선과제.pdf', 'total_pages': 142, 'page': 2, 'page_label': '3'}, page_content='스마트농업 육성사업 추진현황과 개선과제\n총 괄I 송병철 예산분석실장\n기획 ․ 조정I 서세욱 사업평가심의관\n전용수 경제산업사업평가과장\n작 성I 변재연 경제산업사업평가과 예산분석관\n지 원I 김창민 경제산업사업평가과 자료분석지원요원\n이채원 경제산업사업평가과 행정실무원\n본 보고서는 「국회법」 제22조의2 및 「국회예산정책처법」 제3조에 따라 국회의원의\n의정활동을 지원하기 위하여 발간되었습니다.\n문의: 예산분석실 경제산업사업평가과 | 02) 6788-3777 | eie@nabo.go.kr\n이 책은 국회예산정책처 홈페이지(www.nabo.go.kr)를 통하여 보실 수 있습니다.\n“본 보고서는 담당 분석관의 연구 결과를 바탕으로 작성된 것으로 \n국회예산정책처의 공식의견과는 다를 수 있음을 알려드립니다.”'),
예시 4)
# RecursiveCharacterTextSplitter 클래스를 불러옵니다.
# 이 클래스는 텍스트를 재귀적으로 나누어, 문장이나 문단 단위 등 보다 논리적인 청킹을 가능하게 합니다.
# 즉, 단순히 일정 문자 수로 분할하는 대신, 텍스트의 구조를 고려하여 더 자연스러운 조각으로 나눌 수 있음
from langchain.text_splitter import RecursiveCharacterTextSplitter
예시 5)
# RecursiveCharacterTextSplitter를 사용하여 텍스트를 분할할 때 사용할 인스턴스를 생성
# chunk_size는 각 청크(분할된 텍스트 조각)의 최대 문자 수를 1500자로 지정
# chunk_overlap은 인접한 청크 사이에 150자의 중복을 허용하여 문맥이 자연스럽게 이어지도록 함
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1500,
chunk_overlap=150
)
예시 6)
# 텍스트 스플리터(text_splitter)를 이용하여, 로드된 문서들(docs)을 분할
# split_documents 함수는 각 문서를 미리 정의한 청크 크기와 오버랩 설정에 따라 여러 조각으로 나눔
splits = text_splitter.split_documents(docs)
print(splits)
--->
[Document(metadata={'producer': 'DBPortal Corp. TangoPDFBatch.128', 'creator': 'PScript5.dll Version 5.2.2', 'creationdate': '2022-06-13T17:06:21+09:00', 'moddate': '2022-07-04T15:47:11+09:00', 'title': '', 'source': '스마트농업_육성사업_추진현황과_개선과제.pdf', 'total_pages': 142, 'page': 0, 'page_label': '1'}, page_content='스마트농업 육성사업 추진현황과 개선과제\n2\n0\n2\n2\n·\n6\n·\n1\n5\n2022. 6. 15.\n스마트농업 육성사업 \n추진현황과 개선과제\n국회예산정책처┃사업평가\nAnalysis on the status and \nfuture development of \nSmart Farming projects\n변재연'), Documen
예시 7)
# Chroma는 벡터 데이터베이스를 제공하는 모듈로, 텍스트 임베딩 벡터를 저장하고 검색할 때 사용
from langchain.vectorstores import Chroma
# OpenAI의 임베딩 모델을 활용하기 위한 클래스
# 이 클래스를 사용하면 텍스트 데이터를 임베딩 벡터로 변환
from langchain.embeddings.openai import OpenAIEmbeddings
# OpenAI의 'text-embedding-ada-002' 모델을 이용해 임베딩을 생성할 인스턴스를 초기화
# api_key를 통해 OpenAI API에 인증
embedding = OpenAIEmbeddings(model='text-embedding-ada-002', openai_api_key=api_key)
예시 8)
# chromadb 패키지 설치
!pip install chromadb
예시 9)
# 크로마 벡터 영구 저장소 지정
persist_directory = './data/'
# 벡터 저장소
vectordb = Chroma.from_documents(
documents=splits,
embedding=embedding,
persist_directory=persist_directory
)
# 현재 저장된 벡터 개수를 출력
print(vectordb._collection.count()) # 청크 개수와 동일
-->
153
예시 10)
# 질문을 '한국형 스마트팜이란?'으로 정의
question = '한국형 스마트팜이란?'
# vectordb 벡터 데이터베이스에서 질문과 관련된 문서를 유사도 검색 방식으로 찾음
# k=3은 가장 유사도가 높은 상위 3개의 문서를 반환하라는 의미
docs = vectordb.similarity_search(question, k=3)
print(len(docs))
예시 11)
# docs 리스트의 첫 번째 문서에서 page_content 속성을 출력하여 문서의 내용을 확인
print(docs[0].page_content)
-->
차세대 한국형스마트팜 개발
국립농업과학원 농업공학부 스마트팜개발과 이현동 연구관
한국형 스마트팜 개발 프로젝트 !
우리나라 농업은 고령화와 높은 노동강도로 인해 청년인구의 유입이 어려운 구조로 타 분야보다 생산인구 절벽화가 더욱
가시화되고 있다. 이에 대한 대안으로 제시되고 있는 스마트팜은 사물인터넷, 빅데이터, 인공지능, 로봇 등을 활용하여
농산물의 생육환경을 최적상태로 관리하고 노동력 절감과 생산성 향상을 구현하는 효율적인 농업형태이다.
차세대 한국형 스마트팜 기술개발 프로젝트는 4기관 19개 전담부서가 협업하여 핵심 요소 및 원천 기반기술의 확보를 위해
연구 역량을 집중하고 있고 국내 농업여건에 적합하게 기술수준별로 스마트팜 모델을 3가지 단계로 구분하여 개발을
추진하고 있다. 단계별 스마트팜은 1세대(편리성 증진), 2세대(생산성 향상-네덜란드추격형), 3세대(글로벌산업화-플랜트
수출형)로 구분되고 기술의 단계적 개발과 실용화 계획을 통해 노동력과 농자재의 사용을 줄이고, 생산성과 품질을
제고함으로 농가소득과 연계하며, 나아가 영농현장의 애로와 연관 산업의 문제를 동시에 해결해 간다는 계획이다.
차세대 한국형 스마트팜 융복합 프로젝트
예시 12)
question = '필요한 ICT 기술은?'
docs = vectordb.similarity_search(question, k=5)
print(len(docs))
-->
5
예시 13)
print(docs[0])
-->
page_content='제어기 등 ICT 기기 산업을 활성화 시키는데 필수적이다.
ICT 핵심부품 및 기기 표준화
스마트온실 단체표준 제정
파이팅! 한국형 스마트팜
사회 전반에서 4차 산업 혁명에 대한 많은 관심을 가지고 사물인터넷, 빅데이터, 인공지능, 로봇 등을 활용하는 분야를
확장하고 있다. 농업분야에서도 스마트 기기를 농사에 효과적으로 접목할 수 있는 ICT분야 연구개발이 필요하다.
첨단화되는 스마트 기기와 다양한 실시간 정보를 활용해 편리성과 생산성을 높이는 스마트팜 연구개발은 국내농가의
소득증대뿐만 아니라 농업 생산기술과 시스템 수출의 길을 열고, 우리 농업기술의 국제경쟁력을 높이는 데에도 크게 기여할
것으로 기대 된다. 가까운 장래에 한국형 스마트 팜의 기반이 구축되고 우리 경제의 미래 성장 동력으로 자리매김 할 우리
농업의 모습을 기대해 본다.' me
예시 14)
# docs 리스트의 두 번째 문서에서 page_content 속성을 출력하여 해당 문서의 내용을 확인
print(docs[1].page_content)
--->
106∙
2. ICT 데이터 수집․ 활용 부문
스마트농업을 구현하기 위해서는 생산과 환경, 유통, 소비 전반에 이르는 데이
터 수집․ 활용이 필수적인 요소인데, 현재 데이터 수집․ 분석 비중이 높지 못하고 대
부분 생산 관련 데이터가 중심이 되고 있어 향후 적극적인 개선 노력이 필요하다.
그리고, 농가의 데이터 제공을 유도하고 농업 데이터 시장에서 농가 교섭력을
강화하기 위해 농업 데이터에 대한 권리․ 수집․ 접근․ 이용 등에 대한 기준을 마련할
필요가 있다. 농업 데이터의 가용성․ 접근성 향상 및 체계적인 관리 등을 위해 현재
기관별로 분산된 농업 데이터 플랫폼을 조속히 연계통합 운영할 필요가 있다.
3. 연구개발(R&D) 부문
스마트농업은 농업 밸류체인(생산과 유통, 소비) 전반에 첨단 ICT 기술이 접목
되어 자동화와 지능화를 구현하는 것이며, 이를 위해서는 단계별로 다양한 연구 및
기술개발이 필요하다.
2-3. MMR
* MMR(Maximal Marginal Relevance) 검색은 벡터 데이터베이스에서 검색된 결과의 유사성과 다양성을 균형 있게 조정하는 검색 기법입니다.
* 일반적인 유사도 검색은 가장 유사한 벡터만 반환하지만, MMR은 이미 선택된 결과와의 중복을 줄이면서도 쿼리와 관련성이 높은 항목을 선택하여 검색 결과의 다양성을 확보합니다.
* 이를 통해 RAG(Retrieval-Augmented Generation) 시스템에서 중복된 정보를 줄이고, 보다 풍부하고 균형 잡힌 문서를 검색할 수 있도록 돕습니다.
* MMR은 유사도와 중복 방지를 조절하는 λ(람다) 값을 사용하여 검색 결과의 다양성을 조정할 수 있으며, 특히 LLM 기반의 문서 검색 및 챗봇 응답 생성에 효과적으로 활용됩니다.
예시 1)
# text를 입력해줌
texts = [
"""ChatGPT 열풍으로 인해 생성형 AI에 대한 관심이 뜨겁다. 생성형 AI는 이용자의 특정 요구에 따라 결과를 능동적으로 생성해 내는 인공지능 기술이다.""",
"""특히, 생성형 AI는 대량의 데이터(Hyper-scale Data)를 학습하여 인간의 영역이라고 할 수 있는 창작의 영역까지 넘보고 있다.""",
"""베타 버전 출시2개월 만에 MAU(월간 활성 이용자 수)가 무려 1억 명을 넘어섰다. 또한 구글, 메타 등 글로벌 빅테크 기업들이 앞다투어 천문학적인 규모의 투자와 유사 서비스 출시 계획을발표하고 있다.""",
"""이 서비스의 핵심은 서비스 이용자의 질문을 이해하고 분석하여 수많은 정보 중 답이 될 만한 필요정보를 스스로 찾아서 이를 적절히 요약과 정리해 제공하는 것이다 """,
"""특히 앞서 질문한 내용의 맥락을 잇거나 구체적인 사례를 들어 질문할수록 더 정확한 답을 얻을 수 있는데, 이는 마치 사람과 대화하는 것처럼 맥락을 이해하여 답을 제공한다는 점에서 이전과 차원이 다른 정보 검색 서비스를 체감하게 한다."""
]
예시 2)
# Chroma는 텍스트 임베딩 벡터를 저장하고 검색할 수 있는 벡터 데이터베이스를 제공하는 모듈
from langchain.vectorstores import Chroma
# OpenAI 임베딩 모델을 활용하여 텍스트를 벡터 형태로 변환할 수 있는 클래스를 불러옴
from langchain.embeddings.openai import OpenAIEmbeddings
# 'text-embedding-ada-002' 모델을 사용해 텍스트를 임베딩 벡터로 변환할 인스턴스를 생성
# 여기서 openai_api_key 변수는 OpenAI API 사용을 위한 인증 키
embedding = OpenAIEmbeddings(model="text-embedding-ada-002", openai_api_key=api_key)
예시 3)
smalldb = Chroma.from_texts(texts, embedding=embedding)
question = "생성형 AI에 대해 언급된 내용은?"
예시 4)
# fetch_k=3: 먼저 3개의 유사한 문서를 검색
# k=2 : 서로 다른 정보를 담은 가장 유사한 문서 2개 검색
smalldb.max_marginal_relevance_search(question, k=2, fetch_k=3)
-->
[Document(metadata={}, page_content='특히, 생성형 AI는 대량의 데이터(Hyper-scale Data)를 학습하여 인간의 영역이라고 할 수 있는 창작의 영역까지 넘보고 있다.'),
Document(metadata={}, page_content='ChatGPT 열풍으로 인해 생성형 AI에 대한 관심이 뜨겁다. 생성형 AI는 이용자의 특정 요구에 따라 결과를 능동적으로 생성해 내는 인공지능 기술이다.')]
'자연어 처리 > 자연어 처리' 카테고리의 다른 글
15. RAG기반 챗봇 만들기 (6) | 2025.02.19 |
---|---|
13. RAG (2) | 2025.02.17 |
12. 사전 학습된 언어 모델(PML) (4) | 2025.02.13 |
11. 트랜스포머 (2) | 2025.02.12 |
10. 어텐션 메커니즘 (1) | 2025.02.12 |