Oracle AI Vector Search: 임베딩 생성
Oracle AI Vector Search: 임베딩 생성
Oracle AI Vector Search는 인공지능(AI) 워크로드를 위해 설계된 것으로, 키워드가 아닌 의미(semantics)에 기반해 데이터를 쿼리할 수 있게 해줘요. Oracle AI Vector Search의 가장 큰 장점 중 하나는 비정형 데이터에 대한 의미 검색과 비즈니스 데이터에 대한 관계형 검색을 하나의 시스템에서 결합할 수 있다는 점이에요. 전용 벡터 데이터베이스를 추가로 둘 필요가 없어 여러 시스템 간 데이터 단편화의 고통을 없애주므로, 강력할 뿐만 아니라 훨씬 효과적이에요.
또한 벡터는 Oracle Database의 가장 강력한 기능들을 모두 활용할 수 있어요.
- Partitioning Support
- Real Application Clusters scalability
- Exadata smart scans
- Shard processing across geographically distributed databases
- Transactions
- Parallel SQL
- Disaster recovery
- Security
- Oracle Machine Learning
- Oracle Graph Database
- Oracle Spatial and Graph
- Oracle Blockchain
- JSON
이 가이드는 Oracle AI Vector Search 내의 임베딩 기능을 사용해 OracleEmbeddings로 문서의 임베딩을 생성하는 방법을 설명해요.
Oracle Database를 처음 시작하는 경우라면, 데이터베이스 환경을 설정하는 좋은 입문 자료인 무료 Oracle 23 AI를 둘러보는 걸 고려해 보세요. 데이터베이스를 작업할 때는 기본적으로 system 사용자를 피하고 보안과 커스터마이징을 위해 직접 사용자를 만드는 것이 좋아요. 사용자 생성 절차는 Oracle에서 사용자를 설정하는 방법도 보여주는 end-to-end 가이드를 참고하세요. 또한 사용자 권한을 이해하는 것은 데이터베이스 보안을 효과적으로 관리하는 데 중요해요. 사용자 계정 및 보안 관리에 대한 공식 Oracle 가이드에서 더 자세히 배울 수 있어요.
출처: 문서
본문
사전 준비사항 (Prerequisites)
LlamaIndex를 Oracle AI Vector Search와 통합하려면 Oracle Python Client 드라이버가 설치되어 있어야 해요.
%pip install llama-index-embeddings-oracleai
Oracle Database에 연결하기
다음 샘플 코드는 Oracle Database에 연결하는 방법을 보여드려요. 기본적으로 python-oracledb는 Oracle Database에 직접 연결하는 'Thin' 모드로 실행돼요. 이 모드는 Oracle Client 라이브러리가 필요 없어요. 다만 python-oracledb가 Oracle Client 라이브러리를 사용하면 추가 기능을 쓸 수 있어요. Oracle Client 라이브러리를 사용할 때 python-oracledb는 'Thick' 모드에 있다고 해요. 두 모드 모두 Python Database API v2.0 Specification을 지원하는 포괄적인 기능을 갖추고 있어요. 각 모드에서 지원하는 기능에 대한 설명은 다음 가이드를 참고하세요. thin-mode를 사용할 수 없다면 thick-mode로 전환하고 싶을 거예요.
import sys
import oracledb
# Update the following variables with your Oracle database credentials and connection details
username = "<username>"
password = "<password>"
dsn = "<hostname>/<service_name>"
try:
conn = oracledb.connect(user=username, password=password, dsn=dsn)
print("Connection successful!")
except Exception as e:
print("Connection failed!")
sys.exit(1)
임베딩 생성을 위해 사용자는 몇 가지 제공자 옵션을 쓸 수 있어요. 여기에는 데이터베이스 내 임베딩 생성과 OcigenAI, Hugging Face, OpenAI 같은 서드파티 서비스가 포함돼요. 서드파티 제공자를 선택한 사용자는 필수 인증 정보를 포함한 자격 증명(credential)을 만들어야 해요. 반대로 'database'를 제공자로 선택하면 임베딩을 위해 ONNX 모델을 Oracle Database에 로드해야 해요.
ONNX 모델 로드
Oracle은 다양한 임베딩 제공자를 수용해서, 사용자가 전용 데이터베이스 솔루션과 OCIGENAI, HuggingFace 같은 서드파티 서비스 중에서 선택할 수 있게 해줘요. 이 선택은 임베딩을 생성하고 관리하는 방법을 결정해요.
중요: 데이터베이스 옵션을 선택한 경우 ONNX 모델을 Oracle Database에 업로드해야 해요. 반대로 임베딩 생성을 위해 서드파티 제공자를 선택했다면 ONNX 모델을 Oracle Database에 업로드할 필요가 없어요.
Oracle 내에서 ONNX 모델을 직접 활용하면 데이터를 외부로 전송할 필요가 없어 보안과 성능이 향상되는 큰 장점이 있어요. 또한 네트워크나 REST API 호출에서 흔히 발생하는 지연도 피할 수 있어요.
아래는 ONNX 모델을 Oracle Database에 업로드하는 예제 코드예요.
from llama_index.embeddings.oracleai import OracleEmbeddings
# please update with your related information
# make sure that you have onnx file in the system
onnx_dir = "DEMO_DIR"
onnx_file = "tinybert.onnx"
model_name = "demo_model"
try:
OracleEmbeddings.load_onnx_model(conn, onnx_dir, onnx_file, model_name)
print("ONNX model loaded.")
except Exception as e:
print("ONNX model loading failed!")
sys.exit(1)
자격 증명 생성 (Create Credential)
임베딩 생성을 위해 서드파티 제공자를 선택한 경우, 제공자의 엔드포인트에 안전하게 접근할 수 있는 자격 증명을 만들어야 해요.
중요: 'database' 제공자를 선택해 임베딩을 생성할 때는 자격 증명이 필요 없어요. 하지만 서드파티 제공자를 사용하려면 선택한 제공자에 특화된 자격 증명을 만들어야 해요.
다음은 예시예요.
try:
cursor = conn.cursor()
cursor.execute(
"""
declare
jo json_object_t;
begin
-- HuggingFace
dbms_vector_chain.drop_credential(credential_name => 'HF_CRED');
jo := json_object_t();
jo.put('access_token', '<access_token>');
dbms_vector_chain.create_credential(
credential_name => 'HF_CRED',
params => json(jo.to_string));
-- OCIGENAI
dbms_vector_chain.drop_credential(credential_name => 'OCI_CRED');
jo := json_object_t();
jo.put('user_ocid','<user_ocid>');
jo.put('tenancy_ocid','<tenancy_ocid>');
jo.put('compartment_ocid','<compartment_ocid>');
jo.put('private_key','<private_key>');
jo.put('fingerprint','<fingerprint>');
dbms_vector_chain.create_credential(
credential_name => 'OCI_CRED',
params => json(jo.to_string));
end;
"""
)
cursor.close()
print("Credentials created.")
except Exception as ex:
cursor.close()
raise
임베딩 생성 (Generate Embeddings)
Oracle AI Vector Search는 로컬에 호스팅된 ONNX 모델이나 서드파티 API를 활용해 임베딩을 생성하는 여러 방법을 제공해요. 이 대안들을 구성하는 종합적인 지침은 Oracle AI Vector Search Guide를 참고하세요.
참고: ONNX 모델을 사용하는 'database' 제공자를 제외하고, 서드파티 임베딩 생성 제공자를 사용하려면 프록시를 구성해야 할 수도 있어요.
# proxy to be used when we instantiate summary and embedder object
proxy = "<proxy>"
다음 샘플 코드는 임베딩을 생성하는 방법을 보여드려요.
from llama_index.embeddings.oracleai import OracleEmbeddings
"""
# using ocigenai
embedder_params = {
"provider": "ocigenai",
"credential_name": "OCI_CRED",
"url": "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/embedText",
"model": "cohere.embed-english-light-v3.0",
}
# using huggingface
embedder_params = {
"provider": "huggingface",
"credential_name": "HF_CRED",
"url": "https://api-inference.huggingface.co/pipeline/feature-extraction/",
"model": "sentence-transformers/all-MiniLM-L6-v2",
"wait_for_model": "true"
}
"""
# using ONNX model loaded to Oracle Database
embedder_params = {"provider": "database", "model": "demo_model"}
# Remove proxy if not required
embedder = OracleEmbeddings(conn=conn, params=embedder_params, proxy=proxy)
embed = embedder._get_text_embedding("Hello World!")
""" verify """
print(f"Embedding generated by OracleEmbeddings: {embed}")
End to End 데모
Oracle AI Vector Search를 활용해 end-to-end RAG 파이프라인을 구축하려면 전체 데모 가이드 Oracle AI Vector Search End-to-End Demo Guide를 참고하세요.