喂!我是 Wei

Front-End Engineer

Be a Problem Solver.

⌘K

導覽

所有文章緣起互動小功能

文章分類

目錄
為什麼選 Groq安裝與環境變數封裝 AI 服務在 Discord 指令中接上 /ask 與 /reset成本與穩定性建議實際運作效果首次提問多輪追問重置對話

相關文章

Discord Bot 監控與告警:Bot 掛掉時自動發通知到頻道

2026年5月18日

Discord Bot 排程任務:node-cron 做每日公告與資料重置

2026年3月31日

Discord Bot Autocomplete:Slash Command 即時搜尋實戰

2026年3月30日

最新文章
全部 →
前端 CI/CD 與正式環境除錯:從 Pull Request 到事故排查
2026-06-24
即時資料怎麼選?Polling、SSE、WebSocket 比較
2026-06-23
前端系統設計:如何拆元件、資料流與大型專案架構?
2026-06-22
無障礙不是加 ARIA:語意化 HTML、鍵盤操作與焦點管理
2026-06-21
CSS 與 RWD 面試整理:Flexbox、Grid、定位與層疊脈絡
2026-06-19
← 返回文章列表

Discord Bot 串接 Groq:打造高速 AI 對話助理

2026年4月1日·約 4 分鐘閱讀·
Discord.jsBotGroqAINode.js

你前面已經有互動元件、資料層、部署和排程,現在只差一塊就能變成完整社群助理:AI 對話。

這篇我們用 Groq 做 /ask 和 /reset,把 Bot 升級成可持續追問的助手。


為什麼選 Groq

Groq 對 Node.js 的整合很簡單,速度也很適合聊天型場景。對 Discord 來說,回覆延遲低非常重要,使用者體感會明顯好很多。


安裝與環境變數

npm install groq-sdk
.env
GROQ_API_KEY=你的金鑰
GROQ_MODEL=llama-3.3-70b-versatile

封裝 AI 服務

aiChat.js
import Groq from "groq-sdk";
 
const groq = new Groq({ apiKey: process.env.GROQ_API_KEY });
const MODEL = process.env.GROQ_MODEL || "llama-3.3-70b-versatile";
 
// 每個頻道各自維護上下文
const channelHistory = new Map();
const MAX_MESSAGES = 20;
 
function getSystemPrompt() {
  return "你是 Discord 伺服器的助理。回答要精準、口語、條列清楚,必要時給可執行步驟。";
}
 
export async function askGroq({ channelId, userMessage }) {
  const history = channelHistory.get(channelId) ?? [];
  history.push({ role: "user", content: userMessage });
 
  const response = await groq.chat.completions.create({
    model: MODEL,
    messages: [{ role: "system", content: getSystemPrompt() }, ...history],
    temperature: 0.4,
  });
 
  const reply = response.choices?.[0]?.message?.content?.trim() || "我目前沒有產生回覆,請再試一次。";
  history.push({ role: "assistant", content: reply });
 
  // 只留最近 N 則,避免上下文無限成長
  channelHistory.set(channelId, history.slice(-MAX_MESSAGES));
  return reply;
}
 
export function resetChannelHistory(channelId) {
  channelHistory.delete(channelId);
}

在 Discord 指令中接上 /ask 與 /reset

index.js(節錄)
import { askGroq, resetChannelHistory } from "./aiChat.js";
 
const COMMANDS = [
  {
    name: "ask",
    description: "向 AI 提問",
    options: [
      {
        name: "question",
        description: "你的問題",
        type: 3,
        required: true,
      },
    ],
  },
  {
    name: "reset",
    description: "清除本頻道 AI 對話歷史",
  },
];
 
client.on("interactionCreate", async (interaction) => {
  if (!interaction.isChatInputCommand()) return;
 
  if (interaction.commandName === "ask") {
    const question = interaction.options.getString("question", true);
    await interaction.deferReply();
 
    try {
      const answer = await askGroq({
        channelId: interaction.channelId,
        userMessage: question,
      });
      await interaction.editReply(answer.slice(0, 1900));
    } catch (error) {
      console.error("Groq 呼叫失敗", error);
      await interaction.editReply("AI 服務暫時不可用,請稍後再試。");
    }
    return;
  }
 
  if (interaction.commandName === "reset") {
    resetChannelHistory(interaction.channelId);
    await interaction.reply({ content: "本頻道 AI 對話歷史已清除。", flags: 64 });
  }
});

成本與穩定性建議

  1. 每個頻道限制歷史長度(如 20 則)就很有效。
  2. 問題長度可限制在 500 字,避免惡意灌 token。
  3. 回覆做字數裁切,避免超過 Discord 訊息上限。
  4. 發生 API 錯誤時給固定文案,並記錄 log。

實際運作效果

首次提問

使用者輸入問題後,Bot 先 defer(顯示「思考中」),等 Groq 回傳後再把答案完整送出。

/ask 首次提問,Bot 回覆自我介紹

多輪追問

同一頻道繼續追問,Bot 知道前面提過的話題,回覆有延續性。

同頻道追問,Bot 記住上下文

重置對話

使用 /reset 後收到 ephemeral 確認訊息,只有自己看得到。

/reset 後回覆「對話歷史已清除」

重置後再問同樣的問題,Bot 不再記得之前的內容。

reset 後追問,Bot 不記得前面對話

分享:XLinkedIn
← 上一篇Discord Bot 排程任務:node-cron 做每日公告與資料重置
下一篇 →Discord Bot 監控與告警:Bot 掛掉時自動發通知到頻道