はじめに
OllamaはローカルでLLMを実行できる素晴らしいツールですが、PowerShellから使う際に文字化けやセッション管理で困ったことはありませんか?
本記事では、PowerShellでOllamaを快適に使うための実用的なスクリプトを紹介します。日本語対応、会話履歴管理、複数セッション対応など、機能を盛り込みました。
主な機能
- 日本語文字化け完全対策
- 会話履歴の自動保存
- 複数セッション管理
- パイプライン対応
- 簡単な初期化とセットアップ
前提条件
筆者の動作確認の環境
- PowerShell 5.1以上
- Ollama がインストール済み
- お好みのモデル(例:gemma3, llama3など)
スクリプトの構成
1. 初期化処理
まずはOllamaの設定を初期化します。文字化け対策も含まれています。
function Initialize-Ollama {
[CmdletBinding()]
param(
[string]$BaseUri = "http://localhost:11434",
[string]$DefaultModel = "gemma3",
[string]$DefaultSystemPrompt = "あなたは敬語で話すAIアシスタントです。日本語で質問された場合は、必ず日本語で回答してください。"
)
# PowerShellコンソールの文字化け対策
try {
# PowerShell 5.1以前とPowerShell Core/7の違いを考慮
if ($PSVersionTable.PSVersion.Major -ge 6) {
# PowerShell Core/7の場合
$PSDefaultParameterValues['*:Encoding'] = 'utf8'
} else {
# PowerShell 5.1以前の場合、コンソールが利用可能かチェック
if ([System.Console]::IsOutputRedirected -eq $false) {
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
}
if ([System.Console]::IsInputRedirected -eq $false) {
[Console]::InputEncoding = [System.Text.Encoding]::UTF8
}
$PSDefaultParameterValues['*:Encoding'] = 'utf8'
}
}
catch {
Write-Warning "エンコーディング設定に問題がありました: $($_.Exception.Message)"
Write-Host "継続して処理を実行します。" -ForegroundColor Yellow
}
# グローバル変数の初期化
$Global:OllamaConfig = @{
BaseUri = $BaseUri
ChatEndpoint = "$BaseUri/api/chat"
DefaultModel = $DefaultModel
DefaultSystemPrompt = $DefaultSystemPrompt
}
# セッション管理用のハッシュテーブルも初期化
$Global:OllamaSessions = @{}
Write-Host "Ollama設定を初期化しました。" -ForegroundColor Green
Write-Host "- BaseUri: $($Global:OllamaConfig.BaseUri)" -ForegroundColor Gray
Write-Host "- DefaultModel: $($Global:OllamaConfig.DefaultModel)" -ForegroundColor Gray
Write-Host "- セッション管理: 初期化完了" -ForegroundColor Gray
}
2. セッション管理
複数の会話セッションを管理できます。
function New-OllamaSession {
[CmdletBinding()]
param(
[string]$SystemPrompt,
[string]$Model,
[string]$SessionName = "default"
)
if (-not $SystemPrompt) { $SystemPrompt = $Global:OllamaConfig.DefaultSystemPrompt }
if (-not $Model) { $Model = $Global:OllamaConfig.DefaultModel }
$session = @{
Name = $SessionName
Model = $Model
Messages = @(@{ role = "system"; content = $SystemPrompt })
CreatedAt = Get-Date
}
if (-not $Global:OllamaSessions) {
$Global:OllamaSessions = @{}
}
$Global:OllamaSessions[$SessionName] = $session
Write-Host "新しいセッション '$SessionName' を作成しました。" -ForegroundColor Green
return $session
}
3. メッセージ送信
メインの処理です。文字化け対策を施したAPI呼び出しを行います。
function Send-OllamaMessage {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true, Position = 0)]
[string]$Message,
[string]$SessionName = "default",
[string]$Model,
[switch]$NewSession
)
# セッション取得/作成
if ($NewSession) {
New-OllamaSession -SessionName $SessionName -Model $Model | Out-Null
}
$session = $Global:OllamaSessions[$SessionName]
if (-not $session) {
$session = New-OllamaSession -SessionName $SessionName -Model $Model
}
# ユーザーメッセージを追加
$session.Messages += @{ role = "user"; content = $Message }
try {
# UTF-8エンコーディングでAPI呼び出し
$body = @{
model = $session.Model
stream = $false
messages = $session.Messages
} | ConvertTo-Json -Depth 3
$bodyBytes = [System.Text.Encoding]::UTF8.GetBytes($body)
$response = Invoke-RestMethod `
-Uri $Global:OllamaConfig.ChatEndpoint `
-Method Post `
-Body $bodyBytes `
-ContentType "application/json; charset=utf-8" `
-Headers @{ "Accept-Charset" = "utf-8" }
$aiResponse = $response.message.content
$session.Messages += @{ role = "assistant"; content = $aiResponse }
$Global:OllamaSessions[$SessionName] = $session
return $aiResponse
}
catch {
Write-Error "Ollama APIの呼び出しに失敗しました: $($_.Exception.Message)"
$session.Messages = $session.Messages[0..($session.Messages.Count - 2)]
return $null
}
}
4. パイプライン対応
PowerShellらしいパイプライン処理にも対応しています。
function Invoke-OllamaChat {
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline = $true, Position = 0)]
[string]$Message,
[string]$SessionName = "default"
)
process {
return Send-OllamaMessage -Message $Message -SessionName $SessionName
}
}
使用例
手持ちのミニPC(Windows)で試した例 モデルはgemma
基本的な使い方
# 1. 初期化(セッション開始時に一度だけ)
Initialize-Ollama
# 2. 基本的な質問
$response = Send-OllamaMessage -Message "こんにちは、今日の天気はどうですか?"
Write-Host "AI: $response"
# 3. パイプライン使用
"PowerShellの配列操作について教えて" | Invoke-OllamaChat
複数セッションの活用
# 料理専用セッション
New-OllamaSession -SessionName "cooking" -SystemPrompt "あなたは料理に詳しいAIです。レシピや調理法について丁寧に説明してください。"
# プログラミング専用セッション
New-OllamaSession -SessionName "coding" -SystemPrompt "あなたはプログラミングの専門家です。"
# それぞれのセッションで会話
"今日の夕食におすすめの料理は?" | Invoke-OllamaChat -SessionName "cooking"
"PowerShellの効率的な書き方を教えて" | Invoke-OllamaChat -SessionName "coding"
会話履歴の管理
# セッション一覧を表示
Get-OllamaSession
# 特定のセッションの履歴を表示
Show-OllamaHistory -SessionName "cooking" -Last 4
# セッションをクリア
Clear-OllamaSession -SessionName "cooking"
連続会話の例
"こんにちは" | Invoke-OllamaChat
"簡単に作れる和食を教えて" | Invoke-OllamaChat
"材料と手順を詳しく教えて" | Invoke-OllamaChat
システムプロンプトの例
# 技術文書作成専用
$techWriterPrompt = "あなたは技術文書作成の専門家です。明確で分かりやすい説明を心がけ、コード例も含めて回答してください。"
# 翻訳専用
$translatorPrompt = "あなたは英日翻訳の専門家です。自然で読みやすい日本語に翻訳してください。"
New-OllamaSession -SessionName "tech-writer" -SystemPrompt $techWriterPrompt
New-OllamaSession -SessionName "translator" -SystemPrompt $translatorPrompt
まとめ
このスクリプトを使うことで、PowerShellからOllamaを快適に使用できるようになります。特に:
- 日本語での会話が文字化けしない
- 複数の用途に応じたセッション管理
- PowerShellらしいパイプライン処理
- 会話履歴の自動保存
などの機能により、開発効率が大幅に向上します。
注意事項
会話履歴の制限について
このスクリプトは会話履歴を自動保存しますが、各LLMモデルには処理可能な最大トークン数(コンテキスト長)の制限があります。この制限を超えるとモデルが適切に応答できなくなったり、エラーが発生する可能性があります。長時間の会話では期待通りに動作しなくなる場合があるため、適度なタイミングで新しいセッションを作成するか、履歴をクリアすることをお勧めします。








Comments
Let's comment your feelings that are more than good