知識を蓄えることのできる、初めてのローカルLLM

2025年6月24日

取り敢えず、192.168.0.8  の c:\Users\tomoi\rag_projectの中身でやったこと一覧

Ollamaは、どうやって知識を蓄えることができますか?

Ollama自体(正確にはOllama上で動くLLM)は「知識を蓄える(=記憶を永続化する)」機能は原則持っていません。理由と補足は以下の通りです:


🔍 なぜOllama(+LLM)は知識を蓄えないのか?

  • Ollamaが実行するのは事前学習済みの言語モデル(例:LLaMA 3やMistral)であり、内部に知識を書き込む(=学習させ直す)機能はない

  • 一時的な文脈(会話履歴など)は保持できるが、Ollama再起動や会話のリセットで消える。


✅ 知識を“蓄える”ように使いたい場合の方法

方法1: ベクトルDB+RAGで「覚えさせる」

RAG (Retrieval-Augmented Generation) という手法を使うと、ローカルLLMでも“知識を覚えたように使う”ことができます。

構成例:

要素 内容
LLM Ollama + llama3/mistral
知識DB ベクトルDB(例えば Chroma, Weaviate, FAISS など)
統合フレームワーク LangChain, LlamaIndex など
処理内容 PDF, テキスト, Web等 → 分割 → ベクトル化 → 質問に応じて該当知識を検索 → LLMに渡す

📌 つまり、「知識」を蓄えるのはLLMではなく、外部のベクトルデータベースです。


方法2: チューニング(学習)で知識そのものを埋め込む

これは本当の意味での「知識の蓄積」になりますが、難易度が高くなります。

方法

方法名 内容 難易度
LoRA(Low-Rank Adaptation) 特定の知識をモデルに微調整として埋め込む 中〜上
Full fine-tuning モデル全体を再学習 非現実的(高コスト・GPU必須)

🧠「覚えているように見せる」簡易テク

  • LangChainやLlamaIndexで、テキストやPDFファイルを渡すだけで“知識として答える”ように見せられる。

  • これにより、対話履歴を記憶しているように錯覚させることも可能です。


現在、Ollamaが動いていますが、知識を“蓄える”ようにしたいですが、その前にRAGとチューニングの違いについて教えて下さい

はい、非常に重要な質問です。
以下に「RAG」と「チューニング(LoRAなど)」の違いと使い分けを、わかりやすく解説します。


🧠 RAG(Retrieval-Augmented Generation)とは?

▶ 特徴

  • LLMの外部に知識を持たせる。

  • 質問に応じて必要な情報を検索してLLMに与える。

  • モデル自体は一切変更しない。

▶ イメージ

LLMが「図書館で調べながら答えてくれる」ような使い方

▶ メリット

  • 高速かつ安全(モデル改変なし)

  • データの更新が簡単(PDF差し替えなど)

  • ローカルでも構築しやすい

▶ デメリット

  • 検索精度に依存する(ベクトル検索や分割方法が重要)

  • 外部検索結果に基づくため、「推論能力」に制限あり


🔧 チューニング(Fine-tuning / LoRA)とは?

▶ 特徴

  • LLMのパラメータ自体を再学習する。

  • モデル内部に知識を埋め込む。

  • LoRA(Low-Rank Adaptation)を使うと軽量に実現可能。

▶ イメージ

LLMが「訓練して記憶を更新した頭脳を持っている」ような使い方

▶ メリット

  • 対話スタイルやドメイン知識を完全に内面化できる

  • オフラインでも即答できる(検索なし)

▶ デメリット

  • 訓練が難しい(GPU・スクリプト・パラメータ設計)

  • データの入れ替えが容易でない(再チューニングが必要)

  • 学習エラーで性能が落ちることもある


🔄 RAG vs チューニング 比較表

比較項目 RAG チューニング(LoRA含む)
知識の格納先 外部DB(検索) LLM本体(学習)
導入の簡単さ ◎ 簡単 △ 難易度高
データ更新 ◎ 簡単(ファイル差替え) ✕ 毎回再学習が必要
実行速度 ◯(検索+推論) ◎(即応)
精度の安定性 ◯ 安定 △ 調整による
用途 FAQ・文書検索 特定業務への最適化

🎯 どちらを使うべきか?

