옵시디언과 함께하는 브레인스토밍 : Templater 플러그인을 이용한 연구보조도구

소개

저는 일을 시작하기 전에, 주제선정 및 방향설정을 하기위해서 핵심단어를 나열하곤 합니다. 처음엔 5개 미만의 키워드로 시작할때도 많지만, 검색하고 읽고 생각을 다잡아 가면서 수십 수백개의 키워드가 되곤합니다.
생각의 가지를 뻗고, 가지를 치는 일에 옵시디언의 도움을 받아보았습니다.

처음엔 Smart composer를 통해서 진행하였으나, 길고 상세한 답변을 원해서 Gemini-2.0-flash-thinking 모델을 Templater를 통해 반복질문과 내용정리를 시키고, 노트를 만들었습니다. 이후 Graph view와 Smart composer를 이용하여 내용을 확인하였습니다.

진행 방법

처음엔 Smart composer(Gemini-2.0-flash-thinking)을 통해서 검색을 진행하였습니다.
빠르긴 했으나, 빠른 만큼 짧은 답(1000~3000자 내외)만 제공해 주었습니다. 계속해서 자세하게 말해달라고 반복한 다음에 내용을 정리해달라고 하여, 내용을 풍성하게 만드는 방법이 있었습니다.

텍스트가 많은 웹 페이지의 스크린 샷

반복하여 추가 정보를 요청하는 행위가 비효율적으로 생각되어, Claude의 도움을 받아서 Templater의 template을 만들었습니다.
상세내용은 (1) 사용자로부터 키워드를 받고, (2)gemini-2.0-flash-thinking모델을 사용해서 해당 질문을 총 4번 질문(최초질문+추가질문3번)을 합니다. 이후 (3)내용을 최종적으로 정리하고, (4)관련 키워드를 정리해서 프로퍼티에 태그로 정리하고 (5)해당 질문의 이름으로 노트파일을 생성합니다.
코드와 결과는 아래와 같습니다. 기존에 비해서 상세한 정보(7000~15000자)를 한번에 제공해줍니다.
장점은 한번만 입력하면 충실한 내용이 들어온다는 것이고, 단점은 너무 느립니다.
최적화 하는 방법을 몰라서 그냥 한번에 여러 검색어를 걸어두고, 다른일을 하였습니다.

 <%*
const API_KEY = "!!!!!!ENTER_YOUR_GEMINI_API_KEY!!!!!";
const MODEL = "gemini-2.0-flash-thinking-exp-01-21"
 //gemini-1.5-pro-latest
 //gemini-1.5-flash-latest
 //gemini-1.5-flash-8b-latest
 //gemini-exp-1114
 //gemini-exp-1121
 //gemini-exp-1206
 //gemini-2.0-flash-exp
 //learnlm-1.5-pro-experimental
 //gemini-2.0-flash-thinking-exp-1219
 //gemini-2.0-flash-thinking-exp-01-21
 ;
 const k = 3;

 const log = (message) => console.log(message);
 log("🚀 Gemini API 요청을 시작합니다...");

 const userQuestion = await tp.system.prompt("질문을 입력하세요");
 const question = `${userQuestion}에 대해서 자세히 설명해주세요`;
 log(`📝 입력된 질문: ${userQuestion}`);

 async function askGemini(prompt) {
    const url = `https://generativelanguage.googleapis.com/v1beta/models/${MODEL}:generateContent?key=${API_KEY}`;
    const response = await fetch(url, {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({
            contents: [{ parts: [{ text: prompt }] }]
        })
    });
    const data = await response.json();
    return data.candidates?.[0]?.content?.parts?.[0]?.text || "응답 없음";
 }

 log("🤔 첫 번째 답변을 요청합니다...");
 const initialResponse = await askGemini(question);
 log("✅ 첫 번째 답변 완료");

 let explanations = [];
 for (let i = 0; i < k; i++) {
    log(`🔄 추가 설명 ${i + 1}/${k}를 요청합니다...`);
    const followUpResponse = await askGemini(`더 자세히 설명해주세요: ${initialResponse}`);
    explanations.push(followUpResponse);
    log(`✅ 추가 설명 ${i + 1} 완료`);
 }

 log("📊 최종 정리를 요청합니다...");
 const finalPrompt = `질문: ${question}\n\n초기 답변: ${initialResponse}\n\n추가 설명:\n${explanations.join("\n\n")}\n\n이 모든 내용을 심층해설의 형태로 흐름을 다듬고 내용을 상세하게 정리해주세요.`;
 const finalResponse = await askGemini(finalPrompt);

 log("🔑 키워드를 추출합니다...");
 const keywordPrompt = `다음 내용에서 가장 중요한 키워드 20개를 겹치지 않게 뽑고, 쉼표로 구분된 리스트로 작성해주세요. 키워드 사이에 띄어쓰기가 있는 경우 한단어로 붙여주세요.:\n\n${finalResponse}`;
 const keywords = await askGemini(keywordPrompt);
 const keywordList = keywords.replace(/\n/g, '').split(',').map(k => k.trim());

 log("📌 properties를 설정합니다...");
 await tp.file.rename(userQuestion);

 // Frontmatter 생성
 let frontmatter = "---\ntags:\n";
 keywordList.forEach(keyword => {
    frontmatter += `- ${keyword}\n`;
 });
 frontmatter += "---\n\n";

 tR += frontmatter + finalResponse;
 -%>
흰색 배경과 검은 색 텍스트가있는 문서

콘솔에 로그도 잘 출력됩니다.

전화 화면의 한국어 목록

몇개의 키워드를 넣어봤는데, 자동화된 태그를 사용해서 나름 제가 생각하는 위치로 잘 그룹핑 됩니다.

녹색 점의 네트워크 이미지

이중 학습과 감정이라는 두가지 태그를 smart composer로 정리를 부탁합니다.

점과 점의 네트워크 이미지
점과 선 네트워크의 이미지

꽤나 맘에 드는 결과물이 나왔습니다.

컴퓨터 화면의 스크린 샷


결과와 배운 점

키워드를 기반으로 Gemini에게 질문을 하고, 내용과 태그를 정리하여 노트를 만들고, 새로운 키워드를 찾아가는 브레인스토밍을 진행해보았습니다.
기능의 POC를 확인하기 위해서, 이번엔 제가 알고있는 내용을 토대로 키워드를 넣고 노트와 맵을 만들었고, 그 결과 충분히 신뢰성있는 내용과 맵이 그려지는것을 확인하였습니다.

추후 추가하고 싶은 내용은, (1) 이태극 선생님께서 단톡방에 공유해주신 것처럼 태그의 형식을 한글 및 영어 병기를 통해서 명확하게 하는 것과 (2) 노트에 입력된 중복 태그들을 정리하는 것, (3) 그리고 태그를 중심으로 추가적으로 검색후 노트를 추가하는 것입니다.

본 시스템을 토대로, 잘 모르는 분야에 대해서도 비교적 쉽게 브레인스토밍과 아이디에이션 진행가능할것 같습니다.

도움 받은 글 (옵션)

더킹오브옵시디언의 월간 옵시디언 특강👑
이태극선생님의 꿀팁
14기 옵시디언 스터디원분들의 다양한 사례

8

👉 이 게시글도 읽어보세요