1. 概要
Ollamaの登場により、ローカル環境でも手軽にLLMを試せるようになりました。Ollamaの魅力の一つは、PythonからLLMを呼び出せること、つまりLLMを「部品」としてプログラムに組み込めることです。今回は、ollama-pythonライブラリを使い、複数のテキストファイルをLLMで一括校正して見たいと思います。類似の方法で以下のような例にも応用できると考えられます。
参考例
- 定型作業の自動化(校正、要約、分類、タグ付け、表記ゆれの統一など)
- PDFファイルから個人情報を対応関係を維持したままプレイスホールダーに置き換える
- RAG的な仕組みの前処理
前提
- ollamaはすでに動作可能な状態だぞ〜😆
利用するライブラリ
ollama-pythonのインストール
pip install ollama
2. ollama-pythonの基本的な使い方
詳しい使い方は、公式サイトを参照してください。基本的には、ライブラリをimportして、ollama.chat(モデル名, messages)となります。ollama-python のストリーム機能に使い方がコンパクトにまとめられています。
import ollama
response = ollama.chat(
model="gemma2:2b", # ここでモデル名指定
messages=[{"role": "user",
"content": "入力文章"}], # chat_templateに従ったメッセージ入力
stream=True, # stream表示不要の場合はFalse(デフォルト値はFalse)
# options={} # その他の指定
)
説明メモ
- ollama.chatで入力文章に対しての返答が生成されます。
- messagesはchat_templateに応じた辞書形式の内容で記述します。roleにsystemがあるタイプだと、次のように書くこともできます。
messages=[{"role": "system", "content": system_instruction},
{"role": "user", "content": user_message}]
- ターミナルで
ollama show --template モデル名と入力することでテンプレートを確認できるのですが、モデルごとに書き方や表示方法?が様々で読みにくい印象
ollamaサイトのモデルで個別に確認するのが手軽な気がします。 - responseの部分を用途に応じて加工すればOK!
- optionsについては、Ollama REST APIに準拠しているようです。
- stream=Falseにすることで、responseの中身を簡単に抽出できます。
基本形を使い文章校正へ応用してみます。
3. 文章校正
input_textsディレクトリにあるテキストファイルを読み込んで、LLMに校正させた文章をoutput_textsディレクトリに作成するコードです。ライセンスがApache2.0に緩和されたGemma4シリーズをサンプルモデルとして使ってみました1。
関数やclass作成したほうが使いまわしできそうですが、LLMがコード内の部品として使われている感を出すため、上から順番に
- input_textsディレクトリからテキストファイルを読み込む
- ollama-pythonの基本形を利用して文章校正の指示
- output_textsディレクトリへ校正した文章を出力
という流れでベタ書きするだけ![]()
from pathlib import Path
import ollama
# 入出力のディレクトリとollama使用モデル名
target_dir = Path("./input_texts")
output_dir = Path("./output_texts")
model_name = "gemma4:e4b"
# (1) modelへの指示文
system_instruction = """
あなたは優秀な編集者です。与えられたテキストに対して、以下のルールを厳格に守って校正・整形を行ってください。
## ルール
1. 本文中の誤字脱字、日本語として不自然な表現、不要な空行や過度な改行を修正し、自然な原稿(です・ます調)に整えてください。
2. 固有名詞や数値などの事実は勝手に改変しないでください。
3. 出力は「校正後の本文のみ」としてください。前置きや解説、余計な挨拶は一切不要です。
"""
# (2) ファイル読み込み
output_dir.mkdir(parents=True, exist_ok=True) # 出力先ディレクトリを作成
txt_files = sorted(target_dir.glob("*.txt")) # 校正テキストのファイル取得
print(f"合計 {len(txt_files)} 件のファイルを処理します。")
for i, file_path in enumerate(txt_files, start=1):
file_name = file_path.name
print(f"【{i}/{len(txt_files)}】 処理中: {file_name}...")
try:
# (2-1) ファイルを読み込む
raw_text = file_path.read_text(encoding="utf-8")
# lines = file_path.read_text(encoding="utf-8").splitlines() # 行単位の編集が必要な場合
# 中身が空(意味ではなく、文字のことです^^;)の場合はスキップ
if not raw_text.strip():
print(f"{file_name} は本文が空のためスキップ")
continue
# (3) メイン部分:Ollamaに校正をリクエスト
# (3-1) ollama-pythonの基本形
response = ollama.chat(
model=model_name,
messages=[
{"role": "system", "content": system_instruction},
{"role": "user", "content": raw_text},
],
options={"temperature": 0.0,
"num_ctx": 8192, # トークンサイズをコントロールできる
},
)
# (3-2) 書式を整える
ollama_text = response.message.content.strip()
# (4) 校正後のテキストを新しいファイルに保存
output_path = output_dir / file_name
output_path.write_text(ollama_text, encoding="utf-8")
except Exception as e:
print(f"エラーだぞ〜({file_name}): {e}")
continue
print("\nお疲れ様でした。\nすべてのファイルの処理が完了しました😆")
説明メモ
-
(1) gemma4シリーズは{"role" : "system"}があるので、指示文をsystem_instructionとして記載しました2。
-
(2) 出力先のディレクトリを作成、target_dir.glob("*.txt")で"txt"ファイルのみ抽出します。sortedしてリスト化します。
-
(2-1) read_text()を使いファイルを読み込みます。一応、空ファイルの場合はスキップ処理を追加しました。
-
(3-1) メイン部分 ollama.chatで返答文を生成します。optionsでtemperatureを指定してみました。校正するのが目的なので、
num_ctxで利用できるトークン数を多めに確保しておくのが良いかと思います。利用する文章の長さとメモリーなどを考慮して適宜修正が良さそう
-
(3-2) responseの値は、次のような形になります。
ChatResponse(model='gemma4:e4b',..., message=Message(role='assistant', content='文章...'))
必要な部分を適宜抽出すれば完成です。今回は、messageのcontentだけ使いたいので、response.message.contentとしました。添字アクセスのresponse["message"]["content"]でもOKです。好みに応じてどうぞ〜😆
- (4) 校正後のテキストをwrite_textで書き込みます。ファイル操作まわりについてpathlibライブラリを使うことで手短に書くことができます3。
上記のコードでinput_textsディレクトリ内にあるtxtファイルの中身を一括校正してもらえます。プロンプトを変更することで、
- 書き味を統一、
- 「である、だ」調で書いた文章を丁寧語に変更、
- 一度書いた文章をTPOに合わせて修正
できるはず![]()
参考
- Ollama Python Library: 公式サイト。簡潔だけど正確な情報が入手できます。
- ollama-python のストリーム機能: ollama-pythonの使い方がコンパクトにまとまっています。
- Ollama Python Libraryの使い方を徹底解説!: 導入方法から簡単な使い方が説明されています。
-
いろんな制限の中で良さそうなモデル選択する部分が実は一番難しい?
↩ -
「あなたは優秀な○○です」みたいなsystem instructionを書くのってちょっと気恥ずかしい気がしませんか?ここは慣例っぽく書いてみましたが結果を見ながら調整するのがいいのかな
↩ -
pathlibについては、Pythonのpathlib備忘録に詳しく紹介されています。 ↩

