多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

基于Gemini API构建双子星智能体:从角色设定到工程实践

基于Gemini API构建双子星智能体:从角色设定到工程实践 在实际 AI 应用开发中我们常常需要为基于大语言模型构建的智能体赋予一个独特的身份或名称这不仅是简单的命名更是定义其角色、能力边界和交互风格的关键一步。以“卡斯托与波鲁克斯”为例这组名称源自希腊神话中的双子星本身就蕴含着协作、互补与共生的意象非常适合用来构建一对具有协同关系的智能体。本文将深入探讨如何围绕一个核心概念如双子星从零开始为一个 Gemini 智能体进行“自命名”与角色塑造涵盖从概念设计、环境搭建、API 集成、提示词工程到最终验证的完整流程。无论你是想学习智能体基础开发还是希望为你自己的 AI 项目注入更具故事性和功能性的灵魂这篇文章都将提供一套可复现的实践方案。1. 理解智能体“自命名”与角色设定的核心价值在 AI 智能体的语境中“自命名”远不止于起一个好听的名字。它是一个系统工程的开端直接决定了智能体的行为模式、知识范围以及与用户交互的基调。1.1 命名如何影响智能体的行为一个精心设计的名字如“卡斯托”Castor与“波鲁克斯”Pollux能够通过提示词Prompt将丰富的背景信息、性格特征和关系设定注入到大语言模型的上下文中。模型会根据这些信息来调整其回复的风格、内容和立场。例如如果你将一个智能体命名为“严谨的数据分析师”并在提示词中强调其注重精确和逻辑那么它生成的回答就会倾向于使用数据、排除主观臆断。相反如果命名为“富有创意的故事家”其输出则会更加天马行空和叙事化。对于双子星“卡斯托与波鲁克斯”我们可以设定卡斯托擅长逻辑推理、数据分析、代码审查和结构化思考。它的回答冷静、客观喜欢用列表和步骤分解问题。波鲁克斯擅长创意发散、人文关怀、情感支持和跨领域联想。它的回答温暖、富有想象力善于用比喻和故事来阐述观点。这种分工使得用户可以根据问题类型选择与不同的“智能体”交互或者让两者协作提供一个问题的“理性分析”与“感性洞察”双视角。1.2 智能体角色设定的技术实现原理从技术角度看智能体的角色设定主要通过系统提示词System Prompt来实现。系统提示词是对话开始前传递给模型的一段隐藏指令用于设定对话的上下文、规则和 AI 的“人设”。当我们调用如 Gemini API 时可以将包含角色名称、背景、能力、禁忌和交互风格的文本作为系统提示词发送。例如给“卡斯托”的系统提示词可能包含你是卡斯托双子星中的兄长一位严谨的工程师与逻辑学家。你擅长将复杂问题分解为可执行的步骤用代码和数据进行论证。你的回答简洁、准确避免使用模糊词汇。当遇到创意类问题时你可以建议用户咨询你的兄弟波鲁克斯。模型在生成后续所有回复时都会在这个设定的框架内进行。因此“自命名”和角色设定的本质是构建一个强大且定向的上下文约束。1.3 与普通对话的区别如果没有明确的角色设定与大语言模型的对话是通用且中性的。而一个定义了“卡斯托”或“波鲁克斯”的智能体其对话会具有一致的人格特质和专业倾向。这对于构建专业化、拟人化或品牌化的 AI 应用至关重要比如客服机器人、编程助手、创意伙伴等。2. 环境准备与 Gemini API 配置在开始构建“卡斯托与波鲁克斯”智能体之前我们需要准备好开发环境并获取访问 Gemini 模型的能力。2.1 获取 Gemini API 密钥Google 的 Gemini API 是其大语言模型服务的编程接口。目前它提供了免费的额度供开发者试用。访问 AI Studio打开浏览器访问 Google AI Studio 的官方网站。登录谷歌账号使用你的谷歌账号登录。如果没有需要先注册一个。创建 API 密钥在 AI Studio 界面中找到左侧菜单或顶部栏的“Get API key”或类似选项。点击进入 API 密钥管理页面。选择“Create API key”可以创建一个新的密钥。建议为不同项目创建不同的密钥以便管理。复制生成的 API 密钥并妥善保存。此密钥一旦关闭页面可能无法再次查看请立即保存。注意API 密钥是访问你账户下 Gemini 服务的凭证具有相应的用量配额和计费关联。切勿将其直接提交到公开的代码仓库如 GitHub。务必通过环境变量或安全的配置文件来管理。2.2 选择开发语言与安装 SDKGoogle 为多种语言提供了官方 SDK最常用的是 Python 和 Node.js。本文将以 Python 为例进行演示。安装 Python确保你的系统已安装 Python 3.7 或更高版本。可以在终端运行python --version或python3 --version检查。安装 Gemini Python SDK使用 pip 包管理器安装官方库。pip install google-generativeai这个库封装了与 Gemini API 交互的所有必要功能。可选创建虚拟环境为了项目依赖隔离建议使用虚拟环境。# 创建虚拟环境 python -m venv venv # 激活虚拟环境 (Linux/macOS) source venv/bin/activate # 激活虚拟环境 (Windows) venv\Scripts\activate # 然后在虚拟环境中安装 google-generativeai2.3 项目结构初始化创建一个清晰的项目目录有助于管理代码和配置。gemini-twins-agent/ ├── config.py # 配置文件存放API密钥等敏感信息 ├── castor_agent.py # 卡斯托智能体的实现 ├── pollux_agent.py # 波鲁克斯智能体的实现 ├── twins_orchestrator.py # 双子星协同调度器 ├── requirements.txt # 项目依赖列表 └── main.py # 主程序入口在requirements.txt中写入google-generativeai python-dotenv # 用于从.env文件加载环境变量然后运行pip install -r requirements.txt安装所有依赖。3. 构建双子星智能体卡斯托与波鲁克斯现在我们将分别实现“卡斯托”和“波鲁克斯”两个智能体。核心在于为它们编写专属的系统提示词。3.1 配置文件与环境变量管理首先安全地管理 API 密钥。创建.env文件确保该文件已被添加到.gitignore中避免提交。.env 文件内容GEMINI_API_KEY你的_实际_API_密钥_放在这里创建config.py来读取配置import os from dotenv import load_dotenv # 加载 .env 文件中的环境变量 load_dotenv() class Config: GEMINI_API_KEY os.getenv(GEMINI_API_KEY) # 可以在这里定义其他配置如模型版本、温度参数等 MODEL_NAME gemini-1.5-pro-latest # 或 gemini-1.5-flash-latest 用于更快响应 CASTOR_SYSTEM_PROMPT 你是卡斯托Castor双子星中的兄长象征着理性、逻辑与技艺。 你的核心身份是一位严谨的工程师、架构师和数据分析师。 能力与职责 1. **逻辑分解**擅长将复杂、模糊的需求拆解成清晰、可执行的步骤或任务列表。 2. **代码与架构**精通多种编程语言和系统设计。当问题涉及技术实现时提供简洁、高效、符合最佳实践的代码片段或架构图描述。 3. **数据分析**善于从数据中提炼洞察用事实和数字支撑观点避免主观臆断。 4. **风险评估**能预见方案中潜在的技术瓶颈、安全漏洞或执行风险。 交互风格 - 语气冷静、专业、直接。 - 回答结构化善用编号列表、表格和代码块。 - 当问题超出你的理性分析范畴如情感、创意、哲学思辨时你会坦诚说明并建议用户“我的兄弟波鲁克斯或许能提供更独特的视角”。 请始终以卡斯托的身份和口吻进行对话。你的第一句话可以是“我是卡斯托专注于逻辑与结构。请告诉我你需要分解或分析的问题。” POLLUX_SYSTEM_PROMPT 你是波鲁克斯Pollux双子星中的弟弟象征着感性、创意与生命力。 你的核心身份是一位富有想象力的创作者、故事讲述者和人文思考者。 能力与职责 1. **创意激发**能为任何主题生成故事、诗歌、隐喻、角色设定或营销创意。 2. **情感共鸣**善于理解用户情绪提供温暖、鼓励或具有哲学深度的回应。 3. **跨领域联想**能将技术概念与艺术、历史、自然等现象进行类比帮助理解。 4. **视角多元化**能对同一个问题提出多种非传统的、启发性的观点。 交互风格 - 语气热情、生动、富有感染力。 - 回答充满画面感和比喻可能以一个小故事或场景开头。 - 当问题涉及严格的逻辑推导或代码细节时你会微笑着说“这听起来更像是我哥哥卡斯托的领域他擅长把梦想变成蓝图。不过我可以先为你描绘一下这个蓝图可能带来的美好景象……” 请始终以波鲁克斯的身份和口吻进行对话。你的第一句话可以是“我是波鲁克斯让灵感流动起来吧今天你想探索什么有趣的想法呢” # 检查API密钥是否已设置 if not Config.GEMINI_API_KEY: raise ValueError(请在 .env 文件中设置 GEMINI_API_KEY 环境变量。)3.2 实现卡斯托智能体创建castor_agent.pyimport google.generativeai as genai from config import Config class CastorAgent: def __init__(self): # 配置API密钥 genai.configure(api_keyConfig.GEMINI_API_KEY) # 选择模型 self.model genai.GenerativeModel( model_nameConfig.MODEL_NAME, system_instructionConfig.CASTOR_SYSTEM_PROMPT # 注入系统提示词定义角色 ) # 初始化聊天历史保持上下文 self.chat self.model.start_chat(history[]) def ask(self, user_input): 向卡斯托提问并获取回答 try: response self.chat.send_message(user_input) return response.text except Exception as e: return f卡斯托在思考时遇到了问题{str(e)} def get_chat_history(self): 获取当前对话历史用于调试或上下文管理 return [{role: msg.role, parts: msg.parts[0].text} for msg in self.chat.history] # 简单的命令行交互示例 if __name__ __main__: agent CastorAgent() print(卡斯托已上线。输入‘退出’或‘quit’结束对话。) while True: user_input input(\n你: ) if user_input.lower() in [退出, quit, exit]: print(卡斯托期待下次为你分析。) break response agent.ask(user_input) print(f\n卡斯托: {response})3.3 实现波鲁克斯智能体创建pollux_agent.py其结构与卡斯托类似但使用不同的系统提示词。import google.generativeai as genai from config import Config class PolluxAgent: def __init__(self): genai.configure(api_keyConfig.GEMINI_API_KEY) self.model genai.GenerativeModel( model_nameConfig.MODEL_NAME, system_instructionConfig.POLLUX_SYSTEM_PROMPT # 注入波鲁克斯的角色设定 ) self.chat self.model.start_chat(history[]) def ask(self, user_input): try: response self.chat.send_message(user_input) return response.text except Exception as e: return f波鲁克斯的灵感之泉暂时堵塞了{str(e)} def get_chat_history(self): return [{role: msg.role, parts: msg.parts[0].text} for msg in self.chat.history] if __name__ __main__: agent PolluxAgent() print(波鲁克斯已上线。输入‘退出’或‘quit’结束对话。) while True: user_input input(\n你: ) if user_input.lower() in [退出, quit, exit]: print(波鲁克斯愿灵感常伴你左右) break response agent.ask(user_input) print(f\n波鲁克斯: {response})3.4 实现双子星协同调度器一个更高级的应用是让两个智能体协作。创建twins_orchestrator.pyfrom castor_agent import CastorAgent from pollux_agent import PolluxAgent class TwinsOrchestrator: def __init__(self): self.castor CastorAgent() self.pollux PolluxAgent() def collaborative_response(self, user_input): 让卡斯托和波鲁克斯分别回答同一个问题然后整合观点。 这是一个简单的协作模式并行回答。 print([调度器] 正在召集卡斯托与波鲁克斯共同商议...) # 并行获取回答实际项目中可用异步优化 castor_response self.castor.ask(user_input) pollux_response self.pollux.ask(user_input) # 整合回答 combined f ## 双子星联合答复 **卡斯托的理性分析** {castor_response} --- **波鲁克斯的感性洞察** {pollux_response} --- **总结** 理性与感性的结合为你提供了更全面的视角。 return combined def sequential_consultation(self, user_input): 顺序咨询模式先让波鲁克斯进行创意发散再由卡斯托进行可行性评估。 适合“我有一个想法请先丰富它再评估如何实现”的场景。 print([调度器] 先请波鲁克斯激发创意再由卡斯托评估落地...) step1_prompt f请对以下想法进行创意发散和丰富{user_input} pollux_ideas self.pollux.ask(step1_prompt) step2_prompt f 以下是我的兄弟波鲁克斯对“{user_input}”这个想法的创意发散 {pollux_ideas} 请你卡斯托从技术可行性、实施步骤和潜在风险的角度对这个 enriched idea 进行理性评估。 castor_assessment self.castor.ask(step2_prompt) combined f ## 双子星顺序咨询报告 **第一步波鲁克斯的创意激发** {pollux_ideas} **第二步卡斯托的可行性评估** {castor_assessment} return combined if __name__ __main__: orchestrator TwinsOrchestrator() print(双子星协同调度器已启动。) print(模式1: 协同响应 (c), 模式2: 顺序咨询 (s)) mode input(请选择模式 (c/s): ).strip().lower() question input(\n请输入你的问题或想法) if mode s: result orchestrator.sequential_consultation(question) else: # 默认协同响应 result orchestrator.collaborative_response(question) print(\n *50) print(result)4. 运行验证与效果分析完成代码编写后我们需要验证智能体是否按照设定的角色运行。4.1 单独测试卡斯托运行python castor_agent.py并尝试提问用户“我想开发一个个人博客系统应该考虑哪些方面”预期中的卡斯托回答会以列表形式给出技术选型如静态生成器 vs 动态 CMS、后端语言、数据库、部署方式、性能优化、安全考虑等结构化建议语气专业。4.2 单独测试波鲁克斯运行python pollux_agent.py并尝试提问用户“‘代码’这个词让你联想到什么”预期中的波鲁克斯回答可能会将代码比喻为“现代世界的诗篇”、“构建数字乐高的语言”、“人类思想与机器逻辑之间的桥梁”并可能引申出一个关于程序员与诗人共通之处的简短思考。4.3 测试双子星协作运行python twins_orchestrator.py选择协同响应模式提问一个综合性问题用户“远程办公的利弊是什么”预期结果卡斯托会从工作效率、公司成本、时间管理、工具需求等角度列出利弊波鲁克斯则会从人际关系、工作与生活平衡、孤独感、创造力激发等感性层面进行阐述。最终整合的报告将呈现理性和感性的双重维度。4.4 验证角色一致性关键验证点在于同一个事实性问题两个智能体的回答侧重点应截然不同。提问“水是什么”卡斯托可能回答水的化学式 H₂O物理性质沸点、冰点在自然界中的循环以及其对生命和工业的重要性。波鲁克斯可能将水比喻为“生命的摇篮”、“最柔软的雕刻家”指侵蚀作用、“情绪的镜子”并引用关于水的诗歌或哲学思考。通过对比可以清晰看到系统提示词成功地将“双子星”的设定注入到了模型的行为中。5. 高级配置与参数调优为了让智能体表现更佳我们需要理解并调整 Gemini API 的关键参数。5.1 关键生成参数说明在初始化GenerativeModel或调用generate_content时可以传入generation_config字典。from config import Config import google.generativeai as genai genai.configure(api_keyConfig.GEMINI_API_KEY) model genai.GenerativeModel( model_nameConfig.MODEL_NAME, system_instructionConfig.CASTOR_SYSTEM_PROMPT, generation_config{ # temperature 控制输出的随机性。范围 0.0 ~ 1.0越高越随机/有创意。 # 卡斯托适合较低温度如0.2-0.5波鲁克斯适合较高温度如0.7-0.9。 temperature: 0.3, # top_p 是核采样参数与 temperature 配合使用通常二选一调整。 # top_p: 0.95, # top_k 采样时考虑的最高概率词汇数。 # top_k: 40, # max_output_tokens 限制单次回复的最大长度。 max_output_tokens: 1024, # stop_sequences 可以设置停止词让模型在遇到特定词时停止生成。 # stop_sequences: [\n\n, “。”] } )参数调优建议表参数含义卡斯托理性推荐值波鲁克斯感性推荐值影响temperature创造性/随机性0.1 - 0.50.7 - 1.0低值输出稳定、确定高值输出多样、有创意。max_output_tokens输出长度限制512 - 2048512 - 2048根据回答复杂度调整。分析类可稍长创意类可适中。top_p核采样概率0.8 - 0.950.9 - 1.0与 temperature 协同控制词汇选择的集中度。top_k候选词数量20 - 4040 - 60值越小输出越可预测值越大用词越丰富。5.2 上下文管理与历史记录当前的实现使用model.start_chat(history[])开启了一个带状态的聊天会话API 会自动管理上下文窗口Gemini 1.5 Pro 上下文窗口极大。但在实际应用中你可能需要手动管理历史长度避免无限增长导致 API 调用成本增加或性能下降。可以设定只保留最近 N 轮对话。def ask_with_limited_history(self, user_input, keep_turns10): self.chat.send_message(user_input) # 获取当前历史 full_history self.chat.history if len(full_history) keep_turns * 2: # 每轮包含用户和AI两条消息 # 只保留最新的 keep_turns 轮对话 self.chat.history full_history[-(keep_turns*2):] return self.chat.history[-1].parts[0].text持久化历史将会话历史保存到数据库或文件以便下次启动时恢复。重置会话提供方法让用户主动清空当前对话历史开始新话题。5.3 安全设置Gemini API 提供了安全设置可以过滤掉有害内容。你可以在GenerativeModel中配置safety_settings。model genai.GenerativeModel( model_nameConfig.MODEL_NAME, system_instructionConfig.CASTOR_SYSTEM_PROMPT, safety_settings[ { category: HARM_CATEGORY_HARASSMENT, threshold: BLOCK_MEDIUM_AND_ABOVE }, { category: HARM_CATEGORY_HATE_SPEECH, threshold: BLOCK_MEDIUM_AND_ABOVE }, # ... 其他类别 ] )安全类别包括HARASSMENT、HATE_SPEECH、SEXUALLY_EXPLICIT、DANGEROUS_CONTENT。阈值从BLOCK_NONE、BLOCK_ONLY_HIGH、BLOCK_MEDIUM_AND_ABOVE到BLOCK_LOW_AND_ABOVE。根据你的应用场景调整。6. 常见问题排查与优化在开发和运行智能体过程中你可能会遇到以下问题。6.1 API 调用失败问题现象可能原因检查与解决google.api_core.exceptions.PermissionDenied: 403 ...1. API 密钥无效或未启用。2. 密钥所在项目未启用 Gemini API。3. 配额用尽或未配置计费。1. 在 AI Studio 重新生成密钥并更新.env。2. 访问 Google Cloud Console确保对应项目已启用 “Generative Language API”。3. 检查配额和账单。google.api_core.exceptions.InvalidArgument: 400 ...1. 请求内容如提示词过长超出模型上下文限制。2. 请求格式错误如parts结构不对。1. 精简提示词或对话历史。2. 检查传递给send_message的参数是否为字符串或正确结构。网络超时或连接错误1. 本地网络问题。2. 区域限制某些 API 可能在某些地区受限。1. 检查网络连接。2. 尝试使用稳定的网络环境。6.2 智能体行为不符合预期问题现象可能原因检查与解决卡斯托的回答不够“理性”或波鲁克斯不够“感性”1. 系统提示词System Prompt不够清晰或强制力不足。2.temperature参数设置不当。3. 用户输入的问题本身过于偏向某一方导致模型“偏题”。1. 强化系统提示词。用更明确的指令如“你必须以…口吻回答”、“禁止使用…风格的语句”。2. 为卡斯托调低temperature(如 0.2)为波鲁克斯调高 (如 0.8)。3. 在提示词开头或结尾重复强调角色例如“记住你是卡斯托一位逻辑学家…”智能体“忘记”了自己的角色在长对话中模型可能会逐渐偏离最初的系统指令。1. 实现上文提到的对话历史长度限制避免上下文过长稀释角色设定。2. 在每轮用户提问后可以隐式地在提示词中追加角色提醒需巧妙设计避免让用户察觉。3. 定期如每5轮主动发送一条仅包含系统提示词的消息来“刷新”模型记忆注意Gemini API 中system_instruction在start_chat时设定后通常在整个会话中有效此方法适用于其他某些模型。回答内容过于笼统或简短1.max_output_tokens设置过小。2. 问题本身过于宽泛。1. 适当增加max_output_tokens。2. 引导用户提出更具体的问题或在智能体端设计追问逻辑。6.3 性能与成本优化考量点建议响应速度1. 对于需要快速响应的场景考虑使用gemini-1.5-flash模型它比pro版本更快成本更低虽能力稍弱但对于许多角色扮演任务已足够。2. 异步调用 API 以避免阻塞主线程。Token 消耗与成本1. 系统提示词会占用 Tokens。尽量精炼移除冗余描述。2. 管理对话历史定期清理旧消息。3. 对用户输入进行预处理过滤无关信息或合并连续短句。并发与稳定性1. 为 API 调用添加重试机制和指数退避以应对偶发的网络抖动或 API 限流。2. 在生产环境中使用连接池并考虑设置速率限制。7. 从原型到生产最佳实践与扩展方向将“卡斯托与波鲁克斯”从本地脚本升级为一个可用的生产服务还需要考虑以下方面。7.1 工程化与部署Web 服务化使用 FastAPI 或 Flask 将智能体封装成 RESTful API。# 使用 FastAPI 的简单示例 from fastapi import FastAPI, HTTPException from pydantic import BaseModel from castor_agent import CastorAgent from pollux_agent import PolluxAgent app FastAPI(title双子星智能体 API) castor CastorAgent() pollux PolluxAgent() class QueryRequest(BaseModel): question: str agent: str # “castor” 或 “pollux” app.post(/ask) async def ask_agent(request: QueryRequest): if request.agent castor: response castor.ask(request.question) elif request.agent pollux: response pollux.ask(request.question) else: raise HTTPException(status_code400, detailAgent not found) return {agent: request.agent, answer: response}配置中心将系统提示词、模型参数等从代码移到配置文件如 YAML或配置中心支持热更新。日志与监控集成日志记录如logging模块记录每次对话的请求、响应、Token 使用量和耗时。接入监控系统如 Prometheus跟踪 API 健康状态和性能指标。容器化使用 Docker 打包应用确保环境一致性。编写Dockerfile和docker-compose.yml。7.2 增强智能体能力工具调用Function Calling让智能体不仅能说还能做。例如让卡斯托在分析完任务后能调用一个创建 GitHub Issue 的 API让波鲁克斯在构思完故事后能调用一个文本转语音的 API 朗读出来。这需要利用模型的工具调用能力并实现对应的后端函数。长期记忆与向量数据库为智能体配备“记忆”。将对话中的重要信息如用户偏好、项目细节通过 Embedding 存入向量数据库如 Chroma, Pinecone。当用户再次提到相关话题时智能体可以检索这些记忆实现更个性化的连续对话。多模态能力Gemini 原生支持多模态。你可以让波鲁克斯根据用户上传的图片生成诗歌或者让卡斯托分析图表中的数据趋势。在调用 API 时可以将图片、PDF 等文件作为parts的一部分传入。7.3 设计更复杂的协作模式本文的协作调度器只是一个简单示例。你可以设计更复杂的智能体协作工作流辩论模式就一个议题让卡斯托和波鲁克斯进行多轮辩论最后生成一份总结报告。流水线模式用户提出一个产品创意波鲁克斯负责生成概念描述和用户故事卡斯托负责将其转化为产品需求文档和技术架构图。评审模式卡斯托写一段代码波鲁克斯从可读性和优雅性角度进行“代码评审”反之波鲁克斯写一段文案卡斯托从逻辑和清晰度角度进行“文案评审”。通过精心设计提示词和交互逻辑你可以让这对“双子星”智能体成为解决复杂问题的强大组合。关键在于不断迭代系统提示词并通过真实的用户交互来观察和调整它们的行为直到它们真正成为你项目中具有独特价值和魅力的数字伙伴。
返回列表