1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RDBで学ぶRAG(ベクトル検索)の仕組み〜 PostgreSQLとPythonでゼロから理解する 〜③

1
Last updated at Posted at 2026-04-27

前回までのまとめ

第1回目では、

  • ベクトル検索の基本的な仕組み
  • 「素の」PostgreSQLでベクトル検索実践

第2回目では、

  • pgvectorでPostgreSQLをベクトルDBにする
  • アプリケーションとDBを分離して高速検索
  • インデックスについて

について解説しました。

さて、第3回となる本稿では、 より実践的なRAGに向けてレベルアップして行きたいと思います。

まずはサンプルデータですが、第2回まで使っていた100件のデータだと情報量が少なすぎて、RAGの検証用としては物足りません。

そこで、一般公開されている大量テキストデータ(コーパス)を活用して行きたいと思います。

当然、日本語のデータを使用したいところなのですが、選択肢としては以下のようなものが知られています。

日本語対応コーパス

  1. Wikipedia日本語ダンプ(https://dumps.wikimedia.org/jawiki/latest/)
  2. Livedoor News Corpus(https://www.rondhuit.com/download.html#Apache%20OpenNLP)
  3. CC-100 日本語(https://huggingface.co/datasets/range3/cc100-ja)
  4. JNLI(https://huggingface.co/datasets/range3/cc100-ja)

この中のいずれかを使用したいのですが、まず「Wikipedia日本語ダンプ」と「CC-100 日本語」は全体のサイズが巨大(数GB~数十GB)なので、前処理が必要になります。
そして「JNLI」は短文中心です(研究目的)。
残る「Livedoor News」は適度なサイズ(数十MB)で、文章量も豊富で今回の目的に合いそうです。

まずは、
https://www.rondhuit.com/download.html#Apache%20OpenNLP
から
rondhuit-ja-ner-1.0.0.zip
をダウンロードし、第2回まで使っていたディレクトリ(ragdb/app/)に移動してから解凍しましょう。
ターミナルが使えれば、ディレクトリに移動してから以下のコマンドでも良いでしょう

wget -O - https://www.rondhuit.com/download/ldcc-20140209.tar.gz | tar xzf -

そうすると、以下のような構成になるはずです。
image.png

data/の中を開くと、このようになっています。

image.png

data/livedoor/test/の中のdokujo-tsushin/ it-life-hack/といったディレクトリの中に、過去のライブドアニュースの記事がジャンルごとに収納されています。

形式はテキスト形式で、htmlタグ等は含みません。全部で7000記事ほどあるようです。
投稿時期は2009~2012年前後で、17~14年ほど前のものということになります。

適当な記事を開いて見てみましょう。

http://news.livedoor.com/article/detail/6294574/
2012-02-20T10:00:00+0900
サービス終了後はどうなる!電子書籍は永遠に読めるのか【デジ通】
ソニー・コンピュータエンターテイメントのポータブルゲーム機、PSPで配信されていたコミックコンテンツ配信サービスが2012年中に終了することが発表された。

この終了に伴い、ユーザーはこれ以上のコンテンツ拡充はできなくなるし、PSPが壊れると購入したコミックを読むこともできなくなる。
この問題はどの電子書籍サービスにも共通する問題だ。

■サービスが終われば読めなくなる電子書籍
PSPのコミック配信サービスは、PSP用の専用ソフト「コミックリーダー」などでコミックを購入し、読むことができた。1話100円や紙の本での1巻あたり420円という価格で、安いわけでは無いが、それなりにコンテンツ自体は増えていた。

しかし、サービス自体が終了するので、コンテンツはこれ以上増えることは無くなり、PSPというハードウェアに依存もしているので、PSPが物理的に故障するなど、PSPが使えない状況になれば読むこともできなくなる。

PSPの後継機種PS Vitaや、他のパソコンなどで読めればいいが、そのようなソフトは提供されておらず、購入したコンテンツも将来は読むことが難しくなってしまうだろう。

実はこれ以外にも、シャープが電子手帳のザウルスなどに向けて提供していたSpaceTownブックスも2011年末にサービスが終了するなど、いくつかの電子書籍サービスは将来性だ。

日本で雨後のタケノコのように電子書籍サービスが開始されているが、どれも物理的な端末に依存するなど、今回のPSPのコミック配信サービス終了と同等の問題を抱えている。

紙の書籍なら、物理的に破損したり紛失しないかぎり100年後でも読めるのと比べると、電子書籍は読める期間が非常に短くなる場合がある。

(略)

クチコミを見る

14年前の記事なので、やや時代を感じますね笑

色々開いてみると分かりますが、冒頭の2行に関しては、各記事とも同じフォーマットになっています。つまり、

http://news.livedoor.com/article/detail/6294574/
2012-02-20T10:00:00+0900

1行目 → 記事のURL
2行目 → 投稿日時

となっていて、 構造化 されています。

こういった構造化されたデータはベクトルとは別に抽出しておいた方が、後々実用的なRAG検索システムを構築する上で役に立ちます。
例えば、上記の2つのデータを保存しておくと、

・記事の元URLへのリンクを示すことができる
・特定の日付範囲の記事のみを対象とすることができる

というわけで、ユーザー目線で使いやすいシステムにできそうです。

ちなみにこういった「付加情報」のことを 「メタデータ」 と呼び、このメタデータを活用することで、より実用的な検索やフィルタリングが可能になります。

さらにデータを良くみると、「3行目」が記事の「タイトル」になっていそうです。

http://news.livedoor.com/article/detail/6294574/
2012-02-20T10:00:00+0900
サービス終了後はどうなる!電子書籍は永遠に読めるのか【デジ通】←←これがタイトル
http://news.livedoor.com/article/detail/5841772/
2011-09-07T08:35:00+0900
吉澤ひとみが新チーム結成「今、大事にしなきゃいけない人」←←これがタイトル

この「タイトル」も、記事の内容をひとまとめに表す大切な情報なので、「メタデータ」として保存したい所です。

テーブルに「リアル」データ投入

さていよいよデータをDBに投入して行きます。

ただ、その前に検討しなければいけないのが、文章データの 「チャンキング(=分割)」 です。
今回の記事は、だいたい1記事あたり500文字 ~ 2000文字くらいの長さになっています。
割と長めのテキストと言っていいと思います。
ベクトル検索を行う場合、あまりに長いテキストをembeddingすると、意味の方向がぼやけてしまい、うまくクエリとマッチング出来なくなる傾向が出てきます。

そこで、文章を適当な大きさに分割(=チャンキング)して登録するのが普通です。

チャンキングの方法については後述しますが、分割後は以下のようなデータになります。

記事AAA

  • 1番目の分割(=チャンク)
  • 2番目の分割(=チャンク)
  • 3番目~
    ...

記事BBB

  • 1番目の分割(=チャンク)
  • 2番目の分割(=チャンク)
  • 3番目~
    ...

この場合、チャンクごとにレコードができるので、

  • 元々の記事を識別できるデータ
  • 何番目の分割を表す数字

を「メタデータ」として持たせる形にしておいた方が整合が取れそうです。
「何番目の分割を表す数字」はそのまま「n番目」の「n」を用い、「チャンクID」と呼ぶことにします。
「元々の記事を識別できるデータ」については、「タイトル」を使うことが思い付きますが、万が一重複があった場合に備えて、「ファイル名」を利用した方が無難そうです(ファイル名はmovie-enter-6371369.txtのようにユニーク=一意のはず)。
というわけで、

メタデータ

  • タイトル
  • URL
  • 投稿日時
  • チャンクID
  • 記事ID(=ファイル名から.txtを除いたもの)
  • ソース(「dokujo-tsushin」「movie-enter」等)

スキーマ(テーブル)の作成

このデータを入れるためのテーブルdocuments_livedoorをCREATEします。
DBにログインし、以下のDDLを流します。

CREATE TABLE documents_livedoor (
  id SERIAL PRIMARY KEY,
  article_id TEXT,
  chunk_id INT,
  title TEXT,
  content TEXT,
  embedding_v vector(384),
  url TEXT,
  published_at TIMESTAMP,
  source TEXT
);

次に、データの読み込みおよびベクトル化をするためのPythonスクリプトを用意します。
最近では、このようなデータのロードのことを 「インジェッション = ingestion」 と呼ぶことが増えて来た気がしますので、ファイル名をingest.pyとしておきます。

import os
import psycopg2
from sentence_transformers import SentenceTransformer
from datetime import datetime

# -----------------------------
# 設定
# -----------------------------
DATA_DIR = "/app/livedoor-data/data/livedoor/text" # データの格納ディレクトリ
CHUNK_SIZE = 200 # 文章の分割サイズ
OVERLAP = 50 # 重ね代のサイズ

# -----------------------------
# チャンキング
# -----------------------------
def chunk_text(text, chunk_size=200, overlap=50):
    chunks = []
    start = 0

    while start < len(text):
        end = start + chunk_size
        chunk = text[start:end]
        chunks.append(chunk)
        start += chunk_size - overlap # 重ね代の分だけ戻す

    return chunks

# -----------------------------
# Livedoorファイル解析
# -----------------------------
def parse_livedoor_file(filepath):
    with open(filepath, "r", encoding="utf-8") as f:
        lines = f.readlines()

    url = lines[0].strip()
    date_str = lines[1].strip()
    title = lines[2].strip()
    body = "".join(lines[3:]).strip()

    try:
        published_at = datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%S%z")
    except:
        published_at = None

    return url, published_at, title, body

# -----------------------------
# DB接続
# -----------------------------
conn = psycopg2.connect(
    host="localhost",
    database="ragdb",
    user="user",
    password="password"
)

cur = conn.cursor()

# -----------------------------
# モデルロード(1回だけ)
# -----------------------------
print("モデルロード中...")
model = SentenceTransformer(
    "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
)
print("モデルロード完了")

# -----------------------------
# データ投入
# -----------------------------
count = 0

for root, dirs, files in os.walk(DATA_DIR):

    for file in files:
        if not file.endswith(".txt"):
            continue

        source = os.path.basename(root) # パスの最後のセグメントが「ソース」

        filepath = os.path.join(root, file)

        try:
            url, published_at, title, body = parse_livedoor_file(filepath)
        except:
            print(f"スキップ: {filepath}")
            continue

        # article_id(.txt除去)
        article_id = file.replace(".txt", "")

        # embedding用テキスト(タイトル込み)
        full_text = title + "\n" + body

        # チャンキング
        chunks = chunk_text(full_text, CHUNK_SIZE, OVERLAP) # 分割された文章を配列として得る

        vecs = model.encode(chunks) # 文章をリストのまま「まとめて」渡すとバッチ処理になる(高速)

        for i, (chunk, vec) in enumerate(zip(chunks, vecs)):

            vec = vec.tolist() # ベクトル変換

            cur.execute(
                """
                INSERT INTO documents_livedoor (
                    article_id,
                    chunk_id,
                    title,
                    content,
                    embedding_v,
                    url,
                    published_at,
                    source
                )
                VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
                """,
                (
                    article_id,
                    i + 1,
                    title,
                    chunk,
                    vec,
                    url,
                    published_at,
                    source
                )
            )

            print(f"no.{count} {title} チャンクID:{i + 1} 記事ID:{article_id} 投入完了")

        count += 1

        

# -----------------------------
# 保存
# -----------------------------
conn.commit()

cur.close()
conn.close()

print("完了!")

コードについて補足します。

ベクトル変換におけるバッチ処理について

ベクトルを作っている部分は以下になります

vecs = model.encode(chunks) # 文章をリストのまま「まとめて」渡すとバッチ処理になる(高速)

ここでは、チャンクごとに逐次ベクトルを作ってINSERTせず、その記事に属するチャンクをまとめてベクトル化しています。
model.encode()は並列処理に強く、バッチで処理した方が高速に処理が出来るのでこの形を取っています。
この場合は、model.encode()の引数にリストとしてチャンクを渡せば、同じ要素数のベクトルのリストが返って来ます。

チャンキング処理について

以下の部分でチャンキングの初期設定をしています。

CHUNK_SIZE = 200 # 文章の分割サイズ
OVERLAP = 50 # 重ね代のサイズ

まずこの「200」というサイズですが、一般的に100〜300トークン(≒100〜300文字程度)がよく使われているので、この数字にしてあります。

そしてチャンクそのものの長さは200なのですが、スタートは前のチャンクの終わりの50文字を含んでいます。
これは、 唐突なところで文章が切れると意味が解釈できなくなることがある ので、その対策として 「重ね代」 を設けているわけです。

チャンク処理そのものは以下で行なっています

while start < len(text):
        end = start + chunk_size
        chunk = text[start:end]
        chunks.append(chunk)
        start += chunk_size - overlap # 重ね代の分だけ戻す

ここで、 「重ね代を設けたとしても唐突なところで切れてしまうではないか」 と疑問を持つ人もいるかも知れませんが、その感覚はある意味正しくて、意味が解釈できる区切りで文章を分割する 「セマンティック・チャンキング」 という手法も存在します。
ただ、「重ね代を設ける」という方法も一定の実績がありますので、いったんこのような初歩的な方法を採用し、後ほど精度を検証したいと思います。

INSERTにおけるベクトルデータの受け渡し

以下のコードでデータのINSERTを行なっています

vec = vec.tolist() # ベクトル変換

            cur.execute(
                """
                INSERT INTO documents_livedoor (
                    article_id,
                    chunk_id,
                    title,
                    content,
                    embedding_v,
                    url,
                    published_at,
                    source
                )
                VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
                """,
                (
                    article_id,
                    i + 1,
                    title,
                    chunk,
                    vec,
                    url,
                    published_at,
                    source
                )

さて、前回の記事で「<=>」という演算子を用いてベクトル検索を試みた際、

s%::vector

のように「リスト型=>ベクトル型」のキャスト(型変換)をしたのですが、
実はINSERTの場合はキャストをする必要がなく、pgvector側で「リスト型=>ベクトル型」の 変換を自動でしてくれます

よって、

vec = vec.tolist() # ベクトル変換

この部分でリスト化したものをそのまま渡しても問題なくベクトルが挿入されます。

ではデータ投入を開始します。

python3 ingest.py

実行すると、投入が開始され、ログを吐きながら延々と続きます。

...
no.7327 ウィルコム、ULTRA SPEEDとPHSに対応したAndroidスマートフォン「DIGNO DUAL WX04K」を発表!防水やワンセグ、赤外線などに対応 チャンクID:1 記事ID:smax-6604803 投入完了
no.7327 ウィルコム、ULTRA SPEEDとPHSに対応したAndroidスマートフォン「DIGNO DUAL WX04K」を発表!防水やワンセグ、赤外線などに対応 チャンクID:2 記事ID:smax-6604803 投入完了
no.7327 ウィルコム、ULTRA SPEEDとPHSに対応したAndroidスマートフォン「DIGNO DUAL WX04K」を発表!防水やワンセグ、赤外線などに対応 チャンクID:3 記事ID:smax-6604803 投入完了
no.7327 ウィルコム、ULTRA SPEEDとPHSに対応したAndroidスマートフォン「DIGNO DUAL WX04K」を発表!防水やワンセグ、赤外線などに対応 チャンクID:4 記事ID:smax-6604803 投入完了
no.7327 ウィルコム、ULTRA SPEEDとPHSに対応したAndroidスマートフォン「DIGNO DUAL WX04K」を発表!防水やワンセグ、赤外線などに対応 チャンクID:5 記事ID:smax-6604803 投入完了
no.7327 ウィルコム、ULTRA SPEEDとPHSに対応したAndroidスマートフォン「DIGNO DUAL WX04K」を発表!防水やワンセグ、赤外線などに対応 チャンクID:6 記事ID:smax-6604803 投入完了
no.7327 ウィルコム、ULTRA SPEEDとPHSに対応したAndroidスマートフォン「DIGNO DUAL WX04K」を発表!防水やワンセグ、赤外線などに対応 チャンクID:7 記事ID:smax-6604803 投入完了
no.7327 ウィルコム、ULTRA SPEEDとPHSに対応したAndroidスマートフォン「DIGNO DUAL WX04K」を発表!防水やワンセグ、赤外線などに対応 チャンクID:8 記事ID:smax-6604803 投入完了
no.7327 ウィルコム、ULTRA SPEEDとPHSに対応したAndroidスマートフォン「DIGNO DUAL WX04K」を発表!防水やワンセグ、赤外線などに対応 チャンクID:9 記事ID:smax-6604803 投入完了
no.7327 ウィルコム、ULTRA SPEEDとPHSに対応したAndroidスマートフォン「DIGNO DUAL WX04K」を発表!防水やワンセグ、赤外線などに対応 チャンクID:10 記事ID:smax-6604803 投入完了
no.7327 ウィルコム、ULTRA SPEEDとPHSに対応したAndroidスマートフォン「DIGNO DUAL WX04K」を発表!防水やワンセグ、赤外線などに対応 チャンクID:11 記事ID:smax-6604803 投入完了
no.7327 ウィルコム、ULTRA SPEEDとPHSに対応したAndroidスマートフォン「DIGNO DUAL WX04K」を発表!防水やワンセグ、赤外線などに対応 チャンクID:12 記事ID:smax-6604803 投入完了
no.7327 ウィルコム、ULTRA SPEEDとPHSに対応したAndroidスマートフォン「DIGNO DUAL WX04K」を発表!防水やワンセグ、赤外線などに対応 チャンクID:13 記事ID:smax-6604803 投入完了
no.7327 ウィルコム、ULTRA SPEEDとPHSに対応したAndroidスマートフォン「DIGNO DUAL WX04K」を発表!防水やワンセグ、赤外線などに対応 チャンクID:14 記事ID:smax-6604803 投入完了
no.7327 ウィルコム、ULTRA SPEEDとPHSに対応したAndroidスマートフォン「DIGNO DUAL WX04K」を発表!防水やワンセグ、赤外線などに対応 チャンクID:15 記事ID:smax-6604803 投入完了
no.7327 ウィルコム、ULTRA SPEEDとPHSに対応したAndroidスマートフォン「DIGNO DUAL WX04K」を発表!防水やワンセグ、赤外線などに対応 チャンクID:16 記事ID:smax-6604803 投入完了
no.7327 ウィルコム、ULTRA SPEEDとPHSに対応したAndroidスマートフォン「DIGNO DUAL WX04K」を発表!防水やワンセグ、赤外線などに対応 チャンクID:17 記事ID:smax-6604803 投入完了
no.7327 ウィルコム、ULTRA SPEEDとPHSに対応したAndroidスマートフォン「DIGNO DUAL WX04K」を発表!防水やワンセグ、赤外線などに対応 チャンクID:18 記事ID:smax-6604803 投入完了
no.7328 ケータイ各社、北九州における大雨の被害に伴い支援措置を実施!料金支払いの延期など チャンクID:1 記事ID:smax-6725617 投入完了
no.7328 ケータイ各社、北九州における大雨の被害に伴い支援措置を実施!料金支払いの延期など チャンクID:2 記事ID:smax-6725617 投入完了
no.7328 ケータイ各社、北九州における大雨の被害に伴い支援措置を実施!料金支払いの延期など チャンクID:3 記事ID:smax-6725617 投入完了
no.7328 ケータイ各社、北九州における大雨の被害に伴い支援措置を実施!料金支払いの延期など チャンクID:4 記事ID:smax-6725617 投入完了
no.7328 ケータイ各社、北九州における大雨の被害に伴い支援措置を実施!料金支払いの延期など チャンクID:5 記事ID:smax-6725617 投入完了
no.7328 ケータイ各社、北九州における大雨の被害に伴い支援措置を実施!料金支払いの延期など チャンクID:6 記事ID:smax-6725617 投入完了
no.7328 ケータイ各社、北九州における大雨の被害に伴い支援措置を実施!料金支払いの延期など チャンクID:7 記事ID:smax-6725617 投入完了
no.7328 ケータイ各社、北九州における大雨の被害に伴い支援措置を実施!料金支払いの延期など チャンクID:8 記事ID:smax-6725617 投入完了
no.7328 ケータイ各社、北九州における大雨の被害に伴い支援措置を実施!料金支払いの延期など チャンクID:9 記事ID:smax-6725617 投入完了
no.7328 ケータイ各社、北九州における大雨の被害に伴い支援措置を実施!料金支払いの延期など チャンクID:10 記事ID:smax-6725617 投入完了
no.7328 ケータイ各社、北九州における大雨の被害に伴い支援措置を実施!料金支払いの延期など チャンクID:11 記事ID:smax-6725617 投入完了
no.7329 2012年夏モデルでおすすめのスマートフォンはこれだ!個性を放つモデルを選ぶ(フォトグラファーmi2_303編) チャンクID:1 記事ID:smax-6677151 投入完了
no.7329 2012年夏モデルでおすすめのスマートフォンはこれだ!個性を放つモデルを選ぶ(フォトグラファーmi2_303編) チャンクID:2 記事ID:smax-6677151 投入完了
no.7329 2012年夏モデルでおすすめのスマートフォンはこれだ!個性を放つモデルを選ぶ(フォトグラファーmi2_303編) チャンクID:3 記事ID:smax-6677151 投入完了
no.7329 2012年夏モデルでおすすめのスマートフォンはこれだ!個性を放つモデルを選ぶ(フォトグラファーmi2_303編) チャンクID:4 記事ID:smax-6677151 投入完了
...

そこそこ分量がありますので、完了までじっくり待ちます。
私の環境では約25分(!)かかっています。
ずいぶん待たされたと感じるかも知れませんが、ベクトル化をバッチではなく逐一処理にした場合はこの 数倍以上 時間がかかっているはずなので、

「ベクトル化はバッチ処理で高速化」

のテクニックは覚えておいて損はありません。

その際、もうひとつパラメータを覚えておくと便利です。

vecs = model.encode(chunks, batch_size=32)

このようにbatch_sizeパラメータでバッチのサイズを固定しておくことが出来ます。
こうしておくと、無用にサイズが増えてメモリを圧迫してしまうという事態を防ぐことができます。
今回はチャンク数がだいたい想定できている(10くらい)ので特に不要かと思います。

さらに高速化したい場合は、cur.execute(...)で1行ずつINSERTせず、
・cur.executemany(...) で複数行ずつインサートする
・CSVファイルなどに吐き出しCOPYコマンドで一括挿入する
などの手法が有効です。

投入完了!

投入が終わったら、軽くデータを確認しましょう。

記事数は7337でした。
レコード数(つまりチャンク数)は、

select count(*) from documents_livedoor;
 count 
-------
 65521
(1 row)

65521でした。まあ想定内です。

それではデータがきちんと投入できているか、確認してみましょう。
特定の記事に狙いを定めてSELECTしてみます。
(ベクトルを表示すると見づらくなるので、ベクトル列以外を表示します)
あらかじめ表示を整えるために\x(Expanded mode)にしておくことをお勧めします。

select id, article_id, chunk_id, title, content, url, published_at from documents_livedoor where article_id='peachy-4289213';

image.png

article_id='peachy-4289213'に属するレコードが表示されます。

content列にチャンキングされた文章が収納され、「重ね代」(上図の赤い部分)が設けられていることが確認できると思います。
メタデータもしっかり取れていますね。

ベクトルの方は

select embedding_v from documents_livedoor where article_id='peachy-4289213' limit 1;

などとすると、数値が出て来ますので軽く確認しておきましょう。

色々な検索を試す

RDBのキーワード検索

SQLのLIKE句を使って、通常のキーワード検索をしてみます。

キーワードは手当たり次第入れてみます。

ragdb=# select count(*) from documents_livedoor where content like '%スマホ%';
-[ RECORD 1 ]
count | 1545

ragdb=# select count(*) from documents_livedoor where content like '%インターネット%';
-[ RECORD 1 ]
count | 775

ragdb=# select count(*) from documents_livedoor where content like '%ネット%';
-[ RECORD 1 ]
count | 4280

ragdb=# select count(*) from documents_livedoor where content like '%ショッピング%';
-[ RECORD 1 ]
count | 203

ragdb=# select count(*) from documents_livedoor where content like '%大人気%';
-[ RECORD 1 ]
count | 277

ragdb=# select count(*) from documents_livedoor where content like '%超人気%';
-[ RECORD 1 ]
count | 19

ragdb=# select count(*) from documents_livedoor where content like '%人気%';
-[ RECORD 1 ]
count | 2924

ragdb=# select count(*) from documents_livedoor where content like '%コスメ%';
-[ RECORD 1 ]
count | 313

ragdb=# select count(*) from documents_livedoor where content like '%映画%';
-[ RECORD 1 ]
count | 4915

ragdb=# select count(*) from documents_livedoor where content like '%コメディ%';
-[ RECORD 1 ]
count | 147

瞬時に結果が返りますね。さすがに、RDBの検索は速いです。

では次にベクトル検索です。

ベクトル検索

前回使用したpg_search.pyのテーブル名を変えればそのまま使えますが、スキーマに合わせて新しいものを用意します。
名前はpg_search_ld.pyとしておきます。

import psycopg2
from sentence_transformers import SentenceTransformer

# 埋め込みモデルの準備
model = SentenceTransformer('sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2')

# PostgreSQLに接続
print("DBに接続")

conn = psycopg2.connect(
    host="localhost",
    database="ragdb",
    user="user",
    password="password"
)

while True:

    # クエリをセット
    query = input("検索クエリ(qで終了):")

    if query == "q":
        break

    # クエリをベクトル化
    q_vec = model.encode(query).tolist()

    # SQLを発行
    cur = conn.cursor()

    cur.execute("""
    SELECT
    article_id,
    chunk_id,
    title,
    url,
    published_at,
    source,
    content,
    embedding_v <=> %s::vector AS distance
    FROM documents_livedoor
    ORDER BY distance
    LIMIT 10
    """, (q_vec,))

    # 結果を受け取る
    rows = cur.fetchall()

    print(f"検索クエリ: {query}\n")

    for article_id, chunk_id, title, url, published_at, source, content, distance  in rows:
        print("====================================================")
        print(f"{float(distance):.4f} : {article_id} : {title} - {chunk_id} : {source} : {published_at}")
        print(url)
        print(content)

    cur.close()
    
conn.close()

実行してみます

python3 pg_search_ld.py
検索クエリ(qで終了):スマホ
検索クエリ: スマホ

====================================================
0.1460 : smax-6799152 : ついにソフトバンクも900MHz帯でのサービスを開始!プラチナバンドでソフトバンクは繋がりやすくなるのか?【ハウツー】 - 24 : smax : 2012-07-27 11:45:00
http://news.livedoor.com/article/detail/6799152/
モバイル
====================================================
0.2037 : smax-6780865 : ソニーモバイル、最新スマホ「Xperia GX」「Xperia SX」のテレビCMをYoutubeで先行公開 - 8 : smax : 2012-07-22 10:55:00
http://news.livedoor.com/article/detail/6780865/
ーモバイルコミュニケーションズ
====================================================
0.2497 : smax-6794045 : NTTドコモ、らくらくスマートフォン F-12Dの発売日を8月1日に正式決定 - 10 : smax : 2012-07-26 06:45:00
http://news.livedoor.com/article/detail/6794045/
 on Twitter
・報道発表資料 : 「らくらくスマートフォン」を発売 | お知らせ | NTTドコモ
====================================================
0.2504 : smax-6709742 : 【今夏最注目モデル!ドコモハイスペックスマホ「GALAXY SIII SC-06D」特集】 - 42 : smax : 2012-06-30 04:55:00
http://news.livedoor.com/article/detail/6709742/
好き(新米ママちえ編)
こんにちは。最近赤ちゃんを出産して育児奮闘中のちえです。子供を産んだからモバイルは少しおあずけ……とはならず、相変わらず新しいスマートフォンを触りながらはしゃぐ日々を送っております。先月中旬から順次各携帯電話事業者より夏モデルが発表されました。以前にも増してスマートフォン中心のラインナップとなり、ますますどれにしようか悩んでしまいますよね。先日も東京で行われたNTTドコモの
====================================================
0.2625 : smax-6512377 : NTTドコモ、一部スマートフォンの月々サポートを4月27日から増額して本体価格を実質値下げ!人気のAQUOS PHONE SH-01DやREGZA Phone T-01Dなど - 6 : smax : 2012-04-27 09:25:00
http://news.livedoor.com/article/detail/6512377/
円 58,590円 10,710円 
AQUOS PHONE SH-01D 30,240円 35,280円 5,040円 53,550円 18,270円 
AQUOS PHONE SH-06D 42,840円 47,880円 5,040円 66,150円 18,270円 
REGZA Phone T-01D 30,240円 40,320円 10,080円 53,550円 13,230円 


記事
====================================================
0.2722 : smax-6750224 : パナソニック、ELUGAデビューキャンペーンとELUGA Vオリジナルカバーキャンペーンを実施中 - 9 : smax : 2012-07-12 03:25:00
http://news.livedoor.com/article/detail/6750224/
| 携帯電話・スマートフォン | Panasonic
====================================================
0.2757 : livedoor-homme-4872316 : スポーツ中心の大規模SNSが誕生…対戦相手のブッキングサービスも搭載 - 6 : livedoor-homme : 2010-07-07 12:50:00
http://news.livedoor.com/article/detail/4872316/
・http://365sd.jp/ - 携帯電話端末
====================================================
0.2875 : it-life-hack-6337707 : もう糞アプリとは呼ばせない!これはもはや芸術だ【iPhoneでチャンスを掴め】 - 21 : it-life-hack : 2012-03-05 00:00:00
http://news.livedoor.com/article/detail/6337707/
とか!焼き畑と化したスマホ業界の真実
====================================================
0.2937 : dokujo-tsushin-6368259 : スマホで花咲く恋もある!? 合コンで使える本当の“モテテク” - 1 : dokujo-tsushin : 2012-03-14 06:11:00
http://news.livedoor.com/article/detail/6368259/
スマホで花咲く恋もある!? 合コンで使える本当の“モテテク”
つい最近まで、合コンツールとして欠かせないアイテムといえば「携帯電話」だった。待ち合わせに使ったり写メを撮影したり、そして最後は電話番号を交換したり……。まさに携帯電話に始まり、終わるのである。
しかし今や携帯電話はスマートフォンに進化。もちろん従来通り待ち合わせも写メも電話番号交換もできるわけだが、それに加えてさまざまな“アプリ”が使
====================================================
0.2996 : sports-watch-4994682 : 【Sports Watch】山本小鉄さん急逝も、死去直前も“豪傑ぶり”変わらず - 5 : sports-watch : 2010-09-07 09:53:00
http://news.livedoor.com/article/detail/4994682/
)
・週刊アサヒ芸能(モバイル版)

なるほど...割とランダムに「スマホ」関係の記事を拾っているようです。
「スマートフォン」と表示されている記事も拾えているのは想定通りです。
また繰り返しになりますが、「0.2937」などの数値は「コサイン距離」で、「小さいほど似ている」という指標になります。

少しクエリを長めにするとどうでしょうか?
クエリを「人気のスマホ」とします。

検索クエリ(qで終了):人気のスマホ
検索クエリ: 人気のスマホ

====================================================
0.2060 : livedoor-homme-6037115 : 多種多様なデバイスを使うデジタル世帯の、セキュリティ意識とは? - 3 : livedoor-homme : 2011-12-01 00:30:00
http://news.livedoor.com/article/detail/6037115/
携帯電話、「スマートフォン」。各社から競うように続々と発表され、2011年の秋冬モデルは新作のほとんどがスマートフォンのラインナップだ。自分でカスタマイズできるアプリや、インターネットに直接繋ぐことができる点も大きな魅力として、ここ数年でユーザーは激増した。

 ところが手軽で便利と、必ずしも手放しには喜べない。従来の携帯電話は、通信会社の推奨サイト(いわゆるキャリア公式サイト)へのアクセスがメイ
====================================================
0.2126 : it-life-hack-6337707 : もう糞アプリとは呼ばせない!これはもはや芸術だ【iPhoneでチャンスを掴め】 - 21 : it-life-hack : 2012-03-05 00:00:00
http://news.livedoor.com/article/detail/6337707/
とか!焼き畑と化したスマホ業界の真実
====================================================
0.2158 : kaden-channel-6123560 : スマホの似合う著名人、トップはスマホそのもの(?)な渡辺謙【話題】 - 1 : kaden-channel : 2011-12-16 03:30:00
http://news.livedoor.com/article/detail/6123560/
スマホの似合う著名人、トップはスマホそのもの(?)な渡辺謙【話題】
今年は、iPhoneの販売をauも始めるなど、スマートフォンに関しての話題が豊富だった2011年。今年一年を振り返るべく、スマートフォンといえば?という「スマートフォンが似合う有名人」ランキングが発表された。1位はNTTドコモのスマートフォンCMに出演している俳優の渡辺謙さんだ。CMの中ではスマートフォンが似合うというより、スマー
====================================================
0.2281 : it-life-hack-6680234 : GALAXY SIIIが圧倒的人気! MMD研究所「2012年夏発売の携帯電話スマートフォン新端末購入意欲調査」 - 6 : it-life-hack : 2012-06-21 06:00:00
http://news.livedoor.com/article/detail/6680234/
D研究所
■「2012年夏発売の携帯電話スマートフォン新端末購入意欲調査」
====================================================
0.2300 : smax-6799152 : ついにソフトバンクも900MHz帯でのサービスを開始!プラチナバンドでソフトバンクは繋がりやすくなるのか?【ハウツー】 - 24 : smax : 2012-07-27 11:45:00
http://news.livedoor.com/article/detail/6799152/
モバイル
====================================================
0.2335 : kaden-channel-5946822 : 【話題】女の子は誰でも好きな「ガチピンク」!人気モデルがドコモのスマホをアピール - 1 : kaden-channel : 2011-10-18 06:00:00
http://news.livedoor.com/article/detail/5946822/
【話題】女の子は誰でも好きな「ガチピンク」!人気モデルがドコモのスマホをアピール
NTTドコモは14機種のスマートフォン、8機種の携帯電話を発表した。発表はネットでも中継されたのだが、ひと際華やかだったのが、人気ティーン誌のモデルがステージに上がったシーンだろう。
ドコモは今回、ハイティーン向け雑誌「ポップティーン」とコラボレーションしたスマートフォン、そしてローティーン向け雑誌「ニコラ」とコラボ
====================================================
0.2395 : kaden-channel-6422135 : やっぱり使いにくい! スマホからガラケーに戻す人が多いらしい!?【話題】 - 1 : kaden-channel : 2012-03-31 00:00:00
http://news.livedoor.com/article/detail/6422135/
やっぱり使いにくい! スマホからガラケーに戻す人が多いらしい!?【話題】
携帯ショップを見てみると、スマートフォンの数が圧倒的に多い。だが、スマートフォンの普及の陰で、従来型の携帯電話も根強い人気を誇っているという。どうやら、一度はスマートフォンに機種変更したものの「メールが打ちにくい」「こんなに多くの機能はいらない」と従来の携帯電話に戻ってくる人が多いということだ。

たしかに、猫も杓子もスマー
====================================================
0.2441 : peachy-6684605 : キーワードは「カワイク&賢く!」イマドキスマホ女子に人気のスマホグッズ紹介 - 1 : peachy : 2000-06-25 06:45:00
http://news.livedoor.com/article/detail/6684605/
キーワードは「カワイク&賢く!」イマドキスマホ女子に人気のスマホグッズ紹介
・カカオチョコレート
・ウサギケース ラビットしっぽ
・フォンピアス イヤホンジャックアクセサリー クマ
・ブラウンポンポンゴールド スマートフォンアクセ
====================================================
0.2444 : livedoor-homme-6690686 : 快適なスマホライフのための必須アプリ - 1 : livedoor-homme : 2012-06-26 00:45:00
http://news.livedoor.com/article/detail/6690686/
快適なスマホライフのための必須アプリ
昨年12月に発表されたユーキャン新語・流行語大賞でトップテンに選ばれ、日本人の5人に1人が持っているといわれる「スマホ」。MM総研の調査によると、2011年に国内で出荷された携帯電話端末の内、スマートフォンが過半数の55.8%を占め、年間出荷台数で従来端末(フィーチャーフォン)を初めて上回った。スマホは自宅でも外出先でも常時携帯され、インターネット、音楽、動画
====================================================
0.2445 : smax-6750224 : パナソニック、ELUGAデビューキャンペーンとELUGA Vオリジナルカバーキャンペーンを実施中 - 9 : smax : 2012-07-12 03:25:00
http://news.livedoor.com/article/detail/6750224/
| 携帯電話・スマートフォン | Panasonic

かなり「使える」検索結果に近づきつつあるように思えます。
ちなみに、これらの記事の時期(2012年ごろ)はスマホが登場して4,5年経つ頃で、本格的に普及期に入って来た頃であり話題沸騰中の雰囲気が何となく伝わりますね。
ピンポイントからは外れるものの思わず「目移り」がしそうな関連記事も適度に拾っているところが、ベクトル検索「らしさ」を出しています。

しかし、検索結果を見てみると、まだ課題が残っていることが分かります。

現状のチャンキングの問題点

先ほどの検索結果には、以下のようなものが含まれています。

====================================================
0.2126 : it-life-hack-6337707 : もう糞アプリとは呼ばせない!これはもはや芸術だ【iPhoneでチャンスを掴め】 - 21 : it-life-hack : 2012-03-05 00:00:00
http://news.livedoor.com/article/detail/6337707/
とか!焼き畑と化したスマホ業界の真実
====================================================
0.2300 : smax-6799152 : ついにソフトバンクも900MHz帯でのサービスを開始!プラチナバンドでソフトバンクは繋がりやすくなるのか?【ハウツー】 - 24 : smax : 2012-07-27 11:45:00
http://news.livedoor.com/article/detail/6799152/
モバイル
  • 文字数が極端に少ない(記事の最後のチャンク)
  • おかしな所で切れていて、文章として整合していない

ということが分かります。

この検索結果をそのまま返しても、ユーザとしては意味が分かりませんし、前後の文章とつなげて返すにしても「重ねしろ」を削除する処理が必要になります。
それはともかく、このようなチャンクは意味が定まらず、embedding時に「意味ベクトル」がブレてしまうため、理想的な検索結果が得られない懸念があります。

もう少し賢いチャンキングの方法はないのでしょうか?

あります。

実は、チャンキングの精度はそのままベクトル検索の精度に直結するため、
多くのRAGシステムではここに「工夫」が入っています。

そのためにチャンキングの指針を考えていきましょう。

より「賢い」チャンキングの指針を考える

まず、「変な所で文章が切れてしまう」問題の対策を考えます。
日本語の文章は

  • 行頭もしくは前の文の「。」の次から始まり、「。」で終わる

のが基本なので、テキスト処理(正規表現など)で何とかできそうです。

ただ、1文=1チャンクだと短くなりすぎる場合も出てくるので、
- 最大チャンクサイズの中でできる限り多くの文を含める

というルールも加えましょう。

さらに記事の最後のチャンクが短くなってしまうことを避けるために、
- ある文字数以下のチャンクが発生した場合は、前のチャンクに含める

というルールにしておきましょう。

次に、「。」で終わらず、そのまま改行している箇所もあるので、
-「改行」と「。」は同じ扱いとする

そして、全くの空行(行頭がそのまま改行になっている)箇所もあるので、
-「空行」は無視する

という方針にしておきます。

まとめると

新チャンキング指針(今回のルール)
  • 文は途中で切らず、「。」まで含める
  • 「改行」と「。」は同じ扱いとする
  • 「空行」は無視する
  • 最大チャンクサイズの中でできる限り多くの文を含める
  • 最小チャンクサイズ以下のチャンクが発生した場合は、前のチャンクに含める

次に「最大チャンクサイズ」を見直します。
ひとつのセンテンスの文字数は、おおよそ「50~200」文字になっているようなので、長めのセンテンスを2つ収納できるよう、「400」とし、「最小チャンクサイズ」を「50」とします。
そうすると、孤立したチャンクが生じず、チャンクサイズは「200~350」文字に収まることが予想されます。

上記の指針を盛り込んだ新しい投入用コードは以下になります。

import os
import psycopg2
from sentence_transformers import SentenceTransformer
from datetime import datetime

# -----------------------------
# 設定
# -----------------------------
DATA_DIR = "/app/livedoor-data/data/livedoor/text"
CHUNK_SIZE = 300
MIN_LEN = 50

# -----------------------------
# 文単位チャンキング
# -----------------------------
def sentence_chunk(text, max_len=300, min_len=50):
    """
    文単位でテキストを分割する関数

    ルール:
    ・最大 max_len 文字まで
    ・ただし必ず「。」または改行で区切る
    ・改行も文末として扱う
    ・空行は無視
    ・min_len 未満の短いチャンクは前のチャンクに結合
    """

    chunks = []

    # 改行コードを統一(Windows対策)
    text = text.replace("\r\n", "\n")

    # 空行を削除(ノイズ除去)
    lines = [line.strip() for line in text.split("\n") if line.strip()]

    # 再結合(改行も区切りとして扱うため残す)
    text = "\n".join(lines)

    i = 0
    length = len(text)

    # テキストを先頭から順に処理
    while i < length:

        # 最大長までの範囲を決める
        end = min(i + max_len, length)

        split_pos = -1

        # 後ろから「。」または改行を探す
        # → できるだけ自然な文末で区切るため
        for j in range(end, i, -1):
            if text[j - 1] == "" or text[j - 1] == "\n":
                split_pos = j
                break

        # 文末が見つからない場合は強制的に max_len で区切る
        if split_pos == -1:
            split_pos = end

        # チャンクを切り出す
        chunk = text[i:split_pos].strip()

        if chunk:
            # チャンクが短すぎる場合は前のチャンクに結合
            if len(chunk) < min_len and chunks:
                chunks[-1] += " " + chunk
            else:
                chunks.append(chunk)

        # 次の開始位置を更新
        i = split_pos

    return chunks

# -----------------------------
# Livedoorパース
# -----------------------------
def parse_livedoor_file(filepath):
    with open(filepath, "r", encoding="utf-8") as f:
        lines = f.readlines()

    url = lines[0].strip()
    date_str = lines[1].strip()
    title = lines[2].strip()
    body = "".join(lines[3:]).strip()

    try:
        published_at = datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%S%z")
    except:
        published_at = None

    return url, published_at, title, body

# -----------------------------
# DB接続
# -----------------------------
conn = psycopg2.connect(
    host="localhost",
    database="ragdb",
    user="user",
    password="password"
)
cur = conn.cursor()

# -----------------------------
# モデルロード(1回だけ)
# -----------------------------
print("モデルロード中...")
model = SentenceTransformer(
    "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
)
print("モデルロード完了")

# -----------------------------
# データ投入
# -----------------------------
count = 0
total_chunks = 0

for root, dirs, files in os.walk(DATA_DIR):

    for file in files:
        if not file.endswith(".txt"):
            continue

        source = os.path.basename(root)
        filepath = os.path.join(root, file)

        try:
            url, published_at, title, body = parse_livedoor_file(filepath)
        except:
            print(f"スキップ: {filepath}")
            continue

        article_id = file.replace(".txt", "")

        # タイトル込みでembedding
        full_text = title + "" + body

        # チャンキング
        chunks = sentence_chunk(full_text, CHUNK_SIZE, MIN_LEN)

        # バッチembedding
        vecs = model.encode(chunks, batch_size=32)

        for i, (chunk, vec) in enumerate(zip(chunks, vecs)):

            cur.execute(
                """
                INSERT INTO documents_livedoor (
                    article_id,
                    chunk_id,
                    title,
                    content,
                    embedding_v,
                    url,
                    published_at,
                    source
                )
                VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
                """,
                (
                    article_id,
                    i + 1,
                    title,
                    chunk,
                    vec.tolist(),
                    url,
                    published_at,
                    source
                )
            )

            total_chunks += 1

        count += 1

        # ログは控えめ(高速化)
        if count % 100 == 0:
            print(f"{count}記事投入済 / {total_chunks}チャンク")

# -----------------------------
# 保存
# -----------------------------
conn.commit()
cur.close()
conn.close()

print("===================================")
print(f"記事数: {count}")
print(f"チャンク数: {total_chunks}")
print("完了!")

(ログ出力が長くなるので抑制しました)
sentence_chunking関数に今回のチャンキング方針に従った実装をしているので、余裕があれば読み解いてみてください。

データを再投入します。
DBにログインし、データを消去してから

TRUNCATE TABLE documents_livedoor;

実行します。

python3 ingest.py
(略)
6800記事投入済 / 24469チャンク
6900記事投入済 / 24995チャンク
7000記事投入済 / 25548チャンク
7100記事投入済 / 26160チャンク
7200記事投入済 / 26685チャンク
7300記事投入済 / 27237チャンク
===================================
記事数: 7378
チャンク数: 27632
完了

前回と比べ、
65521 -> 27632
とチャンク数がだいぶ減りました。

これは、無意味な分割が減り、より「意味のある単位」でまとまった結果です。

どんな風に分割されたのか、軽く確認してみましょう。

select content from documents_livedoor order by article_id limit 10;
-[ RECORD 1 ]-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
content | - CHANGES.txt ファイルの追加。。- 数値文字参照 &#nnnn; をリテラルに変換。                                                                                                                                                                                                                                                                                                                                                                                                                                                       +
        | 2012-09-13 - 初版公開
-[ RECORD 2 ]-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
content | そこに作成したスピーチ文を掲載し「これで大丈夫か添削してください」とメッセージを送ったというのである。                                                                                                                                                                                                                                                                                                                                                                                                                          +
        | 「一晩で3人位の人が添削してくれましたよ。ちなみに自分以外にもそういう人はたくさんいて、その相談サイトには同じように添削をお願いする投稿がいっぱいありました」(由利さん)。ためしに教えてもらったそのサイトをみてみると、確かに「結婚式のスピーチの添削お願いします」という投稿が1000件を超えるくらいあった。めでたい結婚式の影でこんなネットコミュニティがあったとは知らなかった。                                                                                                                                             +
        | しかし「事前にお願いされるスピーチなら準備ができるしまだいいですよ。一番嫌なのは何といってもサプライズスピーチ!」と語るのは昨年だけで10万以上お祝いにかかったというお祝い貧乏独女の薫さん(35歳)                                                                                                                                                                                                                                                                                                                              +
        | 「私は基本的に人前で話すのが苦手なんですよ。だからいきなり指名されるとしどろもどろになって何もいえなくなる。
-[ RECORD 3 ]-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
content | そうすると自己嫌悪に陥って終わった後でもまったく楽しめなくなりますね」                                                                                                                                                                                                                                                                                                                                                                                                                                                          +
        | サプライズスピーチのメリットとしては、準備していない状態なので、フランクな本音をしゃべってもらえるという楽しさがあるようだ。しかしそれも上手に対応できる人ならいいが、苦手な人の場合だと「フランク」ではなく「しどろもどろ」になる危険性大。ちなみにプロの司会者の場合、本当のサプライズではなく式の最中に「のちほどサプライズスピーチとしてご指名させていただきます」という一言があることも多いようだが、薫さん曰く「そんな何分前に言われても無理!」らしい。要は「サプライズを楽しめる」というタイプの人選が大切ということか。+
        | 一方「ありきたりじゃつまらないし、ネットで例文を検索している際に『こんな方法もあるのか!』って思って取り入れました」という幸恵さん(30歳)が行ったスピーチは「手紙形式のスピーチ」というもの。
-[ RECORD 4 ]-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
content | 主役はあくまで新郎新婦ながらも、いざとなると緊張し、内容もあれこれ考えて、こっそりリハーサル……そんな人知れず頑張るスピーチ担当独女たちにも幸あれ(高山惠)
-[ RECORD 5 ]-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
content | 「○○ちゃんへ みたいな感じで新婦の友人にお手紙を書いて読み上げるやり方です。これなら多少フランクな書き方でも大丈夫だし、何より暗記しないで堂々と読み上げることができますよね。読んだものはそのまま友人にあげれば一応記念にもなります」(幸恵さん)                                                                                                                                                                                                                                                                              +
        | なるほど、確かにこれなら読みあげればいいだけなので、人前で話すのが苦手な人でも失敗しないかもしれない。
-[ RECORD 6 ]-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
content | 友人代表のスピーチ、独女はどうこなしている?。もうすぐジューン・ブライドと呼ばれる6月。独女の中には自分の式はまだなのに呼ばれてばかり……という「お祝い貧乏」状態の人も多いのではないだろうか? さらに出席回数を重ねていくと、こんなお願いごとをされることも少なくない。                                                                                                                                                                                                                                                        +
        | 「お願いがあるんだけど……友人代表のスピーチ、やってくれないかな?」                                                                                                                                                                                                                                                                                                                                                                                                                                                              +
        | さてそんなとき、独女はどう対応したらいいか?                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    +
        | 最近だとインターネット等で検索すれば友人代表スピーチ用の例文サイトがたくさん出てくるので、それらを参考にすれば、無難なものは誰でも作成できる。しかし由利さん(33歳)はネットを参考にして作成したものの「これで本当にいいのか不安でした。一人暮らしなので聞かせて感想をいってくれる人もいないし、かといって他の友人にわざわざ聞かせるのもどうかと思うし……」ということで活用したのが、なんとインターネットの悩み相談サイトに。
-[ RECORD 7 ]-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
content | オール・オア・ナッシングだった以前に比べ、今は縁を切る、友人に戻る、メル友関係を続けるなど、別れた後の関係性を選択できるようになった。未練が残っているうちは辛いが、ツールを上手く使えばメリットを得られることもあるだろう。ただし、落とし穴もある。最後に、律子さん(35歳)のトホホな話を紹介。                                                                                                                                                                                                                                +
        | 「10年前につきあっていた元彼とは、節目節目にメールをしています。“マイミク”で日記にコメントを書き込んだりもするし、年賀状もやりとりする仲。元彼はすでに結婚して子どもが二人いるんですね。最近はすっかり中年太りしてきてマイホームパパって感じ。いい人ではあるけど、すっかり気持ちが冷めた今となっては、なぜ自分があれほど彼に執着していたのか疑問に思えてくる。過去の恋愛の想い出をきれい残したいのなら、知らないほうがいいこともあるかもしれません」                                                                            +
        | 恋の思い出は脳内で美化されるもの。
-[ RECORD 8 ]-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
content | ネットで断ち切れない元カレとの縁。携帯電話が普及する以前、恋人への連絡ツールは一般電話が普通だった。恋人と別れたら、手帳に書かれた相手の連絡先を涙ながらに消す。そうすれば、いつしか縁は切れていったものである。しかし現在は、携帯電話がありメールがあり、インターネットを開けば、ブログで相手の晩飯までわかってしまう赤裸々なご時世。切っても切れない元カレとの縁に独女たちは何を思うのであろうか?                                                                                                                            +
        | 「5年前に別れた彼からメールが届いてビックリしました」とは尚美さん(36歳)                                                                                                                                                                                                                                                                                                                                                                                                                                                       +
        | 「彼の浮気が原因で別れたのですが、現在は独り身らしいことが書いてありました。ただ、私には婚約間近の恋人がいるのでスルー。もし自分に相手がいなかったら、復活愛はあったかも。出会いの機会が少ない独女にとって、いい時代と言えるのでは?」                                                                                                                                                                                                                                                                                          +
        | 彼と交際していた当時、尚美さんは実家に住んでいた。
-[ RECORD 9 ]-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
content | もしもメールも携帯電話もない時代だったら、恐らく彼からの連絡はあり得なかっただろう。                                                                                                                                                                                                                                                                                                                                                                                                                                            +
        | 一方、美加子さん(38歳)は「一般電話だけの時代のほうが、縁を切りにくかったですよ」という。                                                                                                                                                                                                                                                                                                                                                                                                                                      +
        | 「今はメモリ頼りになっている分、電話番号やメールアドレスを消去してしまえばそれまでってところがありますからね。ずるずる引きずろうと思えば引きずれるし、切ろうと思えば切れる。ひと昔前は彼の電話番号を暗記していたものです。受話器を上げたり戻したり……気持ちを断つのが難しかったなぁ」                                                                                                                                                                                                                                            +
        | 知恵さん(34歳)も同意見だ。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    +
        | 「情報は自分が情報網を使えば入ってくるが 自分次第でシャットアウトできるもの。だけど私は、“別れた彼と絶縁すべき”とは思っていません。心が癒されるまでの期間は連絡を断ちきり、それ以降はメールを送るなどして、友達関係に戻ることが多いですね」
-[ RECORD 10 ]----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
content | ネットなどで友情関係を続けるのはよいが、同時に淡く切ない恋の思い出は生活感、現実感にまみれてしまうことがあるので、繋ぎすぎには注意したいところ。ま、お互い様ですけどね。 (来布十和)

最初の1件目は説明ファイルを拾っているので置いておくとして、今回は日本語が破綻している箇所はなさそうです。ということは文脈の解釈がしやすく、精度の高いベクトル検索結果が出てくることが期待できそうです。

チャンクの長さも少し調べてみましょう。

select length(content) from documents_livedoor order by article_id limit 40;
 length 
--------
     67
    395
     78
    389
    174
    400
     91
    365
    375
    384
    369
    380
     89
    353
    371
    352
    400
    120
    391
    343
    387
    362
    389
    409
    390
    382
    388
    363
    345
    386
    194
    396
    318
    387
    297
    370
    335
    365
    394
    384
(40 rows)

良い感じに平準化されていて、孤立したチャンクはなさそうです。

では再び検索を試してみましょう。

python3 pg_search_ld.py

(略)

検索クエリ(qで終了):スマホ
検索クエリ: スマホ

====================================================
0.2806 : smax-6648178 : KDDI、Xperia acro HDとMOTOROLA RAZRにAndroid 4.0 ICSを6月下旬以降から提供予定 - 3 : smax : 2012-06-11 13:55:00
http://news.livedoor.com/article/detail/6648178/
・スマートフォン・携帯電話に関するお知らせ詳細 | スマートフォン・携帯電話に関するお知らせ | au
====================================================
0.2947 : smax-6673414 : 2012年夏モデルでおすすめのスマートフォンはこれだ!ハイスペック、らくらく、でも、ピンクが好き(新米ママちえ編) - 1 : smax : 2012-06-19 08:55:00
http://news.livedoor.com/article/detail/6673414/
2012年夏モデルでおすすめのスマートフォンはこれだ!ハイスペック、らくらく、でも、ピンクが好き(新米ママちえ編)。GALAXY SIIIはやはり本命?
こんにちは。最近赤ちゃんを出産して育児奮闘中のちえです。
子供を産んだからモバイルは少しおあずけ……とはならず、相変わらず新しいスマートフォンを触りながらはしゃぐ日々を送っております。
先月中旬から順次各携帯電話事業者より夏モデルが発表されました。以前にも増してスマートフォン中心のラインナップとなり、ますますどれにしようか悩んでしまいますよね。先日も東京で行われたNTTドコモの2012年夏モデル内覧会に行ってきて、新機種を体験してきたばかりです。
そこで、今回は、私が個人的に気になった新機種からベスト3を選んでみました。現時点で実物に触れることができたのが、ドコモ向け端末のみのため、あえてドコモのモデルから選んでみました。
====================================================
0.2984 : kaden-channel-6130802 : ソニーだいじょうぶ? PS Vitaの質問ページがちょっと変で話題になり、ソニーは慌てて修正【話題】 - 3 : kaden-channel : 2011-12-19 06:30:00
http://news.livedoor.com/article/detail/6130802/
・寒い冬もスマホが快適に使える! 今週の「週間アスキー」の付録は「超ぬくぬくスマホてぶくろ」【話題】
====================================================
0.2997 : peachy-6684605 : キーワードは「カワイク&賢く!」イマドキスマホ女子に人気のスマホグッズ紹介 - 1 : peachy : 2000-06-25 06:45:00
http://news.livedoor.com/article/detail/6684605/
キーワードは「カワイク&賢く!」イマドキスマホ女子に人気のスマホグッズ紹介。・カカオチョコレート
・ウサギケース ラビットしっぽ
・フォンピアス イヤホンジャックアクセサリー クマ ・ブラウンポンポンゴールド スマートフォンアクセ
====================================================
0.3033 : smax-6834765 : ハイスペックだけじゃない!?使い勝手の良いドコモスマホ「ARROWS X F-10D」の使いやすさをチェック!【レビュー】 - 2 : smax : 2012-08-08 00:55:00
http://news.livedoor.com/article/detail/6834765/
スマートフォンを2台目として持つ人がたくさんいるとはいえ、やはりスマートフォンは「電話機」。電話そのものの性能は気になるところですよね。電話機能をチェックしてみました。
着信時の画面です。電話に出るか切るかしかできない端末もありますが、ARROWS X F-10Dでは「伝言メモ」をタップすることでスムーズに留守応答することができます。とっさの時に便利な機能です。
通話中、周囲の状態を感知して通話音声を最適な聞きやすさに自動調節する「ぴったりボイス」という機能が働きます。画面の状態では「静か」であると判断されているようです。
相手の声を聞きやすく変換する「スーパーはっきりボイス3」、、あらかじめ登録した使用者の年齢に合わせた音質に調節する「あわせるボイス2」、相手の話す速さをゆっくり聞こえるように調節する「ゆっくりボイス」に対応しており、通話中に切り替えることができます。
====================================================
0.3095 : it-life-hack-6872658 : パチンコ店でも通話がクリア!電話としてのau最新スマホの音声を徹底チェック - 1 : it-life-hack : 2012-08-21 00:55:00
http://news.livedoor.com/article/detail/6872658/
パチンコ店でも通話がクリア!電話としてのau最新スマホの音声を徹底チェック。パソコンも電話もカメラも手のひらの中に収めた現代の魔法のツールがスマートフォンだ。
カメラ、インターネット、ナビといった楽しい機能から、キャッシュレス電子決済や電話、テレビにいたるまで、スマートフォンがあればどんなことでもできる便利さだ。さらに日々追加される新しいアプリを使えば、スマートフォンはますます便利になっていく。
そんな便利なスマートフォンだが、もっとも基本的な機能である「電話」を忘れてはいけない。
いざとなったら電話は心強いコミュニケーションツールであるだけでなく、命を守るライフラインでもあるからだ。
高機能ばかり注目されるスマートフォンだが、最新機種では音声通話機能の向上にも注力しており、クリアな音質での通話が楽しめるようになってきている。
====================================================
0.3115 : smax-6713239 : NTTドコモ、Disney Mobile on docomo F-08DおよびP-05D、GALAXY Note SC-05DのAndroid 4.0 ICSへのOSバージョンアップを8月以降に提供 - 3 : smax : 2012-07-02 01:37:00
http://news.livedoor.com/article/detail/6713239/
NTTドコモではすでに今年3月にスマートフォンでは「REGZA Phone T-01D」、「AQUOS PHONE SH-01D」、「LUMIX Phone P-02D」、「PRADA phone by LG L-02D」、「MEDIAS ES N-05D」、「Xperia acro HD SO-03D」、「GALAXY S II SC-02C」、「GALAXY S II LTE SC-03D」、「Optimus LTE L-01D」、「ARROWS X LTE F-05D」、「MEDIAS LTE N-04D」、「Xperia NX SO-02D」、「P-04D」、「AQUOS PHONE SH-06D/SH-06D NERV」、タブレットでは「GALAXY Tab 10.1 LTE SC-01D」、「ARROWS Tab LTE F-01D」、「GALAXY Tab 7.0 Plus
====================================================
0.3164 : peachy-6093088 : アンドロイド女子部が学ぶスマートフォンの最新マナー事情 - 1 : peachy : 2011-12-13 07:00:00
http://news.livedoor.com/article/detail/6093088/
アンドロイド女子部が学ぶスマートフォンの最新マナー事情。12月4日、東京都港区でアンドロイド女子部がティーパーティーを開催しました。この女子会イベントではトレンドマイクロ株式会社の方を招いたスマートフォンの最新マナー事情の紹介や、美容研究家の金子エミさんによるビューティーハンド講座が開かれました。
守っておきたいスマートフォンのマナー
まずスマートフォンを扱う上でのマナーとしてセキュリティ事情を紹介いただいたのはトレンドマイクロ株式会社の吉井直子さん。現在スマートフォンユーザーは増加しており、Android向けアプリも多数公開されています。しかし、同時に脅威となっているのがスマートフォンを狙ったウイルスやフィッシングサイト、端末の紛失・盗難だといいます。
例えば2010年のAndroidスマートフォンを標的にしたウイルスは916個発見されています。
====================================================
0.3168 : dokujo-tsushin-6368259 : スマホで花咲く恋もある!? 合コンで使える本当の“モテテク” - 1 : dokujo-tsushin : 2012-03-14 06:11:00
http://news.livedoor.com/article/detail/6368259/
スマホで花咲く恋もある!? 合コンで使える本当の“モテテク”。つい最近まで、合コンツールとして欠かせないアイテムといえば「携帯電話」だった。待ち合わせに使ったり写メを撮影したり、そして最後は電話番号を交換したり……。まさに携帯電話に始まり、終わるのである。
しかし今や携帯電話はスマートフォンに進化。もちろん従来通り待ち合わせも写メも電話番号交換もできるわけだが、それに加えてさまざまな“アプリ”が使えるのが強み。とはいえ、単純にアプリといっても、全世界で現在iPhone用が50万、Androidが35万という途方もない数のアプリが存在している。一体こんな膨大な数の中からどんなアプリを使えば合コンに有効なのだろうか……。
====================================================
0.3186 : kaden-channel-5866975 : 通話機能にしか使わないなら無駄なスマートフォン【デジ通】 - 2 : kaden-channel : 2011-09-16 01:00:00
http://news.livedoor.com/article/detail/5866975/
携帯電話会社が提供する留守番電話機能と区別するために、伝言メモという名前だったりしますが、この携帯電話本体に録音する機能は一部のAndroid端末をのぞいてありません。
携帯電話会社の留守番電話サービスは有料で、場合によっては録音を聞くためにも通話料がかかったりします。スマートフォンで電話に出られないときには録音を残せるようにしたい方は、この有料の留守番電話サービスに加入しなければなりません。
■スマートフォンは高くてすぐに陳腐化する
日本の従来型携帯電話は5万円前後で、スマートフォンの価格も同程度となっています。どちらも高機能なので価格も高くなりますが、従来型の携帯電話の進化は非常にゆっくりした物で、購入し数年は普通に使えていたと思います。しかし、スマートフォンはすごい勢いで日々進化しており、2年もすれば陳腐化し、Android端末の場合、3世代以上古い物となるでしょう。
検索クエリ(qで終了):人気のスマホ
検索クエリ: 人気のスマホ

====================================================
0.2186 : kaden-channel-6123560 : スマホの似合う著名人、トップはスマホそのもの(?)な渡辺謙【話題】 - 1 : kaden-channel : 2011-12-16 03:30:00
http://news.livedoor.com/article/detail/6123560/
スマホの似合う著名人、トップはスマホそのもの(?)な渡辺謙【話題】。今年は、iPhoneの販売をauも始めるなど、スマートフォンに関しての話題が豊富だった2011年。今年一年を振り返るべく、スマートフォンといえば?という「スマートフォンが似合う有名人」ランキングが発表された。1位はNTTドコモのスマートフォンCMに出演している俳優の渡辺謙さんだ。CMの中ではスマートフォンが似合うというより、スマートフォンになりユーザーの人生にアドバイスをしていた渡辺謙さん。印象的なCMの影響もあってか堂々の1位だ。
以下がそのほかのランキングだ。
1渡辺謙
2孫正義
3スティーブ・ジョブス
4木村拓哉
5嵐
6福山雅治
7劇団ひとり
8堀北真希
9田村淳
10SMAP
10上戸彩
10櫻井翔
タレントに交じって、ソフトバンク社長の孫正義さんと、今年亡くなったスティーブ・ジョブズさんがランクインしている。
====================================================
0.2246 : kaden-channel-5946822 : 【話題】女の子は誰でも好きな「ガチピンク」!人気モデルがドコモのスマホをアピール - 1 : kaden-channel : 2011-10-18 06:00:00
http://news.livedoor.com/article/detail/5946822/
【話題】女の子は誰でも好きな「ガチピンク」!人気モデルがドコモのスマホをアピール。NTTドコモは14機種のスマートフォン、8機種の携帯電話を発表した。発表はネットでも中継されたのだが、ひと際華やかだったのが、人気ティーン誌のモデルがステージに上がったシーンだろう。
ドコモは今回、ハイティーン向け雑誌「ポップティーン」とコラボレーションしたスマートフォン、そしてローティーン向け雑誌「ニコラ」とコラボレーションした携帯電話を発表した。「ポップティーン」とコラボレーションし生まれたのは「docomo with series F-03D Girls'」でカラーは幅広く女性に支持されるピンクを編集部や実際のモデルとも検証したという「ガチピンク」だ。ステージに登場した人気モデル「くみっきー」こと舟山久美子さん(写真左)は「持つだけでテンションが上がると思います」と女性の気持ちを代弁した。
====================================================
0.2368 : peachy-6684605 : キーワードは「カワイク&賢く!」イマドキスマホ女子に人気のスマホグッズ紹介 - 1 : peachy : 2000-06-25 06:45:00
http://news.livedoor.com/article/detail/6684605/
キーワードは「カワイク&賢く!」イマドキスマホ女子に人気のスマホグッズ紹介。・カカオチョコレート
・ウサギケース ラビットしっぽ
・フォンピアス イヤホンジャックアクセサリー クマ ・ブラウンポンポンゴールド スマートフォンアクセ
====================================================
0.2459 : livedoor-homme-6690686 : 快適なスマホライフのための必須アプリ - 1 : livedoor-homme : 2012-06-26 00:45:00
http://news.livedoor.com/article/detail/6690686/
快適なスマホライフのための必須アプリ。昨年12月に発表されたユーキャン新語・流行語大賞でトップテンに選ばれ、日本人の5人に1人が持っているといわれる「スマホ」。MM総研の調査によると、2011年に国内で出荷された携帯電話端末の内、スマートフォンが過半数の55.8%を占め、年間出荷台数で従来端末(フィーチャーフォン)を初めて上回った。スマホは自宅でも外出先でも常時携帯され、インターネット、音楽、動画、ゲームなど、その用途は尽きない。
Xperia GX SO-04D    HTC J    PANTONE 5 107SH
5月末には携帯電話3社のスマホ夏モデルが出揃ったが、各社の速度競争が加速。KDDIが下り最大40Mbpsの「WiMAX」(ワイマックス)に対応した3機種を発表したかと思えば、ドコモは受信時最大75Mbpsの「Xi」(クロッシィ)に対応した11機種を発表。
====================================================
0.2479 : kaden-channel-6422135 : やっぱり使いにくい! スマホからガラケーに戻す人が多いらしい!?【話題】 - 1 : kaden-channel : 2012-03-31 00:00:00
http://news.livedoor.com/article/detail/6422135/
やっぱり使いにくい! スマホからガラケーに戻す人が多いらしい!?【話題】。携帯ショップを見てみると、スマートフォンの数が圧倒的に多い。だが、スマートフォンの普及の陰で、従来型の携帯電話も根強い人気を誇っているという。どうやら、一度はスマートフォンに機種変更したものの「メールが打ちにくい」「こんなに多くの機能はいらない」と従来の携帯電話に戻ってくる人が多いということだ。
たしかに、猫も杓子もスマートフォンという風潮ではあるが、誰にでも便利というわけではないようだ。今までは携帯電話を見ることもなくメールが打てたという人もスマートフォンではそうはいかない。
あなたの周りにもスマートフォンに機種変更してがっかりした人は意外に多いのかもしれない。
■関連記事
・字が汚い人には朗報か? メモ入りの便利な付箋が作れる! カシオが「memopri(メモプリ)」を発売【売れ筋チェック】
====================================================
0.2492 : smax-6560368 : スマートフォンとコンパクトスピーカーを使って卓上で手軽にステレオサウンドを楽しもう!電源不要のエレコム製「PSP-CS500」を試す【レビュー】 - 6 : smax : 2012-05-15 04:55:00
http://news.livedoor.com/article/detail/6560368/
・100均で買えるスマートフォンスタンドが凄まじく便利!山田化学のスマートフォンに対応した「携帯電話スタンド」【レビュー】 - S-MAX - ライブドアブログ
・コンパクトスピーカ(携帯タイプ) - PSP-CS500シリーズ(エレコム) ・エレコム
====================================================
0.2549 : peachy-6093088 : アンドロイド女子部が学ぶスマートフォンの最新マナー事情 - 1 : peachy : 2011-12-13 07:00:00
http://news.livedoor.com/article/detail/6093088/
アンドロイド女子部が学ぶスマートフォンの最新マナー事情。12月4日、東京都港区でアンドロイド女子部がティーパーティーを開催しました。この女子会イベントではトレンドマイクロ株式会社の方を招いたスマートフォンの最新マナー事情の紹介や、美容研究家の金子エミさんによるビューティーハンド講座が開かれました。
守っておきたいスマートフォンのマナー
まずスマートフォンを扱う上でのマナーとしてセキュリティ事情を紹介いただいたのはトレンドマイクロ株式会社の吉井直子さん。現在スマートフォンユーザーは増加しており、Android向けアプリも多数公開されています。しかし、同時に脅威となっているのがスマートフォンを狙ったウイルスやフィッシングサイト、端末の紛失・盗難だといいます。
例えば2010年のAndroidスマートフォンを標的にしたウイルスは916個発見されています。
====================================================
0.2616 : smax-6784976 : 7インチタブレット「eden TAB」の3G対応モデルが8月上旬発売へ!価格は34,800円 - 7 : smax : 2012-07-23 23:55:00
http://news.livedoor.com/article/detail/6784976/
・eden TAB | 人気の軽量7インチタブレット・スマホ・スマートフォンゼロから始めるスマートフォン
====================================================
0.2625 : smax-6673414 : 2012年夏モデルでおすすめのスマートフォンはこれだ!ハイスペック、らくらく、でも、ピンクが好き(新米ママちえ編) - 1 : smax : 2012-06-19 08:55:00
http://news.livedoor.com/article/detail/6673414/
2012年夏モデルでおすすめのスマートフォンはこれだ!ハイスペック、らくらく、でも、ピンクが好き(新米ママちえ編)。GALAXY SIIIはやはり本命?
こんにちは。最近赤ちゃんを出産して育児奮闘中のちえです。
子供を産んだからモバイルは少しおあずけ……とはならず、相変わらず新しいスマートフォンを触りながらはしゃぐ日々を送っております。
先月中旬から順次各携帯電話事業者より夏モデルが発表されました。以前にも増してスマートフォン中心のラインナップとなり、ますますどれにしようか悩んでしまいますよね。先日も東京で行われたNTTドコモの2012年夏モデル内覧会に行ってきて、新機種を体験してきたばかりです。
そこで、今回は、私が個人的に気になった新機種からベスト3を選んでみました。現時点で実物に触れることができたのが、ドコモ向け端末のみのため、あえてドコモのモデルから選んでみました。
====================================================
0.2634 : smax-6621762 : 【透けるディスプレイやiPhoneが防水になる技術まで!ワイヤレスジャパン2012を振り返る】 - 4 : smax : 2012-06-03 08:55:00
http://news.livedoor.com/article/detail/6621762/
携帯電話等のモバイル通信機器に関連するケースや周辺アクセサリーの商品を作成、販売している株式会社ラスタバナナ/テレホンリースは全国の量販店での年間販売台数第1位のベンダーを表彰する賞となっている「BCN AWARD」のスマートフォンアクセサリー部門で2年連続最優秀賞を受賞しています。スマートフォンアクセサリーの老舗ともいえるのではないでしょうか。ブース内の展示数はかなり多く、その中でも人気売れ筋商品を聞いてきましたので紹介したいと思います。
■ワイヤレスジャパン2012にてNTTドコモが「メール翻訳コンシェル」を出展!6月から試験運用開始【レポート】
NTTドコモブースにおいて出展されている「メール翻訳コンシェル」を体験してきましたので、スマートフォンによる実際に翻訳作業を行った時の様子を交えて紹介します。
検索クエリ(qで終了):

いかがでしょうか?

少なくとも言えるのは、検索結果が分かり易くなっているということですね。
この状態であれば、ヒットしたチャンクのみを返しても良さそうですし、前後を結合したり、記事全体を返すのもありだと思います。
いずれにしても取り扱いは楽でそうです。

検索結果そのものも、前回に発生した
「とか!焼き畑と化したスマホ業界の真実」
といった単独では意味不明な結果が出てこない分、感覚的な精度が上がっていることが感じられます。

これは、「意味がまとまった単位」でembeddingされることで、
検索時のベクトルの方向が安定したためと考えられます。

感覚的にではなく、数値的にRAGの検索結果を評価する手法もあり、そのために使われる代表的なライブラリとして 「RAGAS」 があります。
この記事は入門的な内容なので、詳細は省かせていただきますが、いずれ機会があれば「RAGAS」の説明も別の記事内でして行きたいと思います。

さて、チャンキングによってそこそこ実用的なベクトル検索が得られるようになりましたが、もう少し欲が出てきませんでしょうか?

今回の検索結果は、いずれも意味的な「ふわっと」捉えたデータがヒットしているのですが、悪く言えば幅広く「ランダム」な情報を拾っているようにも見えます。
ユーザーがそのようなな結果を求めている場合は良いのですが、

もう少しピンポイントでヒットするデータを上位に持ってきて欲しい

と思う方が自然でしょう。

たとえば、
「iPhone17の評判について」
(今回のデータセットには含まれていないですが、あくまでも例として)
というクエリに対して、
「iPhone14」や「Android」の情報は求めていないので、表示するのであれば「参考情報」として後ろの方に配置して欲しいと思うはずです。

実は、このような課題に対応できる解決策としてよく使われているのが、

ハイブリッド検索

という手法で、簡単にいうと、

「ピンポイント検索」

「あいまい検索」

を組み合わせた検索手法になります。

つまり、

今回の改善で

「意味的には正しい検索結果」

は得られるようになりましたが、

「ユーザーが本当に欲しい情報を最上位に持ってくる」

という観点では、まだ課題が残っています。

次回ではこの 「ハイブリッド検索」 について詳しく説明して行きます。
👇👇👇

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?