OxiRAG
渡した資料を読んで、根拠つきで答える。
質問に答えるとき、機械が見るべきなのは「覚えていること」ではなく「渡された資料」です。 資料を探してから答える、この作り方を RAG と言います。 このページには日本語のメモが 7 枚だけ入っています。あなたが質問すると、 そのメモの中だけを探して答えます。
メモも質問も、どこにも送られません。答えを作っているのは、いまあなたのブラウザの中で動いている Pure Rust のプログラムです。
- ①さがす質問に近いメモを見つける
- ②まとめる見つけた文をつないで答えにする
- ③たしかめるその答えが筋の通った話か点検する
- ④つなげる出てきた言葉の関係を図にする
質問してみる
押すだけで試せます。ここに無いことを聞くと「見つからない」と答えます — それがこの仕組みの正しい動きです。作り話をしないために、資料の外には出ません。
日本語を、辞書で正しく読む
ここまでは辞書なしで日本語を読んでいます。「漢字が 2
文字以上続いたら名前らしい」「『は』の前が主語らしい」——推測です。だいたい当たりますが、外れます。
たとえば「日本で一番高い山」から 一番高 という名前を拾ってしまいます。そんな語はありません。
下のボタンを押すと、MeCrab(日本語の形態素解析器)の辞書 IPADIC を読み込んで、同じメモを読み直します。どこで単語が切れるか・その語が地名なのか動詞なのかを、 推測ではなく辞書が答えます。上の結果がその場で変わります。
11 MB は /mecrab が使うのと同じファイルです。あちらを先に見ていれば、ブラウザのキャッシュにあるので待ち時間はありません。 読み込まなくてもこのページは動きます — 辞書なしで動くことが、この実装の下限です。
④ 言葉のつながりを見る
メモを読みながら、出てきた名前と、その間の関係(「〜は〜だ」「〜を使う」「〜にある」)を 自動で拾って図にしています。名前を入れると、そこから 2 つ先まで辿ります。
覚えているメモ(7 枚)
答えはここからしか作られません。だから、答えが正しいかどうかをあなた自身が読んで確かめられます。これが「根拠つきで答える」ということです。
- ペンギンペンギンは鳥です。ペンギンは空を飛びません。ペンギンは海を泳ぎます。ペンギンは南極にすんでいます。
- コウモリコウモリは哺乳類です。コウモリは空を飛びます。コウモリは夜に活動します。コウモリは超音波を使います。
- 富士山富士山は日本で一番高い山です。富士山の高さは3776メートルです。富士山は静岡県と山梨県にあります。富士山は世界文化遺産です。
- 東京東京は日本の首都です。東京の人口は約1400万人です。東京には地下鉄がたくさん走っています。東京は関東地方にあります。
- お米お米は日本の主食です。お米は水田で作ります。ごはんはお米を炊いた食べ物です。日本人はお米をよく食べます。
- 自転車自転車はペダルをこいで進む乗り物です。自転車にはエンジンがありません。自転車は道路の左側を走ります。自転車は健康によい乗り物です。
- カレーカレーはインドで生まれた料理です。日本のカレーはご飯にかけて食べます。カレーには玉ねぎとにんじんを使います。カレーは辛い料理です。
自分のメモを足す
足したメモもこのタブから出ません。1 枚あたり 512 KB、全体で 2,000 枚まで。
読み込み中…
正直に言っておくこと
- 文章を書いている AI はいません。答えはメモから抜き出して並べたものです。 言葉づかいを整える部分だけが無い、と思ってください。逆に言えば、作り話は原理的に起きません。
- 意味ではなく言葉で探しています。「車」と「自動車」が同じ意味だとは知りません。 日本語は 2 文字ずつの並びで見ているので、「東京」は「東京都」に当たります。
- ③ の証明機だけは本物です。OxiZ という Pure Rust の SMT ソルバが、ブラウザの中でそのまま動いています。飾りではありません。
いま上で動いているコード
// crates/oxirag-wasm/src/session.rs:397-409 — 4 段階の本体。これがいま、あなたの質問を走らせている
pub async fn query_json(&self, query: &str, top_k: usize) -> Result<String, RagWasmError> {
check_input("query", query)?;
let output = self
.pipeline
.process(Query::new(query.to_owned()).with_top_k(clamp_top_k(top_k)))
.await
.map_err(|e| RagWasmError::Internal {
message: e.to_string(),
})?;
to_json(&output)
} これがいま上で動いているコードです。scripts/snippet-check.mjs が、この引用がソースと 1 バイトも違わないことを検査しています。
| oxirag | v— (Pure Rust, Apache-2.0) |
|---|---|
| target | wasm32-unknown-unknown |
| wasm size | 1681 KB (gzip 641 KB) |
| メモ | — |
| 名前 / つながり | — |
| ベクトル幅 | — |
| MeCrab 辞書 | 未読込 |
| さがす | — |
| 4 段階 | — |
| つながり | — |
| 外部リクエスト | — |
| server round-trips | 0 |
| C / C++ / Fortran | 0 bytes |