研究所の電子実験ノートを横断して、条件・試薬・結果の記述から過去の近い実験を探し、再現の手がかりと失敗の記録を根拠付きで返す
いま行っている実験の条件と、うまくいかない症状から、電子実験ノートの過去の記録を探して近い実験を並べます。成功した実験との条件の違いと、同じ症状で止めた実験の記録を、根拠のノート番号付きで返します。
- 生成AI
- Azure OpenAI Service/Claude/Gemini
- AIサービス
- Azure AI/Google Vertex AI/OpenSearch
- 対象業界
- 医療/製造
- 対象部門
- 研究開発
- 対象業務
- 情報検索/比較検討
- 主な課題
- 属人化している/引き継ぎができていない/情報が見つからない
- AIで行う処理
- 検索(RAG)
- 主な効果
- 属人化解消/教育コスト削減/検索時間短縮
- 導入難易度
- ★★★★★
- 実装レベル
- 本格構成
- 費用感
- RAG・個別開発(大)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 実験がうまくいかないとき、近くの先輩や上司に、同じことが前にあったかを聞く
- 名前が挙がった人のノートを、実験ノートの画面で日付や化合物の番号から探す
- 名前が挙がらなければ、試薬の名前や反応の名前で実験ノートを言葉で検索する
- 出てきたノートを1件ずつ開き、条件・試薬・観察・結果を読む
- いまの実験との違い(温度・当量・溶媒・試薬のロット・加える順番)を書き出す
- 書き出した違いをもとに、次に何を変えるかを上司と相談する
- 人研究員が、いまの実験のノート番号を指定し、症状を一言書いて検索画面で送る
- 自動Claude API が、いまのノートから反応の種類・試薬と当量・溶媒・温度・時間と、症状を取り出す
- 人研究員が、取り出された条件と症状を画面で確かめ、直す
- 自動Amazon OpenSearch Service が、言葉の一致と意味の近さの両方で過去の実験を探し、点数をそろえて合わせる
- 自動同じ研究員が同じ日に続けた実験を1つの系列にまとめ、系列ごとに代表を出す
- 自動上位の実験について、いまの実験との条件の違いを項目ごとに規則で照らし、印を付ける
- 自動Claude API が、候補ごとに条件の違いと観察・結果の要点を読める文にし、ノート番号を付ける
- 人研究員が上位のノートを開いて読み、次に何を変えるかを決める
各工程の詳しい説明を読む
- 実験がうまくいかないとき、近くの先輩や上司に、同じことが前にあったかを聞く
- 名前が挙がった人のノートを、実験ノートの画面で日付や化合物の番号から探す
- 名前が挙がらなければ、試薬の名前や反応の名前で実験ノートを言葉で検索する
- 出てきたノートを1件ずつ開き、条件・試薬・観察・結果を読む
- いまの実験との違い(温度・当量・溶媒・試薬のロット・加える順番)を書き出す
- 書き出した違いをもとに、次に何を変えるかを上司と相談する
(a)探す入口が人の記憶しかない。 同じ失敗をした人がいても、聞いた相手が覚えていなければ出てきません。部署が違う、何年も前、という記録はほとんど見つかりません。
(b)書き方が違うと言葉の検索に引っかからない。 観察の記述は自由に書かれ、同じ現象に何通りもの書き方があります。言葉の検索では、自分と同じ書き方をした人のノートしか出てきません。
(c)失敗の記録が読まれない。 報告書や社内の発表に残るのは、うまくいった条件です。止めた実験の理由は、その人のノートの中にだけあります。 同じ条件で同じ失敗をくり返していても、誰も気づきません。
(d)違いを見落とす。 うまくいった実験と、いまの実験の違いが、試薬のロットや溶媒の等級、加える順番にあることがあります。ノートを読みながら手で違いを書き出すので、見る人によって拾う違いが変わります。
(e)若手ほど時間がかかる。 誰に聞けばよいかを知らず、ノートの書き方の癖にも慣れていません。1件の調べ物に半日かかり、その間に実験が止まります。
- 【人】 研究員が、いまの実験のノート番号を指定し、症状を一言書いて検索画面で送る
- 【自動】 Claude API が、いまのノートから反応の種類・試薬と当量・溶媒・温度・時間と、症状を取り出す
- 【人】 研究員が、取り出された条件と症状を画面で確かめ、直す
- 【自動】 Amazon OpenSearch Service が、言葉の一致と意味の近さの両方で過去の実験を探し、点数をそろえて合わせる
- 【自動】 同じ研究員が同じ日に続けた実験を1つの系列にまとめ、系列ごとに代表を出す
- 【自動】 上位の実験について、いまの実験との条件の違いを項目ごとに規則で照らし、印を付ける
- 【自動】 Claude API が、候補ごとに条件の違いと観察・結果の要点を読める文にし、ノート番号を付ける
- 【人】 研究員が上位のノートを開いて読み、次に何を変えるかを決める
3番目が、この設計の分かれ目です。 取り出された試薬が違えば、検索の結果がまるごと外れます。とくに CAS 番号と当量は、検索の前に人が1回見ます。
6番目を規則で行うのは、違いの拾い漏れをなくすためです。 温度・当量・溶媒・試薬のロットが同じか違うかは、項目の値どうしの比較で決まります。AIに違いを探させると、目立つ違いだけを書いて小さな違いを落とします。 規則で印を付け、AIはその印を文にします。
02今回想定するシステム構成
電子実験ノート(書き出し) 試薬の在庫の管理システム │ 署名済みのノートを毎晩取り込む ▼ AWS Lambda ── Claude API(条件・試薬・観察・結果の取り出し、構造化出力) │ 単位の換算と CAS 番号の確認はプログラム ├──▶ Amazon Bedrock(Titan Text Embeddings V2)── 観察と手順の文のベクトル ▼ Amazon OpenSearch Service ── 実験の索引(試薬は nested、本文は kuromoji、ベクトル) ▲ │ 検索 検索画面 ──【トリガー】ノート番号と症状を送る ▼ Claude API ── 条件と症状の取り出し ▼【人】条件の確認 OpenSearch ── hybrid(言葉の一致+意味の近さ)+ 正規化の処理 ▼ 条件の照合(規則)── 温度・当量・溶媒・ロット・加える順番 ▼ Claude API ── 候補ごとの説明とノート番号 ▼ 検索画面 ──【人】研究員がノートを読んで決める
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 検索基盤 | Amazon OpenSearch Service(hybrid クエリ、正規化の処理、nested、kuromoji) | Azure AI Search、Vertex AI Search(Agent Search) |
| 生成AI | Claude API(ノートからの取り出し、条件と症状の取り出し、候補の説明) | Azure OpenAI(Microsoft Foundry)、Gemini API |
| 埋め込み | Amazon Titan Text Embeddings V2(観察と手順の文のベクトル) | Azure OpenAI の埋め込みモデル |
| 連携 | AWS Lambda(ノートの取り込み、検索画面とのつなぎ、条件の照合) | AWS Step Functions |
| 保管 | Amazon S3(取り込んだノートの写し) | 研究所のファイルサーバー |
電子実験ノートと試薬の在庫の管理システムには、この構成から書き込みません。 ノートを書き出して読み、試薬の CAS 番号とロットを照らすだけです。電子実験ノートから何をどの形で書き出せるかは製品によって違い、書き出しの機能や API の有無を最初に確かめます。
土台になるのは、実験1件を1文書にした索引です。 実験ノートの1ページには、目的・反応式・試薬の表・手順・観察・結果が並びます。試薬は表の行ごとに名前・CAS 番号・ロット・当量を持つので、nested の項目にします。 nested にすると、「この CAS 番号を、このロットで使った」という1行の中の組み合わせで探せます。nested の問い合わせは path で項目を指定し、inner_hits で当たった行を返せます。
並べ方の中心はハイブリッドクエリです。 複数の問い合わせの点数を、文書ごとに1つの点数へ合わせます。問い合わせは最大5つで、点数の合わせ方は検索パイプラインの正規化の処理で決めます。 言葉の一致(BM25)と意味の近さ(k-NN)は点数の尺度が違うので、問い合わせごとにそろえてから合わせます。そろえ方は min_max(既定)・l2・z_score、合わせ方は算術平均(既定)・幾何平均・調和平均で、問い合わせごとの重みを合計1.0で付けられます。
ハイブリッドクエリは function_score の中に入れません。 公式は、ハイブリッドクエリを最上位のクエリとして設計しており、function_score などに包むと実行時のエラーになるか、正規化の処理が黙って飛ばされるとしています。新しいノートを少し上げたいような調整は、検索のあとにプログラムで行います。
意味の近さには、Amazon Titan Text Embeddings V2 のベクトルを使います。 入力は最大8,192トークン(5万文字)で、出力は既定で1,024次元です。言語は英語で、100以上の言語はプレビューの扱いです。 日本語の観察の記述でどれだけ近いものが拾えるかは、自社のノートで試してから決めます。 公式も、長い文書は段落や節に分けることを勧めています。
本文の言葉の一致には、日本語の形態素解析を使います。 Amazon OpenSearch Service には Japanese (kuromoji) Analysis が全ドメインに入っており、Sudachi Analysis は日本語向けに推奨された任意のプラグインとして載っています。
03どうやって実装するのか
処理の起点を決める
研究員が、いまの実験のノート番号と症状の一言を検索画面で送ったときに動かします。 症状は「結晶が出ない」「原料が残る」「不純物Bが増えた」のような短い言葉で十分です。ノート番号だけで症状が無いときは、「似た条件の実験」を探す検索として扱います。
もう1つの起点は、ノートの署名です。 実験ノートは、研究員が書き終えて署名し、確認者が確認の署名をした時点で取り込みます。毎晩、前日に署名されたノートを書き出して索引に入れます。 書きかけのノートは入れません。後から観察や結果が足されるからです。
署名の後に訂正が入ったノートは、版を上げて入れ直します。 同じノート番号の古い版を消してから入れます。古い版が残ると、同じ実験が別の結果で2件並びます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| いまの実験 | ノート番号、反応の種類、試薬と当量、溶媒、温度、時間、症状 | 検索画面と電子実験ノート |
| 実験の文書 | ノート番号・版・研究員・日付・プロジェクト、反応の種類、手順と観察の本文、結果の数値(収率・純度) | 実験の索引(OpenSearch) |
| 試薬の行 | 名前・CAS 番号・ロット・当量・グレード・加えた順番 | 実験の索引の nested の項目 |
| 結果の区分 | 成功・一部成功・不成功・中止、中止の理由 | ノートの結果の欄から取り出す |
| 試薬のロットの情報 | ロットごとの入荷日と仕入先、検査の記録の有無 | 試薬の在庫の管理システム |
質を決めるのは、3行目の試薬の行です。 試薬の名前だけの索引なら、言葉の検索と大差がありません。CAS 番号とロットが行ごとに入っているから、「同じ試薬の別のロットで止まった実験」が探せます。
4行目の中止の理由も、必ず持たせます。 中止したノートには、「反応液が黒変したため中止」「原料が溶けず中止」のように、次の人がいちばん知りたいことが1行で書かれていることがあります。 理由が書かれていなければ「記載なし」とし、推測で埋めません。
データの取得方法を決める
| 取るもの | どこから | どう取るか |
|---|---|---|
| 言葉が一致する実験 | 実験の索引 | 手順と観察の本文への match、試薬の行への nested の term |
| 意味が近い実験 | 実験の索引 | 症状と観察の文のベクトルへの knn |
| 合わせた順位 | 検索パイプライン | 正規化の処理(min_max、算術平均、重み) |
| ノートの写し | S3 | 上位の実験のノート番号から写しへのリンク |
| ロットの情報 | 試薬の在庫の管理システム | 上位の実験のロットを引いて添える |
検索の形は、次のようになります。
POST /eln-experiments/_search?search_pipeline=eln-hybrid
{
"size": 20,
"query": {
"hybrid": {
"filter": { "term": { "reaction_type": "amide_coupling" } },
"queries": [
{ "match": { "observation": "結晶が出ない 油状 析出しない" } },
{ "nested": {
"path": "reagents",
"query": { "term": { "reagents.cas": "148893-10-1" } },
"inner_hits": {}
} },
{ "knn": { "observation_vec": { "vector": [0.012, -0.031], "k": 50 } } }
]
}
}
}
ベクトルの値は省略して書いています。filter で反応の種類を先に絞り、3つの問い合わせの点数を検索パイプラインで合わせます。 検索パイプラインは次のように作ります。
PUT /_search/pipeline/eln-hybrid
{
"phase_results_processors": [
{ "normalization-processor": {
"normalization": { "technique": "min_max" },
"combination": {
"technique": "arithmetic_mean",
"parameters": { "weights": [0.3, 0.3, 0.4] }
}
} }
]
}
重みは合計が1.0になるように付けます。 最初は意味の近さを少し重くし、研究員が「当たっていた」と答えた候補の順位を見て調整します。算術平均では、片方の問い合わせにしか当たらなかった文書の点数は下がります。 試薬だけ一致して観察が違う実験が下に行くのは、意図どおりです。
実験の索引の1件は、次のような形にします。
{
"notebook_id": "ELN-2021-PD-03417",
"version": 1,
"project": "PJ-118",
"chemist": "研究員の社員番号",
"date": "2021-11-09",
"reaction_type": "amide_coupling",
"reagents": [
{ "name": "HATU", "cas": "148893-10-1", "lot": "L2108A", "equiv": 1.2, "order": 2 },
{ "name": "DIPEA", "cas": "7087-68-5", "lot": "L2105C", "equiv": 3.0, "order": 3 }
],
"solvent": "DMF",
"temp_c": 25,
"time_h": 16,
"observation": "反応後、水を加えても析出せず油状。冷却しても固化せず。",
"result_class": "aborted",
"abort_reason": "単離できず中止。次回は溶媒を変える予定と記載",
"yield_pct": null,
"access_group": "PJ-118"
} AIへ渡す前に整形する
- ノートの書き出し … 署名済みのノートを、本文と試薬の表と結果の欄に分けて書き出します
- 条件と結果の取り出し … Claude API にノートを渡し、試薬の行・溶媒・温度・時間・観察・結果の区分・中止の理由を構造化出力で取り出します。原文の文字列も残します
- 単位の換算 … 「mmol」「g」「mL」で書かれた量から当量を出す計算は、プログラムで行います
- CAS 番号の確認 … CAS 番号の末尾の確認用の数字を計算で照らし、合わないものは確認の待ち行列へ回します
- 試薬の名前のそろえ … 商品名・略号・正式名を、試薬の在庫の管理システムの CAS 番号で1つにまとめます
- 観察の文のベクトル化 … 観察と手順の本文を節ごとに分け、Titan Text Embeddings V2 でベクトルにします
3番目と4番目をAIに任せないのは、構造化出力の制約のためでもあります。 Claude API の構造化出力は、JSON スキーマの minimum・maximum のような数値の制約に対応しておらず、使うと 400 のエラーになります。 スキーマで範囲を縛れないので、範囲と番号の確認は取り込みの処理で行います。
5番目の名前のそろえを省くと、nested の検索が効きません。 「HATU」と書いた人と正式名で書いた人の実験は、CAS 番号でそろえない限り別の試薬になります。
AIに処理させる
させるのは3つです。ノートから条件と結果を取り出すこと、いまの実験から条件と症状を取り出すこと、検索の結果を候補ごとの説明にすることです。
| させること | 中身 |
|---|---|
| ノートからの取り出し | 試薬の行(名前・CAS 番号・ロット・量・加えた順番)、溶媒・温度・時間、観察、結果の区分、中止の理由 |
| いまの実験からの取り出し | 反応の種類、試薬と当量、溶媒・温度・時間、症状の言葉 |
| 候補の説明 | 条件の照合で付いた印の意味、観察と結果の要点、中止の理由の要点 |
| 根拠の付与 | 説明ごとにノート番号と版 |
| させないこと | 理由 |
|---|---|
| 次の実験の条件の提案 | 研究員と上司が、ノートを読んで決める |
| 失敗の原因の推定 | ノートに書かれていない原因を書かせない |
| 当量の計算・単位の換算 | プログラムが行う。AIの計算は桁の誤りが残る |
| 条件の違いの判定 | 項目の比較で規則が決める |
| 検索結果に無い実験の紹介 | 結果に無いノート番号を示さない |
2行目がいちばん起きやすい失敗です。 中止の理由が「単離できず中止」としか書かれていないノートを渡すと、AIは親切に「溶媒の極性が高すぎたためと考えられる」と続けます。その原因は誰も確かめていません。 書かれている理由だけを写させます。
条件の照合は、次の規則でプログラムが行います。
| 照らす項目 | いまの実験と違うときの印 |
|---|---|
| 試薬(CAS 番号) | 片方にしか無い試薬に reagent_diff |
| 試薬のロット | 同じ CAS 番号でロットが違えば lot_diff |
| 当量 | 1割を超えて違えば equiv_diff |
| 溶媒とグレード | 違えば solvent_diff |
| 温度・時間 | 温度が5℃、時間が2割を超えて違えば temp_diff・time_diff |
| 加える順番 | 順番が違えば order_diff |
しきい値は研究所で決めます。 上の値は始めるときの目安です。
指示内容を固定する
あなたは医薬品の合成研究所で、研究員が過去の実験ノートを探すのを手伝う立場です。
検索で見つかった過去の実験を、候補ごとに読みやすく説明してください。
次に何を試すか、失敗の原因が何かを決めないでください。決めるのは研究員です。
【やること】
1. 条件の照合で付いた印(lot_diff など)を、意味の分かる文にしてください。
違いの値は渡された diff の値をそのまま使ってください。
2. 観察と結果の要点を、ノートの言葉を使って1〜2文で書いてください。
3. 結果の区分が不成功・中止なら、中止の理由をノートから写してください。
4. 説明ごとに、根拠のノート番号と版を付けてください。
【厳守事項】
- ノートに書かれていない失敗の原因を書かないでください。
「〜のためと考えられる」「〜が原因の可能性がある」と書かないでください。
- 中止の理由が書かれていなければ「記載なし」としてください。
- 当量・量・温度を自分で計算・換算しないでください。
- 印が付いていない条件について、違いがあると推測しないでください。
- 検索結果に無いノート番号・化合物の番号を書かないでください。
- 「この条件で試すとよい」のような提案を書かないでください。
【いまの実験の条件と症状】{current}
【候補(系列ごとの代表と系列内の実験)】{candidates}
【条件の照合の結果】{condition_flags}
「原因を書かない」を2つの言い回しで書いているのは、1つだと残るからです。 「原因は書かない」とだけ伝えると、「〜の可能性がある」という形で書きます。推量の言い回しそのものを禁じます。
違いの値を渡しているのも同じ理由です。 温度や当量の差は、検索のあとにプログラムが出して diff に入れます。AIが差を計算すると、mmol と当量のように単位の違う値どうしを引くことがあります。
出力形式を固定する
Claude API の構造化出力で、次の形のJSONを受け取ります。
{
"candidates": [
{
"notebook_id": "",
"version": 0,
"result_class": "success | partial | failed | aborted",
"flags": [
{ "flag": "", "current": "", "past": "", "diff": "", "explanation": "" }
],
"observation_summary": "",
"abort_reason": "",
"same_series": []
}
],
"failure_records": [],
"no_similar_found": false,
"check_with": []
}
1つ目の理由は、notebook_id と version を照らせることです。 出てきた番号が検索結果に含まれているかを、プログラムで確かめます。 含まれていない候補は表示しません。
2つ目は、成功と失敗を分けて並べられることです。 result_class が failed と aborted の候補は、failure_records にも入れて別の段に表示します。「同じ症状で止めた人がいる」ことが、成功の候補より先に目に入るようにします。
3つ目は、flags の current と past を並べて見られることです。 画面では違いのある項目だけを色で示し、研究員がノートを開く前に、どこが違うかを読めるようにします。 flags の中身はプログラムが入れ、AIは explanation だけを書きます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 検索画面 | 社内のWeb画面 | ノート番号と症状の送信、条件の確認、候補と根拠の表示 |
| Claude API | Messages API の構造化出力 | ノート・いまの実験からの取り出し、候補の説明 |
| Amazon Bedrock | Titan Text Embeddings V2 | 観察と手順の文のベクトル |
| Amazon OpenSearch Service | _search(hybrid、検索パイプライン) | 近い実験 |
| 電子実験ノート | 毎晩の書き出し | 署名済みのノートの取り込み |
| 試薬の在庫の管理システム | 毎晩の書き出し | CAS 番号・ロット・入荷日 |
人が確認する
- 条件と症状を確かめる … 検索の前に、取り出された試薬・当量・溶媒・温度を見ます。CAS 番号が違っていれば直してから検索します
- 上位のノートを開く … 少なくとも上位3件と、
failure_recordsの全件はノートを開いて読みます - ロットの違いを確かめる …
lot_diffが付いた候補は、在庫の管理システムでロットの検査の記録を見ます - 結果を記録する … 役に立ったノート番号と、次に変えた条件をいまのノートに書きます
2番目を省かないでください。 説明は要約です。観察の細かい書き方、反応式の図、分析のチャートは、ノートを開かないと見えません。
4番目が、索引を育てます。 「ELN-2021-PD-03417 を参照し溶媒を変更」とノートに書けば、次に同じ症状で探した人に、つながった2件のノートが出てきます。
目標は、160件をならして1件12分です。 条件の確認に2分、上位のノートを読むのに8分、ノートへの記録に2分という見込みです。
例外に対処する
| 起きること | 対応 |
|---|---|
| いまの実験から試薬が取り出せない | 検索に進まず、研究員に試薬の入力を求める |
| 近い実験が見つからない | no_similar_found を立て、「近い実験なし」と明示する。 遠い候補を並べない |
| 反応の種類で絞ると0件 | 絞り込みを外した結果を、外したことを明記して別に出す |
| ノート番号が検索結果に無い | その候補を表示しない。ログに残す |
| CAS 番号の確認用の数字が合わない | 索引に入れず確認の待ち行列へ。原文の文字列を添える |
| 試薬の名前が在庫の管理システムに無い | 名前のまま入れ、cas を空にして確認へ回す |
| 署名後に訂正された | 古い版を消して入れ直す |
構造化出力が refusal や max_tokens で終わる | 受け付けずに再実行する |
記録を残す
- いまの実験の条件と症状、取り出した値と、研究員が直した値
- 検索の条件(絞り込み、問い合わせごとの重み)と、上位の実験と点数
- 条件の照合の結果と、そのとき使った規則としきい値の版
- Claude API の出力と、使った指示の版
- 表示しなかった候補と理由
- 研究員が役に立ったと答えたノート番号
最後の行が、重みを直す材料になります。 役に立った候補が言葉の一致で上がったのか、意味の近さで上がったのかを数えると、問い合わせごとの重みをどちらに寄せるべきかが分かります。
04実装レベルの3段階
半自動化で、1件30分が20分程度になります。 CAS 番号とロットで探せるようになりますが、書き方の違う観察は言葉の検索では拾えません。本格構成で12分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化で1か月使うと、試薬の名前がそろわない試薬と、観察の欄が空のノートの多い部署が分かります。そこを直してから意味の近さを足します。
05工数削減シミュレーション
導入後 160件 × 12分 ÷ 60 = 32 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 医薬品の原薬・中間体、機能性化学品、電子材料などの合成や調製を行う研究所で、電子実験ノートが数年分・数万件たまっている場合。実験がうまくいかないときに「前に誰か同じことで詰まっていなかったか」を人に聞いて回っている場合。試薬のロットや手順のずれ、途中で止めた実験まで実験ノートに書く習慣がある場合。AWS を社内で使っている場合。
- 実験ノートがまだ紙で、電子化されていない場合(先に読み取りと電子化が必要です)。実験ノートに結果の数値しか書かれず、観察や中止の理由が残っていない場合。研究員が数名で、互いの実験をすべて把握できている場合。なお、次にどの条件で実験するか、過去の失敗の原因が何だったかの判断は、この構成では代替できません。
07最小構成で試す方法
- 過去3年の実験ノートから、同じ反応の種類のものを100件選ぶ(中止・不成功のノートを必ず含める)
- ノートごとに、試薬・当量・溶媒・温度・観察・結果を1行にまとめた表を作る
- 先月「前に誰かやっていないか」を調べた実験を5件選ぶ
- 手元のAIサービスに表と5件の実験を渡し、「この実験に近い過去の実験を表から選び、条件の違いと、同じ症状で止めた実験をノート番号付きで並べてください。書かれていない原因を推測しないでください」と指示する
- 出てきた候補を、当時研究員が見つけたノートと比べる
| 出てきた内容 | 判断 |
|---|---|
| 当時見つけたノートと、見つけられなかった近いノートが出た | 索引とハイブリッドクエリの仕組みづくりに進む |
| 書かれていない原因を推測で書いた | 指示と条件の照合の規則で直る。構成は有効 |
| 表の観察の欄が空で比べられない | ノートの書き方をそろえることが先 |
3行目が出ることは珍しくありません。 それは失敗ではなく、観察を書く習慣が人によって違うことが分かったということです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 書き方の違う観察が拾えない | 言葉の一致だけでなく、意味の近さのベクトルを合わせる |
| ハイブリッドクエリを function_score で包んでエラーになる | 包めない。新しさの調整は検索のあとにプログラムで行う |
| 試薬の名前が人ごとに違い、試薬の検索が効かない | CAS 番号でそろえ、nested の行で探す |
| 試薬とロットの組み合わせが崩れる | 試薬の表を nested にし、行ごとに別の文書として探す |
| AIが書かれていない失敗の原因を書く | 推量の言い回しを禁じ、中止の理由はノートから写させる |
| 当量の計算の誤りが索引に入る | 換算はプログラム、合わないものは確認へ |
| 日本語の観察で埋め込みが近いものを拾わない | 日本語はプレビューの扱い。自社のノートで試して、重みを言葉の一致に寄せる |
| 書きかけのノートが入る | 署名済みだけを取り込む |
| 別のプロジェクトのノートが見える | 文書の単位の権限で分ける |
上の4行が、この構成の失敗のほとんどです。 どれも検索の結果は出るので、気づきにくい失敗です。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 受託先の化合物の構造と番号、試薬と条件、収率と純度、失敗の記録です。受託の実験の記録は、多くが受託先との秘密保持の契約の対象です。
- 見られる範囲をプロジェクトで分ける … OpenSearch のきめ細かなアクセス制御の文書の単位の権限で、ロールに問い合わせを持たせ、そのプロジェクトの研究員にだけ、そのプロジェクトのノートが見えるようにします。 検索の結果の件数も、見えるノートの分だけになります
- 受託先との契約で、横断して探してよい範囲を決める … ある受託先のノートを、別の受託先の実験の手がかりに使ってよいかは契約によります。横断してよいプロジェクトだけを、共通の検索の対象にします
- 外部の生成AIとベクトル化に渡す範囲を決める … ノートの本文を渡すので、契約上の取り扱いと、受託先の了承の要否を先に確かめます
- 化合物の構造は索引の外に置く … 索引に入れるのは化合物の社内番号までにし、構造の図とデータはノートを開いた人だけが見るようにします
- 判断は人が決めて記録する … 過去のノートを手がかりに条件を変えたときは、参照したノート番号をノートに書きます
誤りが起きた場合のリスクは、別のプロジェクトのノートが見えてしまうことと、推測で書かれた原因を信じて実験を組むことの2つです。 前者は文書の単位の権限で、後者は推量の言い回しを禁じる指示と人の確認で防ぎます。
10まず何から始めるか
1週目:結果の区分と書き出しを決める
上司と一緒に、成功・一部成功・不成功・中止の区分の決め方を決めます。あわせて、電子実験ノートから何をどの形で書き出せるかを確かめます。
2週目:100件で試す
同じ反応の種類のノートを選び、実験の表を作ります。先月調べた実験5件で候補を挙げさせ、当時研究員が見つけたノートと比べます。
3週目:取り出しと名前のそろえを作る
ノートから試薬の行と結果を取り出し、CAS 番号の確認と名前のそろえをプログラムで行うところまで作ります。確認の待ち行列に回ったものを研究員が確かめ、規則を直します。
4週目:索引と言葉の検索をつなぐ
OpenSearch に実験の索引を作り、試薬の nested の行と本文の言葉で探すところまで作ります。この時点では説明を出さず、候補の一覧だけを見ます。
2か月目: 埋め込みとハイブリッドクエリ、条件の照合の規則を足します。3か月目以降: 候補の説明と毎晩の取り込み、権限の設計を足し、1件30分が何分になったかを実測します。若手の研究員が、先輩に聞く前に同じ症状で止めた実験を見つけられるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
ハイブリッドクエリが複数の問い合わせの点数を検索パイプラインで1つに合わせること、問い合わせが最大5つであること、filter を1つの問い合わせとして持てること。最上位のクエリとして設計され、function_score などに入れられず、入れると実行時のエラーか正規化の処理が飛ばされること | OpenSearch: Hybrid query | 2026-10-14 |
| 正規化の処理が問い合わせごとに点数をそろえること、min_max(既定)・l2・z_score、算術平均(既定)・幾何平均・調和平均、重みが0.0〜1.0で合計1.0であること、算術平均で片方にしか当たらない文書の点数が下がること | OpenSearch: Normalization processor | 2026-10-14 |
nested の問い合わせが path で項目を指定し、inner_hits で当たった内側の文書を返せること | OpenSearch: Nested query | 2026-10-14 |
| Amazon OpenSearch Service に Japanese (kuromoji) Analysis が全ドメインに入り、Sudachi Analysis が日本語向けに推奨された任意のプラグインであること、Neural Search と k-NN のプラグインがあること | AWS: Plugins by engine version in Amazon OpenSearch Service | 2026-10-14 |
| Titan Text Embeddings V2 の入力が最大8,192トークン(5万文字)、出力が1,024(既定)・512・256次元であること、言語が英語で100以上の言語がプレビューであること、文書を段落や節に分けることが勧められていること | AWS: Amazon Titan Text Embeddings models | 2026-10-14 |
| きめ細かなアクセス制御の文書の単位の権限で、ロールの問い合わせに合う文書だけが見え、検索の件数にも影響すること | AWS: Fine-grained access control | 2026-10-14 |
構造化出力を output_config.format で指定すること、数値の制約(minimum・maximum など)に対応せず使うと 400 のエラーになること、refusal・max_tokens で終わるとスキーマに合わないことがあること | Claude: Structured outputs | 2026-10-14 |
次にどの条件で実験するか、過去の失敗の原因が何だったかは、研究員と上司がノートの記録に基づいて判断してください。 本記事は上の公開情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1530)についてのご相談はこちらから。
