Cosense上のメモに適度に批判してくれるbot
#UserScript
#作った
https://gyazo.com/7ee82a51c4723c605ba908722079cd98
何も考えずに吐き出している部分も多いので、
一言「コレってどういう意味?」とツッコまれるだけで、
あ、考え甘かったです...というのに気付ける
考えが先に進む
読む本を減らすにも使えそう
Gyaimみたいに(?)、食わせた本を根拠に指摘してくれる
普通にfinetuningか
この辺を使ってる
UserScript Page Edit API
UserScriptからOpenAI APIを呼ぶ
Structured Outputs
code:script.js
// @ts-check
cosense.PageMenu.addMenu({
title: "ask",
image: "https://gyazo.com/cda5cc71ecf260c8e200ef14c1660e8f/raw",
onClick: main,
});
async function main() {
const lines = cosense.Page.lines.map((l, i) => ({ text: l.text, index: i }));
const answer = await askChatGPT(lines);
insertAnswers(lines, answer);
}
function insertAnswers(lines, answers) {
answers.reduce((offset, ans) => {
const originalLine = lines.find(l => l.index === ans.index);
if (!originalLine) return offset;
const indent = createIndent(countIndent(originalLine.text) + 1);
cosense.Page.insertLine(indent + ans.text, ans.index + 1 + offset);
return offset + 1;
}, 0);
}
function countIndent(text) {
const match = text.match(/^(\s*)/);
return match ? match1.length : 0;
}
function createIndent(count) {
return ' '.repeat(count);
}
async function askChatGPT(lines) {
const systemPrompt = `
以下の制約と要件を守って、ユーザーの指示に応えてください。
## 出力について
- 出力はJSONの配列
- 各要素は { "index": number, "text": string } の形とする
- "index"はコメントを追加したい元の行のindex番号(0はタイトル行、1以降は本文)
- "text"は改行なしの1行文章で、末尾に"gpt-4.icon"をつける
- 末尾に"gpt-4.icon"が付いている行は既にあなたが回答している部分なので無視して良い
- 会話の流れを作る場合は、元の行の直下にコメントを追加する
- 必要がない行には返答をしなくてもよい(その場合は配列要素を作らない)
- 思考を深めることが目的なので。
- 一度に回答するのはたかだか3個程度にしてください
- 一度に色々言われても鬱陶しいので
`;
const userPrompt = `
## 目的
- 私はCosenseに思考のメモを残している。
- その思考を更に深めるための質問や批判してほしい
- また私が詰まっている部分があれば補うコメントをしてほしい
- 例えば、「〇〇ってなんだろう?」に対して「〇〇とはこういうものです」という解説など
## 返答について
- 共感は不要
- コメントは適度に短い文にする
- ユーザーが特定の指示を与えている場合("to gpt-4" や "mrsekut.icon" が含まれる行)、その行を重点的に処理する
- 追加の指示が明確に書かれている場合、それに従う
- 例えば、「〇〇について知りたいmrsekut.icon」と書いている場合、それについて回答してほしい
- 1行単位のコメントが求められている場合は簡潔に、10行程度のまとまった指摘が必要な場合はそれに従う
以下にCosenseの各行を示します(indexとtext)。
Lines:
${JSON.stringify(lines, null, 2)}
`;
const result = await openAI(userPrompt, systemPrompt);
return result.sort((a, b) => a.index - b.index);
}
async function openAI(prompt, systemPrompt) {
const apiKey = localStorage.getItem("OPENAI_API_KEY");
if (!apiKey) {
throw new Error("OpenAI APIキーが設定されていません。");
}
const requestBody = {
model: "gpt-4o-mini",
messages: [
{ role: "system", content: systemPrompt },
{ role: "user", content: prompt },
],
temperature: 0.7,
max_tokens: 1000,
response_format: {
type: "json_schema",
json_schema: {
name: "CosenseAnswer",
strict: true,
schema: {
type: "object",
properties: {
lines: {
type: "array",
items: {
type: "object",
properties: {
index: { type: "number" },
text: { type: "string" }
},
required: "index", "text",
additionalProperties: false
}
}
},
required: "lines",
additionalProperties: false
}
}
},
};
const response = await fetch("https://api.openai.com/v1/chat/completions", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: Bearer ${apiKey},
},
body: JSON.stringify(requestBody),
});
const json = await response.json();
const content = json.choices?.0?.message?.content ?? "{}";
try {
const parsed = JSON.parse(content);
return parsed.lines ?? [];
} catch (e) {
throw new Error("JSON parse error: " + e);
}
}
promptが雑魚くてあまり有用性がない
promptを改善しよう
共感してこないでほしいmrsekut.icon
共感するコメントはAIに一切求めてない
↑まずpropmptを更新するために、コンパイルしないといけないのが面倒すぎるのでどうにかしたい
複数体の人格をもたせるのも面白いかも
テックが強い上司、ビズが強い上司、素直で可愛い深堀り後輩くん、
AI同士で会話させて、眺めても良い
なんというか、多様性が欲しい
複数人での読書会の良さって、詳しい人が解説してくれることとかではなく、
それぞれのコンテキストを持つ多様な参加者の純粋な疑問、体験と関連させた気付き、みたいなところ
それを一体のAIで再現させるのは難しいかも(AIが変な忖度をするので)
「10個の側面から考えてみました」とか言われても人間味がなさすぎておもろくない
揺らぎ
行に対する重み付けがあるといい?
ページ全体に対するコメントが欲しいときと、会話をしたいときとある
会話をする場合は、下に下に追加してほしい
カーソルの位置を与えるとか、to gpt-4のようなキーワードを自分で書くとか、[mrsekut.icon]があるところを重点的に見れるようにするとか
適宜プロンプトを与えられると良い
1行で突っ込んでほしいこともあれば、10行程度でまとめてほしいこともある
追加の指示ができるといい
なんか記法を導入してUserScriptに含めても良いし、
普通に、Cosenseのテキスト上で指示しても良い
こっちのほうが自然
promptのcacheみたいなやつ調べよう
毎回同じprompt投げるのが無駄?
Prompt Caching
何も有益でないツッコミはしないでほしい
数より質