はじめに
Markdownに対する検索コマンド QMD を試してみる。
環境
- Ubuntu 22.04 LTS
- Intel Core i9-14900K、メモリ 32GB
- NVIDIA GeForce RTX 4090 (24GB)
- Pi (pi-sandbox) + LM Studio (Qwen3.8 27B)
セットアップ
$ npm install -g @tobilu/qmd
Markdownの検索
Markdownファイルの準備
ネタとして、自分のOpenFOAM記事を検索対象として用意する。
まず、HTMLをMarkdownに変換する。pandoc 2.9.2.1を使用。
html2md
#!/bin/sh
SOURCE_DIR="ss1.xrea.com"
OUTPUT_DIR="md_output"
# 出力フォルダを作成
mkdir -p "$OUTPUT_DIR"
# ソースフォルダ内のすべてのHTMLファイルを処理
find "$SOURCE_DIR" -name "*.html" -type f | while read file; do
# 相対パスを取得(ソースフォルダからの相対パス)
relative_path="${file#$SOURCE_DIR/}"
# 出力ファイルのパスを生成(.htmlを.mdに変更)
output_file="$OUTPUT_DIR/${relative_path%.html}.md"
echo $relative_path "->" $output_file
# 出力ディレクトリが存在しなければ作成
mkdir -p "$(dirname "$output_file")"
# 変換を実行
encoding=`file -b --mime-encoding $file`
if [ $encoding = "unknown-8bit" ] ; then
iconv -f SJIS -t UTF-8 "$file" | pandoc -f html -t markdown --atx-headers --wrap=none -o "$output_file"
else
pandoc -f html -t markdown --atx-headers --wrap=none "$file" -o "$output_file"
fi
done
# HTMLファイル以外のファイルをコピー(CSSは除外)
find "$SOURCE_DIR" -type f ! -name "*.html" ! -name "*.css" ! -name "*.CSS" | while read file; do
relative_path="${file#$SOURCE_DIR/}"
output_file="$OUTPUT_DIR/$relative_path"
echo "copy $relative_path ->" $output_file
mkdir -p "$(dirname "$output_file")"
cp "$file" "$output_file"
done
md_output/penguinitis.g1.xrea.comとして生成される。
コレクションの準備
QMDのコレクションに追加
$ qmd collection add md_output/penguinitis.g1.xrea.com --name openfoam
Creating collection 'openfoam'...
Collection: /home/penguin/work/qmd/html2md/md_output/penguinitis.g1.xrea.com (**/*.md)
Indexing: 291/291 ETA: 0s
Indexed: 291 new, 0 updated, 0 unchanged, 0 removed
Run 'qmd embed' to update embeddings (291 unique hashes need vectors)
✓ Collection 'openfoam' created successfully
qme collection listでコレクションのリストを見れる。
$ qmd collection list
Collections (1):
openfoam (qmd://openfoam/)
Pattern: **/*.md
Files: 291
Updated: 57m ago
qmd collection showでコレクションの情報を確認できる。
$ qmd collection show openfoam
Collection: openfoam
Path: /home/penguin/work/qmd/html2md/md_output/penguinitis.g1.xrea.com
Pattern: **/*.md
Include: yes (default)
Contexts: 1
qmd lsでリストを確認できる。
$ qmd ls openfoam
3.5 KB Sep 22 11:47 qmd://openfoam/study/OpenFOAM/6dof/6dof.md
7.3 KB Sep 22 11:47 qmd://openfoam/study/OpenFOAM/Blender/Blender.md
11.2 KB Sep 22 11:47 qmd://openfoam/study/OpenFOAM/CHT/CHT-2_3_1.md
11.4 KB Sep 22 11:47 qmd://openfoam/study/OpenFOAM/CHT/CHT.md
2.7 KB Sep 22 11:47 qmd://openfoam/study/OpenFOAM/CNC/CNC.md
コンテキストの追加
$ qmd context add qmd://openfoam "OpenFOAM Information"
✓ Added context for: qmd://openfoam/ (collection root)
Context: OpenFOAM Information
qmd context listでコンテキストのリストを見れる。
$ qmd context list
Configured Contexts
openfoam
/ (root)
OpenFOAM Information
検索
セマンティック検索のための埋め込み。GPUを使うようである。
$ qmd embed
Model: embeddinggemma-300M-Q8_0.gguf
...
✓ Done! Embedded 1087 chunks from 291 documents in 8s
qmd searchでキーワード検索。高速。
$ qmd search "乱流モデル"
qmd://openfoam/study/OpenFOAM/turbulence_model_settings.md:1 #8cd019
Title: 乱流モデルの設定
Context: OpenFOAM Information
Score: 86%
@@ -1,3 @@ (0 before, 330 after)
# 乱流モデルの設定
2020年12月29日
...
$ qmd search "離散化スキーム"
qmd://openfoam/study/OpenFOAM/scheme_settings.md:1 #934218
Title: 離散化スキームの設定
Context: OpenFOAM Information
Score: 86%
@@ -1,3 @@ (0 before, 279 after)
# 離散化スキームの設定
2021年1月23日
qmd vsearchでセマンティック検索(ベクトル検索)。少し時間がかかる。
$ qmd vsearch "逆流を許す出口境界条件"
├─ 逆流を許す出口境界条件
├─ vec: 逆流を許す出口境界条件详解
├─ vec: 如何理解逆流出口边界条件
└─ hyde: The topic of 逆流を許す出口境界条件 covers 逆流を許す出口境界条件详解. Proper implementation ...
Searching 4 vector queries...
qmd://openfoam/study/OpenFOAM/patch_types_list.md #91a31a
Title: 境界条件タイプリスト
Context: OpenFOAM Information
Score: 48%
@@ -1,3 @@ (0 before, 5809 after)
# 境界条件タイプリスト
2016年12月10日
qmd queryでハイブリッド検索。かなり時間がかかる。
$ qmd query "逆流を許す出口境界条件"
Expanding query... (0ms)
├─ 逆流を許す出口境界条件
├─ lex: 逆流を許す出口境界条件详解
├─ lex: 如何理解逆
├─ vec: 逆流を許す出口境界条件详解
├─ vec: 如何理解逆流出口边界条件
└─ hyde: The topic of 逆流を許す出口境界条件 covers 逆流を許す出口境界条件详解. Proper implementation ...
Searching 6 queries...
Embedding 4 queries... (1.9s)
Reranking 25 chunks... (60.9s)
qmd://openfoam/study/OpenFOAM/patch_types_list.md #91a31a
Title: 境界条件タイプリスト
Context: OpenFOAM Information
Score: 92%
@@ -1,3 @@ (0 before, 5809 after)
# 境界条件タイプリスト
2016年12月10日
qmd getで文書の取得。内容が標準出力に出てくる。
$ qmd get "openfoam/study/OpenFOAM/turbulence_model_settings.md"
qmd://openfoam/study/OpenFOAM/turbulence_model_settings.md #8cd019
Folder Context: OpenFOAM Information
---
1: # 乱流モデルの設定
2:
3: 2020年12月29日
4:
5: ## はじめに
6:
7: 乱流モデルの設定について。
検索ツールの作成
AIエージェントハーネスで使えるように、スキルを作る。ここではPiを使う。
$ mkdir -p .pi/skills/openfoam-info
qmd searchで--jsonを指定するとJSON形式で出力できるので、これをうまく使う。
SKILL.md
---
name: openfoam-info
description: OpenFOAMについての情報を取得する。
---
`qmd`のコレクション`openfoam`から情報を取得する。
```bash
$ qmd search "検索語" -c openfoam --json
```
JSON配列が返ってくるので、最初の3つのオブジェクトの"file"フィールドを取得する。
それぞれのファイルの内容を以下のように取得する。内容は標準入力として得られる。
```bash
$ qmd get "openfoam/.../sample.md"
```
得られた内容から概要を生成する。
Piを実行。サンドボックス環境ではqmdを実行できないので、サンドボックスを無効にする。
>/sandbox-disable
質問(スキルは指定しなくて大丈夫のはず)
>OpenFOAMの高精度風上スキームとして何があるか知りたい

|