ページ読込後の外部リクエスト: — 件

OxiRAG

渡した資料を読んで、根拠つきで答える。

質問に答えるとき、機械が見るべきなのは「覚えていること」ではなく「渡された資料」です。 資料を探してから答える、この作り方を RAG と言います。 このページには日本語のメモが 7 枚だけ入っています。あなたが質問すると、 そのメモの中だけを探して答えます。

メモも質問も、どこにも送られません。答えを作っているのは、いまあなたのブラウザの中で動いている Pure Rust のプログラムです。

  1. ①さがす質問に近いメモを見つける
  2. ②まとめる見つけた文をつないで答えにする
  3. ③たしかめるその答えが筋の通った話か点検する
  4. ④つなげる出てきた言葉の関係を図にする

質問してみる

押すだけで試せます。ここに無いことを聞くと「見つからない」と答えます — それがこの仕組みの正しい動きです。作り話をしないために、資料の外には出ません。

日本語を、辞書で正しく読む

ここまでは辞書なしで日本語を読んでいます。「漢字が 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 バイトも違わないことを検査しています。

oxiragv— (Pure Rust, Apache-2.0)
targetwasm32-unknown-unknown
wasm size1681 KB (gzip 641 KB)
メモ—
名前 / つながり—
ベクトル幅—
MeCrab 辞書未読込
さがす—
4 段階—
つながり—
外部リクエスト—
server round-trips0
C / C++ / Fortran0 bytes