경고
Oracle 데이터베이스 벡터 저장소 기능은 미리 보기로 제공되며, 릴리스 전에 제한된 상황에서도 호환성이 손상되는 변경이 필요한 개선 사항이 계속 발생할 수 있습니다.
경고
의미 체계 커널 벡터 저장소 기능은 미리 보기 상태이며 릴리스 전에 제한된 상황에서도 호환성이 손상되는 변경이 필요한 개선 사항이 계속 발생할 수 있습니다.
경고
의미 체계 커널 벡터 저장소 기능은 미리 보기 상태이며 릴리스 전에 제한된 상황에서도 호환성이 손상되는 변경이 필요한 개선 사항이 계속 발생할 수 있습니다.
개요
Oracle 데이터베이스 벡터 저장소 커넥터를 사용하여 Oracle Database의 데이터에 액세스하고 관리할 수 있습니다. 커넥터의 특징은 다음과 같습니다.
| 기능 영역 | Support |
|---|---|
| 컬렉션이 다음으로 매핑됩니다. | Oracle 데이터베이스 테이블 |
| 지원되는 키 속성 형식 |
|
| 지원되는 데이터 속성 형식 |
|
| 지원되는 벡터 속성 형식 |
|
| 지원되는 인덱스 형식 |
|
| 지원되는 거리 함수 |
|
| 지원되는 필터 절 |
|
| 레코드에서 0개, 1개 또는 여러 개의 벡터를 지원합니다. | Yes |
| IsIndexed가 지원되는가요? | Yes |
| IsFullTextSearchable이 지원되나요? | 아니오 |
| StorageName이 지원되는가요? | Yes |
| HybridSearch가 지원되는가요? | 아니오 |
중요합니다
벡터 데이터 검색에는 Oracle Database 23ai 이상이 필요합니다. 다른 모든 Oracle 커넥터 기능은 Oracle Database 19c 이상을 사용하여 사용할 수 있습니다.
| 기능 영역 | Support |
|---|---|
| 컬렉션이 다음으로 매핑됩니다. | Oracle 데이터베이스 테이블 |
| 지원되는 키 속성 형식 |
|
| 지원되는 데이터 속성 형식 |
|
| 지원되는 벡터 속성 형식 |
|
| 지원되는 인덱스 형식 |
|
| 지원되는 거리 함수 |
|
| 지원되는 필터 절 | 비교, 부울 연산자, 문자열 메서드(startswith, endswith), between 및 datetime을 사용하는 Python 람다, 바인딩 변수를 사용하여 SQL로 변환 |
| IsIndexed가 지원되는가요? | Yes |
| IsFullTextSearchable이 지원되나요? | 아니오 |
| StoragePropertyName이 지원되는가요? | Yes |
| HybridSearch가 지원되는가요? | 아니오 |
중요합니다
벡터 데이터 검색에는 Oracle Database 23ai 이상이 필요합니다. 다른 모든 Oracle 커넥터 기능은 Oracle Database 19c 이상을 사용하여 사용할 수 있습니다. 또한 python-oracledb 3.3 이상이 필요합니다.
| 기능 영역 | Support |
|---|---|
| 지원되는 필터 절 |
|
| 컬렉션이 다음으로 매핑됩니다. | SQL 데이터베이스 테이블 |
| 지원되는 키 속성 형식 |
|
| 지원되는 데이터 속성 형식 |
|
| 지원되는 벡터 속성 형식 |
|
| 지원되는 인덱스 형식 |
|
| 지원되는 거리 함수 |
|
| 레코드에서 여러 벡터를 지원합니다. | Yes |
| IsIndexed 지원? | Yes |
| IsFullTextSearchable이 지원되나요? | 아니오 |
| StoragePropertyName이 지원되는가요? | 아니요, 대신 사용 @JsonProperty |
| HybridSearch가 지원되는가요? | 아니오 |
시작하기
Oracle Database Vector Store 커넥터 NuGet 패키지를 프로젝트에 추가합니다.
dotnet add package Oracle.VectorData --prerelease
의미 체계 커널에서 제공하는 확장 메서드를 IServiceCollection 사용하여 종속성 주입 컨테이너에 벡터 저장소를 추가할 수 있습니다. 이 경우 클래스의 Oracle.VectorData.OracleVectorStore 인스턴스도 컨테이너에 등록됩니다.
using Microsoft.SemanticKernel;
using Oracle.VectorData;
using Microsoft.Extensions.DependencyInjection;
// Using Kernel Builder.
var builder = Kernel.CreateBuilder();
builder.Services.AddOracleVectorStore("<connection string>");
using Microsoft.AspNetCore.Builder;
using Oracle.VectorData;
using Microsoft.Extensions.DependencyInjection;
// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOracleVectorStore("<connection string>");
매개 변수를 사용하지 않는 확장 메서드도 사용할 수 있습니다. 이를 위해서는 클래스의 인스턴스를 Oracle.ManagedDataAccess.Client.OracleDataSource 종속성 주입 컨테이너에 별도로 등록해야 합니다.
using Microsoft.SemanticKernel;
using Oracle.VectorData;
using Microsoft.Extensions.DependencyInjection;
using Oracle.ManagedDataAccess.Client;
// Using Kernel Builder.
var kernelBuilder = Kernel.CreateBuilder();
builder.Services.AddSingleton<OracleDataSource>(sp =>
{
OracleDataSourceBuilder dataSourceBuilder = new("<connection string>");
return dataSourceBuilder.Build();
});
builder.Services.AddOracleVectorStore();
using Microsoft.AspNetCore.Builder;
using Oracle.VectorData;
using Microsoft.Extensions.DependencyInjection;
using Oracle.ManagedDataAccess.Client;
// Using IServiceCollection with ASP.NET Core.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<OracleDataSource>(sp =>
{
OracleDataSourceBuilder dataSourceBuilder = new("<connection string>");
return dataSourceBuilder.Build();
});
builder.Services.AddOracleVectorStore();
사용자 지정 데이터 원본 또는 연결 문자열을 사용하여 Oracle Database Vector Store 인스턴스를 직접 생성할 수 있습니다.
using Oracle.VectorData;
using Oracle.ManagedDataAccess.Client;
OracleDataSourceBuilder dataSourceBuilder = new("<connection string>");
var dataSource = dataSourceBuilder.Build();
var connection = new OracleVectorStore(dataSource);
using Oracle.VectorData;
var connection = new OracleVectorStore("<connection string>");
사용자 지정 데이터 원본 또는 연결 문자열을 사용하여 명명된 컬렉션에 대한 직접 참조를 생성할 수 있습니다.
using Oracle.VectorData;
using Oracle.ManagedDataAccess.Client;
OracleDataSourceBuilder dataSourceBuilder = new("<connection string>");
var dataSource = dataSourceBuilder.Build();
var collection = new OracleCollection<string, Hotel>(dataSource, "skhotels");
using Oracle.VectorData;
var collection = new OracleCollection<string, Hotel>("<connection string>", "skhotels");
시작하기
Oracle Database Vector Store 커넥터를 설치합니다.
pip install semantic-kernel[oracledb]
OracleSettings, OracleStore 및 OracleCollection 클래스를 가져옵니다.
from semantic_kernel.connectors.oracle import OracleSettings, OracleStore, OracleCollection
OracleSettings 클래스는 Oracle Database에 대한 비동기 연결을 만드는 데 필요한 구성을 보유합니다. OracleStore 클래스는 데이터를 저장하고 검색하는 데 사용되며 OracleCollection 클래스는 컬렉션 내의 레코드를 관리하고 검색합니다. 이러한 클래스를 사용하여 Oracle Vector Store를 설정합니다.
# Read the environment settings
oracle_settings = OracleSettings()
# Create a connection pool
pool = await oracle_settings.create_connection_pool(
wallet_location=<wallet_location>,
wallet_password=<wallet_password>)
# Create an Oracle Vector Store
store = OracleStore(
connection_pool=pool,
)
# Get a collection
collection = await store.get_collection(
record_type=HotelSample,
collection_name=Hotel,
embedding_generator=text_embedding)
# Create a collection if it does not exist
await collection.ensure_collection_exists()
시작하기
Oracle 데이터베이스 벡터 저장소 커넥터를 설정합니다.
// Copyright (c) Microsoft. All rights reserved.
package com.microsoft.semantickernel.samples.syntaxexamples.memory;
import com.microsoft.semantickernel.data.jdbc.JDBCVectorStore;
import com.microsoft.semantickernel.data.jdbc.JDBCVectorStoreOptions;
import com.microsoft.semantickernel.data.jdbc.JDBCVectorStoreRecordCollection;
import com.microsoft.semantickernel.data.jdbc.JDBCVectorStoreRecordCollectionOptions;
import com.microsoft.semantickernel.data.jdbc.oracle.OracleVectorStoreQueryProvider;
import com.microsoft.semantickernel.data.vectorstorage.VectorStoreRecordCollection;
import com.microsoft.semantickernel.samples.documentationexamples.data.index.Hotel;
import java.sql.SQLException;
import java.util.Collections;
import oracle.jdbc.datasource.impl.OracleDataSource;
public class VectorStoreWithOracle {
public static void main(String[] args) throws SQLException {
System.out.println("==============================================================");
System.out.println("============== Oracle Vector Store Example ===================");
System.out.println("==============================================================");
// Configure the data source
OracleDataSource dataSource = new OracleDataSource();
dataSource.setURL("jdbc:oracle:thin:@localhost:1521/FREEPDB1");
dataSource.setUser("scott");
dataSource.setPassword("tiger");
// Build a query provider
OracleVectorStoreQueryProvider queryProvider = OracleVectorStoreQueryProvider.builder()
.withDataSource(dataSource)
.build();
// Build a vector store
JDBCVectorStore vectorStore = JDBCVectorStore.builder()
.withDataSource(dataSource)
.withOptions(JDBCVectorStoreOptions.builder()
.withQueryProvider(queryProvider)
.build())
.build();
// Get a collection from the vector store
VectorStoreRecordCollection<String, Hotel> collection = vectorStore.getCollection(
"skhotels",
JDBCVectorStoreRecordCollectionOptions.<Hotel>builder()
.withRecordClass(Hotel.class)
.build());
// Create the collection if it doesn't exist yet.
collection.createCollectionAsync().block();
collection.upsertAsync(new Hotel("1",
"HotelOne",
"Desc for HotelOne",
Collections.emptyList(), Collections.emptyList()),
null)
.block();
}
}
데이터 매핑
Oracle Database Vector Store 커넥터는 데이터 모델에서 스토리지로 데이터를 매핑할 때 기본 매퍼를 제공합니다. 이 매퍼는 데이터 모델 속성 목록을 Oracle 데이터베이스 열로 직접 변환하여 스토리지 스키마로 변환합니다.
Oracle Database Vector Store 커넥터는 데이터 모델 주석 및 레코드 정의를 지원합니다. 주석을 사용하여 인덱스 및 데이터베이스 열 매핑을 만들기 위해 데이터 모델에 정보를 제공할 수 있습니다. 레코드 정의를 사용하여 데이터 모델과 별도로 정보를 정의하고 제공할 수 있습니다.
다음 표에서는 Oracle Database와 C#간의 기본 기본 키 데이터 형식 매핑을 보여 냅니다.
| C# 데이터 형식 | 데이터베이스 유형 |
|---|---|
| short/int16 | NUMBER(5) |
| int/int32 | NUMBER(10) |
| long/int64 | NUMBER(19) |
| 문자열 | NVARCHAR2(2000) |
| 가이드 | RAW(16) |
다음 표에서는 nullable 형식을 비롯한 기본 데이터 속성 형식 매핑을 보여 있습니다.
| C# 데이터 형식 | 데이터베이스 유형 |
|---|---|
| bool | Oracle Database 23ai 이상용 BOOLEAN 이전 버전에 대한 NUMBER(1) |
| byte | NUMBER(3) |
| short/int16 | NUMBER(5) |
| int/int32 | NUMBER(10) |
| 십진수 | NUMBER(18,2) |
| long/int64 | NUMBER(19) |
| 떠다니다 | BINARY_FLOAT |
| 더블 | BINARY_DOUBLE (바이너리_더블) |
| DateTime | TIMESTAMP(7) |
| DateTimeOffset | 타임스탬프(7) 표준 시간대 |
| TimeSpan | INTERVAL 일(8) TO 초(7) |
| char | NVARCHAR2(1) |
| char[] | NVARCHAR2(2000) |
| byte[] | RAW(2000) |
| 문자열 | NVARCHAR2(2000) |
| 가이드 | RAW(16) |
Oracle Database 23ai부터 데이터베이스 벡터를 .NET에 매핑할 수 있습니다. 데이터 형식입니다. 여러 벡터 열이 지원됩니다. 다음 표에서는 nullable 형식을 비롯한 기본 벡터 속성 형식 매핑을 보여 있습니다.
| C# 데이터 형식 | 데이터베이스 유형 |
|---|---|
|
벡터(차원, 이진) |
|
VECTOR(차원, INT8) |
|
VECTOR(차원, FLOAT64) |
|
VECTOR(차원, FLOAT32) |
속성 이름 재정의
데이터 속성 및 벡터 속성의 경우 데이터 모델 속성 이름과 다른 스토리지에서 사용할 이름을 재정의할 수 있습니다. 속성 이름 재정의는 데이터 모델 속성 또는 레코드 정의에서 옵션을 설정할 StorageName 때 발생합니다.
다음은 코드 샘플이 설정된 데이터 모델 StorageName 및 Oracle SQL 명령에 표시되는 방법입니다.
using Microsoft.Extensions.VectorData;
public class Hotel
{
[VectorStoreKey]
public long HotelId { get; set; }
[VectorStoreData(StorageName = "hotel_name")]
public string? HotelName { get; set; }
[VectorStoreData(StorageName = "hotel_description")]
public string? Description { get; set; }
[VectorStoreVector(Dimensions: 384, DistanceFunction = DistanceFunction.CosineDistance)]
public ReadOnlyMemory<float>? DescriptionEmbedding { get; set; }
}
CREATE TABLE "MYSCHEMA"."Hotels"
("HotelId" NUMBER(10),
"hotel_name" NVARCHAR2(2000),
"hotel_description" NVARCHAR2(2000),
"DescriptionEmbedding" VECTOR(384, FLOAT32),
PRIMARY KEY ( "HotelId" )
);
더 알아보세요
자세한 내용은 다음 Oracle Database Vector Store 커넥터 리소스를 참조하세요.
- 의미 체계 커널용 Oracle 데이터베이스 벡터 저장소 커넥터 소개 주요 커넥터 기능, 클래스를 설명하고 커넥터를 사용하여 샘플 AI 벡터 검색 애플리케이션을 통해 판독기를 안내합니다.
- 설명서: 의미 체계 커널(.NET) API용 Oracle 데이터베이스 벡터 저장소 커넥터 클래스 Oracle 벡터 데이터베이스에서 데이터를 추가하고, 데이터를 검색하고, 벡터 검색을 수행하기 위한 Oracle Database Vector Store 커넥터 클래스에 대한 정보를 포함합니다.
- 설명서: .NET용 Oracle 데이터 공급자 Oracle Database Vector Store 커넥터용 ADO.NET 데이터 공급자인 .NET용 Oracle 데이터 공급자(ODP.NET)에 대한 정보를 포함합니다.
데이터 매핑
Oracle Database Vector Store 커넥터는 데이터 모델에서 스토리지로 매핑할 때 기본 매퍼를 제공합니다. 이 매퍼는 데이터 모델의 속성 목록을 Oracle 데이터베이스 열로 직접 변환하여 스토리지 스키마로 변환합니다.
Oracle Database Vector Store 커넥터는 데이터 모델 주석 및 레코드 정의를 지원합니다. 주석을 사용하여 인덱스 및 데이터베이스 열 매핑을 만들기 위해 데이터 모델에 정보를 제공할 수 있습니다. 레코드 정의를 사용하여 데이터 모델과 별도로 정보를 정의하고 제공할 수 있습니다.
다음 표에서는 Oracle Database와 Python 간의 기본 기본 키 데이터 형식 매핑을 보여줍니다.
| Python 형식 | Oracle SQL 형식 |
|---|---|
| 스트링 | VARCHAR(n), 형식 옵션에서 str(n)를 사용하면 Oracle VARCHAR 길이가 n으로 설정됩니다. n을 지정하지 않으면 기본 길이는 4000입니다. |
| 정수 (int) | NUMBER(10) |
| byte | NUMBER(3) |
| long | NUMBER(19) |
| 십진수 | 번호 |
| 떠다니다 | BINARY_FLOAT |
| 더블 | BINARY_DOUBLE (바이너리_더블) |
| bool | BOOLEAN |
| UUID(범용 고유 식별자) | RAW(16) |
| date | DATE |
| datetime.datetime | TIMESTAMP |
| datetime.timedelta | 일(day)부터 초(second)까지의 간격 |
| Clob | CLOB는 네이티브 Python 형식이 아니라 명시적으로 지정할 수 있습니다. |
| 덩어리 | BLOB은 네이티브 Python 형식이 아니라 명시적으로 지정할 수 있습니다. |
| list[str], dict[str, Any] | JSON |
| list[dict[str, Any]] | JSON |
| bytes | RAW(2000) |
Oracle Database 23ai부터 데이터베이스 벡터를 Python 데이터 형식에 매핑할 수 있습니다. 여러 벡터 열이 지원됩니다. 다음 표에서는 기본 벡터 속성 형식 매핑을 보여줍니다.
| Python 형식 | 데이터베이스 유형 |
|---|---|
| uint8 | BINARY |
| int8 | INT8 |
| 떠다니다 | FLOAT64 |
| float32 | FLOAT32 |
| float64 | FLOAT64 |
| 이진법 | BINARY |
더 알아보세요
자세한 내용은 다음 리소스를 참조하세요.
데이터 매핑
Oracle Database Vector Store 커넥터는 데이터 모델에서 스토리지로 데이터를 매핑할 때 기본 매퍼를 제공합니다. 이 매퍼는 데이터 모델 속성 목록을 Oracle 데이터베이스 열로 직접 변환하여 스토리지 스키마로 변환합니다.
Oracle Database Vector Store 커넥터는 데이터 모델 주석 및 레코드 정의를 지원합니다. 주석을 사용하여 인덱스 및 데이터베이스 열 매핑을 만들기 위해 데이터 모델에 정보를 제공할 수 있습니다. 레코드 정의를 사용하여 데이터 모델과 별도로 정보를 정의하고 제공할 수 있습니다.
Oracle Database와 Java 간 기본 키 데이터 형식의 기본 매핑과 ResultSet에서 데이터를 검색하기 위한 해당 메서드는 다음 표에 나와 있습니다.
| Java 형식 | 데이터베이스 유형 | ResultSet Getter 메서드 |
|---|---|---|
| 바이트(byte/Byte) | NUMBER(3) | resultSet.getByte(name) |
| 짧음/Short | NUMBER(5) | resultSet.getShort(name) |
| int/Integer | NUMBER(10) | resultSet.getInt(name) |
| 롱/Long | NUMBER(19) | resultSet.getLong(name) |
| String | NVARCHAR2(2000) | resultSet.getString(name) |
| UUID(범용 고유 식별자) | RAW(16) | resultSet.getObject(name, java_type) |
다음 표는 데이터를 가져오는 관련 메서드와 함께 기본 데이터 속성 유형 매핑을 보여 줍니다.ResultSet
| Java 형식 | 데이터베이스 유형 | ResultSet Getter 메서드 |
|---|---|---|
| 불리언 | BOOLEAN | resultSet.getByte(name) |
| 바이트(byte/Byte) | NUMBER(3) | resultSet.getByte(name) |
| byte[] | RAW(2000) | resultSet.getBytes(name) |
| 짧음/Short | NUMBER(5) | resultSet.getShort(name) |
| int/Integer | NUMBER(10) | resultSet.getInt(name) |
| 롱/Long | NUMBER(19) | resultSet.getLong(name) |
| float/Float (실수) | BINARY_FLOAT | resultSet.getFloat(name) |
| 더블/Double | BINARY_DOUBLE (바이너리_더블) | resultSet.getDouble(name) |
| BigDecimal | NUMBER(18,2) | resultSet.getBigDecimal(name) |
| OffsetDateTime | 타임스탬프(7) 표준 시간대 | resultSet.getTIMESTAMPTZ(name).offsetDateTimeValue() |
| String | CLOB/NVARCHAR2(%s) | resultSet.getString(name) |
| UUID(범용 고유 식별자) | RAW(16) | resultSet.getObject(name, java_type) |
목록<T> |
JSON |
resultSet.getObject(name, java_type) 사용 ojdbc-extensions-jackson-oson |
Oracle Database 23ai부터 데이터베이스 벡터를 Java 데이터 형식에 매핑할 수 있습니다. 여러 벡터 열이 지원됩니다. 다음 표에서는 기본 벡터 속성 형식 매핑을 보여줍니다.
| Java 형식 | 데이터베이스 유형 |
|---|---|
| String | 벡터(%d, FLOAT32) |
컬렉션<Float> |
벡터(%d, FLOAT32) |
목록<Float> |
벡터(%d, FLOAT32) |
| Float[] | 벡터(%d, FLOAT32) |
| float[] | 벡터(%d, FLOAT32) |