0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【RAG入門・Python実装】第2回

Last updated at Posted at 2025-09-04

【RAG入門・Python実装】第2回 RAGとは何か?仕組みを図解でやさしく解説 パート1

RAG(検索拡張生成)とは?

RAG(Retrieval-Augmented Generation)とは、
外部データを検索してLLMに渡し、回答を生成する仕組みです。

従来のLLMは「学習済みデータ」に依存しており、最新情報や企業特有の知識に
対応するには モデル自体(LLM)を再学習 する必要がありました。

一方でRAGは、LLMを再学習せずに外部データを利用できるため、
コストを抑えつつ正確で実用的な応答が可能になります。

RAG(検索拡張生成)の仕組み

スクリーンショット 2025-09-04 085329.png

仕組みの詳細

そもそも、検索の段階では自然言語を埋め込みベクトルに変換して比較している。
どういうことなのか

text 人工知能(AI)は、人間の知能を模倣する技術です。機械学習はそ
の主要な分野の一つで、データから学習するアルゴリズムを開発します。深層学習は機械学
習の一種で、多層ニューラルネットワークを使用します。自然言語処理(NLP)は、コンピ
ュータが人間の言語を理解し、生成する技術です。RAG(Retrieval-Augmented
Generation)は、LLMが外部情報源から情報を検索し、それに基づいて応答を生成する手
法です。これにより、LLMのハルシネーションを減らし、より正確な情報を提供できます。

というテキストデータを学習させたチャットボットを作ったとする。
このチャットボットに以下のような質問をしたとする。(上図①)

RAGとは何ですか?

②では日本語で検索を行っているのではない。テキストデータと質問文の日本語はベクトル化される。そしてベクトル化されたテキストデータと質問文を比較して②が行われている。その結果得られたものを日本語文として返却される(③)。

ベクトル化とは

ベクトルとは大きさと方向を持つ量で、ここでは「テキストの意味」を数値の並び(多次元空間上の点)として表現したものを指します。
ベクトル化することで、文章同士の「意味の近さ」を数値として扱えるようになります。

(この比較方法については次回詳しく解説します)

まずは実際に、テキストをベクトル化するコードを見てみましょう。

import ollama

def get_embedding(text, model="mxbai-embed-large"):
    try:
        response = ollama.embeddings(model=model, prompt=text)
        return response["embedding"]
    except Exception as e:
        print(f"Ollama Embedding API呼び出し中にエラーが発生しました: {e}")
        return None
    
text1 = "猫は可愛い動物です" 
text2 = "犬は忠実なペットです"  
text3 = "Pythonはプログラミング言語です" 

embedding1 = get_embedding(text1)
embedding2 = get_embedding(text2)
embedding3 = get_embedding(text3)

if embedding1 and embedding2 and embedding3:
    print(f"テキスト1のEmbedd0ingの次元数: {len(embedding1)}")
    print(f"テキスト2のEmbedd0ingの次元数: {len(embedding2)}")
    print(f"テキスト3のEmbedd0ingの次元数: {len(embedding3)}")

    print(f"テキスト1のEmbedding(最初の5要素): {embedding1[:5]}")
    print(f"テキスト2のEmbedding(最初の5要素): {embedding2[:5]}")
    print(f"テキスト3のEmbedding(最初の5要素): {embedding3[:5]}")

出力結果

テキスト1のEmbedd0ingの次元数: 1024
テキスト2のEmbedd0ingの次元数: 1024
テキスト3のEmbedd0ingの次元数: 1024
テキスト1のEmbedding(最初の5要素): [-0.40521955490112305, 0.2711377739906311, -0.010199081152677536, 0.2498672902584076, -0.4358774721622467]
テキスト2のEmbedding(最初の5要素): [0.31985199451446533, 0.07074873149394989, 0.5577247142791748, 0.43831667304039, -0.5286954641342163]
テキスト3のEmbedding(最初の5要素): [0.5985070466995239, -0.20873668789863586, -0.19458788633346558, 0.21659620106220245, 0.06730994582176208]

簡単に説明すると、
text1 = "猫は可愛い動物です"
text2 = "犬は忠実なペットです"
text3 = "Pythonはプログラミング言語です"
の三つの文をベクトル化したコードである。そして出力結果がベクトルになる。

詳しく説明すると、
ollamaという、ローカル環境でLLMを簡単に管理・実行できるオープンソースのツールを使い、Embedding(埋め込み)をしている。Embedding(埋め込み)とは、文・単語を 高次元の密ベクトル に写像した表現である。

👉次回は図の③について解説する。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?