Go godrorドライバでOracle Database 23ai VECTORデータ型がサポート (2025/03/26)

Go godrorドライバでOracle Database 23ai VECTORデータ型がサポート (2025/03/26)

Tamás Gulácsiの優れたGo言語用Godrorドライバは、Oracle Database 23ai VECTORデータ型をサポートするようになりました。これは、Oracle Databaseのドライバ開発グループのシニア・メンバーであるSudarshan Somaによるプル・リクエストのおかげです。

https://medium.com/oracledevs/the-go-godror-driver-now-supports-the-oracle-database-23ai-vector-data-type-8ab6f9cba31f

投稿者:Christopher Jones

Photo by Bernard Hermant on Unsplash




Oracle Database 23aiでは、人工知能および機械学習の検索操作を支援するVECTORデータ型が導入されました。ベクトルは、8ビットの符号付き整数、8ビットの符号なし整数、32ビットの浮動小数点数、または64ビットの浮動小数点数の同種の配列です。オプションで、データのディメンション数を定義できます。ベクトルは、データがほとんどゼロの場合は「密」(デフォルト)または「疎」にできます。


たとえば、2つのVECTOR列を含む表を作成するには、1つは64ビットの浮動小数点数の20次元を含む「密」で、もう1つは35個の8ビットの符号付き整数の疎ベクトルです。


create table vector_table (
v64 vector(20, float64),
v8 vector(35, int8, sparse)
)


Oracle Database 23aiでは、ベクトル埋込みの類似性検索など、VECTORデータ型として格納されている多くの高度な操作がサポートされています。詳細は、『Oracle AI Vector Search User's Guide』を参照してください。


ここでは、godror 0.48 (またはそれ以降)を使用するGoの基本的な例を示します。Oracle Database 23.7 (またはそれ以降)も必要です。コードは、ベクトルを挿入してフェッチするだけで、ベクトルを操作するgodror側を示します。


package main

import (
"context"
"database/sql"
"fmt"
"github.com/godror/godror"
"log"
"math/rand/v2"
"strconv"
"time"
)

// Generates a slice of random float32 numbers
func randomFloat32Slice(size int) []float32 {
slice := make([]float32, size)
for i := range slice {
slice[i] = rand.Float32() * 10
}
return slice
}

func main() {

db, err := sql.Open("godror", ` user="scott" password="tiger" connectString="localhost/orclpdb1" `)
if err != nil {
log.Fatalf("Failed to connect to database: %v", err)
}
defer db.Close()

ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

dropTable := `DROP TABLE IF EXISTS text_search`
_, err = db.ExecContext(ctx, dropTable)

// Create a table with VECTOR columns
dimensions := 5
createTable := `CREATE TABLE text_search (
id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
text_column CLOB NOT NULL,
dense_embedding VECTOR(`
+ strconv.Itoa(dimensions) + `),
sparse_embedding VECTOR(`
+ strconv.Itoa(dimensions) + `, FLOAT32, SPARSE))`
_, err = db.ExecContext(ctx, createTable)
if err != nil {
log.Fatalf("Error creating table: %v", err)
}
fmt.Println("Table created successfully.")

conn, err := db.Conn(ctx)
if err != nil {
log.Fatal(err)
}
defer conn.Close()

stmt, err := conn.PrepareContext(ctx, `INSERT INTO text_search (text_column, dense_embedding, sparse_embedding)
VALUES (:1,:2,:3)`
)
if err != nil {
log.Fatal(err)
}
defer stmt.Close()

// Insert some vector data
float32Vector := godror.Vector{Values: randomFloat32Slice(dimensions)}
sparseFloat32Vector := godror.Vector{Dimensions: uint32(dimensions), Indices: []uint32{0, 2, 4}, Values: randomFloat32Slice(3)}
_, err = stmt.ExecContext(ctx, "SAMPLE TEXT1", &float32Vector, &sparseFloat32Vector)
if err != nil {
log.Fatal(err)
}

float32Vector = godror.Vector{Values: randomFloat32Slice(dimensions)}
sparseFloat32Vector = godror.Vector{Dimensions: uint32(dimensions), Indices: []uint32{1, 3, 4}, Values: randomFloat32Slice(3)}
_, err = stmt.ExecContext(ctx, "SAMPLE TEXT2", &float32Vector, &sparseFloat32Vector)
if err != nil {
log.Fatal(err)
}
fmt.Println("Inserted rows successfully.")

// Query the vectors
rows, err := conn.QueryContext(ctx, fmt.Sprintf(`
SELECT id, text_column, dense_embedding, sparse_embedding from text_search`
))
if err != nil {
log.Fatal("QueryContext failed: %v", err)
}
defer rows.Close()

fmt.Println("Reading rows:")
for rows.Next() {
var outDenseEmbedding godror.Vector
var outSparseEmbedding godror.Vector
var outValue string
var id godror.Number
if err := rows.Scan(&id, &outValue, &outDenseEmbedding, &outSparseEmbedding); err != nil {
log.Fatal("Scan failed: %v", err)
}
fmt.Printf("\tID:[%s], Text:[%s], Dense Embedding:[%v] and Sparse Embedding:[%v]\n",
id, outValue, outDenseEmbedding.Values, outSparseEmbedding)
}
}


新しいgodror.Vector()構造体が使用されていることがわかります。


出力は次のようになります。


Table created successfully.
Inserted rows successfully.
Reading rows:
ID:[1], Text:[SAMPLE TEXT1], Dense Embedding:[[7.2318554 8.494286 2.4187808 5.6896343 1.2094277]] and Sparse Embedding:[{5 [0 2 4] [3.5823603 3.5613031 3.4197946] true}]
ID:[2], Text:[SAMPLE TEXT2], Dense Embedding:[[8.704301 2.638142 5.376678 7.2791424 1.3518274]] and Sparse Embedding:[{5 [1 3 4] [6.7112656 5.6008286 0.21929502] true}]


この例を簡単に拡張して、Oracle Database 23aiの類似性検索の機能を使用できます。


Goでベクトルを使用する方法を教えてください。


コメント

このブログの人気の投稿

Oracle Database 19cサポート・タイムラインの重要な更新 (2024/11/20)

Oracle GoldenGate 23aiでMicrosoft Fabricでのオープン・ミラーリングがサポートされるようになりました (2024/11/19)

Oracle Database Service for Azure(ODSA)とOracle Interconnect for Azureの比較 (2022/08/15)