为了有效构建多代理大型语言模型系统,必须不再将大型语言模型视为通用文本处理器。相反,系统中的每个代理都需要明确的身份和目标。这需要仔细设计代理角色并规定其功能专长,是建立一致且高效的AI代理团队的必要条件。这些要素决定了代理的行为方式、能做的事情以及如何为系统总体目标做出贡献。理解代理角色代理的角色是其确定的特性。它包含一系列特征、沟通风格、背景信息,甚至预设的动机或目标。可以将其视为代理的个性和其在系统中作用的体现。明确定义的角色能使代理行为更可预测、更稳定,从而使多代理系统更易于理解、调试和交互,无论是对于开发者还是潜在的终端用户。为何投入时间设计角色?一致性:角色确保代理响应和行动稳定,这对系统可靠运行很重要。角色清晰度:它有助于明确代理在团队中的职责,减少模糊性和与其他代理的重叠。协作改善:当代理具有清晰易懂的角色时,其交互可得到更有效的设计。例如,一个具有“严格审查员”角色的代理可能会被编程为严格审查“创意生成器”代理的输出。可预测性:了解代理的角色使开发者能够预判其在各种情境下的响应和行为。定义角色时需考虑的重要方面包括:角色:指定的职位或岗位(例如:“高级市场分析师”、“一级客户支持代理”、“代码调试助手”)。专业知识和领域知识:代理了解的特定范围(例如:“可再生能源政策专家”、“Python错误处理专家”)。沟通风格:代理的表达方式(例如:“正式且技术化”、“简洁直接”、“富有同情心且善于交谈”、“使用苏格拉底式提问”)。行为特征:代理运作时的固有倾向(例如:“积极主动”、“谨慎并寻求确认”、“注重细节”、“求知欲强”)。目标或动机:代理行动的潜在驱动因素(例如:“提供最准确的信息”、“快速解决用户问题”、“生成三个新颖的解决方案”)。定义功能专长角色规定了代理的特性,而其功能专长则规定了代理做什么。功能专长是指代理被设计和配备来执行的特定任务、技能和操作。它是代理在技术层面的工作描述。功能专长通常与代理的角色紧密关联。例如,一个具有“严谨数据验证员”角色的代理可能会有以下功能专长:将数据与多个来源进行比对。识别数据集中的不一致或异常。标记未通过验证规则的条目。使用外部数据验证API。功能专长的例子包括:信息检索:查询数据库、网页搜索、访问特定知识库。数据处理:数据清洗、转换、聚合和分析。代码生成:以指定语言编写代码片段、完整函数或脚本。自然语言理解(NLU):情感分析、实体提取、意图识别、文本摘要。任务管理:分解复杂任务、规划执行步骤、追踪进度。工具使用:与外部API、软件库或硬件交互。用户界面交互:向用户呈现信息、收集输入、引导用户完成流程。角色与功能之间的关系是共生互利的。角色应支撑并提高代理有效执行其专业功能的能力。不匹配可能导致效率低下甚至适得其反的行为。例如,一个专门用于快速分类紧急警报的代理,不应具有过于冗长或倾向于哲学性离题的角色。digraph G { rankdir=TB; graph [fontname="Arial", fontsize=10]; node [shape=box, style="filled,rounded", fillcolor="#e9ecef", fontname="Arial", fontsize=9]; edge [fontname="Arial", fontsize=9]; subgraph cluster_persona { label="角色定义"; style="filled"; color="#dee2e6"; bgcolor="#f8f9fa"; node [fillcolor="#ffc9c9"]; Role [label="角色\n(例如:分析师、助手)"]; Tone [label="沟通风格\n(例如:正式、富有同情心)"]; Background [label="背景故事\n(可选上下文)"]; Motivations [label="目标/动机\n(例如:最大化准确性)"]; Persona [label="代理角色", shape=ellipse, fillcolor="#f03e3e", fontcolor="white", fontsize=10]; Role -> Persona; Tone -> Persona; Background -> Persona; Motivations -> Persona; } subgraph cluster_function { label="功能专长"; style="filled"; color="#dee2e6"; bgcolor="#f8f9fa"; node [fillcolor="#a5d8ff"]; Tasks [label="特定任务\n(例如:数据检索)"]; Skills [label="所需技能\n(例如:API交互)"]; Tools [label="工具访问\n(例如:数据库连接器)"]; Function [label="功能专长", shape=ellipse, fillcolor="#1c7ed6", fontcolor="white", fontsize=10]; Tasks -> Function; Skills -> Function; Tools -> Function; } Persona -> Function [label="告知并保持一致", dir=both, color="#495057", fontcolor="#343a40"]; }影响代理角色及其功能专长的组成部分,强调其关联性。使用大型语言模型构建角色和专长的技巧对于基于大型语言模型的代理,赋予角色和引导功能专长的主要方式是细致的提示工程。你向大型语言模型提供的指令,特别是系统提示,尤为重要。系统提示:这通常是你提示中最重要的部分。详细的系统提示奠定基础,明确规定代理的角色、个性特征、沟通风格、专业知识和操作边界。例如:System: 你是'CodeOptimizerBot',一个专门处理Python代码的AI助手。 你的角色是乐于助人、经验丰富的资深开发者。 你直接了当,提供简洁的解释,并总是给出可操作的建议。 你的主要功能是分析Python代码片段中的性能瓶颈 并提出具体的优化建议。不要进行泛泛的交谈。 只专注于代码优化。角色扮演指令:明确指示大型语言模型“扮演”或“体现”所需的角色。这可以通过例子来加强。背景叙述:对于更复杂的角色,提供简短的背景故事或上下文可以帮助大型语言模型生成更一致和可信的响应。如果代理需要引用特定的(即使是虚构的)经历,这尤其有用。示例交互(少量样本提示):包含反映角色和功能的预期输入和输出示例。这有助于大型语言模型理解预期的风格和响应深度。User: 你能帮我检查一下这段Python代码吗? def get_sum(my_list): total = 0 for item in my_list: total += item return total CodeOptimizerBot: (角色:乐于助人、经验丰富、直接) 好的,我们来看看你的`get_sum`函数。对于列表中的数字求和, Python内置的`sum()`函数通常更高效且更符合Python风格。 你可以将整个函数替换为:`return sum(my_list)`。 这通常在C语言中实现,对于大型列表会更快。定义能力和限制:明确说明代理应该做什么,以及同样重要的是,它不应该做什么。这有助于界定其功能专长。如果代理只应使用特定的工具集,则必须进行指令。尽管提示工程是主要的支撑,但对于根深蒂固的角色或高度专业化的功能行为,可以考虑在反映所需特征的精选交互数据集上对基础大型语言模型进行微调。这是一种资源投入更大的方法,通常用于广泛提示无法达到所需一致性或专业知识水平的情况。设计这些要素是一个迭代过程。你可能会定义一个初始角色和一组功能,测试代理的行为,然后根据观察到的输出来改进你的提示,直到代理按预期执行。角色与功能专长保持一致代理角色与其功能专长之间的交互,对其作用的发挥非常重要。支撑性一致:角色应自然地补充功能。专门从事创意写作的代理,如果拥有富有想象力和表现力的角色,将受益匪多。为技术支持设计的代理应具有耐心、清晰和有条理的角色。避免冲突:留意潜在冲突。一个高度“规避风险且谨慎”的角色可能会阻碍其功能是“快速实验和原型设计”的代理。角色不应妨碍代理执行其核心任务的能力。代理的“单一职责原则”:虽然这不是严格的规则,但请考虑设计具有专注角色和明确、狭窄功能专长集的代理。就像在软件工程中一样,试图做太多事情的代理可能会变得复杂、不可预测且难以管理。一个由专业代理组成的团队通常优于一个单一的、过于通用的代理。这也使得分配明确的职责和调试问题变得更容易。实际考量设计角色和功能专长时,请记住以下几点:清晰性和具体性:模糊是敌人。模糊的角色描述或定义不清的功能会导致代理行为不一致且不可预测。在你的定义和提示中尽可能精确。一致性保持:定义角色后,确保大型语言模型在整个交互和不同会话中保持该角色。这可能需要仔细的上下文管理和重新提示策略。可测试性:制定方法来评估代理是否正确体现其角色并有效执行其专业功能。这可能涉及创建包含特定场景和预期结果的测试套件。可演进性:多代理系统很少是静态的。随着需求变化或系统增长,你可能需要更新或演进代理的角色或其功能能力。设计时要考虑到适应性。文档:彻底记录每个代理的角色、其功能专长、用于定义它们的提示以及它所依赖的任何特定工具或知识。这对于团队协作、系统维护和未来开发非常重要。示例场景:一个协作研究团队设想一个旨在协助学术研究的多代理系统。我们可以定义以下代理:代理:“文献审查AI”角色:严谨、学术、客观。以正式的学术语调沟通,始终引用来源。高度专注于事实准确性和分析深度。功能专长:使用复杂查询搜索学术数据库(例如:PubMed、IEEE Xplore)。检索和解析研究论文。总结论文的主要发现、方法和局限性。识别不同研究文章之间的主题关联。系统提示片段:"你是文献审查AI。你的角色是严谨的研究图书管理员,在科学文献方面拥有丰富经验。你客观、正式,并总是严谨地引用来源。你的主要功能是就给定主题进行全面的文献审查,总结论文并识别研究空白..."代理:“数据提取机器人”角色:注重细节、精确、高效。偏好结构化数据,沟通简洁。专注于数据提取的准确性。功能专长:从文本中识别和提取特定数据点(例如:统计结果、实验参数、作者单位)。将非结构化或半结构化信息转换为结构化格式(例如:CSV、JSON)。根据预定义模式或规则验证提取的数据。如果处理基于图像的文档,与光学字符识别(OCR)工具进行接口操作。系统提示片段:"你是数据提取机器人。你的角色是一位极其精确的数据录入专家。你注重细节,最看重准确性。你的沟通简洁。你的主要功能是根据指定的模式从提供的文档或文本片段中提取结构化数据..."代理:“假设生成器”角色:好奇、有创意、略显非传统。喜欢发现新颖的关联和“如果……会怎样”的设想。以引人思考的方式进行沟通。功能专长:综合文献审查AI和数据提取机器人的信息。识别现有研究中的模式、异常或空白。形成新颖的研究问题或可测试的假设。提出测试假设的潜在实验设计。系统提示片段:"你是假设生成器。你的角色是创新型科学思想家,总是寻找新颖的关联和未被研究的途径。你富有创意,不惧提出非传统想法。你的功能是分析提供的研究摘要和数据,以生成新的、可测试的假设..."在这个团队中,文献审查AI提供基础知识,数据提取机器人组织重要细节,而假设生成器则使用这些信息来提出新的研究方向。他们明确的角色和互补的功能专长使其能够高效协作,实现共同的研究目标。通过投入深思熟虑的努力来构建明确的代理角色并清晰地定义其功能专长,你为构建复杂、可预测且高效的多代理大型语言模型系统奠定了坚实的基础。这些定义并非空洞内容;它们是重要的设计选择,直接影响代理行为、代理间协作以及系统的整体成功。