크로마 벡터 스토어를 사용한 AutoAI RAG 실험 코딩하기
가이드라인과 코드 샘플을 검토하여 기본 인메모리 크로마 데이터베이스를 벡터 저장소로 사용하여 AutoAI RAG 실험을 코딩하는 방법을 알아보세요.
벡터화된 콘텐츠를 크로마 데이터베이스에 저장하기
AutoAI RAG 실험을 설정하고 벡터 저장소에 대한 연결을 지정하지 않으면 벡터화된 콘텐츠가 기본 인메모리 크로마 데이터베이스에 저장됩니다. 콘텐츠는 실험 이후에도 지속되지 않으므로 RAG 패턴을 배포하기 위한 실행 가능한 제작 방법이 아닙니다. 하지만 RAG 패턴을 만들기 위한 빠른 경로를 제공합니다.
다음 섹션에서는 Chroma 데이터베이스로 RAG 패턴 자동화 노트북과 함께 제공되는 주석이 달린 샘플 코드를 확장하여 설명합니다.
노트북은 watsonx.ai Python 클라이언트 라이브러리(버전 1.1.11 이상)를 사용하며, 이 버전은 다음과 같습니다.
다음 단계에 따라 사용 사례에 맞는 AutoAI RAG 실험을 코딩하세요.
1단계: 데이터 준비 및 실험 설정을 위한 전제 조건 준비하기
실험을 위한 전제 조건을 준비합니다.
필요한 모듈과 종속성을 설치하고 가져옵니다. 예를 들어,
pip install 'ibm-watsonx-ai[rag]>=1.1.11' pip install langchain-community==0.2.4
- 작업 자격 증명을 추가합니다. 작업 자격 증명 추가하기를 참조하세요.
- watsonx.ai 런타임 서비스를 추가합니다. 서비스 만들기를 참조하세요.
- API 키를 입력합니다. 사용자 API 키 관리하기를 참조하세요.
이를 사용하여 클라이언트를 초기화합니다. 예를 들어,
from ibm_watsonx_ai import APIClient, Credentials credentials = Credentials( url = "https://us-south.ml.cloud.mydomain.com", api_key = "***********" ) client = APIClient(credentials)
프로젝트 또는 스페이스의 ID를 가져옵니다. 프로젝트 ID 찾기를 참조하세요.
기본 프로젝트 또는 스페이스를 설정합니다:
client.set.default_project("<Project ID>")
client.set.default_space("<Space GUID>")
접지 문서
RAG 실험을 실행하는 데 사용할 접지 문서를 준비하고 연결합니다. 자세한 내용은 프로젝트에서 데이터 가져오기 및 준비하기를 참조하세요.
- 지원되는 형식: PDF, HTML, DOCX, 마크다운, 일반 텍스트
- Cloud Object Storage 버킷 또는 버킷의 폴더에 있는 데이터에 연결하거나 최대 20개의 파일을 지정할 수 있습니다.
- AutoAI 실험을 실행하기 위해 문서 샘플을 사용합니다
예를 들어, 문서가 Cloud Object Storage 버킷에 저장되어 있을 때 데이터 연결을 만들려면 다음과 같이 하세요:
from ibm_watsonx_ai.helpers import DataConnection, S3Location
conn_meta_props= {
client.connections.ConfigurationMetaNames.NAME: f"Connection to input data - {datasource_name} ",
client.connections.ConfigurationMetaNames.DATASOURCE_TYPE: client.connections.get_datasource_type_id_by_name(datasource_name),
client.connections.ConfigurationMetaNames.DESCRIPTION: "ibm-watsonx-ai SDK documentation",
client.connections.ConfigurationMetaNames.PROPERTIES: {
'bucket': <BUCKET_NAME>,
'access_key': <ACCESS_KEY>,
'secret_key': <SECRET_ACCESS_KEY>,
'iam_url': 'https://iam.cloud.ibm.com/identity/token',
'url': <ENDPOINT_URL>
}
}
conn_details = client.connections.create(meta_props=conn_meta_props)
cos_connection_id = client.connections.get_id(conn_details)
input_data_references = [DataConnection(
connection_asset_id=cos_connection_id,
location=S3Location(
bucket=<BACKET_NAME>,
path=<BACKET_PATH>
)
)]
다음 예는 프로젝트에서 생성(또는 스페이스로 승격)된 데이터 자산을 사용하는 방법을 보여줍니다.
core_api.html
은 샘플 노트북에 사용된 접지 문서 파일의 예시입니다.
import os, wget
from ibm_watsonx_ai.helpers import DataConnection
input_data_filename = "core_api.html"
input_data_path = f"https://ibm.github.io/watsonx-ai-python-sdk/{input_data_filename}"
if not os.path.isfile(input_data_filename):
wget.download(input_data_path, out=input_data_filename)
asset_details = client.data_assets.create(input_data_filename, input_data_filename)
asset_id = client.data_assets.get_id(asset_details)
asset_id
input_data_references = [DataConnection(data_asset_id=asset_id)]
input_data_references
최대 20개의 DataConnection
인스턴스를 지원합니다.
평가 데이터
- 평가 데이터는 이러한 필드가 포함된 고정 스키마가 있는 JSON 형식이어야 합니다:
question
,correct_answer
,correct_answer_document_ids
예를 들어,
[
{
"question": "What is the purpose of get_token()?",
"correct_answer": "get_token() is used to retrieve an authentication token for secure API access.",
"correct_answer_document_ids": [
"core_api.html"
]
},
{
"question": "How does the delete_model() function operate?",
"correct_answer": "delete_model() method allows users to delete models they've created or managed.",
"correct_answer_document_ids": [
"core_api.html"
]
}
]
평가 데이터를 준비합니다:
import os, wget
from ibm_watsonx_ai.helpers import DataConnection
test_data_filename = "benchmarking_data_core_api.json"
test_data_path = f"https://github.com/IBM/watsonx-ai-samples/blob/master/cloud/data/autoai_rag/{test_data_filename}"
if not os.path.isfile(test_data_filename):
wget.download(test_data_path, out=test_data_filename)
test_asset_details = client.data_assets.create(name=test_data_filename, file_path=test_data_filename)
test_asset_id = client.data_assets.get_id(test_asset_details)
test_data_references = [DataConnection(data_asset_id=test_asset_id)]
2단계: RAG 옵티마이저 구성하기
rag_optimizer
객체는 AutoAI RAG 실험으로 작업하기 위한 메서드 집합을 제공합니다. 이 단계에서는 실험을 정의하기 위해 세부 정보를 입력합니다. 사용 가능한 구성 옵션은 다음과 같습니다:
매개변수 | 설명 | 값 |
---|---|---|
이름 | 올바른 이름 입력 | 실험 이름 |
설명 | 실험 설명 | 선택 사항으로 실험을 설명합니다 |
embedding_models | 시도해 볼 모델 임베딩 | ibm/slate-125m-english-rtrvr intfloat/multilingual-e5-large |
검색_방법 | 사용할 검색 방법 | simple 모든 관련 문서 검색 및 순위 지정window 정해진 수의 관련 문서 검색 및 순위 지정 |
기초_모델 | 시도해 볼 파운데이션 모델 | 작업별 기초 모델 보기 |
최대_개수_오브_래그_패턴 | 생성할 수 있는 최대 RAG 패턴 수 | 4-20 |
최적화_메트릭 | 최적화에 사용할 지표 이름 | faithfulness answer_correctness |
이 샘플 코드는 ibm-watsonx-ai SDK 설명서를 사용하여 실험을 실행하기 위한 구성 옵션을 보여줍니다:
from ibm_watsonx_ai.experiment import AutoAI
experiment = AutoAI(credentials, project_id=project_id)
rag_optimizer = experiment.rag_optimizer(
name='DEMO - AutoAI RAG ibm-watsonx-ai SDK documentation',
description="AutoAI RAG experiment grounded with the ibm-watsonx-ai SDK documentation",
max_number_of_rag_patterns=5,
optimization_metrics=[AutoAI.RAGMetrics.ANSWER_CORRECTNESS]
)
rag_optimizer = experiment.rag_optimizer(
name='DEMO - AutoAI RAG ibm-watsonx-ai SDK documentation',
description="AutoAI RAG experiment grounded with the ibm-watsonx-ai SDK documentation",
embedding_models=["ibm/slate-125m-english-rtrvr"],
foundation_models=["ibm/granite-13b-chat-v2","mistralai/mixtral-8x7b-instruct-v01"],
max_number_of_rag_patterns=5,
optimization_metrics=[AutoAI.RAGMetrics.ANSWER_CORRECTNESS]
)
3단계: 실험 실행
옵티마이저를 실행하여 지정된 구성 옵션을 사용하여 RAG 패턴을 생성합니다. 이 코드 샘플에서 크로마 실험을 실행하기 위한 작업은 대화형 모드로 실행됩니다. background_mode
을 True로 변경하여 백그라운드에서 작업을 실행할 수 있습니다.
run_details = rag_optimizer.run(
input_data_references=input_data_references,
test_data_references=test_data_references,
background_mode=False
)
4단계: 패턴을 검토하고 가장 적합한 패턴을 선택합니다
AutoAI RAG 실험이 성공적으로 완료되면 패턴을 검토할 수 있습니다. ' summary
' 방법을 사용하면 완성된 패턴과 평가 지표 정보를 판다스 DataFrame 형태로 나열하여 최적화된 지표 대비 성능에 따라 순위가 매겨진 패턴을 검토할 수 있습니다.
summary = rag_optimizer.summary()
summary
예를 들어 패턴 결과는 다음과 같이 표시됩니다:
패턴 | 의미_정답_정확성 | 의미_충실함 | 의미_컨텍스트_정확성 | chunking.chunk_size | embeddings.model_id | vector_store.distance_metric | retrieval.method | retrieval.number_of_chunks | generation.model_id |
---|---|---|---|---|---|---|---|---|---|
Pattern1 | 0.6802 | 0.5407 | 1.0000 | 512 | ibm/slate-125m-english-rtrvr | 유클리디안 | Windows | 5 | meta-llama/llama-3-70b-instruct |
Pattern2 | 0.7172 | 0.5950 | 1.0000 | 1024자입니다. | intfloat/multilingual-e5-large | 유클리디안 | Windows | 5 | ibm/granite-13b-chat-v2 |
Pattern3 | 0.6543 | 0.5144 | 1.0000 | 1024자입니다. | intfloat/multilingual-e5-large | 유클리디안 | 단순 | 5 | ibm/granite-13b-chat-v2 |
Pattern4 | 0.6216 | 0.5030 | 1.0000 | 1024자입니다. | intfloat/multilingual-e5-large | 코사인 | Windows | 5 | meta-llama/llama-3-70b-instruct |
Pattern5 | 0.7369 | 0.5630 | 1.0000 | 1024자입니다. | intfloat/multilingual-e5-large | 코사인 | Windows | 3 | mistralai/mixtral-8x7b-instruct-v01 |
로컬에서 테스트할 패턴 선택
다음 단계는 패턴을 선택하고 로컬에서 테스트하는 것입니다. 크로마는 인메모리 방식이므로 문서 색인을 다시 만들어야 합니다.
다음 코드 샘플에서는 core_api.html
및 fm_embeddings.html
문서로 인덱스가 작성됩니다.
from langchain_community.document_loaders import WebBaseLoader
best_pattern = rag_optimizer.get_pattern()
urls = [
"https://ibm.github.io/watsonx-ai-python-sdk/core_api.html",
"https://ibm.github.io/watsonx-ai-python-sdk/fm_embeddings.html",
]
docs_list = WebBaseLoader(urls).load()
doc_splits = best_pattern.chunker.split_documents(docs_list)
best_pattern.indexing_function(doc_splits)
로컬에서 RAG 패턴을 쿼리합니다.
payload = {
client.deployments.ScoringMetaNames.INPUT_DATA: [
{
"values": ["How to use new approach of providing credentials to APIClient?"],
}
]
}
best_pattern.query(payload)
모델의 응답은 다음과 같습니다:
According to the document, the new approach to provide credentials to APIClient is by using the Credentials class. Here's an example:
from ibm_watsonx_ai import APIClient
from ibm_watsonx_ai import Credentials
credentials = Credentials(
url = "https://us-south.ml.cloud.ibm.com",
token = "***********",
)
client = APIClient(credentials)
This replaces the old approach of passing a dictionary with credentials to the APIClient constructor.
특정 패턴을 검색하려면 패턴 번호를 rag_optimizer.get_pattern()
에 전달합니다.
Cloud Object Storage 실험 결과 검토하기
실험의 최종 상태가 실패 또는 오류인 경우 rag_optimizer.get_logs()
을 사용하거나 실험 결과를 참조하여 무엇이 잘못되었는지 파악합니다. 실험 결과와 로그는 계정에 연결된 기본 Cloud Object Storage 인스턴스에 저장됩니다. 기본적으로 결과는 default_autoai_rag_out
디렉터리에 저장됩니다.
결과는 패턴별로 정리됩니다. 예를 들어,
|-- Pattern1
| | -- evaluation_results.json
| | -- indexing_inference_notebook.ipynb (Chroma)
|-- Pattern2
| ...
|-- training_status.json
각 패턴에는 이러한 결과가 포함되어 있습니다:
evaluation_results.json
파일에는 각 벤치마크 질문에 대한 평가 결과가 포함되어 있습니다.indexing_inference_notebook.ipynb
에는 벡터 데이터베이스 인덱스 구축과 검색 및 생성 기능을 구축하기 위한 파이썬 코드가 포함되어 있습니다. 이 노트북에는 데이터 검색, 청크 생성, 임베딩 생성은 물론 청크 검색, 프롬프트 작성, 답변 생성을 위한 명령어가 소개되어 있습니다.
결과 indexing_notebook.ipynb
문서 임베딩 및 색인화 코드가 포함되어 있습니다. You can accelerate the document indexing task by changing vector_store.add_documents()
to vector_store.add_documents_async()
.
추론 및 색인 노트북 받기
지정된 추론 노트북을 다운로드하려면 get_inference_notebook()
을 사용하세요. pattern_name
를 비워두면 메서드는 가장 잘 계산된 패턴의 노트북을 다운로드합니다.
rag_optimizer.get_inference_notebook(pattern_name='Pattern3')
상위 주제: AutoAI SDK로 RAG 패턴 자동화하기