💑

CursorがDuckDB-Wasm + VSS な論文マッチングWEBアプリを作ったよ

に公開

q‑finder: 素敵な金融論文と出会いポロリを探求しよう

金融・投資分野の最新研究を、スワイプひとつで。


TL;DR

  • q‑finder は arXiv q‑fin 論文を Tinder ライクな UI でサクサク仕分けできる PWA
  • DuckDB‑wasm で ブラウザ内 SQL、Google Gemini で日本語 3 行サマリ+トレーダー向けスコア
  • 完全サーバレス & フレームワークレス。S3 + CloudFront に置くだけで世界中へデプロイ
  • オフライン動作、ベクトル検索、Like ベースのレコメンドまで全部ブラウザで完結

デモ: https://qfinder.p-hunters.com


なぜ作ったのか

GWは暇なものです。

https://qiita.com/blog_UKI/items/c81df71ec79fba4eee6d

金融の世界は情報が命。ところが、論文探索は未だに arXiv 検索窓+ PDF ダウンロードの繰り返し……。 "もっとカジュアルに論文を漁りたい" という欲望から生まれたのが q‑finder です。

ポロリとは:https://x.com/search?q=エッジ ポロリ&src=typed_query&f=top

プロダクト概要

機能 ひと言で 技術ハイライト
Tinder 風スワイプ 右=Like / 左=Skip CSS アニメーション + スワイプ検出
リアルタイムフィルタ 年・サブカテゴリなど即絞り込み DuckDB WHERE
AI 要約 & スコア 日本語 3 行 + 0‑10 点の有用度 Google Gemini
フルブラウザ処理 SQL もベクトル検索も JS で完結 DuckDB‑wasm + WebAssembly SIMD
PWA & オフライン トンネル移動中でも読める Service Worker, Cache Storage

q‑finder UI


アーキテクチャ図

[arXiv] ─▶ S3(Parquet) ─▶ CloudFront
                       │
                       ├─▶ q‑finder (PWA)
                       │      ├─ DuckDB‑wasm
                       │      └─ Gemini summarizer API
                       │
                       └─▶ AWS Lambda (Container)
                              └─ Gemini API

技術スタック詳細

フロントエンド(ブラウザ)

  • HTML/CSS/Vanilla JS —— 依存ゼロで最速描画.Plain HTMLでフレームワークも未使用.
  • DuckDB‑wasm —— Parquet 直読み & SQL 実行
  • Apache Parquet —— 軽量カラム指向フォーマット
  • Service Worker —— キャッシュ戦略 + オフライン

クラウド / インフラ

  • 静的ホスティング: S3 + CloudFront
  • AI 要約: AWS Lambda (Container) + Google Gemini API
  • IaC: Terraform

01. DuckDB‑wasm で"サーバいらず"の全文検索

// DuckDB 初期化(最短パターン)
import * as duckdb from "@duckdb/duckdb-wasm";

const db = await duckdb.createDuckDB();
await db.openParquet("papers.parquet");

const papers = await db.query(`
  SELECT title, published 
  FROM papers
  WHERE categories LIKE '%q-fin%' AND EXTRACT(YEAR FROM published) >= 2023
  ORDER BY published DESC;
`);
  • DuckDB-Wasm + VSS でブラウザで高速検索
  • CloudFront から配信された Parquet を fetch() で直ロード

02. ベクトル埋め込みで"意味"検索

BigQuery + Vertex AI で Embeddings を生成し、768次元のベクトルを Parquet に保存。ブラウザでは以下の 3 ステップで類似論文を取得します。

  1. クエリを Embedding に変換
  2. DuckDB-Wasm + VSS で cosine_distance() を使って類似度計算
  3. ORDER BY similarity DESC LIMIT 10
const result = await conn.query(`
  SELECT arxiv_id, title,
         1 - cosine_distance(ml_generate_embedding_result, ?) AS similarity_score
  FROM papers_embeddings
  ORDER BY similarity_score DESC
  LIMIT 10;
`, [queryEmbedding]);

ポイント: 計算コストはすべてユーザーの CPU。サーバーは 0 円!


03. Gemini API で 3 行サマリ + スコアリング

