NISHIO Hirokazu[Translate]
pVectorSearch2023-06-13

事故る予感しかしない
まず公開Scrapboxから作ったデータに関してpublicフラグをつける
そしてデフォルトの検索をpublicからの検索にする
これデータ入れ直すならupdate機能を追加してない現状でも先に再クロールしたらいいんでは?
privateは多様なのでprivateフラグではなく個別のタグにする
特定の権限を持つ人だけ検索対象一覧に特定のタグを持つレコードを検索対象に加えるチェックボックスを表示する

特定の人だけ検索対象を追加する
特定の人に権限を与える作業、僕が作業するのはミスりそうなので、インバイトコードにしたい
そもそもこの機能の実装でバグりそう

NotionはMarkdownでサブページごとエクスポートできそう


>これデータ入れ直すならupdate機能を追加してない現状でも先に再クロールしたらいいんでは?
✅全部まとめて再クロール、5分くらい
JSONからのembeddingはまだバッチにしてなかった
✅コードを一本化
embeddingまちの間に検索にフィルタをつける実験
APIの呼び出し方はわかった
UIからフィルターに関するデータを受け取らないといけない

Notionを検索対象にする話
ヒットしたものをクリックしたら対象にジャンプして欲しいよね
だけどScrapboxと違って「プロジェクトとページ名でリンク先が決まる」というわけではない
UIのためのデータを考えないといけない
今回はある特定の非公開ページをサプページを含めてエクスポートしたもの
ルートのページのURLがあったら復元できるのかな?
お、なるほど
ローカルファイル名
提案2:西尾 7d7c95ceaeb446418bffe462034292bd.md
このIDの部分が全世界ユニークIDのようだ
notion.so/7d7c95ceaeb446418bffe462034292bd で目的ページに飛べる
じゃあ {type: notion, id: xxx} かな〜

:
processing 15469 pages 100%|...| 15469/15469 [00:53<00:00, 290.87it/s] processing 13893 tasks in 277 batches) 100%|...| 278/278 [11:27<00:00, 2.47s/it]

ん、これ僕の理解が正しければすんなり差分更新にできる実装になってるな
過去の自分、偉い

:
# halsk processing 1281 pages 100%|...| 1281/1281 [00:02<00:00, 619.70it/s] total tasks: 2221, 1.00% was cached processing 0 tasks in 0 batches) 0it [00:00, ?it/s] # yuiseki processing 2778 pages 100%|...| 2778/2778 [00:09<00:00, 289.72it/s] total tasks: 4738, 0.92% was cached processing 375 tasks in 8 batches) 100%|...| 8/8 [00:25<00:00, 3.13s/it] # tkgshn processing 5750 pages 100%|...| 5750/5750 [00:11<00:00, 486.96it/s] total tasks: 12117, 0.97% was cached processing 308 tasks in 7 batches) 100%|...| 7/7 [00:20<00:00, 2.89s/it]

差分更新できた

Notionのエクスポートデータから各ページごとにタイトルとIDを取るコードはできた

残りは明日
TODO
Notionからデータを作る
Notionの検索結果のビューを作る
特定の権限の人だけUIを出す
特定の権限を確認して検索フィルターする
UIからフィルターに関するデータを受け取る
データをQdrantに入れ直す

2023-06-14
Discordでの議論も検索対象に入れた方がいいなと思ったのでとりあえず今回は過去ログを日付で分割してNotionに貼ることにした
各種論文のアブストをDeepLしてNotionに入れた
Google Docsにあった初期の議事録もNotionにコピペ

✅Notionからデータを作る
Localのqdrantに入れて試す
✅そのままだとヒットすることを確認
✅publicだけからの検索ならヒットしないことを確認
✅Notionの検索結果のビューを作る
検索結果をクリックしてScrapboxとNotionとどちらにも飛べるようになった

特定の権限の人だけUIを出す
うーん、めんどくさいな
たとえば特定のキーがlocalStorageに入っていることを表示条件にしたらJSをリバースエンジニアリングしたらできてしまう
面倒でもログイン状態を確認すべきか
GPT4と相談: Firebase AuthCustom ClaimsFeature Toggleする
あー、なるほどね、grantするAPIを作ってサーバサイドでやればいいのか
GPT4の情報がちょっと古くて改行のエスケープはもう不要だった
こういうスキルはまだ必要
表示はできた
できた

特定の権限を確認して検索フィルターする
featureAがONの時に、その情報を検索APIにも渡す。そして権限があることを確認してからフィルターの設定に反映して検索する。
いやこれ、チェックボックスで検索対象を切り替えられるようにすることと、特別な権限がある人だけ特別のターゲットを検索できるようにすることは別のイシューだな
一度にやると複雑だから後者だけ先にやろう
できた

後は特定のユーザにCustom Claimつけるのを僕がDBをいじったりしないでできるようにする方法か
promptでpasswordを取ってsetCustomClaim APIに送る
なぜか前回は設定できたのに今回はできない?
>Admin SDK でユーザーの新しいクレームが変更されると、次のように ID トークンによってクライアント側の認証済みユーザーに伝播されます。
> カスタム クレームの変更後に、ユーザーがログインまたは再認証する。その結果として発行された ID トークンには最新のクレームが含まれる。
> 古いトークンが期限切れになると、既存のユーザー セッションでその ID トークンが更新される。
> currentUser.getIdToken(true) を呼び出して ID トークンが強制的に更新される。
あー、なるほど、キャッシュされてるのか
UIはさておき、できた
カスタムクレームは追加されるべきだけど、今は上書きになっている、今は一つしかないから良いが二つ目をやる時に直す必要がある


クラウド側にデータを送る
今回全部入れ替え
インデクシングを止めるコードを入れても、バッチインサートごとに1秒待つようにしても The write operation timed out が出てしまう
失敗した時に10秒待ってリトライするコードに変えてみた
ほー、冒頭部で3回こけてるけど後は安定しているな
だとすると毎回sleepする代わりに、こけたときだけ大きめにsleepする今の設計が正しそうだな

iPhoneでひどくなる問題、PCでの再現方法わかった
直した

Vercel環境にデプロイするとこける
環境変数の設定し忘れ
.env.localを変えた時点でVercel側もやっとけばいいのでは?
Firebaseの初期化を通らないパスがあった
ケアレスミス

動いた、めでたしめでたし

"Engineer's way of creating knowledge" the English version of my book is now available on [Engineer's way of creating knowledge]

(C)NISHIO Hirokazu / Converted from [Scrapbox] at [Edit]