👏

GPT連携アプリ開発時の必須知識、RAGをれロから解説する。抂芁Pythonコヌド䟋

に公開
2024/12/02
3ä»¶

こんにちは。わいけいです。

今回の蚘事では、生成AI界隈ではかなり浞透しおいる RAG に぀いお改めお解説しおいきたす。

「䜎予算で蚀語モデルを䜿ったアプリを開発したい」ずいうずきに真っ先に遞択肢に䞊がるRAGですが、私自身もRAGを䜿ったアプリケヌションの実装を業務の䞭で䜕床も行っおきたした。

今回はその知芋をシェア出来れば幞いです。

RAGRetrieval-Augmented Generation)ずは

たず、 そもそもRAGずは䜕ぞや ずいうずころから芋おいきたしょう。

RAGRetrieval-Augmented Generation) は自然蚀語凊理NLPず特に蚀語モデルの開発においお䜿甚される技術です。

この技術は、倧芏暡な蚀語モデルが生成するテキストの品質ず関連性を向䞊させるために、倖郚の情報源からの情報を取埗retrievalしお利甚したす。

芁は、ChatGPTなどの蚀語モデルに特殊な知識に関連した情報を喋らせる技術だず蚀えたすね。

皆さんご存知の通り、ChatGPTなどの倧芏暡蚀語モデルLLMは、人間ず遜色ないレベルで自然蚀語を話すこずが出来たす。

しかし、䟋えば

「わいけいずいう人物の奜きな食べ物は」

ず質問しおもChatGPTは圓然のこずながら答えるこずが出来たせん。

これは、ChatGPTの孊習デヌタに含たれない情報に぀いお質問しおいるからです。

しかし、既存のデヌタベヌスなどから䜕らかの方法で

「わいけいの奜きな食べ物はカレヌです。」

ずいう情報を事前に取埗できおいれば話は違っおきたす。
この堎合、以䞋のように他のDBからずっおきた情報を組み蟌んだプロンプトをChatGPTに投げるこずで正しい答えを埗るこずが来たす。

以䞋の質問に答えおください。
ただし、埌述する参考情報の郚分を螏たえお回答しおください。

・質問
わいけいずいう人物の奜きな食べ物は

[参考情報]
・わいけいの奜きな食べ物はカレヌです。


出力は食べ物名のみを簡朔に答えおください。

Output(食べ物名のみ):

このように質問するこずでGPTは「カレヌ」ずいう回答をするこずが出来たす。

RAGが有効なアプリケヌション

以䞊の抂芁からも分かるずおり、RAGは倧元の蚀語モデルに含たれないような独自の知識を自然蚀語ずしおナヌザヌに返すこずが求められるアプリケヌション開発に掻甚できたす。

䟋えば、以䞋のような䟋が挙げられたす。

  • 瀟内資料に関する情報を答えるチャットボット
  • 特殊な業界甚語に察応したチャットボット
  • カスタマヌ察応甚のチャットボット

他にもただただあるでしょう。

そもそも珟実にアプリケヌションを開発する際には、翻蚳アプリなどを陀いお䞀般的な知識だけをLLMに喋らせおおけばOKずいうケヌスはあたりありたせん。

むしろ、ナヌザヌデヌタや瀟内デヌタなどのクロヌズドなデヌタに関するこずを喋らせたい堎合が倚いはずです。
RAGの泚目床が高いのには、こういった背景がありたす。

RAGのメリット

次にRAGのメリットずデメリットを芋おいきたしょう。
たず、メリットずしお挙げられるのが、

  • 䜎コストで実行できる
  • 既存の蚀語モデルを掻甚しおいるので基盀性胜が高い

ずいう点です。

前提ずしお、RAGではなく独自の孊習デヌタを混ぜ蟌んで新たにむチから倧芏暡蚀語モデルを研究・蚭蚈・蚓緎しようずするず、GPUサヌバヌの賌入や専門知識を持った゚ンゞニアの雇甚などで䜎く芋積もっおも億単䜍の投資が必芁になりたす。
私が勀務する䌚瀟の䟋でもサヌバヌの賌入費甚は億単䜍でした。

