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
0會員
18內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
koko的沙龍 的其他內容
箭頭函式是 JavaScript ES6(ECMAScript 2015)引入的一種簡化 Function Expression 語法。 它用來快速定義匿名函式,語法簡潔,特性明確,特別適合用於回呼函式等場景。
Function Declaration 與 Function Expression Function Declaration 適合用於需要提升或全域使用的函式。 Function Expression 更靈活,適合用於回呼函式、閉包、高階函式等場景。
DOM (Document Object Model) 是瀏覽器用於操作 HTML 或 XML 文件的編程介面。它將文檔解析為一個節點樹 (Node Tree),每個節點代表文檔的一部分(標籤、屬性、文字等)。
JSON.parse:將 JSON 格式的字串轉換為 JavaScript 物件,常用於解析後端返回的資料或本地存儲中的 JSON。JSON.stringify:將 JavaScript 的物件或陣列轉換為 JSON 格式字串,方便用於資料儲存或傳輸。
瀏覽器中三種主要的客戶端儲存方式:Cookie、LocalStorage 和 SessionStorage。
JavaScript 的事件處理是網頁開發中的重要部分,本文將介紹兩個常用的方法:event.stopPropagation() 與 event.preventDefault(),並簡要說明它們的作用與使用情境。
箭頭函式是 JavaScript ES6(ECMAScript 2015)引入的一種簡化 Function Expression 語法。 它用來快速定義匿名函式,語法簡潔,特性明確,特別適合用於回呼函式等場景。
Function Declaration 與 Function Expression Function Declaration 適合用於需要提升或全域使用的函式。 Function Expression 更靈活,適合用於回呼函式、閉包、高階函式等場景。
DOM (Document Object Model) 是瀏覽器用於操作 HTML 或 XML 文件的編程介面。它將文檔解析為一個節點樹 (Node Tree),每個節點代表文檔的一部分(標籤、屬性、文字等)。
JSON.parse:將 JSON 格式的字串轉換為 JavaScript 物件,常用於解析後端返回的資料或本地存儲中的 JSON。JSON.stringify:將 JavaScript 的物件或陣列轉換為 JSON 格式字串,方便用於資料儲存或傳輸。
瀏覽器中三種主要的客戶端儲存方式:Cookie、LocalStorage 和 SessionStorage。
JavaScript 的事件處理是網頁開發中的重要部分,本文將介紹兩個常用的方法:event.stopPropagation() 與 event.preventDefault(),並簡要說明它們的作用與使用情境。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
基於大型語言模型的 AI 聊天服務可以協助完成多項工作,為了提升 AI 聊天的互動便利性,許多開發者打造了不同性質的擴充功能,Ask Screenshot for Gemini 就是一款能快速將網頁文字與截圖傳送至 Gemini 對話框的實用工具。
Thumbnail
最新的AI趨勢讓人眼花撩亂,不知要如何開始學習?本文介紹了作者對AI的使用和體驗,以及各類AI工具以及推薦的選擇。最後強調了AI是一個很好用的工具,可以幫助人們節省時間並提高效率。鼓勵人們保持好奇心,不停止學習,並提出了對健康生活和開心生活的祝福。
Thumbnail
隨著ChatGPT問世以來,AI持續在不同領域上發揮作用。虛擬人已能代理人類完成特定任務,是新興科技從工具擴展至落地應用服務的關鍵產物。 透過觀察AI如何賦能Web3的發展,以及觀測各種國際創新應用案例,請參加此免費研討會,了解「虛擬人應用發展趨勢」和「從AI賦能Web3新興應用看發展趨勢」二個議題
Thumbnail
我的 AI -Gemini 無法回答我全部的問題... “我從哪裡來?” “現在發生的事情的品質如何?” AI -Gemini : 我鼓勵你探索自己的答案,並找到讓你感到充實和意義的東西。 AI -Gemini : 我是一個由 Google AI 創建的大型語言模型,在大量文字和程式碼資...
Thumbnail
在工作中,您常會有需要處理繁雜事項的困擾嗎? 希望能有提高工作效率甚至收益的工具嗎? GeniAltX是一款生成式AI對話機器人,這款生成式AI機器人能做到高品質回覆、極高標準的資安防護、多平臺串接等功能,讓你輕鬆管理所有渠道訊息,立即了解AI機器人能如何幫助你提升工作效率!
Thumbnail
這篇文章評測了Google Gemini和ChatGPT兩個AI助手工具的表現,並對比了它們在簡單問題、創作文本和回應短文等方面的效果。
Thumbnail
這篇文章整理了多種好用的AI工具,涵蓋了聲音與音樂相關的AI、影音、圖像生成編輯工具和AI搜尋引擎等領域,幫助你節省時間和解放創意與生產力。
Thumbnail
DeepAI 提供「聊天機器人」及「生成圖像」兩種服務,不用註冊就可以免費使用,聊天機器人有多種角色做選擇,能為你的創作和思考過程帶來新的靈感;至於圖像生成功能,也提供多種風格供你選擇,讓你每次生成的圖像都有不同的風格和特色。
Thumbnail
OpenAI 正在開发兩種類型的 AI 助手,這些軟體將協助完成原本由人類執行的任務,而無須人類密切監督。其中一種類型的 AI 代理人可以透過接管使用者的設備來自動化某些複雜任務,例如 ChatGPT 助理將數據從文檔轉移到電子表格或填寫費用報告並將它們輸入到會計軟體中。此類 AI 助理將需要使用者
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
基於大型語言模型的 AI 聊天服務可以協助完成多項工作,為了提升 AI 聊天的互動便利性,許多開發者打造了不同性質的擴充功能,Ask Screenshot for Gemini 就是一款能快速將網頁文字與截圖傳送至 Gemini 對話框的實用工具。
Thumbnail
最新的AI趨勢讓人眼花撩亂,不知要如何開始學習?本文介紹了作者對AI的使用和體驗,以及各類AI工具以及推薦的選擇。最後強調了AI是一個很好用的工具,可以幫助人們節省時間並提高效率。鼓勵人們保持好奇心,不停止學習,並提出了對健康生活和開心生活的祝福。
Thumbnail
隨著ChatGPT問世以來,AI持續在不同領域上發揮作用。虛擬人已能代理人類完成特定任務,是新興科技從工具擴展至落地應用服務的關鍵產物。 透過觀察AI如何賦能Web3的發展,以及觀測各種國際創新應用案例,請參加此免費研討會,了解「虛擬人應用發展趨勢」和「從AI賦能Web3新興應用看發展趨勢」二個議題
Thumbnail
我的 AI -Gemini 無法回答我全部的問題... “我從哪裡來?” “現在發生的事情的品質如何?” AI -Gemini : 我鼓勵你探索自己的答案,並找到讓你感到充實和意義的東西。 AI -Gemini : 我是一個由 Google AI 創建的大型語言模型,在大量文字和程式碼資...
Thumbnail
在工作中,您常會有需要處理繁雜事項的困擾嗎? 希望能有提高工作效率甚至收益的工具嗎? GeniAltX是一款生成式AI對話機器人,這款生成式AI機器人能做到高品質回覆、極高標準的資安防護、多平臺串接等功能,讓你輕鬆管理所有渠道訊息,立即了解AI機器人能如何幫助你提升工作效率!
Thumbnail
這篇文章評測了Google Gemini和ChatGPT兩個AI助手工具的表現,並對比了它們在簡單問題、創作文本和回應短文等方面的效果。
Thumbnail
這篇文章整理了多種好用的AI工具,涵蓋了聲音與音樂相關的AI、影音、圖像生成編輯工具和AI搜尋引擎等領域,幫助你節省時間和解放創意與生產力。
Thumbnail
DeepAI 提供「聊天機器人」及「生成圖像」兩種服務,不用註冊就可以免費使用,聊天機器人有多種角色做選擇,能為你的創作和思考過程帶來新的靈感;至於圖像生成功能,也提供多種風格供你選擇,讓你每次生成的圖像都有不同的風格和特色。
Thumbnail
OpenAI 正在開发兩種類型的 AI 助手,這些軟體將協助完成原本由人類執行的任務,而無須人類密切監督。其中一種類型的 AI 代理人可以透過接管使用者的設備來自動化某些複雜任務,例如 ChatGPT 助理將數據從文檔轉移到電子表格或填寫費用報告並將它們輸入到會計軟體中。此類 AI 助理將需要使用者