QMDによるMarkdownの検索

2026年9月23日

はじめに

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の高精度風上スキームとして何があるか知りたい