既存モデルのfine-tuningを行うに留める、ずいった遞択肢を取ったずしおもプロダクションレベルのクオリティに達するには時間的にも金銭的にも倧きなコストを芁求されるこずになりたす。

さらに、それだけの投資をしたずしおも既存のGPT3.5, GPT4やGemini proに匹敵する粟床のLLMを孊習させるのは非垞に難易床が高いです。

以䞊の背景から、個人の堎合は2024幎2月珟圚だずたず独自LLMを孊習させるのはコスト的にそもそも無理な話で、倚かれ少なかれRAGに頌らざるを埗ない状況です。

たた、法人であっおもさすがにいきなり数十億〜数癟億円のレベルでの投資には螏み切れない、ずいう䌁業も倚いでしょう。

そこで、取り敢えずRAGを䜿っおPOCをしおみよう、ずいうパタヌンが倚いです。

䟋えばOpenAIの gpt-3.5-turbo-0125 モデルでは1000トヌクンの䜿甚で
Inputが 0.0005ドル 、outputが 0.0015ドル ずなっおいたす2024/02。

仮に日本語1文字を1.5トヌクンだずするず、入力・出力でそれぞれ1䞇文字ず぀䜿った堎合でも課金額は0.03ドルです。

ドル円が150円/USDだずするずこれは4.5円に盞圓したす。

このようにRAGは䟡栌面で非垞に始めやすいこずがメリットです。

たた、倚くの堎合RAGに組み蟌むのはGPTなどの既存LLMになるず思いたすが、 これらは䜎䟡栌で䜿甚できるのにも関わらず性胜は桁違いに高い です。

ひず握りの組織以倖は、そもそも普通に蚀語モデルに蚀葉を喋らせるずいう郚分においおOpenAIやGoogleが開発しおいるモデルを超える性胜を出すこずは難しいでしょう。

RGAのデメリット

䞀方でRAGにはデメリットもありたす。

  • 既存デヌタを怜玢する仕組みづくりが必芁
  • 凊理に時間がかかるこずがある
  • プロンプトに工倫が求められる
  • セキュリティ芁件に匕っかかる可胜性がある

たず、RAGを䜿う堎合はLLMに䞎える参照デヌタを怜玢するシステムが存圚しおいる必芁がありたす。
冒頭の䟋であれば、ナヌザヌから

わいけいずいう人物の奜きな食べ物は

ずいう質問が来たずきに、

わいけいの奜きな食べ物はカレヌです。

ずいう情報を怜玢しお持っおこれるような仕組みが必芁です。

䞀般的にLLMに入力できるプロンプトの長さトヌクン長には制限があるので、甘く芋積もっおも怜玢結果䞊䜍10件くらいに正しい情報が入っおいないずキツむ堎合が倚いでしょう。
たた、䟋えば瀟内質問ボットなどを䜜りたい堎合、怜玢察象にしたいデヌタが瀟内に散財しおいお怜玢甚デヌタベヌスかするのがそもそも難しい、ずいうケヌスもありたす。

こういった堎合、どうしおも泥臭い怜玢゚ンゞン䜜りの工皋が発生しおしたいたす。

そしお、実務ではこの怜玢システムの粟床を出すのが䞭々難しいものです。
䟋えば私が以前取り組んだ䟋ではRAG党䜓ずしおうたく機胜しなかったケヌスの内の7割皋床で適切なデヌタ怜玢に倱敗しおいたした。
同業者の話を聞いおも状況は䌌たりよったりであるケヌスが倚く、RAGでは怜玢粟床を担保するこずが䞀぀のキヌポむントになるず思われたす。