目的 選択すべき手法
社内文書を検索しながら答えさせたい ✅ RAG
マニュアルからFAQを生成させたい ✅ RAG
専門用語に強いAI秘書を作りたい ✅ チューニング(LoRA)
自分の書き癖や口調を覚えさせたい ✅ チューニング(LoRA)

まずは、「Ollama + RAG(ローカルでの知識追加)」の構築方法を教えて下さい。なおOllamaはWindows11で動いています

Windows 11 上で動いている Ollama に ローカル知識を与える(RAG構成) ためには、以下のステップを踏むのが最も簡単かつ安定です。

✅ 目標

「PDFやテキストをローカルに保存 → 質問 → Ollamaがその内容に基づいて答える」構成を作る。


🛠 必要なツール構成

ツール 目的
Ollama LLM本体(例:llama3)
LangChain or LlamaIndex チャットの実行+外部知識連携
ベクトルDB 知識の保存・検索(Chromaを使用)
Python スクリプト処理

🪜 手順一覧

① Python + ライブラリをインストール

  1. Python 3.10以上をインストール(公式サイト

  2. 以下をインストール:

pip install langchain llama-index chromadb ollama

③ 知識を追加する方法

  • docs/example.txt に内容を書いて保存(例:社内マニュアル、FAQなど)

  • PDFなら PyMuPDF を使って読み込めます:

pip install pymupdf
python
from langchain.document_loaders import PyMuPDFLoader
loader = PyMuPDFLoader("docs/manual.pdf")

📁 まとめ:フォルダ構成例

rag_project/
├── docs/
│ └── example.txt ←知識ソース ├── rag_ollama.py ←実行スクリプト  

✅ 必要なインストール

以下をすべてインストール済みであることを確認してください:

bash
pip install -U langchain langchain-community langchain-ollama chromadb
ollama run nomic-embed-text # 埋め込み用モデル
ollama run llama3 # LLM本体

🆕 rag_ollama.py(最新版)

from langchain_community.vectorstores import Chroma
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains import RetrievalQA
from langchain_ollama import OllamaEmbeddings, OllamaLLM

# 1. 知識となるテキストを読み込み
loader = TextLoader("docs/example.txt", encoding="utf-8")
documents = loader.load()

# 2. テキストをチャンクに分割
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
texts = text_splitter.split_documents(documents)

# 3. Ollama埋め込みモデルでベクトル化
embedding = OllamaEmbeddings(model="nomic-embed-text")

# 4. ChromaでベクトルDBに保存(自動永続化)
db = Chroma.from_documents(texts, embedding, persist_directory="./chroma_db")

# 5. Ollama本体モデル(例:llama3)
llm = OllamaLLM(model="llama3")

# 6. RAG構成(Retriever + LLM)
qa = RetrievalQA.from_chain_type(llm=llm, retriever=db.as_retriever())

# 7. 対話ループ
print("終了したいときは 'exit' または 'quit' と入力してください。\n")
while True:
    query = input("質問 > ")
    if query.strip().lower() in ["exit", "quit"]:
        break
    result = qa.invoke({"query": query})
    print("答え:", result["result"])

📁 フォルダ構成例

rag_project/
                  ├── rag_ollama.py
                  ├── chroma_db/ ← 自動生成される(永続保存)
                  └── docs/
                                 └── example.txt ← 知識として使いたい文書

📌 注意点

  • .persist()不要(Chromaが自動保存)

  • import元はすべて langchain_community または langchain_ollama に変更済み

  • run() ではなく .invoke() を使用

いま実施して気が付いたのですが、RAGはText(Sample.txt)に記載されたこと以外のことはこたえられないのですか? 

ollama run llama3

ではこたえられることが、

python rag_ollama.py

ではこたえられません。

はい、その気づきはまさにRAGの本質を突いています。
ご理解のとおり:


✅ 【結論】

RAGでの回答は「与えられた知識(たとえば sample.txt)に基づくもの」に限定されます。


🔍 なぜか?

🔁 モードの違い

実行コマンド 動作内容 回答の知識源
ollama run llama3 LLMが直接回答 LLaMA3があらかじめ学習した膨大な知識(Wikipediaなど)
python rag_ollama.py RAG構成で回答 あらかじめ与えられたテキストファイルのみ

つまり、RAGは「知らないことは答えない」ように設計されています。

で、いま、このハイブリッド方法についてコーディングしているんですが、上手く動いていません。

2025年6月24日2025,江端さんの技術メモ

Posted by ebata