ユーザーの略歴
404 経歴が見つかりません
2016年7月12日からのメンバー

@松川 幸久 さん、
$LIST形式のデータであれば、$LISTTOSTRING(list) というコマンドで文字列にできます。
ということで、こんなのはどうでしょうか?

   set line=time_" ["_type_"] "_gref
   if type="SET" {
      if $LISTVALID(gval) {   // if gval is $LIST data
         set gval="$LB("_$LISTTOSTRING(gval)_")"
      }
      set line=line_"="_gval
   }

わかりやすく $LB( ) で前後をくくってみました。 以下のように出力されます。

11/07/2024 02:50:12 [SET] ^["^^c:\intersystems\iris\mgr\user\"]naka=$LB(a,1,xyz)
11/07/2024 10:51:29 [SET] ^["^^c:\intersystems\iris\mgr\user\"]naka(2)=123


 

上記(2)は、あくまでテキストベースで参照するための簡単なサンプルになります。
そのため、グローバルの値が gval=$LB("abc","xyz")gval="abc"_$C(1)_"xyz" など制御コードが含まるときは、ファイルにはそのまま出力されませんので、その点ご注意くださいませ。

「そのようなデータも見たいな」と言われる方は、コメントなどでお寄せください。

@Minoru Horita さん、分かりやすいベクトル検索の紹介記事、ありがとうございます!具体的に、大量の日本語文章データをIRISに格納して、そこからIRISのSQL一発で 「意味が似ている」データをヒットさせるデモは、分かりやすくてワクワクしますね。

感想だけではなんなので、記事の一連のPythonコードを、以下のようなIRISクラスに置き換えてみました。
(1) プロパティは、日本語文書 contents とそのベクトルデータ contentsv の2つ
(2) sqlalchemy ではなく、IRIS上で INSERT文発行して、ベクトルデータを格納

全く同じロジックですが、Pythonコード含めて、少しでも他メンバーの方のご参考になればと掲載します。

Class User.nakav3 Extends %Persistent
{

Property contents As %String(MAXLEN = 4096);

Property contentsv As %Vector(DATATYPE = "DOUBLE", LEN = 768);

ClassMethod load() [ Language = python ]
{
    import iris
    import pandas as pd
    from pyarrow.parquet import ParquetFile
    import pyarrow as pa

    pf = ParquetFile('/var/tmp/cc100/0000.parquet')
    first_rows = next(pf.iter_batches(batch_size = 1000))
    df = pa.Table.from_batches([first_rows]).to_pandas()
    df = df.replace("\n","",regex=True)

    for index,row in df.iterrows():
        text = row['text'] 
        iris.cls('User.nakav3').insertToIRIS(text)

    print('Done')
}

ClassMethod search(question As %String)
{
    if $g(question)="" set question="大都市での生活は便利な半面、混雑や環境の悪さなどの問題もある。"

    set questionv=$tr(..Embedd(question)," '[]")
    set sql="SELECT TOP 5 VECTOR_DOT_PRODUCT(contentsv, TO_VECTOR(?, DOUBLE, 768)) as sim, contents"
    set sql=sql_" FROM SQLUser.nakav3 ORDER BY sim DESC"
    set rs=##class(%SQL.Statement).%ExecDirect(.stmt,.sql,.questionv)
    while rs.%Next() {
        write rs.%Get("sim")," ",rs.%Get("contents"),!
    }
}

ClassMethod insertToIRIS(text As %String)
{
    set textv=$tr(..Embedd(text)," '[]")
    &sql(insert into SQLUser.nakav3 (contents, contentsv) values (:text, TO_VECTOR(:textv, DOUBLE, 768) ) )
}

ClassMethod Embedd(text) As %String [ Language = python ]
{
   from sentence_transformers import SentenceTransformer
   model = SentenceTransformer('stsb-xlm-r-multilingual')
   embeddings = model.encode(text)
   # convert the embeddings to a string
   embeddings_list = [str(embedding.tolist()) for embedding in embeddings]
   return str(embeddings_list)
}

}


データロード
do ##class(User.nakav3).load()

データ検索
do ##class(User.nakav3).search("大都市での生活は便利な半面、混雑や環境の悪さなどの問題もある。")

Open Exchange アプリケーション:
認定証と Credly バッジ:
Global Mastersバッジ:
Seisukeさんはグローバルマスターズバッジをまだ取得していません。
フォロワー:
フォロー中:
Seisukeさんはまだ誰もフォローしていません。