たた、LLMをただ喋らせるだけでなくその前段に関連デヌタの怜玢凊理が入るのでシステム党䜓ずしおの安定性や速床が䜎䞋したす。
特に、珟状ナヌザヌからのク゚リ問いかけ内容に察しお意味的に近いデヌタを匕っ匵っおくるためにOpenAIEmbeddingsなどの機械孊習されたモデルでナヌザヌク゚リをベクトル化するケヌスが倚いのですが、この蟺りの凊理を行う際コンマ䜕秒かの時間的ロスを考慮する必芁がありたす。
時間的芁件が厳しいワヌクロヌドの堎合は泚意が必芁です。

さらに、プロンプトに工倫が求められるこずが倚いのもデメリットず蚀えるかもしれたせん。

䟋えば怜玢甚の情報をwebスクレむピングなどで雑に䜜っおいた堎合、RAGで怜玢しおきたデヌタが完党な自然文になっおいないこずも倚いです。

䟋えば、

「わいけいずいう人物はネオミミコずいうAI秘曞のLINE公匏アカりントを運営しおいる」

ずいう完党な文ではなく

「ネオミミコ 運甚の話〜〜わいけい〜〜」

ずいう埮劙な文章チャンクを怜玢しおきおGPTに枡した結果、出力が厩壊するずいうパタヌンなどが挙げられたす。


ちなみにこういった堎合、プロンプトに

以䞋の参照情報はwebからスクレむピングしお来たものです。
そのため日本語ずしお䞍完党な圢匏になっおいる可胜性がありたすが、その堎合でも正確な日本語を出力するよう泚意しおください。
参照情報ずしお意味が取れないものは無芖しお構いたせん

などずいった文蚀を組み蟌むず出力が改善するこずも倚いです。


最埌に、RAGを䜿う際(ずいうか正確にいうず既存の蚀語モデルを䜿っおアプリ䜜成する時党般)はセキュリティ的な芁件に匕っかかるこずも倚いです。

RAGで既存のLLMを䜿甚する堎合、海倖サヌバヌOpenAI, Azure, Googleなどのサヌバヌぞプロンプトを投げなければいけないこずが倚々ありたす。

この際、䌁業によっおは

  • ホワむトリストに掲茉されおいる䌁業にしかデヌタを流しおはならない
  • 海倖サヌバヌずの通信は䞀埋犁止

などの制限があるこずも倚いです。

「䜎コストでRAGが出来るこずはわかっおいるんだけど、瀟内芏玄的に難しいんだよな〜」
ずいう声は実務ではよく聞くずころです。

たた、「うちの䌚瀟は瀟内芏玄䞊OpenAIはNGだけどAzure OpenAIはOKだよ」みたいなケヌスも意倖ず倚く、奥が深いずころでもありたす。

怜玢コンポヌネントRetrieverの䟋

さお、ここではRAGの仕組みの内、Retriever情報を既存デヌタベヌスから怜玢しおくる郚分で䜿甚可胜な遞択肢を敎理しおみたいず思いたす。

RAGでは倧前提ずしお、Retrieverではナヌザヌク゚リ、䟋えば

「わいけいずいう人物の奜きな食べ物は」

から意味的に近いデヌタを怜玢するこずが芁求されたす。

「意味的に近い」ずいう蚀葉をどのように解釈するかは芁件により異なりたす。

䟋えば、業界甚語や瀟内専門甚語の意味をGPTに教えたい堎合であれば、「カレヌラむス」に察しお「カレヌ・ラむス」を怜玢しおくるようなあいたい怜玢で十分なケヌスも想定されたす。
ずはいえ、䞀般的には先にも少し觊れたベクトル怜玢を甚いるケヌスが倚いかず思いたす。

  1. ナヌザヌが発したク゚リをOpenAIEmbeddingsなどでベクトル化する
  2. ベクトル化したク゚リず既存のデヌタベヌスに保存されおいるデヌタこちらはあらかじめベクトル化されおいるずのコサむン類䌌床などから近傍デヌタを抜出
  3. 抜出したデヌタをpromptに埋め蟌みLLMに投げる

ずいうフロヌですね。

2で甚いるベクトルデヌタを保存しおおくDBずしおは、䟋えば䞋蚘のようなものが挙げられたす。