Lambda (コンテナ) 経由で Gemini を呼び出し、次の JSON を返します。

{
  "id": "2201.12345",
  "title": "Market Efficiency in Crypto Markets",
  "s1": "この論文は暗号通貨市場の効率性について分析している",
  "s2": "従来の金融市場と比較して特異な価格形成メカニズムを発見した",
  "s3": "市場の非効率性から生じる裁定機会について議論している",
  "score": "8",
  "score_reason": "暗号通貨トレーダーにとって市場の非効率性は直接的な収益機会につながるため"
}

Why Lambda?

  • 常時稼働サーバ0 → コスト削減(リクエストがあるときだけ起動)
  • コンテナで依存ライブラリを固めて 1 コマンドデプロイ

04. NotebookLM連携とPodcast機能

q-finderには論文理解を促進するユニークな機能として、NotebookLMとの連携と論文Podcastの共有システムを実装しています。

[論文] ──▶ NotebookLM ──▶ Podcast録音 ──▶ q-finder
                                       │
                                       ▼
                          [Whisper で字幕生成] ──▶ VTTファイル

NotebookLM連携

各論文の詳細ページには「Open NotebookLM」ボタンがあり、ワンクリックで以下が可能です:

  1. 論文PDFのURLを自動的にクリップボードにコピー
  2. NotebookLMを新しいタブで開く
  3. ユーザーがNotebookLMに論文をインポートして深い分析が可能
// NotebookLM連携コード例
function openNotebookLM() {
  // PDFのURLをクリップボードにコピー
  let paperPdfUrl = document.querySelector('.paper-link[href]');
  navigator.clipboard.writeText(paperPdfUrl.href);
  
  // 新しいタブでNotebookLMを開く
  window.open('https://notebooklm.google.com/', '_blank');
}

Podcastアップロード機能

論文に関する音声解説(Podcast)をアップロード・共有できる機能も実装しています:

  1. NotebookLMで生成されたAI解説や、自分の解説音声をアップロード
  2. バックエンドでMP3に自動変換(WAVやMP4も対応)
  3. Whisperによる自動文字起こしで字幕(VTTファイル)生成
  4. ブラウザで字幕付きプレーヤーとして再生可能

字幕付Podcast

このPodcast機能により、視覚的だけでなく聴覚的にも論文内容を理解できるようになり、移動中や作業しながらの論文探索が可能になります。

実装のポイント

  • 音声・動画ファイルはAWS S3にアップロード、CloudFrontで配信
  • 字幕はWebVTT形式で保存し、HTMLのtrack要素でプレーヤーに追加
  • カスタム字幕表示UIで視認性を向上
  • Service Workerでオフライン再生対応

今後のロードマップ

  • パーソナライズされた推薦機能: ユーザーの「いいね」履歴に基づいた論文推薦
  • 複数データソース対応: arXiv以外の論文ソースも統合
  • コメント機能: AI/ユーザー間での論文に関するディスカッション
  • Podcast生成機能: NotebookLMとの連携を深め、AIによる論文解説音声の自動生成

コントリビュート歓迎! 特にNotebookLMの音声作成・アップロードをお願いしたいです。
金融に興味ある学生さん、月1,600円くらいするGoogle Workspaceのアカウントを無償発行するのでDMください(https://x.com/HunterP0r0ry)
※10名くらいまで. q-finder以外の用途でのNotebookLMノートブック作成もOK

https://x.com/takechan_lawyer/status/1918073485152403460


まとめ

q‑finder は "論文の発見" をエンタメに変える試みです。DuckDB‑wasm × Gemini という オールブラウザ アプローチが、Web アプリの新しい可能性を示すと信じています。ぜひ触ってフィードバックをお寄せください!

▶︎ 触ってみる: https://qfinder.p-hunters.com


次回予告

今回は簡単なサービス紹介と技術概要にとどめました。
個人的にDuckDB‑wasmが面白いので反響あれば続編もCursorが執筆してくれるかもしれません。

次回は 「DuckDB‑wasm で実装するブラウザ内大規模データ処理」 を深掘り予定。お楽しみに!

Discussion