AIアシスタントに「その担当者、前にも言うたやん」と思うこと、ないやろか。その説明の繰り返しを減らす仕組みが、Hindsightやで。会話などから情報を保存し、質問に関連する記憶を検索できるで。前の会話も覚えてくれるアシスタントを作りたい人に向いてるで。
この記事ではWindows 11のx64 PCに何も入っていない状態から、架空のメモを1件保存し、担当者を検索するところまで進めていくで。DockerとWindows標準のPowerShellを使い、PythonやGitのインストールはいらへんで。チャットアプリに組み込むんは、この小さな動作確認ができてからや。
この記事で確かめたこと:2026年10月24日時点の公式資料で、導入手順・モデル設定・APIの使い方・ライセンスを確認したで。掲載したPowerShellの書き方とJSONの形式も確認してるで。ただ、この記事を書いたPCにはDockerが入ってへんねん。せやから、起動から有料APIを使った検索までを、実際に動かして確かめたわけやないで。このあとの「成功の目安」は、自分のPCで試すときのチェックに使ってな。
今回のゴールと環境
- 今回のゴール:ローカルAPIがHTTP 200を返す → メモ保存でsuccessがTrueになる → 検索候補に「サンプル社の担当者はAさん」に相当する情報が含まれる。
- PC:Docker Desktopが対応するWindows 11 x64、メモリ8GB以上、仮想化が有効な環境、安定したインターネット接続。イメージとモデルのダウンロードで空き容量を使うで。事前にDockerが使える環境も確認してな。この記事では、Windows ARM、Mac、Linuxでの操作は扱わへんで。
- PCの設定:WSLを初めて使うときは、管理者権限が必要やで。途中でPCの再起動が必要になることもあるで。会社PCでは管理者に相談してな。
- OpenAI API:アカウントとAPIキーを用意し、gpt-4o-miniを使えるように支払い方法や利用上限を設定しておいてな。この手順ではAPIの利用料がかかることがあるで。料金表で条件を確認してな。
構成は「PowerShell → 自分のPCのHindsight → 外部LLM」やで。記憶のDBはDockerの専用ボリュームに保存するんやけど、情報抽出などのため入力が外部LLMへ送られるんや。最初は下の架空メモだけを使うで。
1.WSL・Docker Desktopの導入
すでにDockerが使える場合も、最後の確認コマンドでLinuxコンテナが動く状態か確かめてから次へ進んでな。
- Windowsのスタートを開き、「PowerShell」と検索してな。「Windows PowerShell」を右クリックして管理者として実行し、確認画面で許可してな。
- WSLがまだ入ってへんなら、次の1行を貼り付けてEnterを押してな。未保存の作業を保存し、インストール完了後にPCを再起動してな。
wsl --installこのコマンドでWSLと既定のUbuntuが入るで。再起動後にUbuntuのユーザー名・パスワードの作成を求められたら、画面に従って設定してな。Linux側のパスワード入力では文字が表示されへんで。このあとのコマンドはUbuntuやなくて、WindowsのPowerShellで実行してな。すでに入ってるWSLを更新するときは、管理者PowerShellでwsl --updateを実行してな。詳細はMicrosoftのWSL導入手順を見てみてな。
- Docker DesktopのWindows用公式ページをブラウザーで開き、x86_64用インストーラーをダウンロードしてな。ダウンロードした
Docker Desktop Installer.exeをダブルクリックしてな。 - インストールウィザードに従い、バックエンド選択が出たときはUse WSL 2 instead of Hyper-Vを選んでな。再起動を求められたときは再起動してな。
- スタートからDocker Desktopを起動してな。表示される利用条件を確認して進み、エンジンの起動を待ってな。Docker Desktopの商用利用条件はHindsightのライセンスとは別やで。
- 管理者として実行せず、ふつうに新しいWindows PowerShellを開き、次の3行を1行ずつ実行してな。
wsl --version
docker version
docker info --format '{{.OSType}}'ここでの確認:WSLのバージョンが表示され、docker versionでClientとServerの両方が確認でき、最後がlinuxなら次へ進んでええで。dockerが見つからないときはPowerShellを閉じて開き直してな。Serverに接続できないときはDocker Desktopが起動しているか確認してな。windowsならDocker DesktopのメニューでLinux containersへ切り替えてな。仮想化のエラーが出るときは、タスクマネージャーの「パフォーマンス → CPU → 仮想化」とDockerのトラブル対処を確認してから進めてな。
2.OpenAI APIキーの設定
- OpenAIの開発者プラットフォームにログインしてな。未登録ならアカウントを作成し、必要な確認を済ませてな。
- 設定のBillingで請求・残高・利用上限を確認し、今回利用するモデルが使える状態にしておいてな。利用可否や初回に必要な設定はアカウントにより変わるで。
- API keysを開き、新しいsecret keyを作ってな。名前は例として
hindsight-demoとし、表示されたキーをコピーしてな。キーの作成と保管についてはOpenAI公式クイックスタートも見てみてな。 - さっき開いた、管理者として実行してへんPowerShellに、次のブロック全体を貼り付けてな。入力待ちになったら自分のキーを貼り付け、Enterを押してな。入力内容は表示されへんで。
$secret = Read-Host 'OpenAI APIキーを貼り付けてEnter' -AsSecureString
$env:HINDSIGHT_API_LLM_API_KEY = [System.Net.NetworkCredential]::new('', $secret).Password
Remove-Variable secret
if ([string]::IsNullOrWhiteSpace($env:HINDSIGHT_API_LLM_API_KEY)) {
throw 'APIキーが空です。もう一度入力してください。'
}記事中にキーを直接書き換える場所はないで。この方法はキーそのものをコマンド履歴へ直接書かず、現在のPowerShellの環境変数に渡すんや。ただし、起動後のコンテナ設定にはキーが残り、Dockerを操作できる人は参照できるため、共有PCでの秘密管理方法としては使わんといてな。
3.Hindsightの起動と接続確認
同じPowerShellで、下のブロックをそのまま貼り付けて実行してな。途中の行に「>」や「PS C:」といった表示は追加せんでええ。公式のDocker構成をPowerShell向けに書き直し、練習用の名前と保存先を使うで。
$dockerArgs = @(
'run', '-d', '--pull', 'always',
'--name', 'hindsight-demo', '--shm-size=1g',
'-p', '127.0.0.1:8888:8888',
'-p', '127.0.0.1:9999:9999',
'-e', 'HINDSIGHT_API_LLM_PROVIDER=openai',
'-e', 'HINDSIGHT_API_LLM_MODEL=gpt-4o-mini',
'-e', 'HINDSIGHT_API_LLM_API_KEY',
'-e', 'HINDSIGHT_API_WORKER_ID=hindsight-demo',
'-v', 'hindsight-demo-data:/home/hindsight/.pg0',
'ghcr.io/vectorize-io/hindsight:latest'
)
docker @dockerArgs
if ($LASTEXITCODE -ne 0) { throw '起動に失敗しました。下のトラブル対処を確認してください。' }
Remove-Item Env:HINDSIGHT_API_LLM_API_KEY
docker ps --filter 'name=hindsight-demo'初回はダウンロードと初期化に時間がかかるで。-dはバックグラウンド起動、127.0.0.1はこのPCからの接続、hindsight-demo-dataは記憶を残す保存領域やで。今回は動作を試すだけなのでPC起動時の自動再開は設定してへんで。埋め込みDB・埋め込みモデル等を含むfullイメージを使い、別にPostgreSQLを導入する手順を省いてるで。LLMは外部APIを使うんや。
docker psの一覧にhindsight-demoがあり、STATUSがUpになっているか確認してな。続いて、準備完了を確認してな。
try {
(Invoke-WebRequest -UseBasicParsing -Uri 'http://localhost:8888/health' -TimeoutSec 10).StatusCode
} catch {
Write-Host '準備中または起動失敗です。docker logs --tail 80 hindsight-demo を確認してください。'
}200が表示されれば、次へ進められるで。準備中なら少し待って同じ確認をやり直してな。起動しているだけではLLMのキーが正しいとは限らへんで。キーの確認は次の保存操作まで進めて行うで。ブラウザーのアドレス欄にhttp://localhost:9999を入力すると管理画面も開けるで。今回の保存・検索は画面の名称変更に左右されにくいHTTP APIで行うで。
利用したイメージを後で確認するときは、docker inspect --format '{{.Image}}' hindsight-demoを実行してIDを控えてな。latestは更新されるタグなので、別の日のダウンロードが同じ内容とは限らへんで。
4.練習用バンクの作成とメモの保存
以下も、起動時と同じPowerShellで順番に実行してな。まず、ほかのデータと混ぜない専用Memory Bankを作ってな。バンクは情報を分ける保存箱やで。
$bank = 'first-memory-demo'
$base = "http://localhost:8888/v1/default/banks/$bank"
Invoke-RestMethod -Method Put -Uri $base -ContentType 'application/json' -Body '{}'HTTPエラーが出ず応答が返れば、次の架空メモを登録してな。JSONの日本語をUTF-8のバイト列で渡すため、Windows PowerShellでも文字コードの違いを避けられるで。
$memo = '架空のサンプル社の担当者はAさんです。サンプル社の打ち合わせ場所は第2会議室です。'
$body = @{
items = @(@{
content = $memo
document_id = 'sample-note-001'
})
async = $false
} | ConvertTo-Json -Depth 6
$saved = Invoke-RestMethod -Method Post -Uri "$base/memories" -ContentType 'application/json; charset=utf-8' -Body ([Text.Encoding]::UTF8.GetBytes($body)) -TimeoutSec 300
$saved | Select-Object success, bank_id, items_count, async
if ($saved.success -ne $true) { throw '保存成功を確認できませんでした。ログを確認してください。' }保存成功の目安:successがTrue、bank_idがfirst-memory-demo、items_countが1、asyncがFalseやで。これは期待する項目で、実際の実行結果を載せたものやないで。ここでは、保存が終わるまで待つ設定にしてるで。1件のメモから複数の事実を抽出する場合があるため、items_countを検索候補の件数と同じものやと思わんといてな。
同じdocument_idで再登録すると元の文書を置き換える仕様やで。うまくいかないからと何度も送信すると追加のAPI費用が発生することがあるで。まずログと応答を確認してな。
5.保存したメモの検索
保存が成功した後、次のブロックを実行してな。今回は、新しく回答の文章を作るreflectやなくて、保存した記憶の候補を取り出すrecallを試してみよか。
$query = @{ query = 'サンプル社の担当者は誰ですか'; types = @('world', 'experience') } | ConvertTo-Json
$found = Invoke-RestMethod -Method Post -Uri "$base/memories/recall" -ContentType 'application/json; charset=utf-8' -Body ([Text.Encoding]::UTF8.GetBytes($query)) -TimeoutSec 120
Write-Host ('検索候補数: ' + @($found.results).Count)
$found.results | Select-Object text, document_id | Format-List検索成功の目安:候補が1件以上あり、表示されたtextのどれかに、保存した「サンプル社の担当者はAさん」に相当する情報があることやで。抽出後の文章や言語、件数は固定やないで。保存したメモと照らし合わせてな。候補が返っても、内容が正しいとは限らへんで。
候補が空なら、保存が成功していたか確認し、次の一覧取得で登録内容を見てみてな。その後、検索ブロックの質問を「サンプル社」へ変えてもう一度確認してな。
$listed = Invoke-RestMethod -Uri "$base/memories/list?limit=20"
$listed.items | Select-Object text | Format-Listもう一問試すなら、質問を「サンプル社の打ち合わせ場所はどこですか」へ変えて、検索ブロック全体を再実行してな。第2会議室に相当する情報が拾えるか確認してな。無関係な質問では、候補が返っても質問の答えとは限らないことを確かめてみてな。
システム構成とデータの流れ
この記事で操作しているクライアントはPowerShellやで。コマンドはPC内のHindsight APIへ送られるんや。DockerはHindsightとDBを動かす入れ物で、OpenAI APIはHindsightから呼び出す外部のLLMやで。記憶を残す場所は、この例では自分のPC側にあるDockerの専用ボリュームやで。
| 登場するもの | この記事での役割と接続先 |
|---|---|
| PowerShell(クライアント) | Invoke-RestMethodでメモや質問をlocalhost:8888へ送るんや。Hindsightの外にある操作役やで。 |
| Docker内のHindsight | 保存・検索の要求を受け取り、必要なLLM処理をOpenAIへ依頼し、DBを読み書きするんや。OpenAIのAPIキーを使うのはこのプロセスやで。起動時にPowerShellから環境変数で渡したんや。 |
| OpenAI API(外部LLM) | たとえば保存時にメモから事実を抽出する処理を受け持つんや。クライアントが直接OpenAIへメモを登録する構成やなくて、Hindsightが呼び出すんや。 |
| DBと専用ボリューム | 記憶はHindsight側のPostgreSQLで管理し、データをhindsight-demo-dataへ残しておくんや。コンテナを停止しても、このボリュームを削除しなければデータは残るで。外部API側の保持条件は別に確認が必要やで。 |
| ブラウザー(管理画面) | localhost:9999はDocker内の管理画面を見る入口やで。今回の保存・検索コマンドの宛先は8888やで。 |
メモ保存の仕組み
- PowerShellが「サンプル社の担当者はAさん」というメモを、HindsightへHTTPで送るんや(
POST .../memories)。 - Hindsightが設定済みのOpenAI APIを呼び、メモから事実を抽出する処理などを行うで。メモの内容がPCの外へ送られる段階やで。
- Hindsightが抽出結果を受け取り、検索用データ等とともにDBへ保存するんや。このfullイメージでは埋め込み・再ランキング用のモデルはローカルに含まれてるで。
- 同期保存が完了したら、HindsightがPowerShellに保存結果を返すんや。記事の
$saved.successはこの応答やで。
▶ 保存の流れを再生:メモ → 事実 → 保存完了
白いメモがPowerShellからHindsight、OpenAIへ届いて、黄色い「事実」に変わってDBへ残るで。最後に保存完了がクライアントへ戻るんや。処理の一部を単純化した概念説明で、実際の通信パケット・実行結果・速度を再現した映像やないで。
記憶検索の仕組み
- PowerShellが「サンプル社の担当者は誰ですか」という質問をHindsightへ送るんや(
POST .../memories/recall)。 - HindsightがDB内の記憶を検索し、候補を統合・並べ替えるんや。図では、質問から保存済みの「担当 = Aさん」にたどる主な経路を示してるで。質問の解析などにLLMを利用する範囲は設定や処理内容で変わるで。
- Hindsightが候補の一覧をPowerShellへ返すんや。記事の
$found.resultsはこの一覧やで。ここではOpenAIに最終回答の文章を作らせるreflectまでは呼ばへんで。
▶ 検索の流れを再生:質問 → DBの記憶 → 検索候補
質問カードがHindsightを通って保存済みの記憶へ進み、検索候補がクライアントへ戻るんや。検索処理の概念図やで。このアニメーションではOpenAI側を動かしてへんけど、「検索時は外部通信が一切ない」と保証するもんやないで。
全体図とアニメーションはこの記事のために作ったもんやで。Aさんは架空の入力例で、検索精度を示すものやないで。各アニメーションは16秒で1回再生して止まるで。一時停止を解除してから閉じて開くと再生をやり直せるで。OSで動きを減らす設定にしているときは、保存・検索後の状態を止まった状態で表示するで。参考にした資料:公式のDocker構成、保存API、検索API、検索の仕組み。
トラブルシューティング
| 症状 | 最初にする操作 |
|---|---|
| コンテナ名がすでに使われている | docker ps -a --filter 'name=hindsight-demo'で確認してな。以前作った同じ練習用コンテナならdocker start hindsight-demoで再開してな。新しいキーは既存コンテナへ自動では反映されへんで。 |
| port is already allocated | 8888または9999を使うアプリを確認してな。たとえばGet-NetTCPConnection -LocalPort 8888,9999 -State Listen -ErrorAction SilentlyContinue。すでに使ってるアプリを確認してから終了してな。ポートを変更するときは起動設定とこの記事のURLを対応させて変更する必要があるで。 |
| 200にならない/一覧にコンテナがない | docker ps -a --filter 'name=hindsight-demo'とdocker logs --tail 80 hindsight-demoを実行。まだ起動中なら待ってな。終了してるときはログのエラーを確認してな。メモリ不足ならDocker Desktopのリソース設定とPCの空きメモリも確認してな。 |
| 保存時に401・403・429などが出る | Hindsightのログで外部API側のエラーか確認してな。キー、モデル利用権限、残高・利用上限をOpenAI側で確認してな。429のときは上限・レートの理由を確認し、続けて何度も送らんといてな。 |
| PowerShellを閉じて変数がなくなった | コンテナを起動した後、次節の「新しいPowerShellで再開する2行」を実行し、検索ブロックへ戻るんや。 |
| タイムアウトした | ログとメモ一覧を確認し、処理が終わっているかを先に調べてな。保存がうまくいかんからと、確認せずに何度も実行せんといてな。 |
APIキーを直すときは、練習用コンテナをdocker stop hindsight-demo、docker rm hindsight-demoの順で停止・削除してから、手順2の入力と手順3の起動をやり直してな。保存用ボリュームを削除しなければDBは残るで。ログを人に見せるときはキーや入力内容が含まれていないか確認してな。
停止・再開とデータの削除
作業を終えるときは次の1行を実行してな。記憶のデータは残るで。
docker stop hindsight-demo次回はDocker Desktopを起動してから、次を実行してな。初回のdocker runを毎回繰り返す必要はないで。
docker start hindsight-demo手順3のHTTP 200を確認してな。新しいPowerShellで再開するときは、次の2行で接続先を設定し直してから手順5の検索ブロックを実行してな。保存済みメモを探すだけなら手順4の再登録はいらへんで。
$bank = 'first-memory-demo'
$base = "http://localhost:8888/v1/default/banks/$bank"これで、PowerShellを閉じても記憶がDocker側に残ることを確認できるで。外部LLMへの通信や保存期間を管理する本番運用は別に考えておいてな。
練習データの削除(元に戻せへんで)
Hindsightが起動中なら、次の操作でfirst-memory-demoバンクと、その中のすべての記憶を削除できるで。練習データだけが入っていることを確認してから実行してな。
Invoke-RestMethod -Method Delete -Uri 'http://localhost:8888/v1/default/banks/first-memory-demo'練習用コンテナと専用保存領域もすべて不要なら、次の3行を順番に実行してな。最後の行でhindsight-demo-data内の全データが消えるで。ほかの用途でこのボリュームを使っているときは実行せんといてな。外部APIのキー自体は削除されないので、不要になったキーは発行元のAPI keys画面でも使えんようにしておいてな。
docker stop hindsight-demo
docker rm hindsight-demo
docker volume rm hindsight-demo-dataアシスタントに組み込む前に
| 全文を貼り直す場合 | 今回試した記憶の使い方 |
|---|---|
| 質問するたびに、担当者と会議室のメモを探して貼る。 | 一度保存したメモから、質問に関係する情報をAPIで取り出す。 |
今回のゴールは「保存と検索」やで。チャット画面や、取得した記憶をもとに答えるアプリまでは作ってへんで。次に組み込むときは、利用者ごとのデータ境界、誤った記憶の更新・削除、検索結果と元の情報を比べる方法を考えてな。Memory Bankの名前を分けることだけで、アクセス制御が完成するわけやないで。
公式資料と利用条件
Hindsightリポジトリの本体LICENSEはMITやで。Docker Desktop、同梱モデル、外部LLM、クラウドサービスの条件や料金はそれぞれ別やで。この記事の図解は独自制作で、実際の製品画面や実行結果やないで。
- 公式GitHub・README / 本体LICENSE
- 公式インストール手順 / モデルとプロバイダーの設定
- HTTP API仕様 / リポジトリ内のOpenAPI仕様
- 保存操作の解説 / 検索操作の解説
- Microsoft:WSLの導入 / Docker Desktop:Windowsの導入
- OpenAI API:キーの準備 / 料金
手順を直して資料を確認した日:2026年10月24日。掲載対象はHysen Labsの30日間スター純増CSV(2026年9月23日〜10月23日)の上位20件からすでに記事にしたものを除いて選んだで。Hysen Labsが追跡するリポジトリ内の順位で、GitHub全体を網羅するランキングやないで。期間末と期間初のスター数の差分を使用。データ提供:Hysen Labs(CC BY 4.0)。