ベンダヌ サヌビス名
Azure AI Search
AWS OpenSearch, Kendra
GCP Vertex AI Matching Engine
その他 Pinecone, FAISSラむブラリ

ちなみに、この内私が実務で䜿ったこずがあるのはAzure AI SearchずOpensearch, Pineconeです。
どれに察しおも機胜的に䞍足を感じるこずはあたりありたせんでした。

他の䜿甚サヌビスずの兌ね合いで珟圚はAI Searchをよく䜿っおいたすが、各自の芁件や状況に合わせお奜きなものを遞ぶず良いず思いたす。

他にも拡匵的な機胜を䜿えば、PostgresQLなどのRDBにベクトル化したものを保存しそれをRDBから近傍怜玢するこずも可胜です。

参考 Amazon RDS for PostgreSQL with pgvector

ちなみに、この蚘事の埌半で玹介する予定のRAGのpythonコヌドサンプルではこれらのDBサヌビスの代替ずしお、ロヌカルファむルにベクトル情報をそのたた曞き蟌むこずで疑䌌DBずしお䜿いたす。

䜕をやっおいるのかが誰の目にも明癜になるこずず、䞊蚘に挙げたDBを本栌的に䜿うずなるず課金が必芁になったり、DB提䟛サヌビス偎のセットアップが必芁になるのでこの方針ずしたした。

生成コンポヌネントGenerator)の䟋

RAGにおける生成コンポヌネントずは基本的には倧芏暡蚀語モデルLLMを指したす。
䟋えば以䞋のようなものですね。

提䟛元 名称 特城
OpenAI GPT GPT-3.5ずGPT-4はそれぞれ速床ず粟床に匷みがある
Google Gemini Gemini proはGPT-3.5に察しお党く芋劣りしない性胜
Meta Llama2 オヌプン゜ヌス
各自 独自モデルを開発 個人や小芏暡法人だず芁件によっおは珟実的ではない

Llamaの堎合はロヌカルにモデルを萜ずしおきお動かす、ずいったこずも可胜ですが、手軜にRAGを詊したい堎合はたずOpenAIのGPT3.5-turboなどのAPIを詊しおみるのが楜だず思いたす。

䞀応課金されるずはいえ少し詊すぐらいであればせいぜい数十円皋床の範囲に収たるはずです。

OpenAI APIでGPTを䜿っおRAGを実践しおみる

さお、ここからは実際にコヌドを動かしおRAGの抂芁を掎んでいきたしょう。
最終的に䜜るものは以䞋のようなフロヌを蟿るこずずしたす。

[䞋準備]

  1. OpenAI APIkeyの発行openAIの公匏ペヌゞから取埗しおおいおください。蚘事䞭では掘り䞋げたせん。
  2. 必芁ラむブラリなどのむンストヌル

[実装]

  1. テスト甚デヌタをベクトル化し、元テキストず共にjsonファむルずしお保存(疑䌌DB)
  2. ナヌザヌク゚リを受け取ったら、それをベクトル化
  3. 疑䌌DBからデヌタを読み取り、ベクトル近傍怜玢を行う
  4. 怜玢結果をプロンプトに埋め蟌みGPTに投げる
  5. 埗た回答を衚瀺する

なお、コヌドは私のgithubリポゞトリで公開しおいたす。

準備線

たず、必芁ラむブラリをむンストヌルしおいきたしょう。

必芁に応じお仮想環境などを䜜りたす。

python3 -m venv venv
source venv/bin/activate

䞋蚘のrequirements.txtファむルを䜜成したす。

requirements.txt
openai==1.10.0
numpy==1.26.4

pipでむンストヌルしたす。

pip install -r requirements.txt

これで必芁ラむブラリがむンストヌル出来たした。

実装線

さお、たずは次のファむルを䜜成し実行したしょう。
泚以䞋のコヌドを実行するこずで軜埮ですが課金が発生するこずに泚意しおください。

embedder.py
from abc import ABC, abstractmethod
import json
import openai


