業界・業務から探す
導入目的・課題から探す
データ・AIについて学ぶ
News
Hakkyについて
ウェビナーコラム
◆トップ【AI・機械学習】
AI

執筆者:Handbook編集部

LangChain のTF-IDF Retrieverについて

はじめに

この記事では、LangChain の TF-IDF Retriever について紹介します。

TF-IDF とは

TF-IDF とは単語頻度と文書頻度の逆数の積を意味します。 TF は文書内での単語の出現頻度に関する情報を保持し、IDF は文書内の単語の相対的な希少性に関する情報を保持します。 IDF のおかげで、「です」「ます」のような頻繁に使用される単語の重み付けを最小限に抑えながら、頻度の低い単語の影響を大きくすることができます。

TF-IDF は、情報検索 (IR) および機械学習の分野で使用される尺度であり、ドキュメント内の文字列表現の重要性または関連性を定量化できます。 つまり、TF-IDF スコアが高いほど、単語の重要性または関連性が高くなり、逆に単語の関連性が低くなると、その TF-IDF スコアは 0 に近づきます。

TF-IDF Retriever とは

Retriever は、インデックスと呼ばれる効率的な検索をサポートするデータ構造を使用して、ユーザーのクエリに応じて関連ドキュメントを検索して返します。つまり、TF-IDF Retriever では単語の重要性または関連性を基にしてクエリとの類似度を測り、関連ドキュメントを返します。

近年よく用いられる Transformer アーキテクチャによる Retriver は、トークン化と呼ばれるプロセスによって文章を分解しますが、単語単位ではなく文字やサブワードといった単語より細かい単位で分割されることが多いです。この場合、指すものが全く違ったとしても似た名前を持つ単語同士ならば、共通点があると判断してしまう可能性があります。 その対策の一例として、単語の重要性か関連性を重視する TF-IDF Retriver を用いることが考えられます。

使用例

TF-IDF Retriver を作成する

下記のコードのようにすることで、作成したドキュメントを使用して新しい Retriever を作成できます。 ただし、デフォルトの設定では英語を前提としているため、tfidf_paramsにて日本語の tokenizer を指定する必要があります。 ここでは MeCab を使用して日本語の文章を分かち書きし、その結果を基に TFIDF を用いて類似度を計算し、Retrieval を行います。

def mecab_tokenizer(text):
    mecab = MeCab.Tagger("-Owakati")
    return mecab.parse(text).split()

all_texts = [
    "伊藤太郎は51歳です。",
    "伊藤二郎は52歳です。",
    "佐藤太郎は53歳です。",
    "佐藤二郎は54歳です。",
    "佐藤三郎は55歳です。"
]

tfidf_retriever = TFIDFRetriever.from_texts(
    all_texts,
    tfidf_params={"tokenizer": mecab_tokenizer}
)

質問を実行する

# LLM ラッパーの初期化
llm = OpenAI(
    model_name="text-davinci-003",
    temperature=0,
    max_tokens = 500
)

# チェーンを作り、それを使って質問に答える
qa = RetrievalQA.from_chain_type(
    llm = llm,
    chain_type = "stuff",
    retriever = tfidf_retriever
)

# 質問
query = "佐藤太郎は何歳ですか。"
answer = qa.run(query)

print(answer)

上記のコードの実行結果は以下のようになります。

佐藤太郎は53歳です。

無事、TF-IDF Retriever を用いて回答を得ることができました。

参考文献

info
備考

Hakky ではエンジニアを募集中です!まずは話してみたいなどでも構いませんので、ぜひお気軽に採用ページからお問い合わせくださいませ。

2025年06月15日に最終更新
読み込み中...