【LangChain】ChromaとFAISSの近傍検索を比較
前回まで、近傍検索にFAISSとChromaの2つを使いました。
現時点では、理由があって両者を使い分けているわけではなく、チュートリアル通りにやっているだけなのですが、何が違うのかモヤモヤ感は残っていました。
(ちなみにchromadbはデータベース、faissはデータベースではなくライブラリです)
もちろん、どちらにもメリットデメリットはあり、開発するアプリケーションの規模や要求事項によって使い分けが必要なのでしょうが、とりあえず検索結果に違いはないのか確認しておこうと思います。
google colabセットアップ
!python --version
#-> Python 3.10.12
!pip install openai
import os
os.environ["OPENAI_API_KEY"] = "*****"
from openai import OpenAI
client = OpenAI()
短文で試す
サンプルテキストとして以下用意しました
target_texts = [
"好きな食べ物は何ですか?",
"どこにお住まいですか?",
"朝の電車は混みますね",
"今日は良いお天気ですね",
"最近景気悪いですね"
]
これに対して、'大阪に住んでいます'の短文でベクトル近傍検索を試します。
FAISS
前回の検証で、embeddingのモデルにtext-embedding-3-smallを使うと良好な結果が得られたので、今回もtext-embedding-3-smallを使います
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
faiss_vectorstore = FAISS.from_texts(
texts = target_texts,
embedding=OpenAIEmbeddings(model='text-embedding-3-small')
)
faiss_docs = faiss_vectorstore.similarity_search_with_score('大阪に住んでいます')
for doc in faiss_docs:
print(doc)
結果
(Document(page_content='どこにお住まいですか?'), 0.92825663)
(Document(page_content='最近景気悪いですね'), 1.4471531)
(Document(page_content='今日は良いお天気ですね'), 1.5152621)
(Document(page_content='好きな食べ物は何ですか?'), 1.5968006)
きちんと「どこにお住まいですか」が最も近傍であると出ました
Chroma
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
chroma_vectorstore = Chroma.from_texts(
texts = target_texts,
embedding=OpenAIEmbeddings(model='text-embedding-3-small')
)
chroma_docs = chroma_vectorstore.similarity_search_with_score('大阪に住んでいます')
for doc in chroma_docs:
print(doc)
結果
(Document(page_content='どこにお住まいですか?'), 0.9283161163330078)
(Document(page_content='最近景気悪いですね'), 1.4478684663772583)
(Document(page_content='今日は良いお天気ですね'), 1.515293836593628)
(Document(page_content='好きな食べ物は何ですか?'), 1.5969297885894775)
同じく「どこにお住まいですか」が最も近傍であると出ました。
ただ距離スコアを見ると、FAISSで検索した時とニアリーな数値ですが小数点下4桁の数値が異なっています。
なんで?
text-embedding-ada-002の場合
faissの結果
(Document(page_content='どこにお住まいですか?'), 0.23703708)
(Document(page_content='朝の電車は混みますね'), 0.33973727)
(Document(page_content='最近景気悪いですね'), 0.3561959)
(Document(page_content='今日は良いお天気ですね'), 0.36770105)
chromaの結果
(Document(page_content='どこにお住まいですか?'), 0.23703709244728088)
(Document(page_content='朝の電車は混みますね'), 0.33973729610443115)
(Document(page_content='最近景気悪いですね'), 0.3561958372592926)
(Document(page_content='今日は良いお天気ですね'), 0.36770111322402954)
両者ともほぼ同じスコアですが、やはり下8桁レベルで異なっています。
ちなみにDocumentのスコア差でいうと、ada-002は1.4倍ほど、embedding-3は1.5倍以上の差が開きましたので、やはりembedding-3のほうが文の意味を汲んでいるということでしょうか。
もっと文章を長くしてみる
前回のAdoさんのwikipediaを用いた検証で、文章をチャンクに分解する時は1000文字程度あったほうが近傍検索の精度が上がるという結果が出ました。
そこで、1000文字程度の文を用意してみました。
(chatGPTで作成しています)
- カニ食べ放題に反対する文を作成してください
- 投資を勧める文を作成してください
- 東京の魅力を伝える文を作成してください
- AIによるテクノロジー進化を伝える文を作成してください
- 鬼滅の刃のストーリーを要約してください
クリックで展開
target_texts = [
"カニ食べ放題の提供は、一見して魅力的なオファーに思えるかもしれません。しかし、このようなサービスは持続可能性、動物福祉、および消費者の健康の観点から多くの問題を引き起こす可能性があります。ここでは、カニ食べ放題に反対するいくつかの主要な理由を探ります。まず、持続可能性の問題が挙げられます。海の生態系は非常に繊細で、過剰な漁獲は特定の種の減少、さらには絶滅につながる恐れがあります。カニ食べ放題のようなサービスは、消費を過剰に促進し、漁獲圧を不必要に高めることで、この問題をさらに悪化させる可能性があります。持続可能な漁業の実践は、海洋生物多様性の保護に不可欠であり、無制限の食べ放題はこの目標に反しています。次に、動物福祉の観点からの懸念です。カニを含む海洋生物は、しばしば適切な扱いを受けずに捕獲され、輸送されます。これらの生物が直面する苦痛とストレスは、食べ放題のようなサービスによってさらに増大されることがあります。動物福祉を尊重する社会では、このような慣行は再考されるべきです。消費者の健康に関しても、カニ食べ放題は問題となり得ます。過剰な海鮮消費は、特定の健康リスクを高める可能性があります。例えば、高コレステロールや食中毒のリスクがあります。さらに、食べ放題の文化は、過食と食品の無駄を促進することで、健康に対する意識の低下を引き起こす可能性があります。さらに、カニ食べ放題は食品の無駄を増やすことも懸念されます。顧客が自分が消費できる以上の食品を取ることは珍しくなく、結果として大量の食品が廃棄されます。このような無駄は倫理的にも環境的にも受け入れがたいものです。最後に、カニ食べ放題は、質よりも量を重視する消費文化を促進します。これは、食品に対する敬意の欠如を示し、長期的には消費者の食に対する期待と態度に悪影響を及ぼす可能性があります。総じて、カニ食べ放題には、持続可能性、動物福祉、消費者の健康、食品の無駄、そして消費文化の観点から多くの問題があります。これらの問題を考慮すると、カニ食べ放題のようなサービスは、より責任ある方法で海産物を楽しむための代替手段に取って代わられる",
"投資は将来の安定と成長への鍵となり得ます。貯金だけに頼る時代は終わりを迎え、賢明な投資戦略を通じて個人の資産を増やすことが、経済的自立と豊かな未来を実現するための必須条件となっています。投資は単に余剰資金を市場に投じること以上の意味を持ち、資産の多様化、インフレ対策、そして長期的な財産形成の機会を提供します。株式、債券、不動産、またはミューチュアルファンドといった様々な投資先は、それぞれリスクとリターンのバランスを持ち、個人のリスク許容度や投資目標に合わせて選択することが可能です。また、積立投資や分散投資のような戦略は、リスクを管理しつつ資産を着実に成長させる方法として広く推奨されています。さらに、投資は個人の経済的知識を深め、市場や経済の動向に対する理解を高める絶好の機会を提供します。これらの知識は、日常生活においても賢明な財務判断を下すために役立ちます。時代は変わり、経済環境は常に進化しています。そのため、自分自身と家族の未来を守るためには、積極的に投資の機会を模索し、それに対応する知識とスキルを身につけることが重要です。投資には確かにリスクが伴いますが、適切な教育と計画により、これらのリスクを管理し、長期的な利益を享受することが可能です。経済的自由を実現するための第一歩として、今日から投資を始め、将来への大きな一歩を踏み出しましょう。",
"東京は、伝統と革新が見事に融合した世界有数の都市です。その魅力は、歴史的な寺院から最先端のテクノロジー、静かな庭園から活気あふれる商業地まで、多岐にわたります。浅草の雷門や皇居の庭園など、古き良き日本の姿を偲ばせる場所は多く、訪れる人々に日本の伝統文化を深く感じさせます。一方で、渋谷のスクランブル交差点や六本木ヒルズからの夜景のように、東京のモダンな側面は、都市のダイナミックなエネルギーと刺激的なライフスタイルを象徴しています。また、東京はグルメの都としても知られており、世界中の料理を楽しむことができますが、特に寿司や天ぷら、ラーメンといった日本食の質と多様性には目を見張るものがあります。世界中のシェフたちがその技を競い合うこの都市では、ミシュラン星を獲得したレストランが多数存在し、食文化の高さを世界に示しています。さらに、東京はアートとカルチャーの中心地でもあります。国立新美術館や森美術館などの美術館は現代美術から古典まで、幅広い展示で知識欲を刺激し、多様な文化イベントやフェスティバルは訪れる人々に絶え間ない刺激を提供します。また、東京はショッピングの天国でもあります。表参道のブティック、秋葉原の電気街、銀座の高級ブランド店は、それぞれ異なる魅力を持ち、買い物好きにはたまらない場所です。この都市の魅力の一つに、公共交通機関の発達が挙げられます。JRや地下鉄は非常に効率的で、都市のあらゆる角へ簡単にアクセスすることができます。この信頼性の高い交通網は、東京を探索する際の大きな利点です。最後に、東京の魅力は人々にも見出されます。礼儀正しく、親切な住民は、訪れる人々を温かく迎え入れます。この都市のダイナミズムと温かさは、一度訪れたら忘れられない印象を残し、多くの人々を何度も訪れる理由となっています。まさに東京は、その独自の魅力で世界中の人々を魅了し続ける、比類なき都市です。",
"AI(人工知能)によるテクノロジーの進化は、現代社会における革命的な変化をもたらしています。この技術の進歩は、医療から金融、教育、製造業に至るまで、あらゆる業界に影響を与えています。AIの能力は、膨大なデータを解析し、学習することで日々向上しており、これにより人間の能力を補完し、時には超越することさえあります。例えば、医療分野では、AIは画像診断を支援し、がんなどの病気をより早期に発見することができます。また、個別化医療の分野では、患者一人ひとりの遺伝子情報を分析し、最適な治療法を推奨することが可能になっています。金融業界では、AIは不正検出、リスク管理、顧客サービスの自動化に貢献しており、これにより効率性が大幅に向上し、顧客体験が改善されています。教育分野では、AI技術を用いたパーソナライズされた学習プラットフォームが開発され、生徒一人ひとりの学習スタイルやペースに合わせた指導が可能になっています。製造業においては、AIによる予測保全が実現し、機械の故障を予測し、計画的なメンテナンスによってダウンタイムを最小限に抑えることができます。さらに、スマートファクトリーの概念は、生産ライン全体の自動化と最適化を実現し、生産性の大幅な向上を実現しています。AIはまた、自動運転車の開発にも欠かせない技術であり、将来的には交通事故の減少、交通渋滞の解消、移動の自由度の向上など、社会全体に大きな利益をもたらすことが期待されています。しかし、AI技術の進化は、職業の自動化による雇用への影響や、倫理的な問題など、新たな課題も提示しています。プライバシーの保護、AIの意思決定過程の透明性、偏見のないアルゴリズムの開発など、これらの課題に対処することが、AI技術をより良い方向へと導くためには不可欠です。AIによるテクノロジーの進化は、人類に前例のない機会を提供していますが、その利益を最大限に引き出すためには、技術的な進歩と同じくらいの努力を社会的、倫理的な問題への対応にも注ぐ必要があります。",
"『鬼滅の刃』は、吾峠呼世晴による日本の漫画作品で、そのアニメ化も大きな人気を博しています。物語は大正時代の日本を舞台に、主人公・竈門炭治郎が家族を鬼に殺された悲劇から始まります。炭治郎の妹・禰豆子も鬼にされてしまいますが、彼女は人を襲う鬼とは異なり、人間の心を保っていました。炭治郎は禰豆子を人間に戻す方法を見つけるため、そして家族を襲った鬼への復讐を果たすために、鬼殺隊に入隊します。鬼殺隊は人を襲う鬼を討伐する組織であり、炭治郎はそこで剣術を学び、多くの同志と出会い、成長していきます。物語は炭治郎と仲間たちが、鬼の中でも特に強力な十二鬼月と呼ばれる鬼たちと戦いながら、鬼の創造者である鬼舞辻無惨に迫っていく過程を描きます。炭治郎の純粋な心と不屈の努力、そして仲間たちとの絆が、厳しい試練の中で彼らを支えます。彼らの戦いはただ鬼を倒すだけでなく、人と鬼の悲しみや苦しみにも光を当て、禰豆子を人間に戻す手がかりを求め続ける旅でもあります。『鬼滅の刃』は、心温まる家族愛と友情、厳しい現実と向き合う勇気、そして何よりも人間としての強さと優しさを描いた物語です。それは多くの読者と視聴者に感動を与え、炭治郎と禰豆子、そして彼らと共に戦う仲間たちの旅路に深い共感を呼んでいます。"
]
検索1
'カニを腹一杯食べたい'という短文で検索しました。
(もちろんカニ食べ放題反対の文が近傍になるはずです)
※以下のように書いて出力しました。
for doc in faiss_docs:
content, score = doc
print(f'{content.page_content[:30]} ,{score}')
faissの結果
カニ食べ放題の提供は、一見して魅力的なオファーに思えるかもし ,1.090087890625
『鬼滅の刃』は、吾峠呼世晴による日本の漫画作品で、そのアニメ ,1.6270723342895508
東京は、伝統と革新が見事に融合した世界有数の都市です。その魅 ,1.8229477405548096
投資は将来の安定と成長への鍵となり得ます。貯金だけに頼る時代 ,1.8875393867492676
chromaの結果
カニ食べ放題の提供は、一見して魅力的なオファーに思えるかもし ,1.0900877714157104
『鬼滅の刃』は、吾峠呼世晴による日本の漫画作品で、そのアニメ ,1.6270630359649658
東京は、伝統と革新が見事に融合した世界有数の都市です。その魅 ,1.823068380355835
投資は将来の安定と成長への鍵となり得ます。貯金だけに頼る時代 ,1.8876885175704956
スコアに本質的な違いは見られません
検索2
検索文を以下のように長くしました。進撃の巨人の要約文です
titan = '「進撃の巨人」は、人類が巨人と呼ばれる人間を襲う謎の生物によって絶滅の危機に瀕している世界を舞台にした物語です。人類は、巨人から身を守るために高さ50メートルの三重の壁に囲まれた街で生活しています。物語は、主人公のエレン・イェーガーが巨人に母親を食べられるところから始まります。その復讐と人類を巨人の脅威から救うことを誓い、エレンは幼馴染のミカサ・アッカーマンとアルミン・アルレルトと共に調査兵団に入隊します。エレンは巨人になる特殊な能力を持っていることが判明し、人類にとっての希望となりますが、同時に多くの謎と政治的な陰謀に巻き込まれていくことになります。物語は、人類が巨人との戦いだけでなく、壁の中に隠された真実、人間の本性、そして自由を求める戦いを描いています。巨人の正体や壁の秘密が徐々に明らかになる中で、エレンたちは人類の敵である「巨人」の起源と真実を知ることになります。そして、壁の外には想像を絶する世界が広がっており、人類は巨人だけでなく他の人間とも戦わなければならない運命にあることが判明します。エレンは人類を救うため、そして自らの信念のために、仲間たちと共に過酷な戦いを繰り広げます。進撃の巨人は、壮大なスケールで描かれる人類の生存をかけた戦い、深い人間ドラマ、そして複雑に絡み合う政治的な策略が特徴的な作品であり、読者に強烈な印象を与える物語です。'
あらすじという点では鬼滅の刃が近くなるはずですが、意味的には別物です。
(人が食べられるという点では共通しているかもしれませんが)
faissの結果
『鬼滅の刃』は、吾峠呼世晴による日本の漫画作品で、そのアニメ ,1.0213203430175781
AI(人工知能)によるテクノロジーの進化は、現代社会における ,1.518726110458374
東京は、伝統と革新が見事に融合した世界有数の都市です。その魅 ,1.5441689491271973
投資は将来の安定と成長への鍵となり得ます。貯金だけに頼る時代 ,1.5963176488876343
chromaの結果
『鬼滅の刃』は、吾峠呼世晴による日本の漫画作品で、そのアニメ ,1.0213725566864014
AI(人工知能)によるテクノロジーの進化は、現代社会における ,1.518784999847412
東京は、伝統と革新が見事に融合した世界有数の都市です。その魅 ,1.544326663017273
投資は将来の安定と成長への鍵となり得ます。貯金だけに頼る時代 ,1.5965275764465332
やはり「マンガのあらすじ」という点で近いと判断されたのでしょうか。鬼滅の刃が最も近くなりました。
そしてfaissとchromaのスコアは、小数5位以降に微妙な違いはあるものの、違いはありません。
結論
chromadbでもfaissでも、近傍検索のスコアに本質的な差はありませんでした。
(そして使い勝手も似たようなものです)
なので最初の間は両者の違いをそれほど意識せずに勉強しようと思います。
Discussion