AI跟AI能彼此聊天嗎 ? 使用 Gemini AI 打造雙 AI 對話模擬器

更新於 發佈於 閱讀時間約 23 分鐘
使用 Vue3 + Gemini AI 打造雙 AI 對話模擬器

使用 Vue3 + Gemini AI 打造雙 AI 對話模擬器

身為一個內向的宅宅,我想大家應該都懂比起跟人聊天,我們更喜歡看人們聊天。

所以我常在想有沒有辦法讓AI們自己玩,會不會出現什麼意想不到的對話!

於是~我就做了這個 雙 AI 對話模擬器

這是什麼?

這個專案基於 Vue3、 VitedaisyUI,並使用 Google Gemini AI API,讓 AI 角色能夠彼此交流。你可以設定兩個 AI 的名字和個性描述,然後它們就會開始一場酣暢淋漓的交流。

有趣的功能

💬 雙 AI 對話: 讓兩個 AI 角色自行對話,展現 AI 的對話能力。

🎭 角色設定:使用者可以自定義 AI 角色的名稱和描述。

🎲 隨機生成角色:沒有靈感?沒關係,也可以隨機產生角色設定!

🤖 Gemini AI API:使用 Google Gemini AI API 進行對話生成。

讓我們開始吧~

1.取得 Google Gemini API 金鑰

Google AI Studio 註冊並取得 API 金鑰。

2.初始化專案

    • 使用 Vite 建立 Vue3 專案:
npm create vite@latest my-gemini-ai-project --template vue
cd my-gemini-ai-project
npm install
    • 安裝 Google Generative AI API
npm install @google/generative-ai


3.建立 AI 角色設定介面 (AIAgentConfig.vue)

建立 src/components/AIAgentConfig.vue,讓使用者可以設定兩個 AI 角色的名稱和描述,使用 v-model 實現雙向綁定。

<script setup>
import { ref } from "vue";
import { generateRandomName, generateRandomDescription } from "../utils/random";

const agent1 = ref({ name: "", description: "" });
const agent2 = ref({ name: "", description: "" });
const emit = defineEmits(["start-conversation"]);

const startConversation = () => {
if (
agent1.value.name === "" ||
agent1.value.description === "" ||
agent2.value.name === "" ||
agent2.value.description === ""
)
return;
emit("start-conversation", { agent1: agent1.value, agent2: agent2.value });
};

const generateRandomAgents = async () => {
agent1.value.name = await generateRandomName();
agent1.value.description = await generateRandomDescription();
agent2.value.name = await generateRandomName();
agent2.value.description = await generateRandomDescription();
};
</script>

<template>
<div class="flex flex-col items-center">
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 w-4/5">
<div className="flex flex-col gap-4">
<h2 className="text-5xl font-bold">AI角色 1</h2>
<label className="form-control w-full">
<div className="label">
<span className="label-text">名稱</span>
</div>
<input
type="text"
className="input input-bordered w-full"
id="agent1Name"
v-model="agent1.name"
/>
</label>
<label className="form-control">
<div className="label">
<span className="label-text">描述</span>
</div>
<textarea
className="textarea textarea-bordered h-24"
id="agent1Description"
v-model="agent1.description"
></textarea>
</label>
</div>
<div className="flex flex-col gap-4">
<h2 className="text-5xl font-bold">AI角色 2</h2>
<label className="form-control w-full">
<div className="label">
<span className="label-text">名稱</span>
</div>
<input
type="text"
className="input input-bordered w-full"
id="agent2Name"
v-model="agent2.name"
/>
</label>
<label className="form-control">
<div className="label">
<span className="label-text">描述</span>
</div>
<textarea
className="textarea textarea-bordered h-24"
id="agent2Description"
v-model="agent2.description"
></textarea>
</label>
</div>
</div>
<div class="flex gap-2 mt-5">
<button @click="generateRandomAgents" class="btn btn-accent btn-wide">
隨機生成
</button>
<button @click="startConversation" class="btn btn-info btn-wide">
開始對話
</button>
</div>
</div>
</template>

<style scoped></style>


4.建立隨機生成角色工具 (random.js)

在 src/utils/random.js 中,使用 Gemini API 來產生隨機的角色名稱和描述:

import { generateContent } from "./gemini";

