Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

文章を検索する仕組み

Avatar for segavvy segavvy
November 27, 2025
130

 文章を検索する仕組み

2025年11月27日に開催されたLangChain Meetup Tokyo #7( https://langchain.connpass.com/event/374899/ )で、検索についてお話しした際の資料です。

Avatar for segavvy

segavvy

November 27, 2025
Tweet

More Decks by segavvy

Transcript

  1. ⽂章を検索する仕組み 専⾨⽤語をなるべく使わずに解説してみます @segavvy ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7

    1 ※内容・意⾒は私個⼈のものであり、所属企業・部⾨⾒解を代表するものではありません。 RAGやコンテキストエンジニアリングでも⼤切!!
  2. はじめに ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7 2 ⽂章の検索といえば

    ベクトル検索でしょ︖ 検索もいろいろあるのか…… ⽬的にあわせて考えねば︕ 今 15分後 4章にわけてお話します よろしくお願いします︕
  3. 検索は「道具」 • ⽬的は「必要な情報を⾒つける」ことであり 「◦◦検索」はそのために使う「道具」 • 状況によって適切な道具は変わる a. ある商品のレビューと似たようなレビューを探したい時 レビューの⼀覧を⼆分探索したりはしない b.

    商品コードがわかっている商品の在庫数が知りたい時 商品DBを全⽂検索したりはしない c. ソースコードから特定関数の呼び出し箇所を列挙したい時 ソースコードをベクトル検索したりはしない ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7 4
  4. ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7 7 ʢٳܜʣࣗݾ঺հ ͕͑͠Β

    ͔ͨ͠ ߐ಄ و࢙ !TFHBWWZʢηΨϏʣ גࣜձࣾδΣωϥςΟϒΤʔδΣϯπ "*"HFOU5SBJOJOH4QFDJBMJTU ΋ͷͮ͘Γ΍࢓૊Έͮ͘Γ͕େ޷͖ɻ"*ͷࣾձ࣮૷ʹᬏਐதʂ
  5. 細胞160個で⼿書き数字が認識できた︕ ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7 10 各数字に

    対応する 細胞の出⼒が 強くなる ⼊⼒は 縦28×横28の 点からなる画像 (784ピクセル) 事前に⼤量の⼿書き数字の画像とその正解のペアを⽤意して 調整すれば⼿書き数字を認識する仕組みができる︕
  6. LangChainでベクトル検索するには LangChainの公式ドキュメ ント「Build a RAG agent with LangChain」では、 ベクトル検索を使ったRAG の実装⽅法が解説されてい

    ます ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7 17 Build a RAG agent with LangChain h3ps://docs.langchain.com/oss/python/langchain/rag
  7. 第2章のまとめ ベクトル検索の仕組み 専⾨⽤語 1 ⼈間の脳をマネした仕組み ニューラルネットワーク 2 ⼤量のデータを使って教える作業 機械学習(Machine Learning、ML)

    3 細胞を⼤量に組み合わせて教え込む仕組み ディープラーニング 4 数字の羅列 ベクトル 5 ⽂章を数字の羅列に凝縮すること ⽂章の埋め込み(text embedding) 6 意味が近いものを 近い数字の羅列にする仕組み 教師ありSimCSE(supervised SimCSE) ※今回の説明の場合 7 数字の羅列を検索する仕組み ベクトル空間モデル、ベクトル検索エンジン 8 数字の羅列を検索できるデータベース ベクトルDB、ベクトルストア ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7 18
  8. ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7 19 ʢٳܜʣୈ̎ষͷݩهࣄͷ͝঺հ ୈষ͸ʮʲॳ৺ऀ޲͚ʳ

    ຊ౰ʹΘ͔Γ΍͍͢"*ೖ ໳ʯͷൈਮͰ͢ "*શൠʹ͍ͭͯৄ͘͠ղઆ ͍ͯ͠·͢ͷͰɺ͝ڵຯ͕ ͋Γ·ͨ͠Βͥͻʂ https://qiita.com/segavvy/items/9e7e4ab4b253599ac58a
  9. 仕組みは本の索引と同じ 索引 【あ】 あご 3巻 13 ⾜ 4巻 239 頭

    2巻 192 【い】 胃 2巻 28 【う】 腕 4巻 32 うなじ 2巻 129 本は索引を⾒れば ⽬的ページが すぐわかる 「⾜」については 4巻の239ページ︕ 全⽂検索でも 検索するために 索引をあらかじめ作っておく︕ ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7 21
  10. 索引に載せる⾔葉は どう選ぶのか︖ 索引にない⾔葉では 検索できない どんな条件でも検索できるように 索引を作る必要がある 代表的な 2つの作り⽅をご紹介 ◦ ”AI”

    は検索できる × “RAG” は索引にないので 検索できない ⾔葉 単語の出現場所 AI ⽂書A(5、15⽂字⽬) ⽂書F(... 勉強 ⽂書A(8、18⽂字⽬) ⽂書G(… する ⽂書A(3、20⽂字⽬) ⽂書B(… ⼈達 ⽂書A(12⽂字⽬) ⽂書D(… ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7 22
  11. 索引の作成時 1.⽤語辞書(品詞や原形)を使い分解 2.助詞などの不要なものを除去 3.変化しているものを 原形へ戻す 索引の作り⽅︓①⽇本語解析 A I を勉強した⼈達 A

    I 勉強 する ⼈達 検索時 検索条件の⽂字に対して 同様の処理を実施してから 索引を調べる 索引を⾒て これらが すべてあるものを探す A I を 勉強 し た ⼈達 A I 勉強 し ⼈達 A I の勉強 A I 勉強 ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7 23
  12. A I を勉強した⼈達 A I を勉強した⼈達 A I を勉強した⼈達 A

    I を勉強した⼈達 A I を勉強した⼈達 A I を勉強した⼈達 A I を勉強した⼈達 A I を勉強した⼈達 索引の作り⽅︓②単純に切り刻む A I を勉強した⼈達 検索時 検索条件の⽂字に対して 同じ⽂字数で切り出す 最後の半端は前の⽂字で ⽂字数を合わせる※ 索引を⾒て これらが すべてあるものを探す 索引の作成時 1⽂字ずつ ずらしながら 固定の⽂字数で 切り出していく A I の勉強 A I の勉 勉強 ※ 切り出し ⽂字数が2の場合 ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7 24
  13. ②単純に切り刻む︓⾔葉の途中が該当 東京都府中市 は 東京 京都 都府 府中 中市 に分解 “京都”

    で検索されてしまう 索引の課題 ①⽇本語解析︓解析ミス Honda Cars 東京都 は Honda Cars 東京 都 に分解 解析部分を調整したり 後処理で不要なものを除いたり 両⽅の⽅式を組み合わせたり etc. 正しくは ひがしきょうと Honda Cars 東京都 ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7 25 “京都” で検索できない “東京” で検索されてしまう
  14. 表記のゆれに対応する仕組み ゆれを統⼀する表や 同義語辞書などを⽤意して処理 1 全半⾓ ABC = ABC アイウ =

    アイウ 2 ⼤⼩⽂字 ABC = abc ABC = abc 3 ひらがな・カタカナ りんご = リンゴ みかん = ミカン 4 数字 123 = 一二三 = 百二十三 = ⅠⅡⅢ 5 異体字・新旧字体 高 = 髙 斉 = 齊 辺 = 邊 6 送り仮名 引っ越し = 引越し = 引越 7 同義語 アメリカ = 米国 = 合衆国 = USA 8 記号 ー = ー = - = - = ― = ‐ ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7 26
  15. LangChainで全⽂検索するには ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7 27 ⼩規模なデータをインメモリで検索する場合は

    TFIDFRetriever や BM25Retriever が利⽤できますが ⽇本語の場合は ⾔葉を切り出す処理との組み合わせが必要です https://docs.langchain.com/oss/python/integrations/retrievers/tf_idf https://docs.langchain.com/oss/python/integrations/retrievers/bm25 本格的に利⽤する場合は 全⽂検索エンジンや検索機能付きのDBなどとの連携が⼀般的です (例)ElasticSearchBM25Retriever https://docs.langchain.com/oss/python/integrations/retrievers/elasticsearch_retriever
  16. 第3章のまとめ 全⽂検索の仕組み 専⾨⽤語 1 事前に索引を作ること・その索引 インデキシング・インデックス 2 索引データ(⾔葉と出現位置の対応表) 転置インデックス、転置ファイル 3

    索引作成のために 対象のデータを集めること クローリング、クロールする 4 ⽇本語の解析処理により ⾔葉を切り出すこと 形態素解析、分かち書き 5 検索で不要な 助詞などの⾔葉を 索引から除くこと ストップワードの除去 6 ⽂章を⼀定の⽂字数で単純に切り刻む⽅式 n-gram(エヌ・グラム) 7 ⽂章の分割ミスなどにより 検索に該当しないこと 検索もれ 8 ⽂章の分割ミスなどにより 間違って該当したデータ 検索ノイズ 9 表記ゆれを統⼀したり 辞書を使って対応する処理 正規化、ステミング、辞書展開 ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7 28
  17. ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7 29 ʢٳܜʣୈ̏ষͷݩهࣄͷ͝঺հ ୈষ͸ʮ୭Ͱ΋Θ͔Δ

    શจݕࡧೖ໳ʯͷൈਮͰ ͢ ΋͏গ͠ৄ͘͠ղઆͯ͠ ͍·͢ͷͰɺ͝ڵຯ͕͋ Γ·ͨ͠Βͥͻʂ https://zenn.dev/segavvy/articles/e97fa8417a0ee3
  18. 道具だけに頼らず⼯夫しよう︕ たとえば社内のファイルを⾃然⽂で検索したい場合 • ファイルが格納された既存DBのインデックスを流⽤する LLMに ⾃然⽂の条件からDB向けのクエリーを⽣成させる • 条件が単語のみだと検索の精度が上がらないので LLMに 必要な条件が揃うまで聞き返しをさせる

    「RAG」で検索された時「RAGの何を知りたいですか︖」と聞き返す • ⼊⼒されなくても分かっている条件を⾃動的に補う 「RAGの概要が知りたい」でも営業職と技術職では欲しい情報が違う 所属部⾨と連動させて 条件を補完したり対象DBを選択したりする ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7 33
  19. おわりに ©2025 segavvy 2025/11/27 LangChain Meetup Tokyo #7 35 ⽂章の検索といえば

    ベクトル検索でしょ︖ 検索もいろいろあるのか…… ⽬的にあわせて考えねば︕ 15分前 今 このお話が検索の理解の⼀助になれば幸いです お時間をいただき ありがとうございました