이 튜토리얼에서는 다음을 구축하는 방법을 알아봅니다. 검색 증강 생성(RAG) 애플리케이션을 사용하여 카우치베이스 AI 서비스 를 사용하여 데이터를 저장하고, 임베딩 모델을 사용하여 임베딩을 생성하고, LLM 추론을 수행합니다. RAG 시스템을 만들어 보겠습니다:
- 에서 뉴스 기사를 수집합니다. BBC 뉴스 데이터 세트.
- 를 사용하여 벡터 임베딩을 생성합니다. NVIDIA NeMo 리트리버 카펠라 모델 서비스를 통한 모델.
- 이러한 벡터를 다음 위치에 저장하고 인덱싱합니다. 카우치베이스 카펠라.
- 시맨틱 검색을 수행하여 관련 컨텍스트를 검색합니다.
- 를 사용하여 답변을 생성합니다. 미스트랄-7B LLM은 카펠라에서 호스팅됩니다.
이 코드랩의 노트북 소스 코드를 찾을 수 있습니다. 여기.
왜 카우치베이스 AI 서비스인가?
카우치베이스 AI 서비스가 제공합니다:
- LLM 추론 및 임베딩 API: 외부 API 키나 인프라를 관리할 필요 없이 Capella를 통해 인기 있는 LLM(예: Llama 3)과 임베딩 모델에 직접 액세스할 수 있습니다.
- 통합 플랫폼: 데이터베이스, 벡터화, 검색, 모델을 한 곳에서 활용하세요.
- 통합 벡터 검색: 밀리초 단위의 지연 시간으로 JSON 데이터에서 직접 시맨틱 검색을 수행하세요.
Couchbase AI 서비스 설정
아카펠라에서 클러스터 만들기
- 로그인 카우치베이스 카펠라.
- 새 클러스터를 만들거나 기존 클러스터를 사용합니다. 클러스터는 데이터, 쿼리, 인덱스 및 이벤트 서비스를 포함하는 최신 버전의 Couchbase Server 8.0을 실행해야 한다는 점에 유의하세요.
- 버킷을 만듭니다.
- 데이터의 범위와 컬렉션을 만듭니다.
AI 서비스 사용
- UI에서 Capella의 AI 서비스 섹션으로 이동합니다.
- 임베딩 및 LLM 모델을 배포합니다.
- 이 데모를 위해서는 데이터가 저장될 Capella 클러스터와 동일한 지역에서 임베딩 및 LLM을 실행해야 합니다.
- 이 데모가 제대로 작동하려면 다음과 같은 도구 호출 기능이 있는 LLM을 배포해야 합니다.
미스트랄라이/미스트랄-7b-인스트럭트-v0.3. 임베딩의 경우 다음과 같은 모델을 선택할 수 있습니다.엔비디아/라마-3.2-NV-EMBEDQA-1B-V2. - 엔드포인트 URL을 적어두고 API 키를 생성합니다.
AI 모델 출시에 대한 자세한 내용은 다음을 참조하세요. 공식 문서.
전제 조건
시작하기 전에 Python 3.10 이상이 설치되어 있는지 확인하세요.
1단계: 종속성 설치
Couchbase SDK, LangChain 통합, 데이터 세트 라이브러리가 필요합니다.
|
1 |
%pip install --quiet datasets==4.4.1 langchain-couchbase==1.0.0 langchain-openai==1.1.0 |
2단계: 구성 및 연결
먼저 Couchbase 클러스터에 연결합니다. 또한 Capella 모델 서비스에 대한 엔드포인트를 구성해야 합니다.
참고: Capella 모델 서비스는 OpenAI API 형식과 호환되므로 표준을 사용할 수 있습니다. 랑체인-오픈아이 라이브러리를 Capella 엔드포인트로 가리키면 됩니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import getpass from couchbase.auth import PasswordAuthenticator from couchbase.cluster import Cluster from couchbase.options import ClusterOptions from datetime import timedelta # Configuration CB_CONNECTION_STRING = getpass.getpass("Couchbase Connection String: ") CB_USERNAME = input("Database Username: ") CB_PASSWORD = getpass.getpass("Database Password: ") CB_BUCKET_NAME = input("Bucket Name: ") SCOPE_NAME = "rag" COLLECTION_NAME = "data" INDEX_NAME = "vs-index" # Model Services Config CAPELLA_MODEL_SERVICES_ENDPOINT = getpass.getpass("Capella Model Services Endpoint: ") LLM_MODEL_NAME = "mistralai/mistral-7b-instruct-v0.3" LLM_API_KEY = getpass.getpass("LLM API Key: ") EMBEDDING_MODEL_NAME = "nvidia/llama-3.2-nv-embedqa-1b-v2" EMBEDDING_API_KEY = getpass.getpass("Embedding API Key: ") # Connect to Cluster auth = PasswordAuthenticator(CB_USERNAME, CB_PASSWORD) cluster = Cluster(CB_CONNECTION_STRING, ClusterOptions(auth)) cluster.wait_until_ready(timedelta(seconds=5)) print("Successfully connected to Couchbase") |
3단계: 데이터베이스 구조 설정
뉴스 데이터를 저장할 버킷, 범위, 컬렉션이 있는지 확인해야 합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
def setup_collection(cluster, bucket_name, scope_name, collection_name): bucket = cluster.bucket(bucket_name) manager = bucket.collections() # Create Scope if scope_name not in [s.name for s in manager.get_all_scopes()]: manager.create_scope(scope_name) # Create Collection bucket_manager = bucket.collections() scopes = bucket_manager.get_all_scopes() # ... (logic to create collection if missing) ... # Create Primary Index cluster.query(f"CREATE PRIMARY INDEX IF NOT EXISTS ON `{bucket_name}`.`{scope_name}`.`{collection_name}`").execute() setup_collection(cluster, CB_BUCKET_NAME, SCOPE_NAME, COLLECTION_NAME) |
4단계: 카우치베이스 벡터 검색 인덱스 불러오기
시맨틱 검색은 사용자의 쿼리를 기반으로 관련 문서를 효율적으로 검색할 수 있는 방법이 필요합니다. 바로 이 부분에서 이전에 전체 텍스트 검색(FTS) 서비스로 알려진 Couchbase Vector Search가 활약합니다. 이 단계에서는 인덱스의 구조화 방법을 지정하는 JSON 파일에서 벡터 검색 인덱스 정의를 로드합니다. 여기에는 인덱싱할 필드, 벡터의 차원, 그리고 검색 엔진이 벡터 유사성을 기반으로 쿼리를 처리하는 방법을 결정하는 기타 매개변수가 포함됩니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# If you are running this script in Google Colab, comment the following line # and provide the path to your index definition file. index_definition_path = "capella_index.json" # Local setup: specify your file path here # If you are running in Google Colab, use the following code to upload the index definition file # from google.colab import files # print("Upload your index definition file") # uploaded = files.upload() # index_definition_path = list(uploaded.keys())[0] try: with open(index_definition_path, "r") as file: index_definition = json.load(file) # Update search index definition with user inputs index_definition['name'] = INDEX_NAME index_definition['sourceName'] = CB_BUCKET_NAME # Update types mapping old_type_key = next(iter(index_definition['params']['mapping']['types'].keys())) type_obj = index_definition['params']['mapping']['types'].pop(old_type_key) index_definition['params']['mapping']['types'][f"{SCOPE_NAME}.{COLLECTION_NAME}"] = type_obj except Exception as e: raise ValueError( f"Error loading index definition from {index_definition_path}: {str(e)}" ) # Create the Vector Index via SDK try: scope_index_manager = ( cluster.bucket(CB_BUCKET_NAME).scope(SCOPE_NAME).search_indexes() ) # Check if index already exists existing_indexes = scope_index_manager.get_all_indexes() index_name = index_definition["name"] if index_name in [index.name for index in existing_indexes]: print(f"Index '{index_name}' found") else: print(f"Creating new index '{index_name}'...") # Create SearchIndex object from JSON definition search_index = SearchIndex.from_json(index_definition) # Upsert the index (create if not exists, update if exists) scope_index_manager.upsert_index(search_index) print(f"Index '{index_name}' successfully created/updated.") except Exception as e: logging.error(f"Error creating or updating index: {e}") |
5단계: AI 모델 초기화
임베딩 모델을 초기화하는 방법은 다음과 같습니다. OpenAIE임베딩 하지만 카펠라를 가리킵니다. 카우치베이스 AI 서비스는 에이전트가 사용하는 OpenAI 호환 엔드포인트를 제공합니다. 임베딩의 경우, LangChain Couchbase 통합과 함께 사용되는 LangChain OpenAI 패키지를 사용하고 있습니다.
|
1 2 3 4 5 6 7 8 9 |
from langchain_openai import OpenAIEmbeddings embeddings = OpenAIEmbeddings( openai_api_key=EMBEDDING_API_KEY, openai_api_base=CAPELLA_MODEL_SERVICES_ENDPOINT, # Capella Endpoint model=EMBEDDING_MODEL_NAME, check_embedding_ctx_length=False, tiktoken_enabled=False ) |
6단계: 데이터 수집
BBC 뉴스 데이터 세트를 로드하여 Couchbase에 수집합니다. 그리고 카우치베이스검색벡터스토어 는 정의된 모델을 사용하여 임베딩을 생성하고 저장하는 작업을 자동으로 처리합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
from datasets import load_dataset from langchain_core.documents import Document from langchain_couchbase.vectorstores import CouchbaseSearchVectorStore # Load Data dataset = load_dataset('RealTimeData/bbc_news_alltime', '2024-12', split="train") unique_articles = list(set(dataset["content"]))[:100] # Limit for demo # Initialize Vector Store vector_store = CouchbaseSearchVectorStore( cluster=cluster, bucket_name=CB_BUCKET_NAME, scope_name=SCOPE_NAME, collection_name=COLLECTION_NAME, embedding=embeddings, index_name=INDEX_NAME, ) # Ingest documents = [Document(page_content=article) for article in unique_articles] vector_store.add_documents(documents) print(f"Ingested {len(documents)} documents") |
7단계: RAG 체인 구축
이제 RAG 파이프라인을 생성합니다. LLM을 초기화하고(다시 카펠라를 가리킴) 이를 벡터 스토어 리트리버에 연결합니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnablePassthrough from langchain_core.output_parsers import StrOutputParser # 1. Initialize LLM llm = ChatOpenAI( openai_api_base=CAPELLA_MODEL_SERVICES_ENDPOINT, openai_api_key=LLM_API_KEY, model=LLM_MODEL_NAME, temperature=0 ) # 2. Define Prompt template = """Answer the question based only on the following context: {context} Question: {question} """ prompt = ChatPromptTemplate.from_template(template) # 3. Create Chain rag_chain = ( {"context": vector_store.as_retriever(), "question": RunnablePassthrough()} | prompt | llm | StrOutputParser() ) |
8단계: 쿼리 실행
RAG를 테스트해 보겠습니다.
|
1 2 3 4 5 |
query = "What was Pep Guardiola's reaction to Manchester City's recent form?" response = rag_chain.invoke(query) print(f"Question: {query}") print(f"Answer: {response}") |
출력 예시:
답변: 펩 과르디올라 감독은 맨체스터 시티의 최근 성적에 대해 우려와 좌절감을 표명했습니다. 그는 “나는 충분하지 않다. 나는 감독이다... 나는 해결책을 찾아야 한다.”라고 말했습니다. 그는 팀의 수비 문제와 자신감 부족을 인정했습니다.
결론
이 튜토리얼에서는 방법을 배웠습니다:
- Couchbase를 사용하여 데이터를 벡터화합니다.
- 임베딩 및 LLM에 Couchbase AI 서비스를 사용하세요.
- 카우치베이스 벡터 검색으로 RAG를 구현하세요.
Couchbase의 통합 데이터베이스 플랫폼은 상황에 맞는 고품질의 콘텐츠를 생성할 수 있는 강력한 AI 애플리케이션을 만듭니다.