export const generateRandomName = async () => {
const prompt = "請隨機生成一個現實生活中會出現的角色的名稱";
try {
const response = await generateContent(prompt);
return response.trim().replace(/"/g, '');
} catch (error) {
console.error("Error generating random name:", error);
return "Error Name"
}
};

export const generateRandomDescription = async () => {
const prompt = "請隨機生成一個現實生活中會出現的角色的描述,長度約 20 字左右";
try {
const response = await generateContent(prompt);
return response.trim().replace(/"/g, '');
} catch (error) {
console.error("Error generating random description:", error);
return "Error Description"
}
};


5.設定 Google Gemini API (gemini.js)

在 src/utils/gemini.js 中,設定 API 金鑰、安全設定,並封裝呼叫 Gemini API 的邏輯:

import {
GoogleGenerativeAI,
HarmBlockThreshold,
HarmCategory,
} from "@google/generative-ai";

const genAI = new GoogleGenerativeAI(import.meta.env.VITE_GEMINI_API_KEY);

// 設定安全設定,這裡只是範例,請根據你的需求調整
const safetySettings = [
{
category: HarmCategory.HARM_CATEGORY_HATE_SPEECH,
threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH, // 只封鎖高風險仇恨言論
},
{
category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH, // 只封鎖高風險色情內容
},
{
category: HarmCategory.HARM_CATEGORY_HARASSMENT,
threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH, // 只封鎖高風險騷擾
},
{
category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_HIGH, // 封鎖中高風險危險內容
},
];

const model = genAI.getGenerativeModel({
model: "gemini-pro",
safetySettings,
});

export async function generateContent(prompt) {
try {
const result = await model.generateContent(prompt);
const response = await result.response;
const text = response.text();
return text;
} catch (error) {
console.error("Error in generateContent:", error);
throw new Error(`Gemini API Error: ${error.message}`);
}
}

記得在 .env 或 .env.local 檔案中設定你取得的 Google Gemini API 金鑰:

VITE_GEMINI_API_KEY=YOUR_GEMINI_API_KEY


6.建立對話介面和邏輯 (App.vue)

我們修改 src/App.vue,引入 AIAgentConfig 元件,並實作對話邏輯:

<script setup>
import { ref } from "vue";
import AIAgentConfig from "./components/AIAgentConfig.vue";
import { generateContent } from "./utils/gemini";
import { twMerge } from "tailwind-merge";

const conversation = ref([]);
const isConversationRunning = ref(false);
const agents = ref({});
const context = ref("他們正在聊天");

const handleStartConversation = async (agentsData) => {
console.log("agents", agentsData);
agents.value = agentsData;
conversation.value = [];
isConversationRunning.value = true;
let currentSpeaker = "agent1";
const { agent1, agent2 } = agentsData;
try {
while (isConversationRunning.value) {
const prompt = `
${agent1.name}的描述:${agent1.description}
${agent2.name}的描述:${agent2.description}
${currentSpeaker === 'agent1' ? agent1.name : agent2.name}現在要說話, 請回傳下一句話, 請注意回傳的格式為 "回覆內容"
請不要有其他多餘的文字
目前對話內容:
${conversation.value.map(msg => `${msg.sender}:${msg.text}`).join('\n')}
`;
const response = await generateContent(prompt);
conversation.value.push({
sender: currentSpeaker === "agent1" ? agent1.name : agent2.name,
text: response,
});
currentSpeaker = currentSpeaker === "agent1" ? "agent2" : "agent1";
}
} catch (error) {
console.error("Error generating conversation:", error);
}
};

// 停止對話
const stopConversation = () => {
isConversationRunning.value = false;
};
</script>

<template>
<div class="container mx-auto p-4">
<AIAgentConfig @start-conversation="handleStartConversation" />
<div class="mt-4 w-4/5 mx-auto">
<div v-if="conversation.length > 0">
<div
v-for="(message, index) in conversation"
:key="index"
:class="twMerge('chat', index % 2 === 0 ? 'chat-start' : 'chat-end')"
>
<div className="chat-header">
{{ message.sender }}
</div>
<div className="chat-bubble">
{{ message.text }}
</div>
</div>
</div>
<div v-if="isConversationRunning">
<span className="loading loading-spinner loading-lg block"></span>
<button @click="stopConversation" class="btn btn-error mt-4 mx-auto">
停止對話
</button>
</div>
</div>
</div>
</template>

<style scoped></style>


過程中遇到的一些事...

在過程中,我遇到的一些狀況,來分享一下:

  • Prompt 工程:

要讓 AI 產生更自然、生動的對話,就需要設計有效的 prompt。我嘗試了不同的 prompt 結構,有結構化、情境提示、也有平舖直述式的 prompt,不過有時候對話還是會出現怪怪的現象。

  • 安全過濾:

Gemini API 為了避免產生不當內容,有安全過濾機制,但是身為人類就是想看不正經的對話,所以我去設定安全過濾的門檻,但發現官方文件上說不能設置BLOCK_NONE(也就是完全不封鎖、不過濾),所以最後只能選擇BLOCK_ONLY_HIGH

以下是一些可用的 HarmCategory

      • HarmCategory.HARM_CATEGORY_HATE_SPEECH: 仇恨言論
      • HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT: 色情內容
      • HarmCategory.HARM_CATEGORY_HARASSMENT: 騷擾
      • HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT: 危險內容


每個 HarmCategory 可設定以下的 SafetySetting

      • BLOCK_NONE: 完全不封鎖
      • BLOCK_ONLY_HIGH: 只封鎖高風險內容
      • BLOCK_MEDIUM_AND_HIGH: 封鎖中高風險內容
      • BLOCK_LOW_AND_ABOVE: 封鎖低、中高風險內容



總結

好了,現在我們有了一個雙 AI 對話模擬器。現在就試試這個 Gemini AI 雙 AI 對話模擬器,看看兩個 AI 會聊出什麼神奇的內容吧!如果有生成甚麼有趣的對話也可以在留言區跟我分享喔~ ( 我超想看的

Gemini AI 打造雙 AI 對話模擬器

Gemini AI 打造雙 AI 對話模擬器


專案程式碼連結

https://github.com/koko1108/gemini-chat

留言
avatar-img
留言分享你的想法!
有趣
avatar-img
koko的沙龍
1會員
34內容數
koko的沙龍的其他內容
2025/04/30
React 事件處理:讓網頁動起來~ 網頁的互動性是吸引使用者、提供良好體驗的關鍵。 在 React 中,透過監聽使用者的操作(例如點擊、滑鼠移動、鍵盤輸入),並執行相應的程式碼,來實現豐富的互動效果。
Thumbnail
2025/04/30
React 事件處理:讓網頁動起來~ 網頁的互動性是吸引使用者、提供良好體驗的關鍵。 在 React 中,透過監聽使用者的操作(例如點擊、滑鼠移動、鍵盤輸入),並執行相應的程式碼,來實現豐富的互動效果。
Thumbnail
2025/04/28
在 React 的世界裡,Props 負責從父元件向子元件傳遞資料,而 State 則是負責管理元件自身的內部資料。 State 就像元件的記憶,可以儲存元件的狀態,並根據狀態的變化來更新 UI。
Thumbnail
2025/04/28
在 React 的世界裡,Props 負責從父元件向子元件傳遞資料,而 State 則是負責管理元件自身的內部資料。 State 就像元件的記憶,可以儲存元件的狀態,並根據狀態的變化來更新 UI。
Thumbnail
2025/04/27
在 React 的世界裡,元件 (Component) 就像一個個獨立的個體,各自負責 UI 的一部分,要讓這些個體協同工作,就需要一種溝通的機制,而 Props 就是組件之間通信和數據傳遞的主要方式。
Thumbnail
2025/04/27
在 React 的世界裡,元件 (Component) 就像一個個獨立的個體,各自負責 UI 的一部分,要讓這些個體協同工作,就需要一種溝通的機制,而 Props 就是組件之間通信和數據傳遞的主要方式。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
當你邊吃粽子邊看龍舟競賽直播的時候,可能會順道悼念一下2300多年前投江的屈原。但你知道端午節及其活動原先都與屈原毫無關係嗎?這是怎麼回事呢? 本文深入探討端午節設立初衷、粽子、龍舟競渡與屈原自沉四者。看完這篇文章,你就會對端午、粽子、龍舟和屈原的四角關係有新的認識喔。那就讓我們一起解開謎團吧!
Thumbnail
當你邊吃粽子邊看龍舟競賽直播的時候,可能會順道悼念一下2300多年前投江的屈原。但你知道端午節及其活動原先都與屈原毫無關係嗎?這是怎麼回事呢? 本文深入探討端午節設立初衷、粽子、龍舟競渡與屈原自沉四者。看完這篇文章,你就會對端午、粽子、龍舟和屈原的四角關係有新的認識喔。那就讓我們一起解開謎團吧!
Thumbnail
透過Google Gemini Advanced的Gem功能製作聊天專屬聊天機器人教學,透過QBQ(問題背後的問題)這篇文章的內容作為 RAG,並設計指令來引導 AI 有效對話。經過測試,完成後的QBQ小顧問夠使用者促進積極思考與行動,效果良好。
Thumbnail
透過Google Gemini Advanced的Gem功能製作聊天專屬聊天機器人教學,透過QBQ(問題背後的問題)這篇文章的內容作為 RAG,並設計指令來引導 AI 有效對話。經過測試,完成後的QBQ小顧問夠使用者促進積極思考與行動,效果良好。
Thumbnail
Gemini 是 Google 最新多模態 AI,能理解影音、文字與影像,並具備強大影像編輯功能。它可直接分析影音、美化人像、合成場景,還能生成系列圖片。目前為實驗階段,展現無限潛力。
Thumbnail
Gemini 是 Google 最新多模態 AI,能理解影音、文字與影像,並具備強大影像編輯功能。它可直接分析影音、美化人像、合成場景,還能生成系列圖片。目前為實驗階段,展現無限潛力。
Thumbnail
Google Gemini AI 中的 Gem 功能是一個強大的工具(就是類似 OpenAI ChatGPT 的 GPT),旨在幫助用戶創建個性化的 AI 助手,以滿足各種需求。以下是 Gem 的主要功能介紹:
Thumbnail
Google Gemini AI 中的 Gem 功能是一個強大的工具(就是類似 OpenAI ChatGPT 的 GPT),旨在幫助用戶創建個性化的 AI 助手,以滿足各種需求。以下是 Gem 的主要功能介紹:
Thumbnail
這個專案是一個使用 Vue3、Vite、daisyUI 和 Google Gemini AI API 打造的雙 AI 對話模擬器。 使用者可以設定兩個 AI 角色的名稱和描述,然後讓它們自行對話。 這個專案旨在展示前端如何與 AI API 互動,以及如何建立具有互動性的 AI 應用程式。
Thumbnail
這個專案是一個使用 Vue3、Vite、daisyUI 和 Google Gemini AI API 打造的雙 AI 對話模擬器。 使用者可以設定兩個 AI 角色的名稱和描述,然後讓它們自行對話。 這個專案旨在展示前端如何與 AI API 互動,以及如何建立具有互動性的 AI 應用程式。
Thumbnail
主流AI語言模型API評比,價格比較與SillyTavern AI角色扮演軟體簡介 包括OPENAI GPT-4,CLAUDE系列,GOOGLE GEMINI,Mistral 找出最近適合玩角色扮演的AI
Thumbnail
主流AI語言模型API評比,價格比較與SillyTavern AI角色扮演軟體簡介 包括OPENAI GPT-4,CLAUDE系列,GOOGLE GEMINI,Mistral 找出最近適合玩角色扮演的AI
Thumbnail
運用ChatGPT整合自動化工具,串接Line官方帳號,第三方APP,打造AI LINE小秘書。AI快速製作專業簡報和個人網站,創建個人專屬的知識管理AI-Bot和虛擬主播。完成課程後,您將能夠實現真正的10倍工作效率提升,全面降低成本,打造一個超級AI個人助理。 您將會學到 1.想要了解如
Thumbnail
運用ChatGPT整合自動化工具,串接Line官方帳號,第三方APP,打造AI LINE小秘書。AI快速製作專業簡報和個人網站,創建個人專屬的知識管理AI-Bot和虛擬主播。完成課程後,您將能夠實現真正的10倍工作效率提升,全面降低成本,打造一個超級AI個人助理。 您將會學到 1.想要了解如
Thumbnail
HelpGPT 是一款面向特定內容的聊天機器人,可以回答任何有關該特定內容的問題。 只需輸入相關文本並訓練,您就可以得到一個類似於 ChatGPT 的聊天機器人。然後將其添加為網站的聊天外掛程式,讓用戶通過與機器人聊天來獲得相關資訊。
Thumbnail
HelpGPT 是一款面向特定內容的聊天機器人,可以回答任何有關該特定內容的問題。 只需輸入相關文本並訓練,您就可以得到一個類似於 ChatGPT 的聊天機器人。然後將其添加為網站的聊天外掛程式,讓用戶通過與機器人聊天來獲得相關資訊。
Thumbnail
大家好! 自從ChatGPT 出來以後,人工智能聊天機器人已經大量出現在大眾的生活中。 大家可曾使用過人工智能的角色扮演功能? 這是一個很簡單的原理,你只要告訴AI,使用某人的身份來進行帶入回答,他就可以給予你各種有別於一般的文本,幫助你更好的得到自己想要的內容。 例如,你可能想讓他扮演一
Thumbnail
大家好! 自從ChatGPT 出來以後,人工智能聊天機器人已經大量出現在大眾的生活中。 大家可曾使用過人工智能的角色扮演功能? 這是一個很簡單的原理,你只要告訴AI,使用某人的身份來進行帶入回答,他就可以給予你各種有別於一般的文本,幫助你更好的得到自己想要的內容。 例如,你可能想讓他扮演一
Thumbnail
Hi, 大家好。我是茶桁。 在之前的课程中,我们接触了AI进行文字回复,语音合成。 那么将这两个组合在一起,我们基本就可以制作一个智能的语音聊天机器人了。看过电影《Her》的同学都应该清楚,AI因为用了女神斯嘉丽.约翰逊的配音,吸引到了不少的观众。 不过, 我们怎么能就满足于此呢,从文字到音频
Thumbnail
Hi, 大家好。我是茶桁。 在之前的课程中,我们接触了AI进行文字回复,语音合成。 那么将这两个组合在一起,我们基本就可以制作一个智能的语音聊天机器人了。看过电影《Her》的同学都应该清楚,AI因为用了女神斯嘉丽.约翰逊的配音,吸引到了不少的观众。 不过, 我们怎么能就满足于此呢,从文字到音频
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News