<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">

  <channel>
    <title>Weaviate on @johtaniの日記 3rd</title>
    <link>https://blog.johtani.info/tags/weaviate/</link>
    <description>Recent content in Weaviate on @johtaniの日記 3rd</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ja</language>
    <lastBuildDate>Thu, 18 Dec 2025 12:41:50 +0000</lastBuildDate><atom:link href="https://blog.johtani.info/tags/weaviate/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Weaviateを使って個人的備忘録を作ってる</title>
      <link>https://blog.johtani.info/blog/2025/12/18/grimoire-keeper/</link>
      <pubDate>Thu, 18 Dec 2025 12:41:50 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2025/12/18/grimoire-keeper/</guid>
      <description>&lt;p&gt;本記事は、&lt;a href=&#34;https://qiita.com/advent-calendar/2025/search&#34;&gt;情報検索・検索技術Advent Calendar 2025&lt;/a&gt;の19日目の記事です（今年はなんか参加者が少なくてさみしいけど、きっと検索の人たちは検索流行ってて忙しいんだなということにしておこう）。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;本記事は、&lt;a href=&#34;https://qiita.com/advent-calendar/2025/search&#34;&gt;情報検索・検索技術Advent Calendar 2025&lt;/a&gt;の19日目の記事です（今年はなんか参加者が少なくてさみしいけど、きっと検索の人たちは検索流行ってて忙しいんだなということにしておこう）。&lt;/p&gt;