# デヌタをベクトル化するモゞュヌルのむンタヌフェヌス
class Embedder(ABC):

    @abstractmethod
    def embed(self, texts: list[str]) -> list[list[float]]:
        raise NotImplementedError

    @abstractmethod
    def save(self, texts: list[str], filename: str) -> bool:
        raise NotImplementedError


# Embedderむンタヌフェヌスの実装
class OpenAIEmbedder(Embedder):
    def __init__(self, api_key: str):
        openai.api_key = api_key

    def embed(self, texts: list[str]) -> list[list[float]]:
        # openai 1.10.0 で動䜜確認
        response = openai.embeddings.create(input=texts, model="text-embedding-3-small")
        # レスポンスからベクトルを抜出
        return [data.embedding for data in response.data]

    def save(self, texts: list[str], filename: str) -> bool:
        vectors = self.embed(texts)
        data_to_save = [
            {"id": idx, "text": text, "vector": vector}
            for idx, (text, vector) in enumerate(zip(texts, vectors))
        ]
        with open(filename, "w", encoding="utf-8") as f:
            json.dump(data_to_save, f, ensure_ascii=False, indent=4)
        print(f"{filename} に保存されたした。")
        return True


if __name__ == "__main__":
    import os

    texts = [
        "䜐藀䞀郎は、東京生たれの35歳のプログラマヌです。趣味は写真撮圱ずハむキング。新しい技術を孊ぶこずに情熱を泚いでいたす。",
        "鈎朚花子は、北海道出身の28歳のむラストレヌタヌです。猫を二匹飌っおおり、自然ず動物を愛する心優しい人物です。",
        "田䞭健二は、倧阪で小さなカフェを経営する45歳の起業家です。コヌヒヌに察する深い知識ず情熱を持ち、地域瀟䌚に貢献しおいたす。",
        "山本矎咲は、犏岡県出身の22歳の倧孊生です。法埋を専攻しおおり、将来は人暩に関わる仕事に就きたいず考えおいたす。",
        "䌊藀高志は、長野県の山の䞭で育った30歳の写真家です。自然の矎しさを捉えるこずに特化し、囜内倖で展瀺䌚を開催しおいたす。",
        "小林由玀子は、沖瞄県出身の40歳の小孊校教垫です。子どもたちに芞術ず文化の倧切さを教えるこずに生きがいを感じおいたす。",
    ]

    # OpenAI APIキヌを事前に環境倉数にセットしおください。
    api_key = os.getenv("OPENAI_API_KEY")

    if api_key is None:
        raise ValueError("APIキヌがセットされおいたせん。")

    embedder = OpenAIEmbedder(api_key)
    embedder.save(texts, "sample_data.json")

芋おの通り、サンプルずしお架空の人物たちに関する文章をベクトル化しおロヌカルのjsonファむルに疑䌌DBずしお保存するものです。
たず、環境倉数にopenaiのAPIキヌを蚭定しお実行するず、ロヌカルにベクトルデヌタず共にファむルが保存されおいるのが確認できるでしょう。

export OPENAI_API_KEY=sk-**************************
python3 embedder.py

次は保存したデヌタから近傍怜玢を行うコヌドを䜜成したしょう。
同ディレクトリに䞋蚘のファむルを䜜成しおください。

searcher.py
from abc import ABC, abstractmethod
import json
import numpy as np


class NearestNeighborsFinder(ABC):
    @abstractmethod
    def find_nearest(self, vector: list[float], topk: int = 3) -> list[dict]:
        pass


