LLMに好きにWikiを書いてもらう遊び
from 2025/02/23
inajob.icon
LLMに好きにWikiを書いてもらう遊び
井戸端でそういうWebサービスを作ってるのを見たな
DynaWikiだはるひ.icon
人力検索井戸端だ、ありがとうございますinajob.icon
ちょっとプロンプトを工夫して関連ページを作ってもらう
動作例
りんごが好き
果物は健康に良い
食物繊維は腸内環境を改善する
旬の食材は栄養価が高い
地産地消は環境に優しい
発酵食品は腸内細菌を活性化する
Geminiを使って動かす
無料分でも連続実行しなければ問題ない
Fractal Reader を見ていたら、LLMにwikiを作らせたいなと思ってきた
似た話してる?inajob.icon
MIT Lisence
code: main.py
import os
from dotenv import load_dotenv
import google.generativeai as genai
import json
import re
def extract_json(s):
p = r'json\n(.*)\n'
m = re.findall(p, s, re.DOTALL)
return m
load_dotenv()
GOOGLE_API_KEY=os.getenv('GOOGLE_API_KEY')
genai.configure(api_key=GOOGLE_API_KEY)
model = genai.GenerativeModel("gemini-2.0-flash-exp")
prompt = """あなたにKVS上にナレッジベースを構築してもらいます
このナレッジベースは単なる単語ではなく、短い文をtitleとしており、関連する概念を[]で囲うWikiのような仕組みです
bodyは改行を含めることができ、箇条書きにより内容を構成します。箇条書きはどんどんネストてください。
回答には以下の2種類のJSONのどちらかを使ってください
system_messageは空文字でも良いです
{method: "put", title: "", body: "", system_message: ""}
{method: "get", title: "", system_message: ""}
まず「りんごが好き」の項目を作ってください
"""
prompt2 = """次に関連ページを作ります。関連する適当な概念を考えて追加してください。
titleは単語ではなく主張や概念を示す短い文が望ましいです
"""
chat = model.start_chat(history=[])
response = chat.send_message(prompt)
print(response.text)
jsons = extract_json(response.text)
for j in jsons:
o = json.loads(j)
print("#" + o"title")
print(o"body")
print()
for x in range(5):
response = chat.send_message(prompt2)
#print(response.text)
jsons = extract_json(response.text)
for j in jsons:
o = json.loads(j)
print("# " + o"title")
print(o"body")
print()
code:「皿うどんが好き」から始める
#皿うどんが好き
私は皿うどんが大好きです。
* 皿うどんの魅力
* パリパリの揚げ麺とあんかけの組み合わせが最高
* あんかけには豚肉、エビ、イカ、キャベツ、ネギ、キクラゲなど、たくさんの具材が入っていて美味しい
* ソースをかけると味が変わって二度美味しい
* ウスターソースがおすすめ
* 皿うどんの種類
* 細麺の揚げ麺を使ったもの
* 太麺の揚げ麺を使ったもの
* 焼きそばのように麺を炒めたもの
# 長崎名物には美味しいものが多い
長崎には皿うどん以外にも美味しいものがたくさんあります。
* 長崎名物
* ちゃんぽん
* 豚骨スープと太麺が特徴
* 皿うどんと同じようにあんかけ風のものもある
* カステラ
* 卵をたっぷり使ったスポンジケーキ
* 抹茶味やチョコレート味など、色々な種類がある
* トルコライス
* ピラフ、ナポリタン、トンカツがワンプレートになった大人のお子様ランチ
* お店によって内容が異なるのが面白い
* 佐世保バーガー
* 佐世保で作られている手作りハンバーガー
* ベーコン、レタス、トマト、チーズなど、具材が盛りだくさん
# 揚げ麺は様々な料理に応用できる
揚げ麺は、皿うどん以外にも様々な料理に使えます。
* 揚げ麺を使った料理
* バリそば
* 揚げ麺にあんかけをかけたもの。皿うどんに似ている
* 地域によってはソースをかけて食べる
* 揚げパスタ
* パスタを揚げて塩や砂糖をまぶしたもの。
* おつまみやおやつにぴったり
* サラダ
* サラダに揚げ麺をトッピングすると、食感のアクセントになる
* ドレッシングとの相性も抜群
* ラーメン
* ラーメンのトッピングに揚げ麺を使うと、スープを吸って美味しくなる
* インスタントラーメンに揚げ麺を加えても良い
# あんかけは汎用性が高く色々な麺料理に合う
あんかけは、皿うどんだけでなく色々な麺料理に合います。
* あんかけを使った麺料理
* 中華丼
* ご飯の上にあんかけをかけたもの。麺ではないが、中華料理のあんかけという点で共通する
* 八宝菜に近い
* 五目あんかけ焼きそば
* 焼きそばの上にあんかけをかけたもの。皿うどんと似ている
* 麺を揚げ麺にするか焼き麺にするかで食感が変わる
* 天津麺
* ラーメンの上にかに玉風の卵とあんかけをかけたもの
* 醤油ベースのあんかけが多い
* 酸辣湯麺
* 酸味と辛味のあるあんかけをかけたラーメン
* ラー油や酢で味を調整する
# ソースは料理の味を変化させる魔法
ソースは、皿うどんだけでなく様々な料理の味を変えることができます。
* ソースの種類
* ウスターソース
* 野菜や果物を煮詰めたソース。とんかつやコロッケによく合う。
* 皿うどんにかけると、味が締まって美味しい。
* 中濃ソース
* ウスターソースよりもとろみがあるソース。
* お好み焼きや焼きそばによく合う。
* とんかつソース
* 野菜や果物を煮詰めた甘めのソース。とんかつ専用。
* マスタードを添えても美味しい。
* デミグラスソース
* 牛肉と香味野菜を煮込んだフランス料理のソース。
* ハンバーグやオムライスによく合う。
* ホワイトソース
* バターと小麦粉を炒めて牛乳を加えて作るソース。
* グラタンやドリアによく合う。
# 豚肉は様々な料理で活躍する万能食材
豚肉は、皿うどんの具材としてだけでなく、様々な料理で活躍します。
* 豚肉を使った料理
* 生姜焼き
* 豚肉を生姜風味のタレで炒めた定番料理。
* ご飯との相性抜群。
* 豚の角煮
* 豚バラ肉を甘辛く煮込んだ和食。
* とろけるような食感が特徴。
* 回鍋肉
* 豚バラ肉とキャベツを甜麺醤で炒めた中華料理。
* ご飯が進む味。
* サムギョプサル
* 豚バラ肉を焼いて、サンチュやキムチと一緒に食べる韓国料理。
* ヘルシーで美味しい。
* ポークソテー
* 豚肉をシンプルに焼いた洋食。
* 塩胡椒でシンプルに味付けしても、ソースをかけても美味しい。
面白そうだ! cloudeアプリのmcpに、Obsidian連携のものがあるから、Obsidianをwikiに見立てて、claudeアプリから書いてもらうのもありだな〜と思ったtaktamur.icon
手元でsqliteにデータを入れるようにしてどんどん回している。勝手にページが作られて一人で井戸端をやっているみたいで面白いinajob.icon
遊んでて思ったこと
誰が作っても同じような内容のページがたくさん作られても嬉しくない
単語ではなく概念や主張を表す短文をタイトルにするのは良い
LLMに既存ページ一覧を伝えないとブラケティングするのが難しい
ベクトル検索で関連ページを探すならブラケティングはそこまで重要ではない
LLMが作ったページ名が自分の言葉ではないので、どこに何が書いてあるかわからない
本当か?
井戸端で他人が作ったページでも同じな気がする
ページを探すのはベクトル検索にまかせるなら人間がタイトルで探す必要はない
フロー型のコンテンツをストック型のコンテンツに変換するときに、こういうやり方が使えそう
LLMにページを作らせることの意義
LLMに聞くのと何が違う?
チャット形式ではなく、Wiki形式で出力してもらう体験の良さ
DynaWikiで感じた
LLMの外にある知識を貯めておくときに、この形式だと人間が理解しやすそう
簡易Wikiビューアが欲しい
人間がどう介入するか?
人間は直接ページの内容を編集できず、編集方針を示すことしかできないというのはどうか?
初期ページの作成
ページ名の例を示すと、LLMが連想してどんどんページを作っていく
ページ名に思想をこめることで生成するコンテンツに個性を持たせることができる
既存のページへのリンクを作るのは難しそう
既存ページへの追記
ベクトル検索などで関連ページを限定できれば他のページを加味した編集ができる
複数ページのマージ
関連ページを取得して候補にする
人間がページを指定する
複数ページから連想するページの作成
関連ページを取得して候補にする
人間がページを指定する
既存ページからの切り出し
作ってて思ったこと
LLMの出力をどうやってプログラムで受け取るのかとか初歩的なところを理解できた
JSONのフォーマットを示す
出力にあるコードブロックを取り出す
今回は正規表現で取り出した
Gemini、無料で普通に使えて良い
userscriptにしてみたいtakker.icon