&lt;p&gt;こちらの&lt;a href=&#34;https://search-tech.connpass.com/event/370754/&#34;&gt;秋の検索勉強会&lt;/a&gt;で話をした内容になります。
録画に失敗したので記事を書いておくかなと。。。&lt;/p&gt;
&lt;p&gt;発表の資料と作ってるGitHubのリポジトリです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://noti.st/johtani/vzlnig/weaviate#s25Odsj&#34;&gt;Weaviateを使って個人的備忘録（まだ途中）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/johtani/grimoire-keeper&#34;&gt;johtani/grimoire-keeper&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;なんで作ってるの&#34;&gt;なんで作ってるの？&lt;/h2&gt;
&lt;p&gt;仕事柄（&lt;a href=&#34;https://blog.johtani.info/top/about/&#34;&gt;検索システムに関するコンサルなどをやっていたりします&lt;/a&gt;）、検索に関する記事をよく読んでいます。
Xだったり、どこかのSlackだったり、Googleニュースだったりといろんなところから出てくる記事になんとなく目を通したり、仕事で調べた検索に関する各社の公式ブログや論文などにも目を通しています。&lt;/p&gt;
&lt;p&gt;それなりの量を日々読んでいて、お客さんの話や質問で上がってくる内容に関連しそうな記事があったなぁと思うことが多々あります。
ただ、最近読んだことは覚えていても、どの記事だったかが見つけられないことがあるんです（年齢的な問題？）。&lt;/p&gt;
&lt;p&gt;なので、なんとなく読んで面白かった記事について、ブックマーク＋メモを残す仕組みをWeaviateを使って作ってみているという話です。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ちなみに、コードやドキュメントはAmazon QのVS Code拡張を使いながら書いてもらっています。
個人ツールはそれっぽい名前を付けてもらうために、作りたいものの概要を説明してから「中二病っぽい名前の候補を10個作って」とLLMにお願いして名前を付けています。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;なんでweaviate&#34;&gt;なんでWeaviate？&lt;/h2&gt;
&lt;p&gt;ベクトル検索を主体にしたいなぁというのがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;うろ覚えなのでなんとなくで検索できるようにしたい&lt;/li&gt;
&lt;li&gt;絞り込み検索もしたい（どのサイトとかは覚えてたりする）&lt;/li&gt;
&lt;li&gt;Weaviateを宣伝したい（&lt;a href=&#34;https://weaviate.connpass.com/&#34;&gt;Community作ろうとしてます&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;スライドではUIや前段のスクレイピングなどの話も記載していますが、今回のブログではWeaviateの部分を簡単に紹介する形にします。
Weaviateに登録する前段で記事の要約をして、関連するキーワードをLLMをつかって抽出する処理を入れてあります。&lt;/p&gt;
&lt;h3 id=&#34;スキーマの定義&#34;&gt;スキーマの定義&lt;/h3&gt;
&lt;p&gt;Weaviateでは、コレクションに対してデータを登録すれば&lt;a href=&#34;https://docs.weaviate.io/weaviate/config-refs/collections#auto-schema&#34;&gt;自動的にデータに合わせてスキーマを定義してくれる機能&lt;/a&gt;があります。
この場合、コレクションに作られるベクトル空間は1つとなります。&lt;/p&gt;
&lt;p&gt;ただ、今回はベクトル空間をいくつか用意したい（タイトル、要約、自分のメモなど）と思っているので、あらかじめコレクション作成時にこちらでスキーマを指定します。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# コレクション作成&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;client&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collections&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;create(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GrimoireChunk&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    description&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Grimoire Keeperで管理するWebページのチャンク&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    properties&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pageId&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;INT),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;chunkId&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;INT),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;TEXT),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;TEXT),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;memo&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;TEXT),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;TEXT),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;summary&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;TEXT),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keywords&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;TEXT_ARRAY),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;createdAt&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;DATE),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Property(name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;isSummary&amp;#34;&lt;/span&gt;, data_type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;DataType&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;BOOL),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    vector_config&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Configure&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Vectors&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;text2vec_openai(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content_vector&amp;#34;&lt;/span&gt;, source_properties&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Configure&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Vectors&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;text2vec_openai(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;title_vector&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            source_properties&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;summary&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Configure&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Vectors&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;text2vec_openai(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;memo_vector&amp;#34;&lt;/span&gt;, source_properties&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;memo&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/johtani/grimoire-keeper/blob/main/apps/api/src/grimoire_api/services/vectorizer.py#L185-L215&#34;&gt;GitHubのコードはこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;コレクションの定義をしている部分のコードです。
コレクションの名前（&lt;code&gt;name&lt;/code&gt;）、説明文（&lt;code&gt;description&lt;/code&gt;）、プロパティ（&lt;code&gt;properties&lt;/code&gt;：フィールド、カラムのようなもの）をまず定義しています。
プロパティにも説明を書いた方がいいのですが、今回は記述していないです
（ &lt;a href=&#34;https://docs.weaviate.io/agents/query&#34;&gt;Query Agent | Weaviate Documentation&lt;/a&gt;という機能も提供されており、エージェントがコレクションを検索するときのヒントになるので、コレクションやプロパティに説明を付けてあげたほうが今後の役に立つことになります）。&lt;/p&gt;
&lt;p&gt;ここまでは、よくあるスキーマの定義になりますが、最後の&lt;code&gt;vector_config&lt;/code&gt;がこのコレクションのベクトルに関する設定になります。&lt;/p&gt;
&lt;p&gt;今回は名前を付けたベクトル（&lt;a href=&#34;https://docs.weaviate.io/weaviate/config-refs/collections#named-vectors&#34;&gt;named vectors&lt;/a&gt;）を3つ設定しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;title_vector&lt;/code&gt;：タイトルと要約から生成するベクトル空間&lt;/li&gt;
&lt;li&gt;&lt;code&gt;content_vector&lt;/code&gt;：記事本文をチャンキングしたものから生成するベクトル空間&lt;/li&gt;
&lt;li&gt;&lt;code&gt;memo_vector&lt;/code&gt;：メモから生成するベクトル空間&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;すべて、入力としては&lt;code&gt;properties&lt;/code&gt;で定義したデータの型（今回はすべてテキスト）のデータになります。
Weaviateの内部で、ベクトル化モジュールがOpenAIのembeddingモデルをAPI経由で呼び出して、テキストからベクトルに変換して保存してくれます。
アプリとしては、タイトルや要約などはテキストとしてWeaviateにデータを登録するだけになります。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://docs.weaviate.io/weaviate/model-providers/openai/embeddings#select-a-model&#34;&gt;&lt;code&gt;model&lt;/code&gt;パラメータを設定する&lt;/a&gt;ことで、自分でモデルの選択もできますが、今回はデフォルトのモデルを使用するようにしています。&lt;/p&gt;
&lt;h3 id=&#34;データの登録&#34;&gt;データの登録&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;collection &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; client&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collections&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GrimoireChunk&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i, chunk &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; enumerate(chunks):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    weaviate_object &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pageId&amp;#34;&lt;/span&gt;: page_data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;id,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;chunkId&amp;#34;&lt;/span&gt;: i,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;: page_data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;url,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: page_data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;title,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;memo&amp;#34;&lt;/span&gt;: page_data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;memo &lt;span style=&#34;color:#f92672&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: chunk,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;summary&amp;#34;&lt;/span&gt;: page_data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;summary &lt;span style=&#34;color:#f92672&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;keywords&amp;#34;&lt;/span&gt;: json&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;loads(page_data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;keywords &lt;span style=&#34;color:#f92672&#34;&gt;or&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[]&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;createdAt&amp;#34;&lt;/span&gt;: (
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            page_data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;created_at&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;replace(tzinfo&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;isoformat() &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Z&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; page_data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;created_at&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;tzinfo &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; page_data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;created_at&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;isoformat()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;isSummary&amp;#34;&lt;/span&gt;: i &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; collection&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;data&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;insert(properties&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;weaviate_object)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/johtani/grimoire-keeper/blob/main/apps/api/src/grimoire_api/services/vectorizer.py#L83-L139&#34;&gt;GitHubのコードはこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;登録の処理の抜粋です。
前処理として本文の部分（&lt;code&gt;content&lt;/code&gt;）をチャンクに分割しているので、それらを登録しています。
それとは別に、&lt;code&gt;title_vector&lt;/code&gt;や&lt;code&gt;memo_vector&lt;/code&gt;のベクトル空間を検索した時に、不要なデータが表示されないように&lt;code&gt;isSummary&lt;/code&gt;ということで、最初のチャンクにフラグを立てて、それで絞り込めるようにしてあります。&lt;/p&gt;
&lt;h3 id=&#34;検索処理&#34;&gt;検索処理&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                collection &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; client&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;collections&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;GrimoireChunk&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;# フィルター条件構築&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                where_filter &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_build_weaviate_filter(filters) &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; filters &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                exclude_filter &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_build_exclude_filter(exclude_keywords) &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; exclude_keywords &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;# ベクトル別フィルター追加&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                summary_filter &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; vector_name &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;content_vector&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; weaviate.classes.query &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; Filter
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    summary_filter &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Filter&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;by_property(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;isSummary&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;equal(&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;# フィルター結合&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                filters_list &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; where_filter:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    filters_list&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(where_filter)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; summary_filter:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    filters_list&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(summary_filter)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; exclude_filter:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    filters_list&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(exclude_filter)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                final_filter &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; len(filters_list) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    final_filter &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; filters_list[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;elif&lt;/span&gt; len(filters_list) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    final_filter &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Filter&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;all_of(filters_list)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;# クエリ実行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                response &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; collection&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;query&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;near_text(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    query&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;query,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    target_vector&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;vector_name,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    limit&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;limit,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    filters&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;final_filter,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    return_metadata&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;MetadataQuery(certainty&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                )
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;# 結果変換&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;_convert_search_results_v4(response)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/johtani/grimoire-keeper/blob/main/apps/api/src/grimoire_api/services/search_service.py#L61-L99&#34;&gt;GitHubのコードはこちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;検索処理です。入力されたキーワードや文章をベクトル検索するのには&lt;code&gt;near_text&lt;/code&gt;メソッドを利用します。
&lt;code&gt;target_vector&lt;/code&gt;が検索対象となるベクトル空間の名前（例：&lt;code&gt;title_vector&lt;/code&gt;）の指定です。
クエリ実行前にいくつかのフィルタ条件を組み立てて、条件として追加してあります（期間だったり除外するキーワードなどの条件）。&lt;/p&gt;
&lt;p&gt;検索するときもこちらでベクトルに変換するなどの処理は行っておらず、テキストを&lt;code&gt;query&lt;/code&gt;に渡せば、よしなにWeaviate側でベクトル空間の設定をもとにエンベディングして検索をしてくれます。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;とりあえず、トラディショナルな感じのRAGのベースを自分でも試してみるかな？と思いながら作ってます。
が、いろいろと使ってみて気づくことが多いなとなってるところです。&lt;/p&gt;
&lt;p&gt;データはWeaviateに入れる前の時点でファイルとして保存するような作りにしているので、いろいろと改善できそうなことに手を出しながら触っていこうかなと思います（late interactionっぽいことやってみたり、チャットのUIを用意したり、チャンキングの仕組みを変えてみたり）。&lt;/p&gt;
&lt;p&gt;なんとなく、Weaviateの使い方がこんな感じかな？というイメージを持ってもらえたら幸いです。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Weaviate入門（Quickstart - Go言語編）</title>
      <link>https://blog.johtani.info/blog/2025/07/14/intro-weaviate-quickstart/</link>
      <pubDate>Mon, 14 Jul 2025 09:41:28 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2025/07/14/intro-weaviate-quickstart/</guid>
      <description>&lt;p&gt;いくつか用語も説明したので（&lt;a href=&#34;https://blog.johtani.info/blog/2025/07/01/intro-weaviate/&#34;&gt;ベクトルデータベース&lt;/a&gt;、&lt;a href=&#34;https://blog.johtani.info/blog/2025/07/04/intro-weaviate-collection/&#34;&gt;オブジェクト、コレクション&lt;/a&gt;、&lt;a href=&#34;https://blog.johtani.info/blog/2025/07/08/intro-weaviate-modules/&#34;&gt;モジュール&lt;/a&gt;）、そろそろちょっと触ってみる、クイックスタートを紹介します。&lt;/p&gt;
&lt;p&gt;英語で書かれた&lt;a href=&#34;https://docs.weaviate.io/weaviate/quickstart&#34;&gt;Quickstart (with cloud resources) | Weaviate Documentation&lt;/a&gt;もあるのですが、実は日本語のページが用意されてます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weaviate.io/ja&#34;&gt;Weaviate ベクトルデータベース | Weaviate&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こちらに沿って、簡単ですがクイックスタートを紹介します。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;いくつか用語も説明したので（&lt;a href=&#34;https://blog.johtani.info/blog/2025/07/01/intro-weaviate/&#34;&gt;ベクトルデータベース&lt;/a&gt;、&lt;a href=&#34;https://blog.johtani.info/blog/2025/07/04/intro-weaviate-collection/&#34;&gt;オブジェクト、コレクション&lt;/a&gt;、&lt;a href=&#34;https://blog.johtani.info/blog/2025/07/08/intro-weaviate-modules/&#34;&gt;モジュール&lt;/a&gt;）、そろそろちょっと触ってみる、クイックスタートを紹介します。&lt;/p&gt;
&lt;p&gt;英語で書かれた&lt;a href=&#34;https://docs.weaviate.io/weaviate/quickstart&#34;&gt;Quickstart (with cloud resources) | Weaviate Documentation&lt;/a&gt;もあるのですが、実は日本語のページが用意されてます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weaviate.io/ja&#34;&gt;Weaviate ベクトルデータベース | Weaviate&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;こちらに沿って、簡単ですがクイックスタートを紹介します。&lt;/p&gt;
&lt;p&gt;日本語のクイックスタートでは、Weaviateのクラスターに対して、「Jeopardy!」のデータを登録し、VectorizerモジュールとGeneratorモジュールにOpenAIのAPIを利用して、簡単なベクトル検索とRAG（検索拡張生成）を体験できます。&lt;/p&gt;
&lt;h2 id=&#34;0-openaiのapiキーの取得&#34;&gt;0 OpenAIのAPIキーの取得&lt;/h2&gt;
&lt;p&gt;このクイックスタートではOpenAIのAPIを利用します。
クイックスタートの「3.簡単なデータの取り込み」の「登録はこちら」リンクからOpenAIにサインアップするか、すでにOpenAIのAPIを利用されている方は、今回のためにAPIキーを生成して用意してください。&lt;/p&gt;
&lt;h2 id=&#34;1-weaviateデータベースの作成&#34;&gt;1 Weaviateデータベースの作成&lt;/h2&gt;
&lt;p&gt;マネージドサービスとして、&lt;a href=&#34;https://docs.weaviate.io/cloud/quickstart&#34;&gt;Weaviate Cloud&lt;/a&gt;が用意されています。&lt;/p&gt;
&lt;p&gt;ちょっと触ってみるのにはアカウントを作成してから、Sandboxクラスターを利用するのが簡単です。アカウント作成やSandboxクラスターの作成方法は以下のドキュメントを参考にしてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.weaviate.io/cloud/platform/create-account&#34;&gt;Create a user account | Weaviate Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.weaviate.io/cloud/manage-clusters/create&#34;&gt;Create a cluster | Weaviate Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なお、Sandboxクラスターは14日間で自動で削除されるのでそこだけ注意が必要です。
容量の制限もあるので、大量データで利用する場合は別途、Serverlessなどを選択する必要があります。&lt;/p&gt;
&lt;h2 id=&#34;2-weaviate-clientライブラリのインストール&#34;&gt;2 Weaviate Clientライブラリのインストール&lt;/h2&gt;
&lt;p&gt;クイックスタートで選択できる言語は以下の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;JavaScript / TypeScript&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;Java（最近クライアントが新しくなった）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;各言語向けのクライアントのインストール方法が表示されています。
Dockerなどで環境を用意してインストールをしてもいいですし、ローカルにインストールすることもできます。&lt;/p&gt;
&lt;p&gt;私は、Pythonを利用する場合はDevContainerの環境を用意したりします。
GoやJavaだとローカルで済ますかな？&lt;/p&gt;
&lt;p&gt;たとえば、Goのプロジェクトを作っておいて以下を実行します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;go get github.com/weaviate/weaviate-go-client/v5
go install
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;3-簡単なデータの取り込み&#34;&gt;3. 簡単なデータの取り込み&lt;/h2&gt;
&lt;h3 id=&#34;クライアントの接続&#34;&gt;クライアントの接続&lt;/h3&gt;
&lt;p&gt;まずは、Weaviate Cloudのクラスターへの接続情報が必要にです。&lt;/p&gt;
&lt;p&gt;1.で作成したクラスターをクリックし、Cluster detailsの画面で以下の情報をコピーし、環境変数に設定します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Informationのセクションの「REST Endpoint」の文字列を環境変数&lt;code&gt;WEAVIATE_URL&lt;/code&gt;に設定&lt;/li&gt;
&lt;li&gt;API Keysのセクションで、「+ Create API Key」ボタンをクリックし、出てきたダイアログで
&lt;ol&gt;
&lt;li&gt;Name：なんでもOK（例：&lt;code&gt;go-sample-client&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;Role：&lt;code&gt;admin&lt;/code&gt;を選択&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;生成されたAPIキーをコピーして、環境変数&lt;code&gt;WEAVIATE_API_KEY&lt;/code&gt;に設定（APIキーは生成するタイミングでダウンロードもできます）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Weaviateにあるモジュールを経由して、OpenAIのAPIを実行するために、OpenAIのAPIキーをリクエストヘッダ経由で設定します。実際の値は&lt;code&gt;OPENAI_API_KEY&lt;/code&gt;という環境変数から取得しますので、APIキーを環境変数&lt;code&gt;OPENAI_API_KEY&lt;/code&gt;に設定します。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a6e22e&#34;&gt;cfg&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;weaviate&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Config&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;Host&lt;/span&gt;:       &lt;span style=&#34;color:#a6e22e&#34;&gt;os&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Getenv&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;WEAVIATE_URL&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;Scheme&lt;/span&gt;:     &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;AuthConfig&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;auth&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ApiKey&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;Value&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;os&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Getenv&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;WEAVIATE_API_KEY&amp;#34;&lt;/span&gt;)},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;Headers&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;X-OpenAI-Api-Key&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;os&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Getenv&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;OPENAI_API_KEY&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;クイックスタートで使用する環境変数は以上の3つ（&lt;code&gt;WEAVIATE_URL&lt;/code&gt;、&lt;code&gt;WEAVIATE_API_KEY&amp;quot;&lt;/code&gt;、&lt;code&gt;OPENAI_API_KEY&lt;/code&gt;）です。&lt;/p&gt;
&lt;p&gt;ここまでのプログラムも実行できるので、実行してみましょう。
Weaviateへの接続情報に問題がなければ、「true」とだけ表示されます（現時点ではOpenAIのAPIへの接続は未確認です）。
（このあとには、&lt;code&gt;// Check the connection&lt;/code&gt;の処理の部分は変更します）&lt;/p&gt;
&lt;h3 id=&#34;データコレクションの作成&#34;&gt;データコレクションの作成&lt;/h3&gt;
&lt;p&gt;Weaviateでは、データを登録する前にコレクションを作成しておく必要があります。
今回の処理では、&lt;code&gt;models.Class&lt;/code&gt;という構造体を使ってスキーマを定義します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コレクションの名前（&lt;code&gt;Class&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;使用するベクトライザー（&lt;code&gt;text2vec-openai&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;使用するモジュール（&lt;code&gt;text2vec-openai&lt;/code&gt;、&lt;code&gt;generative-openai&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;使用するベクトライザーは、このコレクションでエンベディングのベクトル生成に利用するデフォルトのベクトライザーになります。&lt;/p&gt;
&lt;p&gt;このクイックスタートでは、プロパティについては、データ登録時に自動で設定するようにしています。プロパティ個別にベクトライザーやその他の設定を行うこともできます（&lt;a href=&#34;https://docs.weaviate.io/weaviate/manage-collections/collection-operations#create-a-collection-and-define-properties&#34;&gt;Basic collection operations | Weaviate Documentation&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;なお、今回の処理では、エラーが出力されなければ問題なくコレクションが作成されたということになります。エラー出ない場合のメッセージの処理がないためです。&lt;/p&gt;
&lt;p&gt;Weaviate Cloudのコンソールで「Collections」をクリックし、先ほど作成したクラスターを選択した後に、「Question」というコレクションが表示されているかを確認することで処理の成功を確認できます。&lt;/p&gt;
&lt;h3 id=&#34;データ登録&#34;&gt;データ登録&lt;/h3&gt;
&lt;p&gt;コレクションの作成もおわったので、Jeopardyのデータを登録します。
処理の流れとしては次のようになっています。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Weaviateのクライアント接続&lt;/li&gt;
&lt;li&gt;JSONファイルのダウンロードしてmapの配列に&lt;/li&gt;
&lt;li&gt;1データずつ、&lt;code&gt;models.Object&lt;/code&gt;の構造体に変換&lt;/li&gt;
&lt;li&gt;ObjectsBatcher()を利用して、バッチ登録
&lt;ol&gt;
&lt;li&gt;Weaviateがデータを受け取って、&lt;code&gt;text2vec-openai&lt;/code&gt;モジュールを使ってベクトルに変換してからベクトルインデックスに登録&lt;/li&gt;
&lt;li&gt;JSONのプロパティからWeaviateのスキーマを自動で生成してくれる&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;3の構造体を作るときに、JSONの文字列のデータを入れているだけで、このタイミングではベクトルは生成していません。
4.1に書いたように、Weaviate内部でOpenAIのAPIを利用してエンベディングの生成を行います。
ですので、この処理を実行するときにはOpenAIのAPIキーを設定しておく必要があります。&lt;/p&gt;
&lt;p&gt;コレクションの作成と同様に、エラーがなければ成功です。&lt;/p&gt;
&lt;p&gt;ちなみに、OpenAIのAPIキーを設定せずに実行すると、次のようなエラーが出ます。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;panic&lt;/span&gt;: ([]&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;models&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ErrorResponseErrorItems0&lt;/span&gt;) &lt;span style=&#34;color:#ae81ff&#34;&gt;0xc000008870&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;goroutine&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; [&lt;span style=&#34;color:#a6e22e&#34;&gt;running&lt;/span&gt;]:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#f92672&#34;&gt;...&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;weaviate&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;quickstart&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;go&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;.&lt;span style=&#34;color:#66d9ef&#34;&gt;go&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;68&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0x745&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記のサンプルのままでは、&lt;code&gt;res.Result.Errosrs.Error&lt;/code&gt;は配列のためエラーが発生してしまいました。&lt;/p&gt;
&lt;p&gt;次のように修正することで、登録時のレスポンスにエラーが含まれている場合に、エラーの内容がきちんと表示できます。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;range&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;batchRes&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Result&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Errors&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;items0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;range&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;res&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Result&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Errors&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Error&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				println(&lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Sprintf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Error is %v&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;items0&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;APIキーの設定を忘れているとこんな感じのエラーメッセージになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Error is &amp;amp;{API Key: no api key found neither in request header: X-Openai-Api-Key nor in environment variable under OPENAI_APIKEY}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;データ登録できたかどうかは、この後のクエリで確認もできますし、先ほどのコンソールでのコレクションを見ると「10 objects」となってデータが登録されているのも分かります。&lt;/p&gt;
&lt;h2 id=&#34;4-クエリ方法&#34;&gt;4. クエリ方法&lt;/h2&gt;
&lt;p&gt;最後は検索です。
クイックスタートでは、ベクトル検索とRAG（検索拡張生成）を試すことができます。&lt;/p&gt;
&lt;h3 id=&#34;ベクトル検索&#34;&gt;ベクトル検索&lt;/h3&gt;
&lt;p&gt;入力テキストからベクトライザーでベクトルを生成して、そのベクトルをもとにベクトルインデックスを検索する処理です。&lt;/p&gt;
&lt;p&gt;今回のクイックスタートでは、検索には次の情報が指定されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;検索結果に含めるプロパティ（フィールド）
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[]graphql.Field&lt;/code&gt;に指定しているもの&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;クエリ文字列
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nearText&lt;/code&gt;に調べたい文章（今回は&lt;code&gt;biology&lt;/code&gt;という単語）を設定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;検索対象のクラス名（コレクション名）
&lt;ul&gt;
&lt;li&gt;「Question」&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;取得する件数（最もベクトルが近いものn件）
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;WithLimit&lt;/code&gt;に&lt;code&gt;2&lt;/code&gt;を指定&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;返却される&lt;code&gt;result&lt;/code&gt;に検索結果が入っています。中身はWebに掲載されています（ローカルだとインデントされてないですが）。&lt;/p&gt;
&lt;h3 id=&#34;rag&#34;&gt;RAG&lt;/h3&gt;
&lt;p&gt;ベクトル検索では、入力のテキストに近いオブジェクトを取得するだけでした。
RAGのサンプルコードでは、ベクトル検索をして結果を取得するところまでは同じ流れですが、
取得した後に、それぞれのオブジェクトのデータを使って文章の生成をモジュールを使用して行う処理が追加されています（&lt;code&gt;WithGenerativeSearch()&lt;/code&gt;メソッド）。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;generativeSearch := graphql.NewGenerativeSearch().SingleResult(&amp;#34;Explain {answer} as you might to a five-year-old.&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;{answer}&lt;/code&gt;に、ベクトル検索の結果のオブジェクトの&lt;code&gt;answer&lt;/code&gt;プロパティの文字列が入ります。
そして、生成モジュールを通して、テキストが生成され、その結果が&lt;code&gt;_additional&lt;/code&gt;の&lt;code&gt;generate&lt;/code&gt;の中に帰ってきています。&lt;/p&gt;
&lt;p&gt;クライアントアプリ側では、特にOpenAIのAPIの呼び出しを行っていませんが、文字列の生成までできています。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、&lt;a href=&#34;https://weaviate.io/ja&#34;&gt;日本語に翻訳されたクイックスタート&lt;/a&gt;についてGo言語のサンプルコードをもとに紹介をしました。
数件しかデータを入れていないですが、簡単に動作を確認できるかと思います。&lt;/p&gt;
&lt;p&gt;クイックスタートはまだほんの入り口にすぎません。Weaviateでできることはほかにもあるので、ちょっとずつこれからも紹介していこうかと思います。&lt;/p&gt;
&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;
&lt;p&gt;日本のコミュニティとしてConnpassにグループを作りました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weaviate.connpass.com/&#34;&gt;Weaviate JP Community - connpass&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どうやってイベントをやるかはまだ考え中ですが、興味がある方は登録しておいていただければと。&lt;/p&gt;
&lt;p&gt;どんな情報、どんなイベントがあれば興味をもっていただけるか？Weaviateを使ってみようと思うけど何から始めよう？など疑問に思うことがあればXやブログのコメントなどをいただければと思います。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Weaviate入門（モジュール）</title>
      <link>https://blog.johtani.info/blog/2025/07/08/intro-weaviate-modules/</link>
      <pubDate>Tue, 08 Jul 2025 08:25:32 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2025/07/08/intro-weaviate-modules/</guid>
      <description>&lt;p&gt;今回も用語の話です。
今回は仕組みの用語「モジュール」です。&lt;/p&gt;
&lt;h2 id=&#34;モジュール&#34;&gt;モジュール&lt;/h2&gt;
&lt;p&gt;Weaviateを利用する際にいくつかの機能についてモジュール化されています。
根幹となるベクトルデータベース周りに便利な処理を提供するのがモジュールです。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;今回も用語の話です。
今回は仕組みの用語「モジュール」です。&lt;/p&gt;
&lt;h2 id=&#34;モジュール&#34;&gt;モジュール&lt;/h2&gt;
&lt;p&gt;Weaviateを利用する際にいくつかの機能についてモジュール化されています。
根幹となるベクトルデータベース周りに便利な処理を提供するのがモジュールです。&lt;/p&gt;
&lt;h3 id=&#34;ベクトライザーモジュール&#34;&gt;ベクトライザーモジュール&lt;/h3&gt;
&lt;p&gt;たとえば、Weaviateはベクトルデータベースですが、登録するデータのベクトルを生成する「ベクトライザー」と呼ばれるモジュールを備えています。
これにより、データ登録や検索時にアプリケーション側で独自にベクトルを生成してからWeaviateに問い合わせる必要がなくなり、より簡単に検索やデータ登録をできるようになっています。
ベクトライザーと呼ばれるモジュールには、様々なモデルやモデルプロバイダー（OpenAIやCohere、Weaviate、Jina AI、Hugging Faceなど）のモジュールが用意されています。&lt;a href=&#34;https://docs.weaviate.io/weaviate/configuration/modules#enable-vectorizer-modules&#34;&gt;必要に応じてモジュールを有効にする&lt;/a&gt;ことができます。&lt;/p&gt;
&lt;p&gt;また、&lt;a href=&#34;https://docs.weaviate.io/weaviate/modules/custom-modules&#34;&gt;カスタムモジュール&lt;/a&gt;ということで、独自のモジュールを作成できるようにもなっています。利用可能なモデルプロバイダーがなかったり、機能の追加をしたい場合はドキュメントをご覧ください。&lt;/p&gt;
&lt;p&gt;もちろん、ベクトライザーを使用せずに、独自のベクトルのデータを登録したり、検索に使用することも可能です。&lt;/p&gt;
&lt;h3 id=&#34;生成モジュール&#34;&gt;生成モジュール&lt;/h3&gt;
&lt;p&gt;ベクトライザーはエンベディングの生成の用途でしたが、生成モジュール（生成AIモジュール？）と呼ばれるものもあります。
こちらは、検索した結果をもとに、回答を生成することもできます。RAGのGenerateの部分です。
検索するだけでなく、回答の生成のためにLLMを呼び出す仕組みも用意されています。&lt;/p&gt;
&lt;h2 id=&#34;weaviateの公式ドキュメント&#34;&gt;Weaviateの公式ドキュメント&lt;/h2&gt;
&lt;p&gt;今回はモジュールについて少しだけ紹介しました。
モジュールの概念に関するWeaviateのドキュメントを&lt;a href=&#34;https://docs.weaviate.io/weaviate/concepts/modules&#34;&gt;Modules | Weaviate Documentation&lt;/a&gt;ご覧いただくとそのほかのモジュールについても記載があります。
また、モデルプロバイダーに関するページも参考にしてください（&lt;a href=&#34;https://docs.weaviate.io/weaviate/model-providers&#34;&gt;Model provider integrations | Weaviate Documentation&lt;/a&gt;）。&lt;/p&gt;
&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;
&lt;p&gt;日本のコミュニティとしてConnpassにグループを作りました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weaviate.connpass.com/&#34;&gt;Weaviate JP Community - connpass&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どうやってイベントをやるかはまだ考え中ですが、興味がある方は登録しておいていただければと。&lt;/p&gt;
&lt;p&gt;どんな情報、どんなイベントがあれば興味をもっていただけるか？Weaviateを使ってみようと思うけど何から始めよう？など疑問に思うことがあればXやブログのコメントなどをいただければと思います。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Weaviate入門（オブジェクト、コレクション）</title>
      <link>https://blog.johtani.info/blog/2025/07/04/intro-weaviate-collection/</link>
      <pubDate>Fri, 04 Jul 2025 03:16:01 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2025/07/04/intro-weaviate-collection/</guid>
      <description>&lt;p&gt;ソフトウェアやサーバーによって用語って変わりますよね？
ベクトルデータベースのWeaviateも、私がこれまで触ってきたものとは違う用語が使われているので、いくつかの用語を紹介しようと思います。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;ソフトウェアやサーバーによって用語って変わりますよね？
ベクトルデータベースのWeaviateも、私がこれまで触ってきたものとは違う用語が使われているので、いくつかの用語を紹介しようと思います。&lt;/p&gt;
&lt;h2 id=&#34;データオブジェクト&#34;&gt;データオブジェクト&lt;/h2&gt;
&lt;p&gt;1件のデータのことをデータオブジェクトと呼びます。
データオブジェクトはプロパティ（名前とデータ型）を持っており、コレクション（クラスと呼ばれることもある）と呼ばれるデータの集合（RDBでいうテーブルのようなもの）に属します。
データオブジェクトはJSONドキュメントとして表現されます。
データオブジェクトを登録する場合は、コレクションに対して登録します。&lt;/p&gt;
&lt;p&gt;ベクトルデータベースなので、データオブジェクトに直接自分で作成したベクトルを含めて登録することもできますが、Weaviateでは、&lt;a href=&#34;https://weaviate.io/developers/weaviate/modules#vectorizer-reranker-and-generative-ai-integrations&#34;&gt;ベクトライザー&lt;/a&gt;と呼ばれるベクトルエンベディングをWeaviateのモジュールが生成してくれる機能があります（OpenAIのAPIを利用したエンベディングなど、さまざまなエンベディングのAPIを呼ぶ設定ができるようになっている）。
コレクションの作成時にこのベクトライザーを定義しておくと、コレクションにデータを登録するとベクトルを生成して検索できるようにしてくれます。&lt;/p&gt;
&lt;h2 id=&#34;コレクション&#34;&gt;コレクション&lt;/h2&gt;
&lt;p&gt;RDBでいうテーブルのようなものです。
コレクションに対してデータオブジェクトを登録、更新などを行えます。
コレクションにはスキーマが定義されており、コレクションに属するデータオブジェクトがどのようなプロパティを持っているのかがわかります。&lt;/p&gt;
&lt;p&gt;コレクション作成時にスキーマを定義することもできますが、チュートリアルなどでは、自動生成されるスキーマを利用している場合があります。
また、上記でも説明したようにベクトライザーと呼ばれるベクトル生成のためのモジュールの設定などもこちらで定義できます。&lt;/p&gt;
&lt;p&gt;コレクションごとにベクトル空間があり、その中でベクトル検索ができるようになっています。
また、バージョン1.24からは、&lt;a href=&#34;https://weaviate.io/developers/weaviate/concepts/data#multiple-vector-embeddings-named-vectors&#34;&gt;名前付きベクトル&lt;/a&gt;と呼ばれる機能が追加され、1つのコレクションに対して複数のベクトル空間を作ることもできるようになっています。&lt;/p&gt;
&lt;p&gt;ベクトル以外にも、&lt;a href=&#34;https://weaviate.io/developers/weaviate/concepts/indexing#inverted-indexes&#34;&gt;転置インデックス&lt;/a&gt;の設定もできるようになっており、いわゆるハイブリッド検索（転置インデックスを利用した検索＋ベクトル検索）も可能になっています。&lt;/p&gt;
&lt;h2 id=&#34;weaviateの公式ドキュメント&#34;&gt;Weaviateの公式ドキュメント&lt;/h2&gt;
&lt;p&gt;今回紹介したデータの概念などに関するWeaviateのドキュメントは&lt;a href=&#34;https://weaviate.io/developers/weaviate/concepts/data&#34;&gt;Data structure | Weaviate&lt;/a&gt;にあります。&lt;/p&gt;
&lt;p&gt;図などもありますので、参考にしていただければと。&lt;/p&gt;
&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;
&lt;p&gt;日本のコミュニティとしてConnpassにグループを作りました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weaviate.connpass.com/&#34;&gt;Weaviate JP Community - connpass&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どうやってイベントをやるかはまだ考え中ですが、興味がある方は登録しておいていただければと。&lt;/p&gt;
&lt;p&gt;どんな情報、どんなイベントがあれば興味をもっていただけるか？Weaviateを使ってみようと思うけど何から始めよう？など疑問に思うことがあればXやブログのコメントなどをいただければと思います。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Weaviate入門（ベクトルデータベース、ベクトル）</title>
      <link>https://blog.johtani.info/blog/2025/07/01/intro-weaviate/</link>
      <pubDate>Tue, 01 Jul 2025 06:11:01 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2025/07/01/intro-weaviate/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://weaviate.io/&#34;&gt;Weaviate&lt;/a&gt;って聞いたことありますか？&lt;/p&gt;
&lt;p&gt;Goで書かれたOSSのベクトルデータベースです（&lt;a href=&#34;https://github.com/weaviate/weaviate&#34;&gt;GitHubリポジトリはこちら&lt;/a&gt;）。
&lt;a href=&#34;https://blog.johtani.info/blog/2024/12/17/japanese-search-with-weaviate/&#34;&gt;昨年、Kagomeを使えるようにPRを送って、発表をしてきました&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;改めて、Weaviateはどんなものなのか？というのを少しずつアウトプットしていこうかと思いブログを書き始めたところです（日本で広めていく手伝いもすることになったので）。
まずは、用語などの説明から少しずつ始めていこうと思います。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;a href=&#34;https://weaviate.io/&#34;&gt;Weaviate&lt;/a&gt;って聞いたことありますか？&lt;/p&gt;
&lt;p&gt;Goで書かれたOSSのベクトルデータベースです（&lt;a href=&#34;https://github.com/weaviate/weaviate&#34;&gt;GitHubリポジトリはこちら&lt;/a&gt;）。
&lt;a href=&#34;https://blog.johtani.info/blog/2024/12/17/japanese-search-with-weaviate/&#34;&gt;昨年、Kagomeを使えるようにPRを送って、発表をしてきました&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;改めて、Weaviateはどんなものなのか？というのを少しずつアウトプットしていこうかと思いブログを書き始めたところです（日本で広めていく手伝いもすることになったので）。
まずは、用語などの説明から少しずつ始めていこうと思います。&lt;/p&gt;
&lt;h2 id=&#34;ベクトルデータベース&#34;&gt;ベクトルデータベース？&lt;/h2&gt;
&lt;p&gt;最近では、RAG（Retrieval-Augmented Generation）などで利用されるものというイメージが多いかもしれないです。&lt;/p&gt;
&lt;p&gt;ベクトルデータベースとは、データオブジェクトとそれを表現するベクトルを保存してベクトルの近いものを検索することができるものです。
データオブジェクトはベクトルのもととなるテキストなどに加えて、メタデータを含んだ情報です。&lt;/p&gt;
&lt;p&gt;検索する際に、クエリをベクトルに変換したものに近いベクトルを持ったデータオブジェクトを探してくることができます。
近いベクトルというのは、類似のベクトルを探してくると言い換えることもできます。
これにより、ベクトルとして似ているものを検索して並べることが可能となります。&lt;/p&gt;
&lt;p&gt;ベクトルデータベースは、大量のベクトルデータに対してさまざまな技術を用いて素早く検索をする仕組みを提供します。&lt;/p&gt;
&lt;h2 id=&#34;ベクトル&#34;&gt;ベクトル？&lt;/h2&gt;
&lt;p&gt;RAGという観点だとテキストの検索のイメージがありますが、ベクトルにできるものはテキストだけではありません。
画像、動画、音声、何かしらの特徴量をベクトルにするといったことも可能です。
LLMの流行の前から画像の検索などにベクトルが用いられてきました。&lt;/p&gt;
&lt;p&gt;また、LLMの活用によってテキスト情報をベクトル埋め込みと呼ばれる手法でベクトルにすることで、これまでのキーワードによるテキストや単語の完全一致ではなく、意味的な類似によって情報を検索できるようになってきています。
このため、ベクトル検索はセマンティック検索（意味的な検索）とも呼ばれています。&lt;/p&gt;
&lt;p&gt;ベクトル空間に異なるデータのベクトルを統合することで、マルチモーダルなベクトル検索を可能にすることなどもできます（昨年やったデモはキーワードで画像を検索してみました）。&lt;/p&gt;
&lt;h2 id=&#34;weaviateの公式ブログ&#34;&gt;Weaviateの公式ブログ&lt;/h2&gt;
&lt;p&gt;Weaviateの公式ブログにはさらっと私が書いたこと以上にベクトルデータベースに関する記事（ &lt;a href=&#34;https://weaviate.io/blog/what-is-a-vector-database&#34;&gt;A Gentle Introduction to Vector Databases | Weaviate&lt;/a&gt;）やベクトル検索に関する記事（&lt;a href=&#34;https://weaviate.io/blog/vector-search-explained&#34;&gt;Bring your own vectors | Weaviate&lt;/a&gt;）が公開されています。
こちらも参考になるかと。&lt;/p&gt;
&lt;p&gt;これ以外にもWeaviateのブログではLLMやRAGにまつわる技術の紹介などがされているので興味がある方はご覧いただければと（たとえば、&lt;a href=&#34;https://weaviate.io/blog/late-interaction-overview&#34;&gt;Late Interactionの話とか&lt;/a&gt;）。&lt;/p&gt;
&lt;h2 id=&#34;最後に&#34;&gt;最後に&lt;/h2&gt;
&lt;p&gt;ということで？、日本のコミュニティとしてConnpassにグループを作りました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://weaviate.connpass.com/&#34;&gt;Weaviate JP Community - connpass&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どうやってイベントをやるかはまだ考え中ですが、興味がある方は登録しておいていただければと。&lt;/p&gt;
&lt;p&gt;どんな情報、どんなイベントがあれば興味をもっていただけるか？Weaviateを使ってみようと思うけど何から始めよう？など疑問に思うことがあればXやブログのコメントなどをいただければと思います。&lt;/p&gt;
</content:encoded>
    </item>
    
    <item>
      <title>Weaviateで日本語を利用した検索という話をしました</title>
      <link>https://blog.johtani.info/blog/2024/12/17/japanese-search-with-weaviate/</link>
      <pubDate>Tue, 17 Dec 2024 13:22:01 +0000</pubDate>
      
      <guid>https://blog.johtani.info/blog/2024/12/17/japanese-search-with-weaviate/</guid>
      <description>&lt;p&gt;この記事は&lt;a href=&#34;https://qiita.com/advent-calendar/2024/search&#34;&gt;情報検索・検索技術 - Qiita Advent Calendar 2024 - Qiita&lt;/a&gt;の17日目（ちょっと遅刻？）の記事となります。&lt;/p&gt;
&lt;p&gt;「&lt;a href=&#34;https://weaviate-japan-event.peatix.com/&#34;&gt;【日本初主催】新世代のソフトウェアのためのAIネイティブデータベース Weaviate Japan Summit | Peatix&lt;/a&gt;」というイベントで&lt;a href=&#34;https://github.com/ikawaha/kagome&#34;&gt;Kagome&lt;/a&gt;でテキスト検索できる仕組みを実装したものを取り込んでもらった話をしてきました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://weaviate.io/&#34;&gt;Weaviate&lt;/a&gt;とは、ベクトル検索やキーワード検索、RAGなどを手軽に体験できるデータベースになります。
OSSで公開されており、SaaSも提供されています。Goで実装されていることもあり、日本語の検索に&lt;a href=&#34;https://github.com/ikawaha/kagome&#34;&gt;Kagome&lt;/a&gt;が利用できるかも？ということでちょっと調べて実装してみました。&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;この記事は&lt;a href=&#34;https://qiita.com/advent-calendar/2024/search&#34;&gt;情報検索・検索技術 - Qiita Advent Calendar 2024 - Qiita&lt;/a&gt;の17日目（ちょっと遅刻？）の記事となります。&lt;/p&gt;
&lt;p&gt;「&lt;a href=&#34;https://weaviate-japan-event.peatix.com/&#34;&gt;【日本初主催】新世代のソフトウェアのためのAIネイティブデータベース Weaviate Japan Summit | Peatix&lt;/a&gt;」というイベントで&lt;a href=&#34;https://github.com/ikawaha/kagome&#34;&gt;Kagome&lt;/a&gt;でテキスト検索できる仕組みを実装したものを取り込んでもらった話をしてきました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://weaviate.io/&#34;&gt;Weaviate&lt;/a&gt;とは、ベクトル検索やキーワード検索、RAGなどを手軽に体験できるデータベースになります。
OSSで公開されており、SaaSも提供されています。Goで実装されていることもあり、日本語の検索に&lt;a href=&#34;https://github.com/ikawaha/kagome&#34;&gt;Kagome&lt;/a&gt;が利用できるかも？ということでちょっと調べて実装してみました。&lt;/p&gt;
&lt;p&gt;先週の発表に利用した資料は次のリンク先で公開してあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スライド：&lt;a href=&#34;https://noti.st/johtani/9399yD/weaviate&#34;&gt;Weaviateの日本語対応とマルチモーダル・多言語検索デモ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;セッションでは、日本語のキーワード検索だけではなく、ベクトル検索やキーワードとベクトルを組み合わせたハイブリッド検索をデモしました。
今回はセッションで話をあまりしていない、デモの仕組みに関してブログにまとめようと思います。&lt;/p&gt;
&lt;h2 id=&#34;デモデータについて&#34;&gt;デモデータについて&lt;/h2&gt;
&lt;p&gt;今回は日本語を用いたデモ（今回取り込んでもらった機能を紹介するデモ）が必須であったため、次のような要件でデモを考えていました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;日本語テキストに対してキーワード検索&lt;/li&gt;
&lt;li&gt;ベクトル化したデータも検索（Weaviateの得意分野）&lt;/li&gt;
&lt;li&gt;せっかく日本でやるイベントなので日本語を使ったベクトル検索がいい&lt;/li&gt;
&lt;li&gt;ハイブリッド検索やフィルタ検索（ベクトル検索した結果をキーワードでフィルタリング）のデモをやりたい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;テキストだけで当初はデータを探そうと思っていたのですが、ベクトル検索とキーワードの検索での違いが分かりにくくなりそうかも？という懸念がありました。
それよりも、画像を日本語で検索でき、画像に日本語の文章の説明がついているデータがデモをするときの流れも作りやすいのでは？と思い、まずは、Weaviateのマルチモーダルのデモを探すことに。&lt;/p&gt;
&lt;h3 id=&#34;デモのシステムのベース&#34;&gt;デモのシステムのベース&lt;/h3&gt;
&lt;p&gt;Weaviateの方たちは様々なデモを用意してくれており、マルチモーダル検索のデモも用意されていました。
ベースとしたのは、次のリンク先で公開されているサンプルになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/weaviate/weaviate-examples/blob/main/clip-multi-modal-text-image-search/README.md&#34;&gt;weaviate-examples/clip-multi-modal-text-image-search/README.md at main · weaviate/weaviate-examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このサンプルは3つの要素から構成されています。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Weaviate Server&lt;/li&gt;
&lt;li&gt;CLIPモデルを用いたServer（&lt;a href=&#34;https://github.com/weaviate/multi2vec-clip-inference/tree/main&#34;&gt;Hugging Faceを利用したサービス&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;Node.jsによるフロントエンド&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最初の2つはDockerで起動するコンテナとなっています。&lt;/p&gt;
&lt;p&gt;Weaviateにはモジュールという概念があります。このモジュールの中で、入力されたデータをもとにベクトル化するものを&lt;a href=&#34;https://weaviate.io/developers/weaviate/configuration/modules#vectorizer-modules&#34;&gt;Vectorizer&lt;/a&gt;と呼んでいます。
今回は&lt;code&gt;multi2vec-clip&lt;/code&gt;というVectorizerを利用して、Weaviateから2のCLIPモデルを用いたサービスを呼び出し、画像やテキストをベクトル化してWeaviateに保存したり利用する形をとっています。&lt;/p&gt;
&lt;p&gt;上記のサンプルでは、特定のディレクトリ（&lt;code&gt;images&lt;/code&gt;）に入れた画像をWeaviateに登録する処理（&lt;a href=&#34;https://github.com/weaviate/weaviate-examples/blob/main/clip-multi-modal-text-image-search/import/go/cmd/main.go&#34;&gt;Goで書かれたコマンド&lt;/a&gt;）が用意されています。&lt;/p&gt;
&lt;p&gt;フロントエンドでは、検索窓が用意されておりテキストを入力すると、画像が検索結果として出てくるデモです。&lt;/p&gt;
&lt;p&gt;テキストを入力としてベクトル検索をするデモの部分はこれでよいのですが、今回はこれに加えてキーワードで検索できるようなデータが必要となります。&lt;/p&gt;
&lt;h3 id=&#34;デモデータの準備&#34;&gt;デモデータの準備&lt;/h3&gt;
&lt;p&gt;キーワード検索をするために、画像＋テキスト（しかも日本語がよい）ということで、いくつか物色した結果、採用したでものデータは次のものになりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://cocodataset.org/#home&#34;&gt;MS COCO&lt;/a&gt;データセット&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://captions.stair.center/&#34;&gt;日本語のキャプションデータ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MS COCOと呼ばれる、画像に対していくつかのメタデータを追加してあるデータセットが公開されています。
追加されてデータは次のようなものになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オブジェクト（画像内の位置と移っているオブジェクトのカテゴリ名）&lt;/li&gt;
&lt;li&gt;キャプション（画像に関する説明文が5つ）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ただし、キャプションデータはもちろん英語となっています。
このデータに対して、千葉工業大学の研究センターの方が日本語でキャプションデータを生成したものを公開してくれています。&lt;/p&gt;
&lt;p&gt;MS COCOのの画像のうち商用利用可能なライセンスの画像を今回のデモ用に利用させていただきました。
それぞれのファイルをダウンロードし、MS COCOの画像ファイル名をキーにして英語と日本語のキャプションデータを配列で持つようなJSONデータを生成し、それをもとにWeaviateにデータ登録する形です。&lt;/p&gt;
&lt;p&gt;処理の内容は省きますが、上記のデータセットをもとに次のような1ファイル1JSONを作って、JSONLファイル（1行1JSON）として保存したものを読み込んでWeaviateに登録しています。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-JSON&#34; data-lang=&#34;JSON&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;200109&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;license_id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;4&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;license_name&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Attribution License&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;filename&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;COCO_val2014_000000200109.jpg&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;date_captured&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2013-11-22 02:26:57&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;caption_en&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;645817&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;A slice of pizza partially obscuring a cell phone.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;caption_jp&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;41320&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;食事をしながらメールチェックをする&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;category&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;英語のキャプションは登録はしましたが、今回のデモには利用しませんでした（日本語で検索できるところを見せたかったので）&lt;/p&gt;
&lt;h2 id=&#34;スキーマの定義&#34;&gt;スキーマの定義&lt;/h2&gt;
&lt;p&gt;上記のデータをもとに考えたWeaviateのスキーマは次のようなものになります。
Weaviateで利用できる日本語のトークナイザーのうち、GSEとKagomeを利用してデモをできるようにそれぞれをTokenizationに指定したフィールドを&lt;code&gt;caption_ja_gse&lt;/code&gt;、&lt;code&gt;caption_ja&lt;/code&gt;として用意しました。&lt;/p&gt;
&lt;p&gt;画像からベクトルを生成して保存する定義は、&lt;code&gt;Vectorizer&lt;/code&gt;という部分の&lt;code&gt;multi2vec-clip&lt;/code&gt;になります。
実際に、画像からベクトルを生成するのは、&lt;code&gt;multi2vec-clip&lt;/code&gt;という名前のコンテナで動いているCLIPのモデルを通して処理をします（&lt;a href=&#34;https://github.com/weaviate/multi2vec-clip-inference/tree/main&#34;&gt;コンテナ内部で動いている処理などはこちらで公開&lt;/a&gt;されています）。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Go&#34; data-lang=&#34;Go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;multiModal&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;models&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Class&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;Class&lt;/span&gt;:       &lt;span style=&#34;color:#a6e22e&#34;&gt;ClassName&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;Description&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Sample class holding all the images&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;ModuleConfig&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#66d9ef&#34;&gt;interface&lt;/span&gt;{}{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;multi2vec-clip&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;map&lt;/span&gt;[&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;]&lt;span style=&#34;color:#66d9ef&#34;&gt;interface&lt;/span&gt;{}{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;imageFields&amp;#34;&lt;/span&gt;: []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;image&amp;#34;&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;VectorIndexType&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;flat&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;Vectorizer&lt;/span&gt;:      &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;multi2vec-clip&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&lt;span style=&#34;color:#a6e22e&#34;&gt;Properties&lt;/span&gt;: []&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;models&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Property&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;DataType&lt;/span&gt;:    []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;Description&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;The name of the file&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;:        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;filename&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;DataType&lt;/span&gt;:    []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;string&amp;#34;&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;Description&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;The Flickr URL&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;:        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;flickr_url&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;DataType&lt;/span&gt;:    []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;blob&amp;#34;&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;Description&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Base64 encoded image&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;:        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;image&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;DataType&lt;/span&gt;:     []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;schema&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;DataTypeTextArray&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;()},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;Description&lt;/span&gt;:  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Caption in English&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;:         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;caption_en&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;Tokenization&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;models&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;PropertyTokenizationLowercase&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;DataType&lt;/span&gt;:     []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;schema&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;DataTypeTextArray&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;()},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;Description&lt;/span&gt;:  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Caption in Japanese&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;:         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;caption_ja_gse&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;Tokenization&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;models&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;PropertyTokenizationGse&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;DataType&lt;/span&gt;:     []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;schema&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;DataTypeTextArray&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;()},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;Description&lt;/span&gt;:  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Caption in Japanese&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;:         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;caption_ja&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;Tokenization&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kagome_ja&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#75715e&#34;&gt;// TODO 1.28リリース時には定数を利用可能&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;DataType&lt;/span&gt;:     []&lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;{&lt;span style=&#34;color:#a6e22e&#34;&gt;schema&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;DataTypeTextArray&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;String&lt;/span&gt;()},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;Description&lt;/span&gt;:  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Category in English&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;Name&lt;/span&gt;:         &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;category&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;				&lt;span style=&#34;color:#a6e22e&#34;&gt;Tokenization&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;models&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;PropertyTokenizationLowercase&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		},
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとは、GoのWeaviateのSDKを利用してデータを登録するだけです。
&lt;a href=&#34;https://github.com/weaviate/weaviate-examples/blob/main/clip-multi-modal-text-image-search/import/go/data/objects.go#L32&#34;&gt;登録処理はサンプル&lt;/a&gt;をもとに、上記のフィールドのデータを追加した程度です。&lt;/p&gt;
&lt;p&gt;これで、Weaviateに日本語と画像のベクトルのデータが保存できました。あとは検索です。&lt;/p&gt;
&lt;h2 id=&#34;検索処理&#34;&gt;検索処理&lt;/h2&gt;
&lt;p&gt;参考にしたサンプルでは、Node.jsで処理が書いてあるのですが、私自身はあまりNode.jsを記述したことがありません。
ということで、さくっと作るためにStreamlitを利用して検索画面を作成しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gist.github.com/johtani/a68b0d63b2bc6aec9c1ee32577206f3e&#34;&gt;コードはこちら&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Weaviateの接続部分は簡略化（別の便利関数を作った）してありますが、流れはなんとなくわかっていただけるかな？&lt;/p&gt;
&lt;p&gt;デモのできることとしては次のような検索です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GSEのフィールドでキーワード検索&lt;/li&gt;
&lt;li&gt;Kagomeのフィールドでキーワード検索&lt;/li&gt;
&lt;li&gt;ベクトル検索（テキストをCLIPでベクトル化して検索）&lt;/li&gt;
&lt;li&gt;ハイブリッド検索（ベクトル検索＋Kagomeフィールドでキーワード検索）&lt;/li&gt;
&lt;li&gt;ベクトル検索＋Kagomeのフィールドでキーワードでフィルタリング&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;p&gt;駆け足ですが、Weaviateで日本語のマルチモーダル検索をやるときにどんなデモデータでどんなデモをやったかを紹介しました。
完全なものではないので恐縮ですが。。。&lt;/p&gt;
&lt;p&gt;Weaviate 1.28（2024/12現在最新版）からKagome JAという日本語のキーワード検索用のトークナイザーが利用できるようになっています。
興味がある方は、ちょっと触ってみてはどうでしょうか？&lt;/p&gt;
&lt;p&gt;もう少し時間が取れて整理整頓出来たら、Docker Composeなども含めた形でリポジトリで公開しようと思います。
Weaviateで動かしてみようとしたり、ブログで不明点などがあればXなどで連絡をいただければと。&lt;/p&gt;
</content:encoded>
    </item>
    
  </channel>
</rss>