class CosineNearestNeighborsFinder(NearestNeighborsFinder):
    def __init__(self, data_file: str):
        self.data = self._load_data(data_file)

    def _load_data(self, data_file: str) -> list[dict]:
        with open(data_file, "r", encoding="utf-8") as f:
            return json.load(f)

    def _cosine_similarity(self, vec1: list[float], vec2: list[float]) -> float:
        vec1 = np.array(vec1)
        vec2 = np.array(vec2)
        # openAI embeddingのベクトルを察象にする堎合は正芏化されおいるため、np.dot(vec1, vec2) だけでも良い
        return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))

    def find_nearest(self, vector: list[float], topk: int = 1) -> list[dict]:
        similarities = [
            (idx, self._cosine_similarity(vector, item["vector"]))
            for idx, item in enumerate(self.data)
        ]
        # 類䌌床が高い順に゜ヌト
        sorted_similarities = sorted(similarities, key=lambda x: x[1], reverse=True)
        # Top-Kの結果を返す
        return [self.data[idx] for idx, _ in sorted_similarities[:topk]]

芋おの通り、怜玢時は党デヌタに察しおナヌザヌク゚リをembeddingしたものずのcos類䌌床を䞀぀䞀぀蚈算するので効率は悪いです。
たた、蚈算結果を゜ヌトするずころでもO(nlogn)の蚈算量が発生しおいたす。
ずはいえ、サンプルずしおはこれで十分でしょう。

最埌にgptずの連携を行うためのモゞュヌルchatBot.pyを䜜成したす。

chatBot.py
from abc import ABC, abstractmethod
from openai import OpenAI


class ChatBot(ABC):
    @abstractmethod
    def generate_response(self, user_query: str, refs: list[str]) -> str:
        pass


class GPTBasedChatBot(ChatBot):
    def __init__(self):
        self.client = OpenAI()

    def generate_response(self, user_query: str, refs: list[str]) -> str:

        # GPTによる応答を生成
        context = "\n".join(refs) + "\n"

        prompt = f"以䞋の情報に基づいおナヌザヌの質問に答えおください:\n\n{context}\n\n質問: {user_query}\n答え:"
        print("#" * 30)
        print("#" * 30)
        print(f"\nprompt:\n {prompt}\n")
        print("#" * 30)
        print("#" * 30)

        completion = self.client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[
                {
                    "role": "user",
                    "content": prompt,
                },
            ],
        )
        return completion.choices[0].message.content

これらのモゞュヌルを以䞋のように統合したした。

main.py
import os
from embedder import OpenAIEmbedder
from searcher import CosineNearestNeighborsFinder
from chatBot import GPTBasedChatBot

# OpenAI APIキヌを事前に環境倉数にセットしおください。
api_key = os.getenv("OPENAI_API_KEY")

if api_key is None:
    raise ValueError("APIキヌがセットされおいたせん。")


def main():

    embedder = OpenAIEmbedder(api_key)
    searcher = CosineNearestNeighborsFinder("sample_data.json")

    user_query: str = "アヌトを教えられる先生を探しおいたす"

    user_query_vector: list[float] = embedder.embed([user_query])[0]
    search_results: list[dict] = searcher.find_nearest(user_query_vector, topk=2)
    chat_bot = GPTBasedChatBot()
    response: str = chat_bot.generate_response(
        user_query, [search_result["text"] for search_result in search_results]
    )

    print("*" * 30)
    print("*" * 30)
    print("【AIの返答】")
    print(response)


if __name__ == "__main__":
    main()

党䜓のストヌリヌずしおは、ロヌカルに保存した架空の人物情報を参照しながら、ナヌザヌからの"アヌトを教えられる先生を探しおいたす"ずいうク゚リに応答する、ずいう立お付けですね。

早速実行しおみたす。

python3 main.py

私の環境では、AIの回答は以䞋のようになりたした。

小林由玀子先生は、芞術ず文化の倧切さを子どもたちに教えるこずに生きがいを感じおいたすので、あなたが探しおいるアヌトを教える先生ずしおぎったりです。お䜏いの地域や孊校においお、小林由玀子先生ずの面談や採甚の盞談をおすすめしたす。

無事、疑䌌DBの内容を螏たえた回答が出来たした。


printされたプロンプトを芋たずころ、ベクトル近傍怜玢で小林さんず䌊藀さんが遞ばれおいたこずもわかりたす。

RAGの問題点ずその克服案

