はじめに
今日は3日目です。今回はRAG(検索拡張生成)の実装をします。
ローカルで特定の用途用にLLMをカスタマイズする技術として理解・修得できたらいいな。
RAGの基礎知識
RAG(Retrieval-Augmented Generation)は、LLMが知らない最新情報やプライベートなデータを外部のデータベースから「検索(Retrieval)」し、その内容をプロンプトに「追加(Augmented)」してLLMに解答させる技術だそう。
LLM自体を追加学習(ファインチューニング)させるには膨大なマシンスペックが必要だが、RAGであれば十分にできるのだそう。
勉強開始
以下の疑似的な講義ノートのデータをLLMに読み込ませてみます。
※内容は架空のもので存在しない技術です。
【情報工学特論:次世代暗号化通信「アルカディア・プロトコル」について】
1. 概要
アルカディア・プロトコルとは、2026年に開発された量子コンピュータ耐性を持つ新しい暗号化通信プロトコルである。既存のSSL/TLSに代わる技術として期待されている。
2. コア技術:「動的カオス鍵生成(DCKG)」
このプロトコルでは、通信のたびに「動的カオス鍵生成(DCKG)」と呼ばれるアルゴリズムを使用する。これは、端末の温度変化と大気ノイズをブレンドして、1秒間に100回使い捨ての暗号鍵を生成する技術である。
3. 開発者
この技術は、未来情報大学の「極秘技術研究チーム」によって開発された。
この架空の技術について説明したテキストファイルをmain.pyと同じフォルダ内に保存しました。また、main.pyでは、前回のものに追記・変更を施して以下のように外部データを読み込む関数と、RAGを実行する(与えた知識をもとに答えるように指示するシステムプロンプトの構築を行う)関数を作ります。
import ollama
# 1. 外部データ(講義ノート)を読み込む関数
def load_knowledge_base(file_path):
with open(file_path, "r", encoding="utf-8") as f:
return f.read()
# 2. RAGを実行するメイン関数
def ask_llm_with_rag(user_question, knowledge_data):
print("🔍 外部知識を読み込み、プロンプトを構築中...")
# LLMに「与えた知識(コンテキスト)を元に答えるように」指示する(システムプロンプトの構築)
prompt = f"""
以下の【参考資料】を厳密に読み込み、その内容だけをベースにして【質問】に答えてください。
資料に書かれていないことは、絶対に妄想で答えないでください。
【参考資料】
{knowledge_data}
【質問】
{user_question}
"""
print("🤖 LLMが思考中...")
# OllamaのローカルLLMを呼び出す
response = ollama.chat(
model='qwen2.5:3b',
messages=[
{
'role': 'user',
'content': prompt,
},
]
)
print("\n📝 【RAGシステムの回答】")
print(response['message']['content'])
if __name__ == "__main__":
# 講義ノートの読み込み
knowledge = load_knowledge_base("lecture_note.txt")
# LLM本来が知らないはずの質問を投げてみる
question = "アルカディア・プロトコルのコア技術である「DCKG」って、どんな仕組みで鍵を作っているの?"
ask_llm_with_rag(question, knowledge)
promptには、以下の【参考資料】を厳密に読み込み、その内容だけをベースにして【質問】に答えてください。資料に書かれていないことは、絶対に妄想で答えないでください。という文を予め追加し、参考資料の参照をなるべく強制します。
このプログラムを保存して前回と同じようにターミナルからプログラムを実行します。
python main.py
ターミナルに表示されたLLMの回答は以下の通りです。(質問文(プロンプト)はプログラム内においてあるので、ターミナルでは解答のみ得られます。)
アルカディア・プロトコルのコア技術である「DCKG」って、どんな仕組みで鍵を作っているの?
🔍 外部知識を読み込み、プロンプトを構築中...
🤖 LLMが思考中...
📝 【RAGシステムの回答】
アルカディア・プロトコルのコア技術である「動的カオス鍵生成(DCKG)」は、通信のたびに端末の温度変化と大気ノイズをブレンドし、1秒間に100回使い捨ての暗号鍵を作り出すアルゴリズムです。
こちらが用意した知識を正しく解答に使用してくれました。
次は、試しに意地悪な質問を投げかけてみましょう。
質問:アルカディア・プロトコルの開発リーダーである佐藤教授の経歴は?
回答:申し証め、参考資料には佐藤教授の具体的な経歴が記載されていません。アルカディア・プロトコルの開発者として知られる「極秘技術研究チーム」のリーダーである佐藤教授についての詳細情報は見つかりませんでしたので、その情報だけをベースに回答することはできません。
回答:資料には、アルカディア・プロトコルの開発リーダーである佐藤教授の経歴が記載されていません。因此,无法根据提供的资料回答这个问题。
参考資料を見ても存在しない情報を聞いてみました。何回か聞いてみましたが、知ったかぶりはしませんでした。しかし、「申し証め」や二回目の回答の最後の中国語など少々おかしな出力が目立ちました。
これについては、現在使っているQwen2.5が中国の企業アリババが開発したモデルであり、ベースが中国語のモデルであるため、「資料にないから答えられない!」とパニック(強い制約)がかかったときや出力における確率計算がバグった時に、不自然な日本語や中国語が出てしまうのでは?ということだそうです。
また、現実勝っているモデルのサイズは3B(30億パラメータ)であり、他の巨大モデルに比べると「指示を厳密に守る能力(プロンプト追従性)」がまだ少し弱いそう。
「資料にないことは絶対に妄想で答えないでください」という強い禁止命令を与えたため、モデルが安全側に倒そうと必死になり、言語の出力部分の制御が少しバグってしまったっぽい。
まぁ、知ったかぶりをしないので今回は全然よし。満足。
ここで、先生(Gemini)の指示はなかったけど気になったのでもう一つ質問を投げかけてみました。参考資料にはのってないけど、参考資料から考えられることを出力させる質問です。参考資料をもとに考察してくれるのかというところですね。
アルカディア・プロトコルで解決しそうな問題はどんなもの?
1. 量子 computersへの脆弱性:現行の暗号化技術(SSL/TLS)に対して、量子コンピュータが非常に効率的に攻撃を開始できる可能性があるという懸念があります。アルカディア・プロトコルでは「動的カオス鍵生成(DCKG)」を使用することで、量子 computers に対しても暗号化通信の安全性を確保することが可能です。
2. 暗号キーの管理:SSL/TLSは、毎回新しい暗号キーを使用するため、キーの管理と転送に多くのリソースが必要です。この問題に対して、アルカディア・プロトコルでは毎秒100回生成される使い捨ての暗号鍵が使われますので、キーの管理コストを大幅に削減することが可能です。
以上の2つの点で、アルカディア・プロトコルは既存のSSL/TLSよりも量子 computers に対する安全性とキーの管理効率面で改善する可能性があります。
架空の技術なのであってるかはわかりませんが、それっぽい考察がされてます。といってもLLMというものがそれっぽいものを出力するものなので内容は評価しにくいですが、用意した参考資料をそのまま出力だけでなく、そこからの思考・考察もしっかりしてくれそうです。
最後の質問は回答に一番時間がかかって15秒くらい思考時間がありました。それまでの質問は大体5~10秒くらい?思考させようとするとやはり時間がかかりますね。
今日はこれでおしまいにします。
読んていただきありがとうございます。
まとめ
RAGを使ってAIに特定の分野の新知識を使わせることができた。(今回は架空の技術について)
参照した資料にのっていない情報を使わせようとすると、その強い制約によって出力がおかしくなりがちだった。(変な日本語、部分的な中国語の出力等)
参考資料の内容をそのまま出力させるのはもちろん、参考資料の内容からさらに思考させることも可能だった。