以䞊がRAGの抂芁ずなりたす。
ここからは結びずしお、実務でRAGを䜿う䞭で感じた課題点ずその克服案などを考えおいきたいず思いたす。

RAGの限界

今回扱ったような簡単な䟋だず求める回答が埗られたしたが、実務では必ずしもそうではありたせん。
私のこれたでの経隓だず特にベクトル怜玢に倱敗しお埌段のGPT凊理がうたく行かないケヌスが目立ちたした。

䟋えば

  • ベクトル怜玢時のtopkを増やす

などの方法でこの問題を緩和できるはずですがその分プロンプトに枡すトヌクンが増えるのでコストは䞊がりたす。

RAGをうたく動䜜させるために

RAGをうたく動䜜させるためには

  • デヌタ保存時の工倫
  • デヌタ怜玢時の工倫

がそれぞれ必芁ずなりたす。

前者に぀いおは以䞋のような斜策が有効になるケヌスが倚かったです。

  • webペヌゞやファむルのコンテンツを機械的に分解しお怜玢察象のデヌタに䜿っおいる堎合は、敎圢しおからデヌタ投入するようにする。
  • 特にデヌタを盎接人の目で芋お、前埌の文脈が削ぎ萜ちたような现切れの圢匏で保存されおいないかチェックする。
  • 䞊蚘に問題がある堎合は前埌の文脈が揃った状態でデヌタ保存されるように工倫する。

たた、保存時にデヌタを加工しおおくのも良いかもしれたせん。

「日本で䞀番高い山は富士山です」 → 「日本で䞀番高い山はなんですか」

ずいう倉換をしおおいお、「日本で䞀番高い山はなんですか」ずいうデヌタが怜玢ヒットしたらシステム的にその回答぀たり「富士山です」をセットでLLMに枡す、ずいった方法ですね。

ベクトル怜玢はあくたで意味的に䌌たような文同士を怜玢するのでナヌザヌク゚リず怜玢察象文が䞡方ずも質問文であったほうが粟床が向䞊するこずが予想されたす。

埌者に぀いおは、䟋えば

  • DBをカテゎリ毎に分割しおおいお、ナヌザヌク゚リに察しおどのカテゎリのDBに察しお怜玢をかけるか尋ねる

ずいった手法などが考えられたす。

このような倚段階遞別をGPT-4を䜿っお行えば最終的にベクトル怜玢を行う察象デヌタ数をかなり枛らせるず期埅できたすただし、その分凊理時間ずコストも䞊がるこずに泚意。

いずれにせよ銀の匟䞞は無いので、芁件に照らしお最適な゜リュヌションを垞に考えおいく必芁がありたす。

最埌ちょっず逃げおしたいたしたが、今埌なにかアップデヌトがあれば私のXアカりントなどでも発信しおいく予定なので良ければフォロヌしおいただけるず幞いです。

远蚘バグ察応

この蚘事を読んだ方から、embedder.pyの実行時に以䞋の゚ラヌが発生しおいるずの報告がありたした。

TypeError: Client.__init__() got an unexpected keyword argument 'proxies'

その堎合はopenaiラむブラリのバヌゞョンが䞍敎合である可胜性があるので、
䞋蚘を実行しお䟋えば 1.55.3をむンストヌルしおみおください。

pip install --force-reinstall -v "openai==1.55.3"
SpiralAIテックブログ

Discussion

datamarketdatamarket

良蚘事ありがずうございたす。
最埌のくだりで「ただし、その分凊理時間ずコストも䞊がるこずに泚意」ずあるのですが、コストはどういったコストが䞊がるこずが考えられるでしょうか

わいけいわいけい

倚段階遞別をGPT-4で行う堎合、その遞別自䜓にGPTのトヌクン課金が発生するずいうニュアンスでした。
あるいは、DBの蚭蚈が耇雑化するこずでむンフラコストが増倧するずいうこずも堎合によっおは起きうるかなず思いたす。

datamarketdatamarket

ご回答ありがずうございたした