# Agentic RAG

本课程全面介绍了代理型检索增强生成（Agentic RAG），这是一种新兴的人工智能范式，其中大型语言模型（LLMs）在从外部数据源获取信息的同时，能够自主规划下一步的操作。与传统的静态“检索然后阅读”模式不同，Agentic RAG 采用了迭代调用 LLM 的方式，穿插工具或函数调用及结构化输出。系统会评估结果、优化查询、在必要时调用额外工具，并持续循环，直到找到满意的解决方案。

## 简介

本课程将涵盖以下内容：

- **了解 Agentic RAG**：学习一种新兴的人工智能范式，其中大型语言模型（LLMs）能够在从外部数据源获取信息的同时自主规划下一步操作。
- **掌握迭代式“制造者-检查者”风格**：理解这种循环模式，通过迭代调用 LLM，穿插工具或函数调用及结构化输出，旨在提升准确性并处理格式错误的查询。
- **探索实际应用**：识别 Agentic RAG 在特定场景中的优势，例如以准确性为优先的环境、复杂的数据库交互以及扩展的工作流。

## 学习目标

完成本课程后，您将能够了解/掌握以下内容：

- **理解 Agentic RAG**：学习一种新兴的人工智能范式，其中大型语言模型（LLMs）能够在从外部数据源获取信息的同时自主规划下一步操作。
- **迭代式“制造者-检查者”风格**：理解通过迭代调用 LLM，穿插工具或函数调用及结构化输出来提升准确性并处理格式错误查询的概念。
- **掌控推理过程**：理解系统掌控其推理过程的能力，能够自主决定如何解决问题，而不是依赖预定义的路径。
- **工作流**：了解代理型模型如何自主决定检索市场趋势报告、识别竞争对手数据、关联内部销售指标、综合发现并评估策略。
- **迭代循环、工具集成与记忆**：学习系统如何依赖循环交互模式，在步骤间保持状态和记忆，从而避免重复循环并做出更明智的决策。
- **处理失败模式与自我纠正**：探索系统的强大自我纠正机制，包括迭代与重新查询、使用诊断工具以及在必要时依赖人工监督。
- **代理的边界**：了解 Agentic RAG 的局限性，聚焦于领域特定的自主性、对基础设施的依赖以及对安全措施的遵守。
- **实际应用场景及价值**：识别 Agentic RAG 在特定场景中的优势，例如以准确性为优先的环境、复杂的数据库交互以及扩展的工作流。
- **治理、透明性与信任**：学习治理和透明性的重要性，包括可解释的推理、偏见控制以及人工监督。

## 什么是 Agentic RAG？

代理型检索增强生成（Agentic Retrieval-Augmented Generation，简称 Agentic RAG）是一种新兴的人工智能范式，其中大型语言模型（LLMs）能够在从外部数据源获取信息的同时自主规划下一步操作。与传统的静态“检索然后阅读”模式不同，Agentic RAG 采用了迭代调用 LLM 的方式，穿插工具或函数调用及结构化输出。系统会评估结果、优化查询、在必要时调用额外工具，并持续循环，直到找到满意的解决方案。这种迭代式“制造者-检查者”风格旨在提升准确性、处理格式错误的查询，并确保高质量的结果。

系统能够主动掌控其推理过程，重写失败的查询、选择不同的检索方法并整合多种工具——例如 Azure AI Search 的向量搜索、SQL 数据库或自定义 API——在最终生成答案之前完成这些操作。代理型系统的显著特性在于其能够掌控推理过程。传统的 RAG 实现依赖预定义的路径，而代理型系统则基于所获取信息的质量自主决定步骤顺序。

## 定义代理型检索增强生成（Agentic RAG）

代理型检索增强生成（Agentic Retrieval-Augmented Generation，简称 Agentic RAG）是一种新兴的人工智能开发范式，其中 LLM 不仅从外部数据源中获取信息，还能自主规划下一步操作。与传统的静态“检索然后阅读”模式或精心设计的提示序列不同，Agentic RAG 采用了一种迭代调用 LLM 的循环模式，穿插工具或函数调用及结构化输出。在每一步，系统都会评估已获得的结果，决定是否需要优化查询、调用额外工具，并持续这一循环直到找到满意的解决方案。

这种迭代式“制造者-检查者”操作风格旨在提升准确性、处理格式错误的查询（例如 NL2SQL）并确保高质量的结果。与依赖精心设计的提示链不同，系统能够主动掌控其推理过程。它可以重写失败的查询、选择不同的检索方法并整合多种工具——例如 Azure AI Search 的向量搜索、SQL 数据库或自定义 API——在最终生成答案之前完成这些操作。这消除了对过于复杂的编排框架的需求。相反，通过一个相对简单的循环模式“LLM 调用 → 工具使用 → LLM 调用 → …”，即可生成复杂且可靠的输出。

![Agentic RAG 核心循环](../../../translated_images/agentic-rag-core-loop.2224925a913fb3439f518bda61a40096ddf6aa432a11c9b5bba8d0d625e47b79.zh.png)

## 掌控推理过程

让系统具备“代理型”能力的关键特性在于其能够掌控推理过程。传统的 RAG 实现通常依赖于人类预先定义的路径：一个思维链条，明确指出需要检索什么以及何时检索。
而真正的代理型系统则能够内部决定如何解决问题。它不只是执行脚本，而是根据所获取信息的质量自主决定步骤顺序。
例如，如果被要求创建一个产品发布策略，它不会仅仅依赖一个明确列出所有研究和决策工作流的提示。相反，代理型模型会自主决定：

1. 使用 Bing Web Grounding 检索当前市场趋势报告。
2. 使用 Azure AI Search 识别相关的竞争对手数据。
3. 使用 Azure SQL Database 关联历史内部销售指标。
4. 通过 Azure OpenAI Service 综合这些发现形成一个连贯的策略。
5. 评估策略是否存在漏洞或不一致之处，如有必要，进行新一轮的检索。
所有这些步骤——优化查询、选择数据源、迭代直到对答案“满意”为止——都是由模型自主决定，而非由人类预先编写脚本。

## 迭代循环、工具集成与记忆

![工具集成架构](../../../translated_images/tool-integration.7b05a923e3278bf1fd2972faa228fb2ac725f166ed084362b031a24bffd26287.zh.png)

代理型系统依赖于一种循环交互模式：

- **初始调用**：用户目标（即用户提示）被传递给 LLM。
- **工具调用**：如果模型发现信息缺失或指令含糊，它会选择一个工具或检索方法——例如向量数据库查询（如 Azure AI Search 的混合搜索私有数据）或结构化 SQL 调用——以获取更多上下文。
- **评估与优化**：在审查返回的数据后，模型会决定这些信息是否足够。如果不足，它会优化查询、尝试不同工具或调整方法。
- **重复直到满意**：此循环会持续进行，直到模型认为已获得足够的清晰度和证据，可以给出一个最终的、经过充分推理的响应。
- **记忆与状态**：由于系统在步骤之间保持状态和记忆，它可以回忆起之前的尝试及其结果，从而避免重复循环，并在推进过程中做出更明智的决策。

随着时间推移，这种方式创造了一种不断演进的理解，使得模型能够处理复杂的多步骤任务，而无需人类不断干预或重塑提示。

## 处理失败模式与自我纠正

Agentic RAG 的自主性还包括强大的自我纠正机制。当系统遇到瓶颈（例如检索到无关文档或遇到格式错误的查询）时，它可以：

- **迭代与重新查询**：模型不会返回低价值的响应，而是尝试新的搜索策略、重写数据库查询或查找替代数据集。
- **使用诊断工具**：系统可能调用额外的函数来帮助其调试推理步骤或确认检索数据的正确性。像 Azure AI Tracing 这样的工具对于实现强大的可观测性和监控将非常重要。
- **依赖人工监督**：对于高风险或反复失败的场景，模型可能会标记不确定性并请求人工指导。一旦人类提供了纠正反馈，模型可以将这一经验融入后续操作。

这种迭代和动态的方法使得模型能够不断改进，确保它不仅是一次性系统，而是能够在当前会话中从错误中学习的系统。

![自我纠正机制](../../../translated_images/self-correction.3d42c31baf4a476bb89313cec58efb196b0e97959c04d7439cc23d27ef1242ac.zh.png)

## 代理的边界

尽管在任务范围内具备一定的自主性，Agentic RAG 并不等同于通用人工智能（AGI）。其“代理型”能力局限于开发者提供的工具、数据源和策略。它无法自主创建新工具或超出已设定的领域边界。相反，它擅长动态协调现有资源。

与更高级 AI 形式的关键区别包括：

1. **领域特定的自主性**：Agentic RAG 系统专注于在已知领域内实现用户定义的目标，采用查询重写或工具选择等策略来优化结果。
2. **依赖基础设施**：系统的能力依赖于开发者集成的工具和数据。没有人类干预，它无法超越这些限制。
3. **遵守安全措施**：道德准则、合规规则和业务政策仍然非常重要。代理的自由始终受到安全措施和监督机制的约束（希望如此？）。

## 实际应用场景及价值

Agentic RAG 在需要迭代优化和精确性的场景中表现出色：

1. **以准确性为优先的环境**：在合规检查、法规分析或法律研究中，代理型模型可以反复验证事实、咨询多个来源并重写查询，直到生成经过充分验证的答案。
2. **复杂的数据库交互**：处理结构化数据时，查询可能经常失败或需要调整，系统可以通过 Azure SQL 或 Microsoft Fabric OneLake 自主优化查询，确保最终检索结果符合用户意图。
3. **扩展工作流**：随着新信息的出现，长时间运行的会话可能会不断演变。Agentic RAG 可以持续整合新数据，并在了解问题空间的过程中调整策略。

## 治理、透明性与信任

随着这些系统在推理上变得更加自主，治理和透明性至关重要：

- **可解释的推理**：模型可以提供其所做查询、所咨询来源及其推理步骤的审计记录。像 Azure AI Content Safety 和 Azure AI Tracing / GenAIOps 这样的工具可以帮助保持透明性并降低风险。
- **偏见控制与平衡检索**：开发者可以调整检索策略以确保考虑到平衡且具有代表性的数据源，并定期审核输出以检测偏见或不平衡模式，适用于使用 Azure Machine Learning 的高级数据科学组织。
- **人工监督与合规性**：对于敏感任务，人工审查仍然是必不可少的。Agentic RAG 并不会在高风险决策中取代人类判断，而是通过提供经过更充分验证的选项来增强人类决策。

拥有能够清晰记录操作的工具至关重要。否则，调试多步骤过程将变得非常困难。以下是来自 Literal AI（Chainlit 背后的公司）的代理运行示例：

![代理运行示例](../../../translated_images/AgentRunExample.27e2df23ad898772d1b3e7a3e3cd4615378e10dfda87ae8f06b4748bf8eea97d.zh.png)

![代理运行示例2](../../../translated_images/AgentRunExample2.c0e8c78b1f2540a641515e60035abcc6a9c5e3688bae143eb6c559dd37cdee9f.zh.png)

## 结论

Agentic RAG 代表了 AI 系统在处理复杂、数据密集型任务方面的一种自然演进。通过采用循环交互模式、自主选择工具并优化查询直到获得高质量结果，系统超越了静态的提示跟随，成为一种更具适应性和上下文感知的决策者。尽管仍然受限于人类定义的基础设施和伦理指南，这些代理型能力使企业和终端用户能够享受到更丰富、更动态、更有价值的 AI 交互。

## 其他资源

- 实现检索增强生成（RAG）与 Azure OpenAI 服务：学习如何使用 Azure OpenAI 服务与您自己的数据。[此 Microsoft Learn 模块提供了有关实现 RAG 的全面指南](https://learn.microsoft.com/training/modules/use-own-data-azure-openai)
- 使用 Azure AI Foundry 评估生成式 AI 应用程序：本文涵盖了基于公开可用数据集评估和比较模型的内容，包括 [代理型 AI 应用程序和 RAG 架构](https://learn.microsoft.com/azure/ai-studio/concepts/evaluation-approach-gen-ai)
- [What is Agentic RAG | Weaviate](https://weaviate.io/blog/what-is-agentic-rag)
- [Agentic RAG: A Complete Guide to Agent-Based Retrieval Augmented Generation – News from generation RAG](https://ragaboutit.com/agentic-rag-a-complete-guide-to-agent-based-retrieval-augmented-generation/)
- [Agentic RAG: turbocharge your RAG with query reformulation and self-query! Hugging Face Open-Source AI Cookbook](https://huggingface.co/learn/cookbook/agent_rag)
- [Adding Agentic Layers to RAG](https://youtu.be/aQ4yQXeB1Ss?si=2HUqBzHoeB5tR04U)
- [The Future of Knowledge Assistants: Jerry Liu](https://www.youtube.com/watch?v=zeAyuLc_f3Q&t=244s)
- [How to Build Agentic RAG Systems](https://www.youtube.com/watch?v=AOSjiXP1jmQ)
- [Using Azure AI Foundry Agent Service to scale your AI agents](https://ignite.microsoft.com/sessions/BRK102?source=sessions)

### 学术论文

- [2303.17651 Self-Refine: Iterative Refinement with Self-Feedback](https://arxiv.org/abs/2303.17651)
- [2303.11366 Reflexion: Language Agents with Verbal Reinforcement Learning](https://arxiv.org/abs/2303.11366)
- [2305.11738 CRITIC: Large Language Models Can Self-Correct with Tool-Interactive Critiquing](https://arxiv.org/abs/2305.11738)

**免责声明**：
本文件使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保翻译的准确性，但请注意，自动翻译可能包含错误或不准确之处。应以原始语言的文件为权威来源。对于关键信息，建议使用专业人工翻译。我们不对因使用此翻译而引起的任何误解或误读承担责任。


# 构建值得信赖的 AI 代理

## 简介

本课程将涵盖以下内容：

- 如何构建和部署安全且高效的 AI 代理。
- 开发 AI 代理时的重要安全注意事项。
- 如何在开发 AI 代理时维护数据和用户隐私。

## 学习目标

完成本课程后，您将能够：

- 识别并减轻在创建 AI 代理时可能面临的风险。
- 实施安全措施，确保数据和访问得到妥善管理。
- 创建既能维护数据隐私又能提供优质用户体验的 AI 代理。

## 安全性

首先，我们来看如何构建安全的代理型应用程序。安全性意味着 AI 代理能够按照设计执行任务。作为代理型应用程序的开发者，我们有一些方法和工具来最大化安全性：

### 构建元提示系统

如果您曾使用大型语言模型（LLMs）构建 AI 应用程序，您应该了解设计一个强大的系统提示或系统消息的重要性。这些提示定义了元规则、指令以及与用户和数据交互的指导方针。

对于 AI 代理来说，系统提示更为重要，因为它们需要非常具体的指令来完成我们为其设计的任务。

为了创建可扩展的系统提示，我们可以使用一个元提示系统来为应用程序中的一个或多个代理构建提示：

![构建元提示系统](../../../translated_images/building-a-metaprompting-system.aa7d6de2100b0ef48c3e1926dab6903026b22fc9d27fc4327162fbbb9caf960f.zh.png)

#### 第一步：创建元提示或模板提示

元提示将被提供给 LLM，用于生成我们为代理创建的系统提示。我们将其设计为模板，这样如果需要，可以高效地创建多个代理。

以下是我们可能提供给 LLM 的元提示示例：

```plaintext
You are an expert at creating AI agent assitants.
You will be provided a company name, role, responsibilites and other
information that you will use to provide a system prompt for.
To create the system prompt, be descriptive as possible and provide a structure that a system using an LLM can better understand the role and responsibilites of the AI assistant.
```

#### 第二步：创建基础提示

下一步是创建一个基础提示来描述 AI 代理。您应该包括代理的角色、代理需要完成的任务以及代理的其他职责。

示例如下：

```plaintext
You are a travel agent for Contoso Travel with that is great at booking flights for customers. To help customers you can perform the following tasks: lookup available flights, book flights, ask for preferences in seating and times for flights, cancel any previously booked flights and alert customers on any delays or cancellations of flights.
```

#### 第三步：将基础提示提供给 LLM

现在，我们可以通过将元提示作为系统提示，并结合基础提示来优化这个提示。

这将生成一个更适合指导 AI 代理的提示：

```markdown
**Company Name:** Contoso Travel
**Role:** Travel Agent Assistant

**Objective:**
You are an AI-powered travel agent assistant for Contoso Travel, specializing in booking flights and providing exceptional customer service. Your main goal is to assist customers in finding, booking, and managing their flights, all while ensuring that their preferences and needs are met efficiently.

**Key Responsibilities:**

1. **Flight Lookup:**

    - Assist customers in searching for available flights based on their specified destination, dates, and any other relevant preferences.
    - Provide a list of options, including flight times, airlines, layovers, and pricing.
2. **Flight Booking:**

    - Facilitate the booking of flights for customers, ensuring that all details are correctly entered into the system.
    - Confirm bookings and provide customers with their itinerary, including confirmation numbers and any other pertinent information.
3. **Customer Preference Inquiry:**

    - Actively ask customers for their preferences regarding seating (e.g., aisle, window, extra legroom) and preferred times for flights (e.g., morning, afternoon, evening).
    - Record these preferences for future reference and tailor suggestions accordingly.
4. **Flight Cancellation:**

    - Assist customers in canceling previously booked flights if needed, following company policies and procedures.
    - Notify customers of any necessary refunds or additional steps that may be required for cancellations.
5. **Flight Monitoring:**

    - Monitor the status of booked flights and alert customers in real-time about any delays, cancellations, or changes to their flight schedule.
    - Provide updates through preferred communication channels (e.g., email, SMS) as needed.

**Tone and Style:**

- Maintain a friendly, professional, and approachable demeanor in all interactions with customers.
- Ensure that all communication is clear, informative, and tailored to the customer's specific needs and inquiries.

**User Interaction Instructions:**

- Respond to customer queries promptly and accurately.
- Use a conversational style while ensuring professionalism.
- Prioritize customer satisfaction by being attentive, empathetic, and proactive in all assistance provided.

**Additional Notes:**

- Stay updated on any changes to airline policies, travel restrictions, and other relevant information that could impact flight bookings and customer experience.
- Use clear and concise language to explain options and processes, avoiding jargon where possible for better customer understanding.

This AI assistant is designed to streamline the flight booking process for customers of Contoso Travel, ensuring that all their travel needs are met efficiently and effectively.

```

#### 第四步：迭代与改进

这个元提示系统的价值在于能够更轻松地为多个代理扩展创建提示，并随着时间推移改进提示。很少有提示能在第一次就完全适用于您的用例。通过更改基础提示并将其运行通过系统，您可以进行小幅调整和改进，从而比较和评估结果。

## 理解威胁

要构建值得信赖的 AI 代理，理解并减轻可能对 AI 代理造成的风险和威胁是至关重要的。我们来看看一些常见的 AI 代理威胁以及如何更好地规划和应对它们。

![理解威胁](../../../translated_images/understanding-threats.f8fbe6fe11e025b3085fc91e82d975937ad1d672260a2aeed40458aa41798d0e.zh.png)

### 任务与指令

**描述：** 攻击者试图通过提示或操控输入来更改 AI 代理的指令或目标。

**缓解措施：** 执行验证检查和输入过滤，以检测潜在危险的提示，在它们被 AI 代理处理之前拦截。由于这类攻击通常需要频繁与代理交互，限制对话轮数也是防止此类攻击的有效方法。

### 对关键系统的访问

**描述：** 如果 AI 代理可以访问存储敏感数据的系统和服务，攻击者可能会破坏代理与这些服务之间的通信。这可能是直接攻击，也可能是通过代理间接获取这些系统的信息。

**缓解措施：** AI 代理应仅在需要时访问相关系统，以防止此类攻击。代理与系统之间的通信应确保安全。实施身份验证和访问控制也是保护信息的有效手段。

### 资源和服务过载

**描述：** AI 代理可以访问不同的工具和服务来完成任务。攻击者可能利用这一能力，通过代理发送大量请求来攻击这些服务，可能导致系统故障或高昂成本。

**缓解措施：** 实施策略以限制 AI 代理对服务的请求数量。限制对话轮数和请求次数也是防止此类攻击的另一种方法。

### 知识库污染

**描述：** 这种攻击并不直接针对 AI 代理，而是针对代理将使用的知识库和其他服务。这可能包括篡改代理完成任务所需的数据或信息，导致代理向用户提供偏颇或意外的响应。

**缓解措施：** 定期验证 AI 代理在其工作流程中使用的数据。确保对这些数据的访问是安全的，并且只有受信任的人员才能更改，以避免此类攻击。

### 连锁错误

**描述：** AI 代理依赖多种工具和服务来完成任务。攻击者引发的错误可能导致其他系统的故障，使攻击范围扩大且更难排查。

**缓解措施：** 一种避免方法是让 AI 代理在受限环境中运行，例如在 Docker 容器中执行任务，以防止直接系统攻击。创建回退机制和重试逻辑，以应对某些系统返回错误的情况，也是防止更大范围系统故障的有效手段。

## 人类参与

另一种构建值得信赖的 AI 代理系统的有效方法是引入“人类参与”机制。这种机制允许用户在代理运行过程中提供反馈。用户实际上充当了多代理系统中的一个代理，可以批准或终止运行的流程。

![人类参与](../../../translated_images/human-in-the-loop.e9edbe8f6d42041b4213421410823250aa750fe8bdba5601d69ed46f3ff6489d.zh.png)

以下是一个使用 AutoGen 实现此概念的代码示例：

```python

# Create the agents.
model_client = OpenAIChatCompletionClient(model="gpt-4o-mini")
assistant = AssistantAgent("assistant", model_client=model_client)
user_proxy = UserProxyAgent("user_proxy", input_func=input)  # Use input() to get user input from console.

# Create the termination condition which will end the conversation when the user says "APPROVE".
termination = TextMentionTermination("APPROVE")

# Create the team.
team = RoundRobinGroupChat([assistant, user_proxy], termination_condition=termination)

# Run the conversation and stream to the console.
stream = team.run_stream(task="Write a 4-line poem about the ocean.")
# Use asyncio.run(...) when running in a script.
await Console(stream)

```

**免责声明**：
本文件使用基于机器的人工智能翻译服务进行翻译。尽管我们力求准确，但请注意，自动翻译可能包含错误或不准确之处。应以原文的母语版本为权威来源。对于关键信息，建议寻求专业人工翻译服务。对于因使用本翻译而引起的任何误解或误读，我们概不负责。

10 Lessons to Get Started Building AI Agents


# 规划设计

## 简介

本课程将涵盖以下内容：

* 明确总体目标，并将复杂任务拆解为可管理的子任务。
* 利用结构化输出以生成更可靠且机器可读的响应。
* 应用事件驱动的方法来处理动态任务和意外输入。

## 学习目标

完成本课程后，您将能够：

* 为 AI 代理设定一个明确的总体目标，确保它清楚需要实现的内容。
* 将复杂任务分解为可管理的子任务，并以逻辑顺序组织它们。
* 为代理配备合适的工具（例如搜索工具或数据分析工具），决定何时以及如何使用这些工具，并处理可能出现的意外情况。
* 评估子任务的结果，衡量性能，并通过迭代改进最终输出。

## 定义总体目标并分解任务

![定义目标与任务](../../../translated_images/defining-goals-tasks.dcc1181bbdb194704ae0fb3363371562949e8b03fd2fadc256218aaadf84a9f4.zh.png)

大多数现实世界的任务都过于复杂，无法一步完成。AI 代理需要一个简洁的目标来指导其规划和行动。例如，考虑以下目标：

    "生成一个为期三天的旅行行程。"

尽管这个目标表述得很简单，但它仍然需要进一步细化。目标越清晰，代理（以及任何人类协作者）就越能够专注于实现正确的结果，例如创建一个包含航班选项、酒店推荐和活动建议的全面行程。

### 任务分解

将大型或复杂的任务分解为更小的、以目标为导向的子任务，可以使其更易于管理。
以旅行行程为例，您可以将目标分解为：

* 航班预订
* 酒店预订
* 租车服务
* 个性化定制

每个子任务都可以由专门的代理或流程处理。例如，一个代理可能专注于寻找最佳航班优惠，另一个代理则负责酒店预订，等等。然后，一个协调或“下游”代理可以将这些结果整合成一个连贯的行程，供最终用户使用。

这种模块化方法还允许逐步改进。例如，您可以添加专门的代理来提供美食推荐或本地活动建议，从而随着时间的推移不断优化行程。

### 结构化输出

大型语言模型（LLMs）可以生成结构化输出（例如 JSON），这使得下游代理或服务更容易解析和处理。这在多代理环境中特别有用，我们可以在收到规划输出后执行这些任务。请参考此 [博客文章](https://microsoft.github.io/autogen/stable/user-guide/core-user-guide/cookbook/structured-output-agent.html) 以快速了解相关内容。

以下是一个简单规划代理的 Python 代码片段示例，它将目标分解为子任务并生成结构化计划：

### 多代理协作的规划代理

在此示例中，一个语义路由代理接收用户请求（例如，“我需要一个旅行的酒店计划。”）。

规划过程如下：

* 接收酒店计划：规划代理接收用户的消息，并基于系统提示（包括可用代理的详细信息）生成结构化的旅行计划。
* 列出代理及其工具：代理注册表保存了一份代理列表（例如航班、酒店、租车和活动代理）以及它们提供的功能或工具。
* 将计划分配给相应的代理：根据子任务的数量，规划代理会直接将消息发送给专门的代理（针对单任务场景），或者通过群聊管理器协调多代理协作。
* 总结结果：最后，规划代理总结生成的计划以确保清晰明了。

以下是展示这些步骤的 Python 代码示例：

```python

from pydantic import BaseModel

from enum import Enum
from typing import List, Optional, Union

class AgentEnum(str, Enum):
    FlightBooking = "flight_booking"
    HotelBooking = "hotel_booking"
    CarRental = "car_rental"
    ActivitiesBooking = "activities_booking"
    DestinationInfo = "destination_info"
    DefaultAgent = "default_agent"
    GroupChatManager = "group_chat_manager"

# Travel SubTask Model

class TravelSubTask(BaseModel):
    task_details: str
    assigned_agent: AgentEnum # we want to assign the task to the agent

class TravelPlan(BaseModel):
    main_task: str
    subtasks: List[TravelSubTask]
    is_greeting: bool
import json
import os
from typing import Optional

from autogen_core.models import UserMessage, SystemMessage, AssistantMessage
from autogen_ext.models.openai import AzureOpenAIChatCompletionClient

# Create the client with type-checked environment variables

client = AzureOpenAIChatCompletionClient(
    azure_deployment=os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME"),
    model=os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME"),
    api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
    azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),
)

from pprint import pprint

# Define the user message

messages = [
    SystemMessage(content="""You are an planner agent.
    Your job is to decide which agents to run based on the user's request.
    Below are the available agents specialised in different tasks:
    - FlightBooking: For booking flights and providing flight information
    - HotelBooking: For booking hotels and providing hotel information
    - CarRental: For booking cars and providing car rental information
    - ActivitiesBooking: For booking activities and providing activity information
    - DestinationInfo: For providing information about destinations
    - DefaultAgent: For handling general requests""", source="system"),
    UserMessage(content="Create a travel plan for a family of 2 kids from Singapore to Melbourne", source="user"),
]

response = await client.create(messages=messages, extra_create_args={"response_format": TravelPlan})

# Ensure the response content is a valid JSON string before loading it

response_content: Optional[str] = response.content if isinstance(response.content, str) else None
if response_content is None:
    raise ValueError("Response content is not a valid JSON string")

# Print the response content after loading it as JSON

pprint(json.loads(response_content))
```

上述代码的输出如下，您可以使用此结构化输出将任务路由到 `assigned_agent` 并向最终用户总结旅行计划：

```json
{
    "is_greeting": "False",
    "main_task": "Plan a family trip from Singapore to Melbourne.",
    "subtasks": [
        {
            "assigned_agent": "flight_booking",
            "task_details": "Book round-trip flights from Singapore to Melbourne."
        },
        {
            "assigned_agent": "hotel_booking",
            "task_details": "Find family-friendly hotels in Melbourne."
        },
        {
            "assigned_agent": "car_rental",
            "task_details": "Arrange a car rental suitable for a family of four in Melbourne."
        },
        {
            "assigned_agent": "activities_booking",
            "task_details": "List family-friendly activities in Melbourne."
        },
        {
            "assigned_agent": "destination_info",
            "task_details": "Provide information about Melbourne as a travel destination."
        }
    ]
}
```

包含上述代码示例的示例笔记本可在 [这里](../../../07-planning-design/code_samples/07-autogen.ipynb) 获取。

### 迭代规划

某些任务需要反复调整或重新规划，其中一个子任务的结果可能会影响下一个子任务。例如，如果代理在预订航班时发现了意外的数据格式，它可能需要在继续酒店预订之前调整其策略。

此外，用户反馈（例如用户决定选择更早的航班）可能会触发部分重新规划。这种动态、迭代的方法可以确保最终解决方案符合现实世界的约束和不断变化的用户偏好。

例如，示例代码：

    ```python
    from autogen_core.models import UserMessage, SystemMessage, AssistantMessage
    #.. same as previous code and pass on the user history, current plan
    messages = [
        SystemMessage(content="""You are a planner agent to optimize the
        Your job is to decide which agents to run based on the user's request.
        Below are the available agents specialised in different tasks:
        - FlightBooking: For booking flights and providing flight information
        - HotelBooking: For booking hotels and providing hotel information
        - CarRental: For booking cars and providing car rental information
        - ActivitiesBooking: For booking activities and providing activity information
        - DestinationInfo: For providing information about destinations
        - DefaultAgent: For handling general requests""", source="system"),
        UserMessage(content="Create a travel plan for a family of 2 kids from Singapore to Melboune", source="user"),
        AssistantMessage(content=f"Previous travel plan - {TravelPlan}", source="assistant")
    ]
    # .. re-plan and send the tasks to respective agents
    ```

有关更全面的规划，请参考 Magnetic One 的 [博客文章](https://www.microsoft.com/research/articles/magentic-one-a-generalist-multi-agent-system-for-solving-complex-tasks)，以了解如何解决复杂任务。

## 总结

本文展示了如何创建一个能够动态选择定义代理的规划器。规划器的输出会将任务分解并分配给代理以执行任务。假设这些代理能够访问执行任务所需的功能/工具。除了代理之外，您还可以包括其他模式，例如反思、总结器、轮询聊天等，以进一步自定义。

## 其他资源

* 使用 o1 推理模型在规划复杂任务中表现出了相当高的先进性——TODO: 分享示例？

* Autogen Magnetic One - 一种通用多代理系统，用于解决复杂任务，并在多个具有挑战性的代理基准测试中取得了令人印象深刻的成果。参考：[autogen-magentic-one](https://github.com/microsoft/autogen/tree/main/python/packages/autogen-magentic-one)。在此实现中，协调器会创建特定任务的计划，并将这些任务委派给可用代理。除了规划之外，协调器还采用了一种跟踪机制来监控任务进度，并根据需要重新规划。

**免责声明**：
本文档通过基于机器的人工智能翻译服务进行翻译。虽然我们尽力确保准确性，但请注意，自动翻译可能包含错误或不准确之处。应以原文档的原始语言版本为权威来源。对于关键信息，建议使用专业的人类翻译服务。对于因使用此翻译而引起的任何误解或误读，我们概不负责。


# 多代理设计模式

当你开始一个涉及多个代理的项目时，就需要考虑多代理设计模式。然而，何时切换到多代理模式以及它的优势可能并不一目了然。

## 引言

在本课中，我们将尝试解答以下问题：

- 哪些场景适合应用多代理模式？
- 多代理相较于单一代理处理多个任务有什么优势？
- 实现多代理设计模式的核心构建模块是什么？
- 我们如何掌握多个代理之间的交互情况？

## 学习目标

完成本课后，你应该能够：

- 识别适合应用多代理模式的场景。
- 理解多代理相较于单一代理的优势。
- 掌握实现多代理设计模式的核心构建模块。

更大的意义是什么？

*多代理是一种设计模式，允许多个代理协同工作以实现共同目标。*

这一模式广泛应用于多个领域，包括机器人技术、自动化系统和分布式计算等。

## 多代理适用的场景

那么，哪些场景适合使用多代理模式呢？答案是有很多场景可以从多个代理的应用中受益，尤其是在以下情况下：

- **大规模工作负载**：大规模的工作负载可以被分解为较小的任务，并分配给不同的代理，从而实现并行处理并加快完成速度。例如，大型数据处理任务就属于这一类。
- **复杂任务**：复杂任务可以像大规模工作负载一样被分解为多个子任务，并分配给专注于特定方面的不同代理。例如，在自动驾驶汽车中，不同的代理分别负责导航、障碍物检测以及与其他车辆的通信。
- **多样化的专业技能**：不同的代理可以具备不同的专业技能，从而比单一代理更有效地处理任务的不同方面。例如，在医疗领域，代理可以分别负责诊断、制定治疗方案以及患者监测。

## 多代理相较于单一代理的优势

单一代理系统在处理简单任务时可能表现良好，但对于更复杂的任务，使用多个代理可以带来以下几个优势：

- **专业化**：每个代理可以专注于特定任务。而单一代理缺乏专业化，可能会在面对复杂任务时感到困惑。例如，它可能执行一个并不擅长的任务。
- **可扩展性**：通过增加更多代理来扩展系统比让单一代理超负荷工作更容易。
- **容错性**：如果一个代理失败，其他代理可以继续运行，从而确保系统的可靠性。

举个例子，假设我们为用户预订一次旅行。单一代理系统需要处理旅行预订过程的所有方面，从搜索航班到预订酒店和租车。如果由单一代理完成，这个代理需要具备处理所有这些任务的工具。这可能导致系统复杂且难以维护和扩展。而多代理系统可以分别让不同的代理专注于搜索航班、预订酒店和租车。这使得系统更加模块化、易于维护且具有可扩展性。

这可以类比为一个家庭式旅行社与连锁旅行社的对比。家庭式旅行社由一个代理处理旅行预订的所有方面，而连锁旅行社则由不同的代理分别处理不同方面的预订。

## 实现多代理设计模式的核心构建模块

在实现多代理设计模式之前，你需要了解构成这一模式的核心构建模块。

让我们通过再次审视用户旅行预订的例子来使这一点更加具体。在这种情况下，核心构建模块包括：

- **代理通信**：负责搜索航班、预订酒店和租车的代理需要相互通信并共享用户的偏好和限制条件。你需要决定这些通信的协议和方法。具体而言，负责搜索航班的代理需要与负责预订酒店的代理沟通，以确保酒店的预订日期与航班日期一致。这意味着代理需要共享用户的旅行日期，因此你需要决定*哪些代理共享信息以及如何共享信息*。
- **协调机制**：代理需要协调它们的行为以确保满足用户的偏好和限制。例如，用户可能偏好靠近机场的酒店，而限制条件可能是租车只能在机场提取。这意味着负责预订酒店的代理需要与负责租车的代理协调，以确保用户的偏好和限制得到满足。因此你需要决定*代理如何协调它们的行为*。
- **代理架构**：代理需要具备内部结构来做出决策并从与用户的交互中学习。例如，负责搜索航班的代理需要具备内部结构来决定向用户推荐哪些航班。这意味着你需要决定*代理如何做出决策并从与用户的交互中学习*。例如，负责搜索航班的代理可以使用机器学习模型，根据用户过去的偏好向其推荐航班。
- **多代理交互的可视性**：你需要能够掌握多个代理之间的交互情况。这意味着你需要工具和技术来跟踪代理的活动和交互。这可以通过日志记录和监控工具、可视化工具以及性能指标来实现。
- **多代理模式**：实现多代理系统可以采用不同的模式，例如集中式、分散式和混合式架构。你需要选择最适合你的用例的模式。
- **人类参与**：在大多数情况下，你需要在系统中保留人类参与，并指示代理在需要时请求人类介入。例如，用户可能会要求预订一个代理未推荐的特定酒店或航班，或者在预订前要求确认。

## 多代理交互的可视性

了解多个代理之间的交互情况非常重要。这种可视性对于调试、优化以及确保整体系统的有效性至关重要。为此，你需要工具和技术来跟踪代理的活动和交互。这可以通过日志记录和监控工具、可视化工具以及性能指标来实现。

例如，在用户旅行预订的场景中，你可以使用一个仪表板来显示每个代理的状态、用户的偏好和限制条件，以及代理之间的交互情况。这个仪表板可以显示用户的旅行日期、航班代理推荐的航班、酒店代理推荐的酒店以及租车代理推荐的租车选项。这将为你提供一个清晰的视图，了解代理之间的交互情况以及是否满足了用户的偏好和限制条件。

让我们更详细地看看这些方面：

- **日志记录和监控工具**：你需要为每个代理的每个动作进行日志记录。日志条目可以存储代理执行的动作、动作的时间以及动作的结果等信息。这些信息可以用于调试、优化等。
- **可视化工具**：可视化工具可以帮助你以更直观的方式查看代理之间的交互。例如，你可以使用图表展示代理之间的信息流。这可以帮助你识别系统中的瓶颈、低效以及其他问题。
- **性能指标**：性能指标可以帮助你跟踪多代理系统的有效性。例如，你可以跟踪完成任务所需的时间、每单位时间完成的任务数量以及代理推荐的准确性。这些信息可以帮助你识别改进空间并优化系统。

## 多代理模式

让我们探讨一些可以用于创建多代理应用的具体模式。以下是一些值得考虑的有趣模式：

### 群聊

这种模式适用于创建一个群聊应用，其中多个代理可以相互通信。典型的使用场景包括团队协作、客户支持和社交网络。

在这种模式中，每个代理代表群聊中的一个用户，消息通过某种消息协议在代理之间交换。代理可以向群聊发送消息、从群聊接收消息以及响应其他代理的消息。

这种模式可以通过集中式架构（所有消息通过中央服务器路由）或分散式架构（消息直接交换）实现。

![群聊](../../../translated_images/multi-agent-group-chat.82d537c5c8dc833abbd252033e60874bc9d00df7193888b3377f8426449a0b20.zh.png)

### 任务交接

这种模式适用于创建一个应用，其中多个代理可以相互交接任务。

典型的使用场景包括客户支持、任务管理和工作流自动化。

在这种模式中，每个代理代表一个任务或工作流中的一个步骤，代理可以根据预定义规则将任务交接给其他代理。

![任务交接](../../../translated_images/multi-agent-hand-off.ed4f0a5a58614a8a3e962fc476187e630a3ba309d066e460f017b503d0b84cfc.zh.png)

### 协作过滤

这种模式适用于创建一个应用，其中多个代理可以协作为用户提供推荐。

为什么需要多个代理协作？因为每个代理可以拥有不同的专业技能，并以不同的方式为推荐过程做出贡献。

例如，用户想要获得关于股市中最佳股票的推荐：

- **行业专家**：一个代理可以是某个特定行业的专家。
- **技术分析**：另一个代理可以是技术分析的专家。
- **基本面分析**：还有一个代理可以是基本面分析的专家。通过协作，这些代理可以为用户提供更全面的推荐。

![推荐](../../../translated_images/multi-agent-filtering.719217d169391ddb118bbb726b19d4d89ee139f960f8749ccb2400efb4d0ce79.zh.png)

## 场景：退款流程

考虑一个客户尝试为某产品申请退款的场景，这一流程可能涉及多个代理。我们可以将这些代理分为专门针对退款流程的代理和可以用于其他流程的通用代理。

**专门针对退款流程的代理**：

以下是一些可能参与退款流程的代理：

- **客户代理**：代表客户，负责启动退款流程。
- **卖家代理**：代表卖家，负责处理退款。
- **支付代理**：代表支付流程，负责退还客户的付款。
- **解决方案代理**：代表问题解决流程，负责解决退款流程中出现的任何问题。
- **合规代理**：代表合规流程，负责确保退款流程符合相关法规和政策。

**通用代理**：

这些代理可以用于业务的其他部分。

- **物流代理**：代表物流流程，负责将产品退回给卖家。该代理既可以用于退款流程，也可以用于例如购买时的物流。
- **反馈代理**：代表反馈流程，负责收集客户的反馈。反馈可以在任何时候进行，而不仅限于退款流程。
- **升级代理**：代表升级流程，负责将问题升级到更高级别的支持。该代理可用于任何需要升级问题的流程。
- **通知代理**：代表通知流程，负责在退款流程的各个阶段向客户发送通知。
- **分析代理**：代表分析流程，负责分析与退款流程相关的数据。
- **审计代理**：代表审计流程，负责审计退款流程以确保其正确执行。
- **报告代理**：代表报告流程，负责生成退款流程的报告。
- **知识代理**：代表知识流程，负责维护与退款流程相关的信息知识库。此代理不仅可以掌握退款相关知识，还可以掌握业务的其他部分。
- **安全代理**：代表安全流程，负责确保退款流程的安全性。
- **质量代理**：代表质量流程，负责确保退款流程的质量。

以上列出了许多代理，包括专门针对退款流程的代理以及可以用于业务其他部分的通用代理。希望这些例子能帮助你了解如何为你的多代理系统决定使用哪些代理。

## 练习

这一课的练习是什么？

设计一个用于客户支持流程的多代理系统。确定流程中涉及的代理、它们的角色和职责，以及它们如何相互交互。既要考虑专门针对客户支持流程的代理，也要考虑可以用于业务其他部分的通用代理。

> 在查看下面的解决方案之前，先自己思考一下，你可能需要比预想中更多的代理。

> TIP：思考客户支持流程的不同阶段，同时考虑任何系统可能需要的代理。

## 解决方案

[解决方案](./solution/solution.md)

## 知识检查

问题：何时应该考虑使用多代理？

- [] A1: 当你有小型工作负载和简单任务时。
- [] A2: 当你有大型工作负载时。
- [] A3: 当你有简单任务时。

[测试解决方案](./solution/solution-quiz.md)

## 总结

在本课中，我们探讨了多代理设计模式，包括多代理适用的场景、多代理相较于单一代理的优势、实现多代理设计模式的核心构建模块，以及如何掌握多个代理之间的交互情况。

## 其他资源

- [Autogen设计模式](https://microsoft.github.io/autogen/stable/user-guide/core-user-guide/design-patterns/intro.html)
- [Agentic设计模式](https://www.analyticsvidhya.com/blog/2024/10/agentic-design-patterns/)

**免责声明**：
本文件使用基于机器的人工智能翻译服务进行翻译。尽管我们尽力确保准确性，但请注意，自动翻译可能包含错误或不准确之处。应以原始语言的文件作为权威来源。对于关键信息，建议使用专业人工翻译。对于因使用本翻译而引起的任何误解或误读，我们概不负责。


# 元认知在人工智能代理中的应用

## 介绍

欢迎学习关于人工智能代理中元认知的课程！本章专为对人工智能代理如何思考其自身思维过程感兴趣的初学者设计。在本课结束时，您将理解关键概念，并掌握将元认知应用于人工智能代理设计的实际示例。

## 学习目标

完成本课程后，您将能够：
1. 理解代理定义中推理循环的影响。
2. 使用计划和评估技术帮助自我纠正的代理。
3. 创建能够操控代码完成任务的代理。

## 元认知简介

元认知是指涉及思考自己思维的高级认知过程。对于人工智能代理来说，这意味着能够基于自我意识和过去的经验来评估和调整其行为。

### 什么是元认知？

元认知，或称“思考思维”，是一种高级认知过程，涉及对自身认知过程的自我意识和自我调节。在人工智能领域，元认知使代理能够评估和调整其策略和行为，从而提升问题解决和决策能力。通过理解元认知，您可以设计出不仅更智能，而且更具适应性和效率的人工智能代理。

### 元认知在人工智能代理中的重要性

元认知在人工智能代理设计中具有重要作用，主要体现在以下几个方面：

![元认知的重要性](../../../translated_images/importance-of-metacognition.e351a5983bb745d60a1a60185391a39a6751d033c8c1948ceb6ad04eff7dbeac.zh.png)

- **自我反思**：代理可以评估自身表现并找出改进的地方。
- **适应性**：代理可以根据过去的经验和不断变化的环境调整其策略。
- **错误修正**：代理可以自主检测和纠正错误，从而提高结果的准确性。
- **资源管理**：代理可以通过规划和评估行为来优化资源的使用，例如时间和计算能力。

## 人工智能代理的组成部分

在深入探讨元认知过程之前，首先需要了解人工智能代理的基本组成部分。一个人工智能代理通常包括：
- **角色**：代理的个性和特征，定义其与用户的交互方式。
- **工具**：代理可以执行的能力和功能。
- **技能**：代理所具备的知识和专业能力。

这些组件协同工作，创建一个能够执行特定任务的“专业单元”。

**示例**：考虑一个旅行代理服务，该代理不仅计划您的假期，还能根据实时数据和过去的客户旅程经验调整路径。

### 示例：旅行代理服务中的元认知

假设您正在设计一个由人工智能驱动的旅行代理服务。该代理“旅行代理”协助用户规划假期。为了融入元认知，“旅行代理”需要基于自我意识和过去的经验来评估和调整其行为。

#### 当前任务

当前任务是帮助用户规划去巴黎的旅行。

#### 完成任务的步骤

1. **收集用户偏好**：询问用户的旅行日期、预算、兴趣（例如博物馆、美食、购物）以及任何具体需求。
2. **检索信息**：搜索符合用户偏好的航班、住宿、景点和餐馆。
3. **生成推荐**：提供包含航班详情、酒店预订和建议活动的个性化行程。
4. **根据反馈调整**：询问用户对推荐的反馈，并进行必要的调整。

#### 所需资源

- 访问航班和酒店预订数据库。
- 巴黎景点和餐馆的信息。
- 之前交互中的用户反馈数据。

#### 经验和自我反思

“旅行代理”通过元认知评估其表现并从过去的经验中学习。例如：

1. **分析用户反馈**：旅行代理会审查用户反馈，以确定哪些推荐受到欢迎，哪些不受欢迎，并据此调整未来的建议。
2. **适应性**：如果用户之前提到不喜欢拥挤的地方，旅行代理会在未来避免在高峰时段推荐热门景点。
3. **错误修正**：如果旅行代理在过去的预订中出现错误，例如推荐了已满的酒店，它会学习在推荐之前更严格地检查可用性。

#### 实际开发示例

以下是旅行代理在融入元认知时的代码简化示例：

```python
class Travel_Agent:
    def __init__(self):
        self.user_preferences = {}
        self.experience_data = []

    def gather_preferences(self, preferences):
        self.user_preferences = preferences

    def retrieve_information(self):
        # Search for flights, hotels, and attractions based on preferences
        flights = search_flights(self.user_preferences)
        hotels = search_hotels(self.user_preferences)
        attractions = search_attractions(self.user_preferences)
        return flights, hotels, attractions

    def generate_recommendations(self):
        flights, hotels, attractions = self.retrieve_information()
        itinerary = create_itinerary(flights, hotels, attractions)
        return itinerary

    def adjust_based_on_feedback(self, feedback):
        self.experience_data.append(feedback)
        # Analyze feedback and adjust future recommendations
        self.user_preferences = adjust_preferences(self.user_preferences, feedback)

# Example usage
travel_agent = Travel_Agent()
preferences = {
    "destination": "Paris",
    "dates": "2025-04-01 to 2025-04-10",
    "budget": "moderate",
    "interests": ["museums", "cuisine"]
}
travel_agent.gather_preferences(preferences)
itinerary = travel_agent.generate_recommendations()
print("Suggested Itinerary:", itinerary)
feedback = {"liked": ["Louvre Museum"], "disliked": ["Eiffel Tower (too crowded)"]}
travel_agent.adjust_based_on_feedback(feedback)
```

#### 元认知为何重要

- **自我反思**：代理可以分析其表现并找出改进的地方。
- **适应性**：代理可以根据反馈和变化的条件调整策略。
- **错误修正**：代理可以自主检测和纠正错误。
- **资源管理**：代理可以优化资源使用，例如时间和计算能力。

通过融入元认知，“旅行代理”可以提供更个性化和准确的旅行推荐，从而提升整体用户体验。

---

## 2. 代理中的规划

规划是人工智能代理行为的关键组成部分。它涉及根据当前状态、资源和可能的障碍来制定实现目标的步骤。

### 规划的要素

- **当前任务**：明确定义任务。
- **完成任务的步骤**：将任务分解为可管理的步骤。
- **所需资源**：确定必要的资源。
- **经验**：利用过去的经验来指导规划。

**示例**：以下是“旅行代理”在有效协助用户规划旅行时需要采取的步骤：

### 旅行代理的步骤

1. **收集用户偏好**
   - 询问用户关于旅行日期、预算、兴趣和任何具体需求的详细信息。
   - 示例：“您计划什么时候旅行？”“您的预算范围是多少？”“您在假期中喜欢哪些活动？”

2. **检索信息**
   - 根据用户偏好搜索相关的旅行选项。
   - **航班**：寻找符合用户预算和偏好的航班。
   - **住宿**：找到符合用户对位置、价格和设施要求的酒店或租赁房产。
   - **景点和餐馆**：识别与用户兴趣一致的热门景点、活动和餐饮选择。

3. **生成推荐**
   - 将检索到的信息编制成个性化行程。
   - 提供航班选项、酒店预订和建议活动的详细信息，确保推荐符合用户偏好。

4. **向用户展示行程**
   - 与用户分享拟议的行程以供审查。
   - 示例：“这是为您巴黎之行建议的行程，包括航班详情、酒店预订以及推荐的活动和餐馆。请告诉我您的想法！”

5. **收集反馈**
   - 询问用户对拟议行程的反馈。
   - 示例：“您喜欢这些航班选项吗？”“酒店是否符合您的需求？”“是否有您想添加或删除的活动？”

6. **根据反馈调整**
   - 根据用户反馈修改行程。
   - 对航班、住宿和活动推荐进行必要的更改，以更好地符合用户偏好。

7. **最终确认**
   - 向用户展示更新后的行程以供最终确认。
   - 示例：“我已根据您的反馈进行了调整。这是更新后的行程。您觉得如何？”

8. **预订并确认**
   - 在用户批准行程后，进行航班、住宿和任何预定活动的预订。
   - 将确认详情发送给用户。

9. **提供持续支持**
   - 在用户旅行前和旅行期间，随时协助处理任何更改或额外请求。
   - 示例：“如果您在旅行期间需要任何进一步的帮助，请随时与我联系！”

### 示例交互

```python
class Travel_Agent:
    def __init__(self):
        self.user_preferences = {}
        self.experience_data = []

    def gather_preferences(self, preferences):
        self.user_preferences = preferences

    def retrieve_information(self):
        flights = search_flights(self.user_preferences)
        hotels = search_hotels(self.user_preferences)
        attractions = search_attractions(self.user_preferences)
        return flights, hotels, attractions

    def generate_recommendations(self):
        flights, hotels, attractions = self.retrieve_information()
        itinerary = create_itinerary(flights, hotels, attractions)
        return itinerary

    def adjust_based_on_feedback(self, feedback):
        self.experience_data.append(feedback)
        self.user_preferences = adjust_preferences(self.user_preferences, feedback)

# Example usage within a booing request
travel_agent = Travel_Agent()
preferences = {
    "destination": "Paris",
    "dates": "2025-04-01 to 2025-04-10",
    "budget": "moderate",
    "interests": ["museums", "cuisine"]
}
travel_agent.gather_preferences(preferences)
itinerary = travel_agent.generate_recommendations()
print("Suggested Itinerary:", itinerary)
feedback = {"liked": ["Louvre Museum"], "disliked": ["Eiffel Tower (too crowded)"]}
travel_agent.adjust_based_on_feedback(feedback)
```

## 3. 校正型 RAG 系统

首先，让我们了解 RAG 工具与预加载上下文的区别：

![RAG 与上下文加载对比](../../../translated_images/rag-vs-context.9bb2b76d17aeba1489ad2a43ddbc9cd20e7ada4e4871cc99c63a498aa0ff70f7.zh.png)

### 检索增强生成（RAG）

RAG 将检索系统与生成模型结合。当提出查询时，检索系统从外部来源获取相关文档或数据，并使用这些检索到的信息增强生成模型的输入。这有助于模型生成更准确和上下文相关的响应。

在 RAG 系统中，代理从知识库中检索相关信息，并利用这些信息生成适当的响应或行动。

### 校正型 RAG 方法

校正型 RAG 方法专注于使用 RAG 技术来纠正错误并提高人工智能代理的准确性。这包括：

1. **提示技术**：使用特定提示指导代理检索相关信息。
2. **工具**：实施使代理能够评估检索信息相关性并生成准确响应的算法和机制。
3. **评估**：持续评估代理的表现，并进行调整以提高其准确性和效率。

#### 示例：搜索代理中的校正型 RAG

考虑一个从网络检索信息以回答用户查询的搜索代理。校正型 RAG 方法可能涉及：

1. **提示技术**：根据用户输入制定搜索查询。
2. **工具**：使用自然语言处理和机器学习算法对搜索结果进行排序和过滤。
3. **评估**：分析用户反馈以识别和纠正检索信息中的不准确之处。

### 校正型 RAG 在旅行代理中的应用

校正型 RAG（检索增强生成）增强了人工智能在检索和生成信息时纠正任何不准确之处的能力。以下是“旅行代理”如何使用校正型 RAG 方法提供更准确和相关的旅行推荐：

这包括：
- **提示技术**：使用特定提示指导代理检索相关信息。
- **工具**：实施使代理能够评估检索信息相关性并生成准确响应的算法和机制。
- **评估**：持续评估代理的表现，并进行调整以提高其准确性和效率。

#### 在旅行代理中实施校正型 RAG 的步骤

1. **初始用户交互**
   - “旅行代理”收集用户的初始偏好，例如目的地、旅行日期、预算和兴趣。
   - 示例：```python
     preferences = {
         "destination": "Paris",
         "dates": "2025-04-01 to 2025-04-10",
         "budget": "moderate",
         "interests": ["museums", "cuisine"]
     }
     ```

2. **信息检索**
   - “旅行代理”根据用户偏好检索有关航班、住宿、景点和餐馆的信息。
   - 示例：```python
     flights = search_flights(preferences)
     hotels = search_hotels(preferences)
     attractions = search_attractions(preferences)
     ```

3. **生成初始推荐**
   - “旅行代理”利用检索到的信息生成个性化行程。
   - 示例：```python
     itinerary = create_itinerary(flights, hotels, attractions)
     print("Suggested Itinerary:", itinerary)
     ```

4. **收集用户反馈**
   - “旅行代理”询问用户对初始推荐的反馈。
   - 示例：```python
     feedback = {
         "liked": ["Louvre Museum"],
         "disliked": ["Eiffel Tower (too crowded)"]
     }
     ```

5. **校正型 RAG 过程**
   - **提示技术**：
```
```markdown
旅行代理根据用户反馈制定新的搜索查询。
- 示例：```python
       if "disliked" in feedback:
           preferences["avoid"] = feedback["disliked"]
       ```
- **工具**：旅行代理使用算法对新的搜索结果进行排名和筛选，强调基于用户反馈的相关性。
- 示例：```python
       new_attractions = search_attractions(preferences)
       new_itinerary = create_itinerary(flights, hotels, new_attractions)
       print("Updated Itinerary:", new_itinerary)
       ```
- **评估**：旅行代理通过分析用户反馈并进行必要的调整，持续评估其推荐的相关性和准确性。
- 示例：```python
       def adjust_preferences(preferences, feedback):
           if "liked" in feedback:
               preferences["favorites"] = feedback["liked"]
           if "disliked" in feedback:
               preferences["avoid"] = feedback["disliked"]
           return preferences

       preferences = adjust_preferences(preferences, feedback)
       ```

#### 实用示例
以下是一个结合纠正型RAG方法的简化Python代码示例，用于旅行代理：
```python
class Travel_Agent:
    def __init__(self):
        self.user_preferences = {}
        self.experience_data = []

    def gather_preferences(self, preferences):
        self.user_preferences = preferences

    def retrieve_information(self):
        flights = search_flights(self.user_preferences)
        hotels = search_hotels(self.user_preferences)
        attractions = search_attractions(self.user_preferences)
        return flights, hotels, attractions

    def generate_recommendations(self):
        flights, hotels, attractions = self.retrieve_information()
        itinerary = create_itinerary(flights, hotels, attractions)
        return itinerary

    def adjust_based_on_feedback(self, feedback):
        self.experience_data.append(feedback)
        self.user_preferences = adjust_preferences(self.user_preferences, feedback)
        new_itinerary = self.generate_recommendations()
        return new_itinerary

# Example usage
travel_agent = Travel_Agent()
preferences = {
    "destination": "Paris",
    "dates": "2025-04-01 to 2025-04-10",
    "budget": "moderate",
    "interests": ["museums", "cuisine"]
}
travel_agent.gather_preferences(preferences)
itinerary = travel_agent.generate_recommendations()
print("Suggested Itinerary:", itinerary)
feedback = {"liked": ["Louvre Museum"], "disliked": ["Eiffel Tower (too crowded)"]}
new_itinerary = travel_agent.adjust_based_on_feedback(feedback)
print("Updated Itinerary:", new_itinerary)
```

### 预加载上下文
预加载上下文是指在处理查询之前，将相关的上下文或背景信息加载到模型中。这意味着模型从一开始就可以访问这些信息，从而帮助其生成更有见地的响应，而无需在过程中检索额外的数据。以下是一个预加载上下文在旅行代理应用中的简化Python示例：
```python
class TravelAgent:
    def __init__(self):
        # Pre-load popular destinations and their information
        self.context = {
            "Paris": {"country": "France", "currency": "Euro", "language": "French", "attractions": ["Eiffel Tower", "Louvre Museum"]},
            "Tokyo": {"country": "Japan", "currency": "Yen", "language": "Japanese", "attractions": ["Tokyo Tower", "Shibuya Crossing"]},
            "New York": {"country": "USA", "currency": "Dollar", "language": "English", "attractions": ["Statue of Liberty", "Times Square"]},
            "Sydney": {"country": "Australia", "currency": "Dollar", "language": "English", "attractions": ["Sydney Opera House", "Bondi Beach"]}
        }

    def get_destination_info(self, destination):
        # Fetch destination information from pre-loaded context
        info = self.context.get(destination)
        if info:
            return f"{destination}:\nCountry: {info['country']}\nCurrency: {info['currency']}\nLanguage: {info['language']}\nAttractions: {', '.join(info['attractions'])}"
        else:
            return f"Sorry, we don't have information on {destination}."

# Example usage
travel_agent = TravelAgent()
print(travel_agent.get_destination_info("Paris"))
print(travel_agent.get_destination_info("Tokyo"))
```

#### 解释
1. **初始化 (`__init__` method)**: The `TravelAgent` class pre-loads a dictionary containing information about popular destinations such as Paris, Tokyo, New York, and Sydney. This dictionary includes details like the country, currency, language, and major attractions for each destination.

2. **Retrieving Information (`get_destination_info` method)**: When a user queries about a specific destination, the `get_destination_info` 方法)**：该方法从预加载的上下文字典中获取相关信息。通过预加载上下文，旅行代理应用可以快速响应用户查询，而无需实时从外部来源检索信息。这使得应用更加高效和响应迅速。

### 以目标为导向启动计划并迭代
以目标为导向启动计划是指从一开始就明确目标或预期结果。通过事先定义目标，模型可以在整个迭代过程中以此为指导原则。这有助于确保每次迭代都朝着实现预期结果的方向推进，使过程更加高效和专注。以下是如何为旅行代理启动计划并迭代的示例：

### 场景
旅行代理希望为客户制定一个定制化的假期计划。目标是根据客户的偏好和预算创建一个能最大化客户满意度的旅行行程。

### 步骤
1. 定义客户的偏好和预算。
2. 基于这些偏好启动初始计划。
3. 通过迭代优化计划，最大化客户满意度。

#### Python代码
```python
class TravelAgent:
    def __init__(self, destinations):
        self.destinations = destinations

    def bootstrap_plan(self, preferences, budget):
        plan = []
        total_cost = 0

        for destination in self.destinations:
            if total_cost + destination['cost'] <= budget and self.match_preferences(destination, preferences):
                plan.append(destination)
                total_cost += destination['cost']

        return plan

    def match_preferences(self, destination, preferences):
        for key, value in preferences.items():
            if destination.get(key) != value:
                return False
        return True

    def iterate_plan(self, plan, preferences, budget):
        for i in range(len(plan)):
            for destination in self.destinations:
                if destination not in plan and self.match_preferences(destination, preferences) and self.calculate_cost(plan, destination) <= budget:
                    plan[i] = destination
                    break
        return plan

    def calculate_cost(self, plan, new_destination):
        return sum(destination['cost'] for destination in plan) + new_destination['cost']

# Example usage
destinations = [
    {"name": "Paris", "cost": 1000, "activity": "sightseeing"},
    {"name": "Tokyo", "cost": 1200, "activity": "shopping"},
    {"name": "New York", "cost": 900, "activity": "sightseeing"},
    {"name": "Sydney", "cost": 1100, "activity": "beach"},
]

preferences = {"activity": "sightseeing"}
budget = 2000

travel_agent = TravelAgent(destinations)
initial_plan = travel_agent.bootstrap_plan(preferences, budget)
print("Initial Plan:", initial_plan)

refined_plan = travel_agent.iterate_plan(initial_plan, preferences, budget)
print("Refined Plan:", refined_plan)
```

#### 代码解释
1. **初始化 (`__init__` method)**: The `TravelAgent` class is initialized with a list of potential destinations, each having attributes like name, cost, and activity type.

2. **Bootstrapping the Plan (`bootstrap_plan` method)**: This method creates an initial travel plan based on the client's preferences and budget. It iterates through the list of destinations and adds them to the plan if they match the client's preferences and fit within the budget.

3. **Matching Preferences (`match_preferences` method)**: This method checks if a destination matches the client's preferences.

4. **Iterating the Plan (`iterate_plan` method)**: This method refines the initial plan by trying to replace each destination in the plan with a better match, considering the client's preferences and budget constraints.

5. **Calculating Cost (`calculate_cost` 方法)**：该方法计算当前计划的总成本，包括潜在的新目的地。

#### 示例用法
- **初始计划**：旅行代理基于客户的观光偏好和$2000的预算创建初始计划。
- **优化计划**：旅行代理迭代优化计划，以满足客户的偏好和预算。

通过以明确的目标（例如最大化客户满意度）启动计划并迭代优化，旅行代理可以为客户创建一个定制化且优化的旅行行程。这种方法确保旅行计划从一开始就符合客户的偏好和预算，并在每次迭代中不断改进。

### 利用LLM进行重新排序和评分
大型语言模型（LLM）可以通过评估检索到的文档或生成的响应的相关性和质量，用于重新排序和评分。以下是其工作原理：
**检索**：初始检索步骤根据查询获取一组候选文档或响应。
**重新排序**：LLM评估这些候选项，并根据其相关性和质量重新排序。此步骤确保最相关和高质量的信息优先呈现。
**评分**：LLM为每个候选项分配分数，反映其相关性和质量。这有助于选择最适合用户的响应或文档。

通过利用LLM进行重新排序和评分，系统可以提供更准确和上下文相关的信息，从而改善整体用户体验。以下是旅行代理如何使用大型语言模型（LLM）根据用户偏好重新排序和评分旅行目的地的示例：

#### 场景 - 基于偏好的旅行
旅行代理希望根据客户的偏好推荐最佳旅行目的地。LLM将帮助重新排序和评分目的地，以确保呈现最相关的选项。

#### 步骤：
1. 收集用户偏好。
2. 检索潜在的旅行目的地列表。
3. 使用LLM根据用户偏好重新排序和评分目的地。

以下是如何更新之前的示例以使用Azure OpenAI服务：

#### 要求
1. 您需要拥有一个Azure订阅。
2. 创建一个Azure OpenAI资源并获取您的API密钥。

#### 示例Python代码
```python
import requests
import json

class TravelAgent:
    def __init__(self, destinations):
        self.destinations = destinations

    def get_recommendations(self, preferences, api_key, endpoint):
        # Generate a prompt for the Azure OpenAI
        prompt = self.generate_prompt(preferences)

        # Define headers and payload for the request
        headers = {
            'Content-Type': 'application/json',
            'Authorization': f'Bearer {api_key}'
        }
        payload = {
            "prompt": prompt,
            "max_tokens": 150,
            "temperature": 0.7
        }

        # Call the Azure OpenAI API to get the re-ranked and scored destinations
        response = requests.post(endpoint, headers=headers, json=payload)
        response_data = response.json()

        # Extract and return the recommendations
        recommendations = response_data['choices'][0]['text'].strip().split('\n')
        return recommendations

    def generate_prompt(self, preferences):
        prompt = "Here are the travel destinations ranked and scored based on the following user preferences:\n"
        for key, value in preferences.items():
            prompt += f"{key}: {value}\n"
        prompt += "\nDestinations:\n"
        for destination in self.destinations:
            prompt += f"- {destination['name']}: {destination['description']}\n"
        return prompt

# Example usage
destinations = [
    {"name": "Paris", "description": "City of lights, known for its art, fashion, and culture."},
    {"name": "Tokyo", "description": "Vibrant city, famous for its modernity and traditional temples."},
    {"name": "New York", "description": "The city that never sleeps, with iconic landmarks and diverse culture."},
    {"name": "Sydney", "description": "Beautiful harbour city, known for its opera house and stunning beaches."},
]

preferences = {"activity": "sightseeing", "culture": "diverse"}
api_key = 'your_azure_openai_api_key'
endpoint = 'https://your-endpoint.com/openai/deployments/your-deployment-name/completions?api-version=2022-12-01'

travel_agent = TravelAgent(destinations)
recommendations = travel_agent.get_recommendations(preferences, api_key, endpoint)
print("Recommended Destinations:")
for rec in recommendations:
    print(rec)
```

#### 代码解释 - 偏好推荐器
1. **初始化**：将 `TravelAgent` class is initialized with a list of potential travel destinations, each having attributes like name and description.

2. **Getting Recommendations (`get_recommendations` method)**: This method generates a prompt for the Azure OpenAI service based on the user's preferences and makes an HTTP POST request to the Azure OpenAI API to get re-ranked and scored destinations.

3. **Generating Prompt (`generate_prompt` method)**: This method constructs a prompt for the Azure OpenAI, including the user's preferences and the list of destinations. The prompt guides the model to re-rank and score the destinations based on the provided preferences.

4. **API Call**: The `requests` library is used to make an HTTP POST request to the Azure OpenAI API endpoint. The response contains the re-ranked and scored destinations.

5. **Example Usage**: The travel agent collects user preferences (e.g., interest in sightseeing and diverse culture) and uses the Azure OpenAI service to get re-ranked and scored recommendations for travel destinations.

Make sure to replace `your_azure_openai_api_key` with your actual Azure OpenAI API key and `https://your-endpoint.com/...` 替换为Azure OpenAI部署的实际端点URL。

通过利用LLM进行重新排序和评分，旅行代理可以为客户提供更个性化和相关的旅行推荐，从而增强客户的整体体验。

### RAG: 提示技术与工具
检索增强生成（RAG）既可以作为一种提示技术，也可以作为开发AI代理的工具。理解两者之间的区别可以帮助您更有效地在项目中利用RAG。

#### RAG作为提示技术
**是什么？**
- 作为提示技术，RAG涉及制定特定查询或提示，以指导从大型语料库或数据库中检索相关信息。然后将这些信息用于生成响应或采取行动。

**如何工作：**
1. **制定提示**：根据任务或用户输入创建结构良好的提示或查询。
2. **检索信息**：使用提示从预先存在的知识库或数据集中搜索相关数据。
3. **生成响应**：将检索到的信息与生成式AI模型结合，以生成全面且连贯的响应。

**旅行代理示例**：
- 用户输入："我想参观巴黎的博物馆。"
- 提示："查找巴黎的顶级博物馆。"
- 检索到的信息：关于卢浮宫、奥赛博物馆等的详细信息。
- 生成的响应："以下是巴黎的一些顶级博物馆：卢浮宫、奥赛博物馆和蓬皮杜中心。"

#### RAG作为工具
**是什么？**
- 作为工具，RAG是一个集成系统，可以自动化检索和生成过程，使开发人员无需为每个查询手动编写提示即可实现复杂的AI功能。

**如何工作：**
1. **集成**：将RAG嵌入AI代理的架构中，使其能够自动处理检索和生成任务。
2. **自动化**：工具管理整个过程，从接收用户输入到生成最终响应，无需为每一步明确提示。
3. **高效性**：通过简化检索和生成过程，提高代理的性能，使其能够更快、更准确地响应。

**旅行代理示例**：
- 用户输入："我想参观巴黎的博物馆。"
- RAG工具：自动检索关于博物馆的信息并生成响应。
- 生成的响应："以下是巴黎的一些顶级博物馆：卢浮宫、奥赛博物馆和蓬皮杜中心。"

### 比较
| 方面 | 提示技术 | 工具 |
|------------------------|-------------------------------------------------------------|-------------------------------------------------------|
| **手动与自动**| 每个查询手动制定提示。 | 检索和生成的自动化过程。 |
| **控制** | 对检索过程提供更多控制。 | 简化并自动化检索和生成。|
| **灵活性** | 允许根据具体需求定制提示。 | 更适合大规模实现。 |
| **复杂性** | 需要设计和调整提示。 | 更容易集成到AI代理的架构中。 |

### 实用示例
**提示技术示例：**
```python
def search_museums_in_paris():
    prompt = "Find top museums in Paris"
    search_results = search_web(prompt)
    return search_results

museums = search_museums_in_paris()
print("Top Museums in Paris:", museums)
```

**工具示例：**
```python
class Travel_Agent:
    def __init__(self):
        self.rag_tool = RAGTool()

    def get_museums_in_paris(self):
        user_input = "I want to visit museums in Paris."
        response = self.rag_tool.retrieve_and_generate(user_input)
        return response

travel_agent = Travel_Agent()
museums = travel_agent.get_museums_in_paris()
print("Top Museums in Paris:", museums)
```
```

```markdown
巴黎最好的博物馆？"). - **导航意图**：用户希望导航到特定的网站或页面（例如，“卢浮宫官网”）。 - **交易意图**：用户希望执行交易，例如预订航班或购买商品（例如，“预订飞往巴黎的航班”）。 2. **上下文意识**： - 分析用户查询的上下文有助于准确识别其意图。这包括考虑先前的互动、用户偏好以及当前查询的具体细节。 3. **自然语言处理（NLP）**： - 使用NLP技术来理解和解释用户提供的自然语言查询。这包括实体识别、情感分析和查询解析等任务。 4. **个性化**： - 根据用户的历史记录、偏好和反馈个性化搜索结果，提高检索信息的相关性。 #### 实际示例：旅行代理中的意图搜索 让我们以旅行代理为例，看看如何实现意图搜索。 1. **收集用户偏好** ```python
   class Travel_Agent:
       def __init__(self):
           self.user_preferences = {}

       def gather_preferences(self, preferences):
           self.user_preferences = preferences
   ``` 2. **理解用户意图** ```python
   def identify_intent(query):
       if "book" in query or "purchase" in query:
           return "transactional"
       elif "website" in query or "official" in query:
           return "navigational"
       else:
           return "informational"
   ``` 3. **上下文意识** ```python
   def analyze_context(query, user_history):
       # Combine current query with user history to understand context
       context = {
           "current_query": query,
           "user_history": user_history
       }
       return context
   ``` 4. **搜索并个性化结果** ```python
   def search_with_intent(query, preferences, user_history):
       intent = identify_intent(query)
       context = analyze_context(query, user_history)
       if intent == "informational":
           search_results = search_information(query, preferences)
       elif intent == "navigational":
           search_results = search_navigation(query)
       elif intent == "transactional":
           search_results = search_transaction(query, preferences)
       personalized_results = personalize_results(search_results, user_history)
       return personalized_results

   def search_information(query, preferences):
       # Example search logic for informational intent
       results = search_web(f"best {preferences['interests']} in {preferences['destination']}")
       return results

   def search_navigation(query):
       # Example search logic for navigational intent
       results = search_web(query)
       return results

   def search_transaction(query, preferences):
       # Example search logic for transactional intent
       results = search_web(f"book {query} to {preferences['destination']}")
       return results

   def personalize_results(results, user_history):
       # Example personalization logic
       personalized = [result for result in results if result not in user_history]
       return personalized[:10]  # Return top 10 personalized results
   ``` 5. **示例用法** ```python
   travel_agent = Travel_Agent()
   preferences = {
       "destination": "Paris",
       "interests": ["museums", "cuisine"]
   }
   travel_agent.gather_preferences(preferences)
   user_history = ["Louvre Museum website", "Book flight to Paris"]
   query = "best museums in Paris"
   results = search_with_intent(query, preferences, user_history)
   print("Search Results:", results)
   ``` --- ## 4. 作为工具的代码生成 代码生成代理使用AI模型来编写和执行代码，解决复杂问题并实现任务自动化。 ### 代码生成代理 代码生成代理使用生成式AI模型来编写和执行代码。这些代理可以通过生成和运行各种编程语言的代码来解决复杂问题、实现任务自动化并提供有价值的见解。 #### 实际应用 1. **自动代码生成**：为特定任务生成代码片段，例如数据分析、网络爬取或机器学习。 2. **作为RAG的SQL**：使用SQL查询从数据库中检索和操作数据。 3. **问题解决**：创建并执行代码以解决特定问题，例如优化算法或分析数据。 #### 示例：用于数据分析的代码生成代理 假设您正在设计一个代码生成代理。其工作流程可能如下： 1. **任务**：分析数据集以识别趋势和模式。 2. **步骤**： - 将数据集加载到数据分析工具中。 - 生成SQL查询以过滤和聚合数据。 - 执行查询并检索结果。 - 使用结果生成可视化和见解。 3. **所需资源**：访问数据集、数据分析工具和SQL能力。 4. **经验**：利用过去的分析结果提高未来分析的准确性和相关性。 ### 示例：旅行代理的代码生成代理 在此示例中，我们将设计一个代码生成代理Travel Agent，通过生成和执行代码来协助用户规划旅行。该代理可以处理诸如获取旅行选项、筛选结果以及使用生成式AI编制行程等任务。 #### 代码生成代理概述 1. **收集用户偏好**：收集用户输入的信息，如目的地、旅行日期、预算和兴趣。 2. **生成用于获取数据的代码**：生成代码片段以检索航班、酒店和景点数据。 3. **执行生成的代码**：运行生成的代码以获取实时信息。 4. **生成行程**：将获取的数据编译为个性化的旅行计划。 5. **根据反馈调整**：接收用户反馈并重新生成代码以优化结果。 #### 分步实现 1. **收集用户偏好** ```python
   class Travel_Agent:
       def __init__(self):
           self.user_preferences = {}

       def gather_preferences(self, preferences):
           self.user_preferences = preferences
   ``` 2. **生成用于获取数据的代码** ```python
   def generate_code_to_fetch_data(preferences):
       # Example: Generate code to search for flights based on user preferences
       code = f"""
       def search_flights():
           import requests
           response = requests.get('https://api.example.com/flights', params={preferences})
           return response.json()
       """
       return code

   def generate_code_to_fetch_hotels(preferences):
       # Example: Generate code to search for hotels
       code = f"""
       def search_hotels():
           import requests
           response = requests.get('https://api.example.com/hotels', params={preferences})
           return response.json()
       """
       return code
   ``` 3. **执行生成的代码** ```python
   def execute_code(code):
       # Execute the generated code using exec
       exec(code)
       result = locals()
       return result

   travel_agent = Travel_Agent()
   preferences = {
       "destination": "Paris",
       "dates": "2025-04-01 to 2025-04-10",
       "budget": "moderate",
       "interests": ["museums", "cuisine"]
   }
   travel_agent.gather_preferences(preferences)

   flight_code = generate_code_to_fetch_data(preferences)
   hotel_code = generate_code_to_fetch_hotels(preferences)

   flights = execute_code(flight_code)
   hotels = execute_code(hotel_code)

   print("Flight Options:", flights)
   print("Hotel Options:", hotels)
   ``` 4. **生成行程** ```python
   def generate_itinerary(flights, hotels, attractions):
       itinerary = {
           "flights": flights,
           "hotels": hotels,
           "attractions": attractions
       }
       return itinerary

   attractions = search_attractions(preferences)
   itinerary = generate_itinerary(flights, hotels, attractions)
   print("Suggested Itinerary:", itinerary)
   ``` 5. **根据反馈调整** ```python
   def adjust_based_on_feedback(feedback, preferences):
       # Adjust preferences based on user feedback
       if "liked" in feedback:
           preferences["favorites"] = feedback["liked"]
       if "disliked" in feedback:
           preferences["avoid"] = feedback["disliked"]
       return preferences

   feedback = {"liked": ["Louvre Museum"], "disliked": ["Eiffel Tower (too crowded)"]}
   updated_preferences = adjust_based_on_feedback(feedback, preferences)

   # Regenerate and execute code with updated preferences
   updated_flight_code = generate_code_to_fetch_data(updated_preferences)
   updated_hotel_code = generate_code_to_fetch_hotels(updated_preferences)

   updated_flights = execute_code(updated_flight_code)
   updated_hotels = execute_code(updated_hotel_code)

   updated_itinerary = generate_itinerary(updated_flights, updated_hotels, attractions)
   print("Updated Itinerary:", updated_itinerary)
   ``` ### 利用环境意识和推理 基于表格的模式确实可以通过利用环境意识和推理来增强查询生成过程。以下是实现方式的示例： 1. **理解模式**：系统将理解表格的模式，并利用此信息来支持查询生成。 2. **根据反馈调整**：系统将根据反馈调整用户偏好，并推断需要更新模式中的哪些字段。 3. **生成和执行查询**：系统将生成并执行查询，以根据新的偏好获取更新的航班和酒店数据。 以下是一个包含这些概念的更新Python代码示例： ```python
def adjust_based_on_feedback(feedback, preferences, schema):
    # Adjust preferences based on user feedback
    if "liked" in feedback:
        preferences["favorites"] = feedback["liked"]
    if "disliked" in feedback:
        preferences["avoid"] = feedback["disliked"]
    # Reasoning based on schema to adjust other related preferences
    for field in schema:
        if field in preferences:
            preferences[field] = adjust_based_on_environment(feedback, field, schema)
    return preferences

def adjust_based_on_environment(feedback, field, schema):
    # Custom logic to adjust preferences based on schema and feedback
    if field in feedback["liked"]:
        return schema[field]["positive_adjustment"]
    elif field in feedback["disliked"]:
        return schema[field]["negative_adjustment"]
    return schema[field]["default"]

def generate_code_to_fetch_data(preferences):
    # Generate code to fetch flight data based on updated preferences
    return f"fetch_flights(preferences={preferences})"

def generate_code_to_fetch_hotels(preferences):
    # Generate code to fetch hotel data based on updated preferences
    return f"fetch_hotels(preferences={preferences})"

def execute_code(code):
    # Simulate execution of code and return mock data
    return {"data": f"Executed: {code}"}

def generate_itinerary(flights, hotels, attractions):
    # Generate itinerary based on flights, hotels, and attractions
    return {"flights": flights, "hotels": hotels, "attractions": attractions}

# Example schema
schema = {
    "favorites": {"positive_adjustment": "increase", "negative_adjustment": "decrease", "default": "neutral"},
    "avoid": {"positive_adjustment": "decrease", "negative_adjustment": "increase", "default": "neutral"}
}

# Example usage
preferences = {"favorites": "sightseeing", "avoid": "crowded places"}
feedback = {"liked": ["Louvre Museum"], "disliked": ["Eiffel Tower (too crowded)"]}
updated_preferences = adjust_based_on_feedback(feedback, preferences, schema)

# Regenerate and execute code with updated preferences
updated_flight_code = generate_code_to_fetch_data(updated_preferences)
updated_hotel_code = generate_code_to_fetch_hotels(updated_preferences)

updated_flights = execute_code(updated_flight_code)
updated_hotels = execute_code(updated_hotel_code)

updated_itinerary = generate_itinerary(updated_flights, updated_hotels, feedback["liked"])
print("Updated Itinerary:", updated_itinerary)
``` #### 解释 - 基于反馈的预订 1. **模式意识**：`schema` dictionary defines how preferences should be adjusted based on feedback. It includes fields like `favorites` and `avoid`, with corresponding adjustments.
2. **Adjusting Preferences (`adjust_based_on_feedback` method)**: This method adjusts preferences based on user feedback and the schema.
3. **Environment-Based Adjustments (`adjust_based_on_environment`方法）**：此方法根据模式和反馈自定义调整。 4. **生成和执行查询**：系统生成代码以根据调整后的偏好获取更新的航班和酒店数据，并模拟执行这些查询。 5. **生成行程**：系统根据新的航班、酒店和景点数据创建更新后的行程。 通过使系统具有环境意识并基于模式进行推理，它可以生成更准确和相关的查询，从而提供更好的旅行推荐和更个性化的用户体验。 ### 使用SQL作为检索增强生成（RAG）技术 SQL（结构化查询语言）是与数据库交互的强大工具。当用作检索增强生成（RAG）方法的一部分时，SQL可以从数据库中检索相关数据，以为AI代理中的响应或操作提供信息并生成它们。让我们探讨如何在旅行代理的上下文中使用SQL作为RAG技术。 #### 关键概念 1. **数据库交互**： - 使用SQL查询数据库，检索相关信息并操作数据。 - 示例：从旅行数据库中获取航班详情、酒店信息和景点。 2. **与RAG集成**： - 根据用户输入和偏好生成SQL查询。 - 然后使用检索到的数据生成个性化推荐或操作。 3. **动态查询生成**： - AI代理根据上下文和用户需求生成动态SQL查询。 - 示例：定制SQL查询以根据预算、日期和兴趣筛选结果。 #### 应用 - **自动代码生成**：为特定任务生成代码片段。 - **作为RAG的SQL**：使用SQL查询操作数据。 - **问题解决**：创建并执行代码以解决问题。 **示例**：一个数据分析代理： 1. **任务**：分析数据集以发现趋势。 2. **步骤**： - 加载数据集。 - 生成SQL查询以过滤数据。 - 执行查询并检索结果。 - 生成可视化和见解。 3. **资源**：数据集访问权限、SQL能力。 4. **经验**：利用过去的结果提高未来分析的准确性。 #### 实际示例：在旅行代理中使用SQL 1. **收集用户偏好** ```python
   class Travel_Agent:
       def __init__(self):
           self.user_preferences = {}

       def gather_preferences(self, preferences):
           self.user_preferences = preferences
   ``` 2. **生成SQL查询** ```python
   def generate_sql_query(table, preferences):
       query = f"SELECT * FROM {table} WHERE "
       conditions = []
       for key, value in preferences.items():
           conditions.append(f"{key}='{value}'")
       query += " AND ".join(conditions)
       return query
   ``` 3. **执行SQL查询** ```python
   import sqlite3

   def execute_sql_query(query, database="travel.db"):
       connection = sqlite3.connect(database)
       cursor = connection.cursor()
       cursor.execute(query)
       results = cursor.fetchall()
       connection.close()
       return results
   ``` 4. **生成推荐** ```python
   def generate_recommendations(preferences):
       flight_query = generate_sql_query("flights", preferences)
       hotel_query = generate_sql_query("hotels", preferences)
       attraction_query = generate_sql_query("attractions", preferences)

       flights = execute_sql_query(flight_query)
       hotels = execute_sql_query(hotel_query)
       attractions = execute_sql_query(attraction_query)

       itinerary = {
           "flights": flights,
           "hotels": hotels,
           "attractions": attractions
       }
       return itinerary

   travel_agent = Travel_Agent()
   preferences = {
       "destination": "Paris",
       "dates": "2025-04-01 to 2025-04-10",
       "budget": "moderate",
       "interests": ["museums", "cuisine"]
   }
   travel_agent.gather_preferences(preferences)
   itinerary = generate_recommendations(preferences)
   print("Suggested Itinerary:", itinerary)
   ``` #### 示例SQL查询 1. **航班查询** ```sql
   SELECT * FROM flights WHERE destination='Paris' AND dates='2025-04-01 to 2025-04-10' AND budget='moderate';
   ``` 2. **酒店查询** ```sql
   SELECT * FROM hotels WHERE destination='Paris' AND budget='moderate';
   ``` 3. **景点查询** ```sql
   SELECT * FROM attractions WHERE destination='Paris' AND interests='museums, cuisine';
   ``` 通过将SQL作为检索增强生成（RAG）技术的一部分，像Travel Agent这样的AI代理可以动态检索并利用相关数据，提供准确且个性化的推荐。 ### 结论 元认知是一种强大的工具，可以显著增强AI代理的能力。通过引入元认知过程，您可以设计出更智能、更适应性强且更高效的代理。使用附加资源进一步探索AI代理中元认知的迷人世界。
```

**免责声明**：
本文件使用基于机器的人工智能翻译服务进行翻译。尽管我们尽力确保翻译的准确性，但请注意，自动翻译可能包含错误或不准确之处。应以原始语言的文件作为权威来源。对于关键信息，建议使用专业人工翻译。我们对因使用本翻译而产生的任何误解或误读不承担责任。


# AI代理的生产部署

## 简介

本课程将涵盖以下内容：

- 如何有效规划将AI代理部署到生产环境中。
- 部署AI代理到生产环境时可能遇到的常见错误和问题。
- 如何在保持AI代理性能的同时管理成本。

## 学习目标

完成本课程后，您将了解如何/能够：

- 提高生产环境中AI代理系统的性能、成本效率和效果的技术。
- 如何评估您的AI代理及其具体方法。
- 控制AI代理生产部署成本的策略。

部署值得信赖的AI代理非常重要。请参阅“构建值得信赖的AI代理”课程以了解更多内容。

## 评估AI代理

在部署AI代理之前、期间和之后，建立一个完善的评估系统至关重要。这可以确保您的系统与您和用户的目标保持一致。

评估AI代理时，您需要能够评估的不仅仅是代理的输出，还包括AI代理所运行的整个系统。这包括但不限于：

- 初始模型请求。
- 代理识别用户意图的能力。
- 代理识别执行任务所需正确工具的能力。
- 工具对代理请求的响应。
- 代理解释工具响应的能力。
- 用户对代理响应的反馈。

这种方法可以帮助您以更模块化的方式识别改进领域。然后，您可以更高效地监控模型、提示词、工具以及其他组件更改的效果。

## AI代理的常见问题及潜在解决方案

| **问题**                                     | **潜在解决方案**                                                                                |
| -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| AI代理任务执行不一致                        | - 优化提供给AI代理的提示词，明确目标。
- 确定是否可以将任务分解为子任务，并通过多个代理分别处理。                                                                                |
| AI代理陷入连续循环                          | - 确保定义清晰的终止条件，让代理知道何时停止流程。
- 对于需要推理和规划的复杂任务，使用专为推理任务设计的大型模型。                                                                  |
| AI代理调用工具表现不佳                      | - 在代理系统外测试并验证工具的输出。
- 优化工具的参数设置、提示词和命名方式。                                                                                |
| 多代理系统表现不一致                        | - 优化提供给每个代理的提示词，确保它们具体且相互区分。
- 构建一个使用“路由”或控制器代理的分层系统，以确定哪个代理是正确的选择。                                                    |

## 成本管理

以下是一些在生产环境中部署AI代理的成本管理策略：

- **缓存响应** - 识别常见请求和任务，并在它们通过您的代理系统之前提供响应，这是减少类似请求量的好方法。您甚至可以通过更基础的AI模型实现一个流程，来判断某个请求与缓存请求的相似度。

- **使用小型模型** - 小型语言模型（SLM）在某些代理使用场景中表现良好，并能显著降低成本。如前所述，建立一个评估系统来确定并比较其与大型模型的性能是了解SLM在您的使用场景中表现的最佳方式。

- **使用路由模型** - 类似的策略是使用不同规模的模型组合。您可以使用LLM/SLM或无服务器函数，根据请求的复杂性将其路由到最合适的模型。这不仅能降低成本，还能确保复杂任务的性能表现。

## 恭喜

这是“AI代理入门”课程的最后一课。

我们计划根据反馈和这个快速发展的行业变化不断增加新课程，因此欢迎您不久后再回来查看。

如果您想继续学习和构建AI代理，欢迎加入 [Azure AI Community Discord](https://discord.gg/kzRShWzttr)。

我们在这里举办工作坊、社区圆桌会议以及“问我任何问题”环节。

此外，我们还有一个学习资料集合，其中包含更多帮助您开始在生产环境中构建AI代理的资源。

**免责声明**：
本文件使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保翻译的准确性，但请注意，自动翻译可能包含错误或不准确之处。应以原始语言的文件作为权威来源。对于关键信息，建议使用专业的人类翻译服务。对于因使用本翻译而产生的任何误解或误读，我们概不负责。


A: A2: Wenn Sie eine große Arbeitsbelastung haben

**Haftungsausschluss**:
Dieses Dokument wurde mit KI-gestützten maschinellen Übersetzungsdiensten übersetzt. Obwohl wir uns um Genauigkeit bemühen, beachten Sie bitte, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner ursprünglichen Sprache sollte als maßgebliche Quelle betrachtet werden. Für kritische Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die sich aus der Nutzung dieser Übersetzung ergeben.


**Agentspezifisch für den Kundenserviceprozess**:

- **Kunden-Agent**: Dieser Agent repräsentiert den Kunden und ist dafür verantwortlich, den Supportprozess zu initiieren.
- **Support-Agent**: Dieser Agent repräsentiert den Supportprozess und ist dafür verantwortlich, dem Kunden Unterstützung zu leisten.
- **Eskalations-Agent**: Dieser Agent repräsentiert den Eskalationsprozess und ist dafür verantwortlich, Probleme an eine höhere Supportebene weiterzuleiten.
- **Lösungs-Agent**: Dieser Agent repräsentiert den Lösungsprozess und ist dafür verantwortlich, auftretende Probleme während des Supportprozesses zu lösen.
- **Feedback-Agent**: Dieser Agent repräsentiert den Feedbackprozess und ist dafür verantwortlich, Feedback vom Kunden einzuholen.
- **Benachrichtigungs-Agent**: Dieser Agent repräsentiert den Benachrichtigungsprozess und ist dafür verantwortlich, dem Kunden in verschiedenen Phasen des Supportprozesses Benachrichtigungen zu senden.
- **Analyse-Agent**: Dieser Agent repräsentiert den Analyseprozess und ist dafür verantwortlich, Daten im Zusammenhang mit dem Supportprozess zu analysieren.
- **Audit-Agent**: Dieser Agent repräsentiert den Auditprozess und ist dafür verantwortlich, den Supportprozess zu prüfen, um sicherzustellen, dass er korrekt durchgeführt wird.
- **Bericht-Agent**: Dieser Agent repräsentiert den Berichtprozess und ist dafür verantwortlich, Berichte über den Supportprozess zu erstellen.
- **Wissens-Agent**: Dieser Agent repräsentiert den Wissensprozess und ist dafür verantwortlich, eine Wissensdatenbank mit Informationen zum Supportprozess zu pflegen.
- **Sicherheits-Agent**: Dieser Agent repräsentiert den Sicherheitsprozess und ist dafür verantwortlich, die Sicherheit des Supportprozesses zu gewährleisten.
- **Qualitäts-Agent**: Dieser Agent repräsentiert den Qualitätsprozess und ist dafür verantwortlich, die Qualität des Supportprozesses sicherzustellen.
- **Compliance-Agent**: Dieser Agent repräsentiert den Compliance-Prozess und ist dafür verantwortlich, sicherzustellen, dass der Supportprozess den Vorschriften und Richtlinien entspricht.
- **Schulungs-Agent**: Dieser Agent repräsentiert den Schulungsprozess und ist dafür verantwortlich, Support-Agenten darin zu schulen, wie sie Kunden unterstützen können.

Das sind einige Agenten – war das mehr oder weniger, als Sie erwartet haben?

**Haftungsausschluss**:
Dieses Dokument wurde mithilfe von KI-gestützten maschinellen Übersetzungsdiensten übersetzt. Obwohl wir uns um Genauigkeit bemühen, beachten Sie bitte, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner ursprünglichen Sprache sollte als maßgebliche Quelle betrachtet werden. Für kritische Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die aus der Nutzung dieser Übersetzung entstehen.


A: A2: Cuando tienes una gran carga de trabajo

**Descargo de responsabilidad**:
Este documento ha sido traducido utilizando servicios de traducción automática basados en inteligencia artificial. Si bien nos esforzamos por garantizar la precisión, tenga en cuenta que las traducciones automatizadas pueden contener errores o imprecisiones. El documento original en su idioma nativo debe considerarse como la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables de malentendidos o interpretaciones erróneas que puedan surgir del uso de esta traducción.


**Agentes específicos para el proceso de soporte al cliente**:

- **Agente del cliente**: Este agente representa al cliente y es responsable de iniciar el proceso de soporte.
- **Agente de soporte**: Este agente representa el proceso de soporte y es responsable de brindar asistencia al cliente.
- **Agente de escalamiento**: Este agente representa el proceso de escalamiento y es responsable de escalar problemas a un nivel superior de soporte.
- **Agente de resolución**: Este agente representa el proceso de resolución y es responsable de resolver cualquier problema que surja durante el proceso de soporte.
- **Agente de retroalimentación**: Este agente representa el proceso de retroalimentación y es responsable de recopilar opiniones del cliente.
- **Agente de notificaciones**: Este agente representa el proceso de notificaciones y es responsable de enviar avisos al cliente en varias etapas del proceso de soporte.
- **Agente de analítica**: Este agente representa el proceso de análisis y es responsable de analizar datos relacionados con el proceso de soporte.
- **Agente de auditoría**: Este agente representa el proceso de auditoría y es responsable de auditar el proceso de soporte para garantizar que se lleve a cabo correctamente.
- **Agente de reportes**: Este agente representa el proceso de reportes y es responsable de generar informes sobre el proceso de soporte.
- **Agente de conocimiento**: Este agente representa el proceso de gestión del conocimiento y es responsable de mantener una base de información relacionada con el proceso de soporte.
- **Agente de seguridad**: Este agente representa el proceso de seguridad y es responsable de garantizar la seguridad del proceso de soporte.
- **Agente de calidad**: Este agente representa el proceso de calidad y es responsable de asegurar la calidad del proceso de soporte.
- **Agente de cumplimiento**: Este agente representa el proceso de cumplimiento y es responsable de garantizar que el proceso de soporte cumpla con regulaciones y políticas.
- **Agente de capacitación**: Este agente representa el proceso de capacitación y es responsable de entrenar a los agentes de soporte en cómo asistir a los clientes.

¿Son bastantes agentes, no? ¿Era más o menos de lo que esperabas?

**Descargo de responsabilidad**:
Este documento ha sido traducido utilizando servicios de traducción automática basados en inteligencia artificial. Si bien nos esforzamos por garantizar la precisión, tenga en cuenta que las traducciones automáticas pueden contener errores o imprecisiones. El documento original en su idioma nativo debe considerarse la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables de ningún malentendido o interpretación errónea que surja del uso de esta traducción.


A : A2 : Lorsque vous avez une charge de travail importante

**Avertissement** :
Ce document a été traduit à l'aide de services de traduction automatique basés sur l'intelligence artificielle. Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de faire appel à une traduction humaine professionnelle. Nous déclinons toute responsabilité en cas de malentendus ou d'interprétations erronées résultant de l'utilisation de cette traduction.


**Agents spécifiques au processus de support client** :

- **Agent client** : Cet agent représente le client et est chargé d'initier le processus de support.
- **Agent de support** : Cet agent représente le processus de support et est responsable de fournir de l'assistance au client.
- **Agent d'escalade** : Cet agent représente le processus d'escalade et est chargé de transmettre les problèmes à un niveau de support supérieur.
- **Agent de résolution** : Cet agent représente le processus de résolution et est chargé de résoudre les problèmes qui surviennent pendant le processus de support.
- **Agent de feedback** : Cet agent représente le processus de retour d'information et est responsable de collecter les retours du client.
- **Agent de notification** : Cet agent représente le processus de notification et est chargé d'envoyer des notifications au client à différentes étapes du processus de support.
- **Agent d'analyse** : Cet agent représente le processus d'analyse et est chargé d'analyser les données liées au processus de support.
- **Agent d'audit** : Cet agent représente le processus d'audit et est responsable de vérifier que le processus de support est correctement exécuté.
- **Agent de rapport** : Cet agent représente le processus de création de rapports et est chargé de générer des rapports sur le processus de support.
- **Agent de connaissance** : Cet agent représente le processus de gestion des connaissances et est chargé de maintenir une base de connaissances relative au processus de support.
- **Agent de sécurité** : Cet agent représente le processus de sécurité et est chargé de garantir la sécurité du processus de support.
- **Agent de qualité** : Cet agent représente le processus de gestion de la qualité et est chargé d'assurer la qualité du processus de support.
- **Agent de conformité** : Cet agent représente le processus de conformité et est chargé de garantir que le processus de support respecte les réglementations et les politiques en vigueur.
- **Agent de formation** : Cet agent représente le processus de formation et est chargé de former les agents de support sur la manière d'assister les clients.

Cela fait pas mal d'agents. Est-ce plus ou moins que ce à quoi vous vous attendiez ?

**Avertissement** :
Ce document a été traduit à l'aide de services de traduction basés sur l'intelligence artificielle. Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatiques peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de faire appel à une traduction humaine professionnelle. Nous déclinons toute responsabilité en cas de malentendus ou d'interprétations erronées résultant de l'utilisation de cette traduction.


A: A2: 當你有大量工作量時

**免責聲明**：
本文件經由機器翻譯AI服務進行翻譯。儘管我們致力於確保準確性，但請注意，自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件為權威來源。對於關鍵資訊，建議使用專業人工翻譯。我們對因使用本翻譯而引起的任何誤解或錯誤解釋概不負責。


**專門為客戶支援流程設計的代理**:

- **客戶代理**: 呢個代理代表客戶，負責開啟支援流程。
- **支援代理**: 呢個代理代表支援流程，負責為客戶提供協助。
- **升級代理**: 呢個代理代表升級流程，負責將問題升級到更高層次嘅支援。
- **解決代理**: 呢個代理代表解決流程，負責解決支援過程中出現嘅任何問題。
- **反饋代理**: 呢個代理代表反饋流程，負責收集客戶嘅反饋意見。
- **通知代理**: 呢個代理代表通知流程，負責喺支援流程嘅唔同階段向客戶發送通知。
- **分析代理**: 呢個代理代表分析流程，負責分析與支援流程相關嘅數據。
- **審核代理**: 呢個代理代表審核流程，負責審核支援流程以確保其正確執行。
- **報告代理**: 呢個代理代表報告流程，負責生成有關支援流程嘅報告。
- **知識代理**: 呢個代理代表知識流程，負責維護與支援流程相關嘅知識庫。
- **安全代理**: 呢個代理代表安全流程，負責確保支援流程嘅安全性。
- **質量代理**: 呢個代理代表質量流程，負責確保支援流程嘅質量。
- **合規代理**: 呢個代理代表合規流程，負責確保支援流程符合規範及政策要求。
- **培訓代理**: 呢個代理代表培訓流程，負責培訓支援代理如何協助客戶。

呢啲代理數量多唔多？係咪超出你預期？

**免責聲明**:
本文件使用機器翻譯服務進行翻譯。我們致力於提供準確的翻譯，但請注意，自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊，建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤讀概不負責。


A: A2: 大量の作業量がある場合

**免責事項**:
本書類は、機械ベースのAI翻訳サービスを使用して翻訳されています。正確性を期すよう努めておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があります。原文（元の言語の文書）を公式な情報源としてご参照ください。重要な情報については、専門の人間による翻訳を推奨します。本翻訳の使用に起因する誤解や解釈の誤りについて、当方は一切の責任を負いかねます。


**カスタマーサポートプロセスに特化したエージェント**:

- **カスタマーエージェント**: このエージェントは顧客を代表し、サポートプロセスを開始する役割を担います。
- **サポートエージェント**: このエージェントはサポートプロセスを代表し、顧客への支援を提供する役割を担います。
- **エスカレーションエージェント**: このエージェントはエスカレーションプロセスを代表し、問題をより高いサポートレベルにエスカレーションする役割を担います。
- **解決エージェント**: このエージェントは解決プロセスを代表し、サポートプロセス中に発生する問題を解決する役割を担います。
- **フィードバックエージェント**: このエージェントはフィードバックプロセスを代表し、顧客からのフィードバックを収集する役割を担います。
- **通知エージェント**: このエージェントは通知プロセスを代表し、サポートプロセスのさまざまな段階で顧客に通知を送る役割を担います。
- **分析エージェント**: このエージェントは分析プロセスを代表し、サポートプロセスに関連するデータを分析する役割を担います。
- **監査エージェント**: このエージェントは監査プロセスを代表し、サポートプロセスが正しく実行されているかを監査する役割を担います。
- **レポートエージェント**: このエージェントはレポートプロセスを代表し、サポートプロセスに関するレポートを作成する役割を担います。
- **ナレッジエージェント**: このエージェントはナレッジプロセスを代表し、サポートプロセスに関連する情報のナレッジベースを維持する役割を担います。
- **セキュリティエージェント**: このエージェントはセキュリティプロセスを代表し、サポートプロセスの安全性を確保する役割を担います。
- **品質エージェント**: このエージェントは品質プロセスを代表し、サポートプロセスの品質を確保する役割を担います。
- **コンプライアンスエージェント**: このエージェントはコンプライアンスプロセスを代表し、サポートプロセスが規制やポリシーに準拠していることを確認する役割を担います。
- **トレーニングエージェント**: このエージェントはトレーニングプロセスを代表し、サポートエージェントが顧客を支援する方法についてトレーニングを行う役割を担います。

これだけのエージェントがいますが、想像していたより多かったですか？それとも少なかったですか？

**免責事項**:
この文書は、AIによる機械翻訳サービスを使用して翻訳されています。正確性を期すよう努めておりますが、自動翻訳には誤りや不正確な箇所が含まれる可能性があります。元の言語で記載された原文が正式な情報源として考慮されるべきです。重要な情報については、専門の人間による翻訳をお勧めします。本翻訳の利用に起因する誤解や誤った解釈について、当方は一切の責任を負いません。


A: A2: 작업량이 많을 때

**면책 조항**:
이 문서는 기계 기반 AI 번역 서비스를 사용하여 번역되었습니다. 정확성을 위해 노력하고 있지만, 자동 번역에는 오류나 부정확성이 포함될 수 있습니다. 원본 문서의 원어 버전이 신뢰할 수 있는 권위 있는 자료로 간주되어야 합니다. 중요한 정보의 경우, 전문적인 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해서는 책임을 지지 않습니다.


**고객 지원 프로세스를 위한 에이전트들**:

- **Customer agent (고객 에이전트)**: 이 에이전트는 고객을 나타내며, 지원 프로세스를 시작하는 역할을 담당합니다.
- **Support agent (지원 에이전트)**: 이 에이전트는 지원 프로세스를 나타내며, 고객에게 도움을 제공하는 역할을 담당합니다.
- **Escalation agent (승격 에이전트)**: 이 에이전트는 문제를 상위 지원 단계로 승격시키는 과정을 나타내며, 이를 담당합니다.
- **Resolution agent (해결 에이전트)**: 이 에이전트는 문제 해결 과정을 나타내며, 지원 프로세스 중 발생하는 문제를 해결하는 역할을 담당합니다.
- **Feedback agent (피드백 에이전트)**: 이 에이전트는 피드백 과정을 나타내며, 고객으로부터 피드백을 수집하는 역할을 담당합니다.
- **Notification agent (알림 에이전트)**: 이 에이전트는 알림 과정을 나타내며, 지원 프로세스의 여러 단계에서 고객에게 알림을 보내는 역할을 담당합니다.
- **Analytics agent (분석 에이전트)**: 이 에이전트는 분석 과정을 나타내며, 지원 프로세스와 관련된 데이터를 분석하는 역할을 담당합니다.
- **Audit agent (감사 에이전트)**: 이 에이전트는 감사 과정을 나타내며, 지원 프로세스가 올바르게 수행되고 있는지 감사하는 역할을 담당합니다.
- **Reporting agent (보고 에이전트)**: 이 에이전트는 보고 과정을 나타내며, 지원 프로세스에 대한 보고서를 생성하는 역할을 담당합니다.
- **Knowledge agent (지식 에이전트)**: 이 에이전트는 지식 과정을 나타내며, 지원 프로세스와 관련된 정보를 유지 관리하는 지식 베이스를 관리하는 역할을 담당합니다.
- **Security agent (보안 에이전트)**: 이 에이전트는 보안 과정을 나타내며, 지원 프로세스의 보안을 보장하는 역할을 담당합니다.
- **Quality agent (품질 에이전트)**: 이 에이전트는 품질 과정을 나타내며, 지원 프로세스의 품질을 보장하는 역할을 담당합니다.
- **Compliance agent (준수 에이전트)**: 이 에이전트는 준수 과정을 나타내며, 지원 프로세스가 규정과 정책을 준수하도록 보장하는 역할을 담당합니다.
- **Training agent (교육 에이전트)**: 이 에이전트는 교육 과정을 나타내며, 고객을 지원하는 방법에 대해 지원 에이전트를 교육하는 역할을 담당합니다.

이 정도 에이전트가 있네요. 예상했던 것보다 많았나요, 아니면 적었나요?

**면책 조항**:
이 문서는 기계 기반 AI 번역 서비스를 사용하여 번역되었습니다. 정확성을 위해 최선을 다하고 있지만, 자동 번역에는 오류나 부정확성이 포함될 수 있음을 유의하시기 바랍니다. 원어로 작성된 원본 문서를 권위 있는 자료로 간주해야 합니다. 중요한 정보의 경우, 전문적인 인간 번역을 권장드립니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해서는 책임을 지지 않습니다.


A: A2: Quando você tem uma grande carga de trabalho

**Aviso Legal**:
Este documento foi traduzido utilizando serviços de tradução automática baseados em IA. Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte oficial. Para informações críticas, recomenda-se a tradução humana profissional. Não nos responsabilizamos por mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução.


**Agentes específicos para o processo de suporte ao cliente**:

- **Agente do cliente**: Este agente representa o cliente e é responsável por iniciar o processo de suporte.
- **Agente de suporte**: Este agente representa o processo de suporte e é responsável por fornecer assistência ao cliente.
- **Agente de escalonamento**: Este agente representa o processo de escalonamento e é responsável por encaminhar problemas para um nível superior de suporte.
- **Agente de resolução**: Este agente representa o processo de resolução e é responsável por resolver quaisquer problemas que surjam durante o processo de suporte.
- **Agente de feedback**: Este agente representa o processo de feedback e é responsável por coletar feedback do cliente.
- **Agente de notificações**: Este agente representa o processo de notificações e é responsável por enviar notificações ao cliente em várias etapas do processo de suporte.
- **Agente de análise**: Este agente representa o processo de análise e é responsável por analisar dados relacionados ao processo de suporte.
- **Agente de auditoria**: Este agente representa o processo de auditoria e é responsável por auditar o processo de suporte para garantir que está sendo realizado corretamente.
- **Agente de relatórios**: Este agente representa o processo de relatórios e é responsável por gerar relatórios sobre o processo de suporte.
- **Agente de conhecimento**: Este agente representa o processo de conhecimento e é responsável por manter uma base de conhecimento com informações relacionadas ao processo de suporte.
- **Agente de segurança**: Este agente representa o processo de segurança e é responsável por garantir a segurança do processo de suporte.
- **Agente de qualidade**: Este agente representa o processo de qualidade e é responsável por assegurar a qualidade do processo de suporte.
- **Agente de conformidade**: Este agente representa o processo de conformidade e é responsável por garantir que o processo de suporte esteja em conformidade com regulamentos e políticas.
- **Agente de treinamento**: Este agente representa o processo de treinamento e é responsável por treinar os agentes de suporte sobre como ajudar os clientes.

São bastantes agentes, foi mais ou menos do que você esperava?

**Aviso Legal**:
Este documento foi traduzido utilizando serviços de tradução baseados em IA. Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte oficial. Para informações críticas, recomenda-se a tradução profissional feita por humanos. Não nos responsabilizamos por mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução.


A: A2: 當你有大量工作量時

**免責聲明**：
本文件使用基於機器的人工智能翻譯服務進行翻譯。儘管我們努力確保準確性，但請注意，自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊，建議尋求專業人工翻譯。我們對因使用此翻譯而產生的任何誤解或錯誤解讀概不負責。


**專門用於客戶支援流程的代理**：

- **Customer agent（客戶代理）**：此代理代表客戶，負責啟動支援流程。
- **Support agent（支援代理）**：此代理代表支援流程，負責為客戶提供協助。
- **Escalation agent（升級代理）**：此代理代表升級流程，負責將問題升級至更高層級的支援。
- **Resolution agent（解決代理）**：此代理代表問題解決流程，負責處理支援過程中出現的任何問題。
- **Feedback agent（回饋代理）**：此代理代表回饋流程，負責收集客戶的意見和建議。
- **Notification agent（通知代理）**：此代理代表通知流程，負責在支援流程的不同階段向客戶發送通知。
- **Analytics agent（分析代理）**：此代理代表數據分析流程，負責分析與支援流程相關的數據。
- **Audit agent（審核代理）**：此代理代表審核流程，負責審查支援流程以確保其正確執行。
- **Reporting agent（報告代理）**：此代理代表報告流程，負責生成有關支援流程的報告。
- **Knowledge agent（知識代理）**：此代理代表知識管理流程，負責維護與支援流程相關的知識庫。
- **Security agent（安全代理）**：此代理代表安全流程，負責確保支援流程的安全性。
- **Quality agent（品質代理）**：此代理代表品質管理流程，負責確保支援流程的服務品質。
- **Compliance agent（合規代理）**：此代理代表合規流程，負責確保支援流程符合相關規範與政策。
- **Training agent（培訓代理）**：此代理代表培訓流程，負責培訓支援代理如何更好地協助客戶。

這麼多代理，跟你預期的相比，是多了還是少了呢？

**免責聲明**：
本文件是使用機器翻譯服務進行翻譯的。我們雖然致力於確保翻譯的準確性，但請注意，自動翻譯可能包含錯誤或不精確之處。應以原始語言的文件作為權威來源。對於關鍵信息，建議尋求專業人工翻譯。我們對因使用本翻譯而產生的任何誤解或錯誤解釋概不負責。


A: A2: 当你有大量工作时

**免责声明**：
本文档使用基于机器的人工智能翻译服务进行翻译。尽管我们努力确保翻译的准确性，但请注意，自动翻译可能包含错误或不准确之处。应以原文档的原始语言版本作为权威来源。对于关键信息，建议寻求专业人工翻译。我们对于因使用本翻译而引起的任何误解或误读不承担责任。


**专门用于客户支持流程的代理**：

- **客户代理（Customer agent）**：此代理代表客户，负责启动支持流程。
- **支持代理（Support agent）**：此代理代表支持流程，负责为客户提供协助。
- **升级代理（Escalation agent）**：此代理代表升级流程，负责将问题升级到更高级别的支持。
- **解决代理（Resolution agent）**：此代理代表解决流程，负责解决支持流程中出现的任何问题。
- **反馈代理（Feedback agent）**：此代理代表反馈流程，负责收集客户的反馈意见。
- **通知代理（Notification agent）**：此代理代表通知流程，负责在支持流程的各个阶段向客户发送通知。
- **分析代理（Analytics agent）**：此代理代表分析流程，负责分析与支持流程相关的数据。
- **审计代理（Audit agent）**：此代理代表审计流程，负责审查支持流程以确保其正确执行。
- **报告代理（Reporting agent）**：此代理代表报告流程，负责生成有关支持流程的报告。
- **知识代理（Knowledge agent）**：此代理代表知识流程，负责维护与支持流程相关的信息知识库。
- **安全代理（Security agent）**：此代理代表安全流程，负责确保支持流程的安全性。
- **质量代理（Quality agent）**：此代理代表质量流程，负责确保支持流程的质量。
- **合规代理（Compliance agent）**：此代理代表合规流程，负责确保支持流程符合相关法规和政策。
- **培训代理（Training agent）**：此代理代表培训流程，负责培训支持代理如何为客户提供帮助。

这些代理数量怎么样，是不是比你预期的多或少呢？

**免责声明**：
本文件通过基于机器的AI翻译服务进行翻译。尽管我们努力确保准确性，但请注意，自动翻译可能包含错误或不准确之处。应以原文所在语言的文件为权威来源。对于关键信息，建议使用专业人工翻译。因使用本翻译而引起的任何误解或误读，我们概不负责。


# ai-by-hand-excel

AI by Hand ✍ Exercises in Excel

![](gallery.png)

## Basic
* Softmax
* LeakyReLU
* Temperature

## Advanced
* Multi Layer Perceptron (MLP)
* Backpropagation
* Recurrent Neural Network (RNN)
* Long Short Term Memory (LSTM) (+ Seq2Seq)
* Extended Long Short Term Memory (xLSTM)
* Residual Network (ResNet)
* Transformer - Simple
* Transformer - Full Stack
* Self-Attention
* Multihead Attention
* Autoencoder (AE)
* Mamba
* AlphaFold

## Lectures

### 🔥 NEW: DeepSeek
Multi-head Latent Attention + Mixture of Experts
(blank only)

[View](https://o365coloradoedu-my.sharepoint.com/:x:/g/personal/peye9704_colorado_edu/EfAlZg6tnotMtEb3N0TA_98BWFdAiqD24mc-MqETTDoVUQ?e=dh4Ncq)
| [Download](lectures/DeepSeek-blank.xlsx)
![deepseek](assets/deepseek.png)

## Workbook
1. Dot Product
2. Matrix Multiplication
3. Linear Layer

## Coming Soon
* Generative Adversarial Network (GAN)
* Variational Autoencoder (VAE)
* U-Net
* CLIP
* more ...

README.md


# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our
community include:

* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
  and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
  overall community

Examples of unacceptable behavior include:

* The use of sexualized language or imagery, and sexual attention or
  advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
  address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.

Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
https://x.com/OmAI_lab.
All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the
reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:

### 1. Correction

**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.

**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.

### 2. Warning

**Community Impact**: A violation through a single incident or series
of actions.

**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.

### 3. Temporary Ban

**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.

### 4. Permanent Ban

**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior,  harassment of an
individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent ban from any sort of public interaction within
the community.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

CODE_OF_CONDUCT.md

Solve Visual Understanding with Reinforced VLMs


# VLM-R1: A stable and generalizable R1-style Large Vision-Language Model

 [[🤗 Demo](https://huggingface.co/spaces/omlab/VLM-R1-Referral-Expression)] [[🤗 Data](https://huggingface.co/datasets/omlab/VLM-R1)] [[🤗 Checkpoint](https://huggingface.co/omlab/Qwen2.5VL-3B-VLM-R1-REC-500steps)]

Since the introduction of [Deepseek-R1](https://github.com/deepseek-ai/DeepSeek-R1), numerous works have emerged focusing on reproducing and improving upon it. In this project, we propose VLM-R1, a stable and generalizable R1-style Large Vision-Language Model.

Specifically, for the task of Referring Expression Comprehension (REC), we trained [Qwen2.5-VL](https://github.com/QwenLM/Qwen2.5-VL) using both R1 and SFT approaches. The results reveal that, on the in-domain test data, the performance of the SFT model is slightly lower than that of the R1 model (as shown at the top of the figure above). However, on the out-of-domain test data, the SFT model’s performance deteriorates significantly as the number of steps increases, while the R1 model shows a steady improvement (as shown at the bottom of the figure above).

## Update

- 2025-02-21: We release the [checkpoint](https://huggingface.co/omlab/Qwen2.5VL-3B-VLM-R1-REC-500steps) of the VLM-R1 REC model.
- 2025-02-20: We release the script for [general data loading](#for-your-own-data).
- 2025-02-19: We incorporate an explanation of the [SFT](#sft) method.
- 2025-02-17: We release the VLM-R1 REC [Demo](https://huggingface.co/spaces/omlab/VLM-R1-Referral-Expression) on Hugging Face Spaces.
- 2025-02-15: We release the VLM-R1 repository and [GRPO](#grpo) training script.

## Setup

```bash
conda create -n vlm-r1 python=3.10
conda activate vlm-r1
bash setup.sh
```

## Training

### Referring Expression Comprehension (REC)

#### GRPO

> 1. Download the [COCO Train2014 image](https://huggingface.co/datasets/omlab/VLM-R1/resolve/main/train2014.zip) and unzip it, and we refer to the image dir as `<your_image_root>`.

> 2. Download the [RefCOCO/+/g and RefGTA Annotation files](https://huggingface.co/datasets/omlab/VLM-R1/resolve/main/rec_jsons_processed.zip) and unzip it (RefGTA is used for out-of-domain evaluation).

> 3. Write the path of the annotation files in the `src/open-r1-multimodal/data_config/rec.yaml` file.
```bash
datasets:
    - json_path: /path/to/refcoco_train.json
    - json_path: /path/to/refcocop_train.json
    - json_path: /path/to/refcocog_train.json
```

> 4. ```bash src/open-r1-multimodal/run_grpo_rec.sh```

> NOTE: If you encounter 'CUDA out of memory' error, you can try to (1) set `gradient_checkpointing` as `true`, (2) reduce the `num_generations`, or (3) use lora (the script will be updated soon).

```bash
cd src/open-r1-multimodal

torchrun --nproc_per_node="8" \
    --nnodes="1" \
    --node_rank="0" \
    --master_addr="127.0.0.1" \
    --master_port="12346" \
    src/open_r1/grpo_rec.py \
    --deepspeed local_scripts/zero3.json \
    --output_dir output/$RUN_NAME \
    --model_name_or_path Qwen/Qwen2.5-VL-3B-Instruct \
    --dataset_name data_config/rec.yaml \
    --image_root <your_image_root> \
    --max_prompt_length 1024 \
    --num_generations 8 \
    --per_device_train_batch_size 1 \
    --gradient_accumulation_steps 2 \
    --logging_steps 1 \
    --bf16 \
    --torch_dtype bfloat16 \
    --data_seed 42 \
    --report_to wandb \
    --gradient_checkpointing false \
    --attn_implementation flash_attention_2 \
    --num_train_epochs 2 \
    --run_name $RUN_NAME \
    --save_steps 100 \
    --save_only_model true
```

![image](./assets/iou.jpg)

#### Multi-Node GRPO
For multi-node training, please refers to [multinode_training_demo.sh](src/open-r1-multimodal/multinode_training_demo.sh).

#### SFT
We use [LLaMA-Factory](https://github.com/hiyouga/LLaMA-Factory) to train the SFT model.
> 1. Clone the [LLaMA-Factory](https://github.com/hiyouga/LLaMA-Factory) repository and install the dependencies.
```bash
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"
```

> 2. Download the dataset_info.json, mllm_rec_json.json, and qwen2_5_vl_full_sft.yaml we provided [here](https://huggingface.co/datasets/omlab/VLM-R1/tree/main/sft_related). Put the json files in the `LLaMA-Factory/data` directory and the yaml file in the `LLaMA-Factory/examples/train_full` directory.

> 3. Run the following command to train the SFT model.
```bash
llamafactory-cli train examples/train_full/qwen2_5_vl_full_sft.yaml
```

### For your own data
We also support data loading the jsonl data of this format in [`src/open-r1-multimodal/src/open_r1/grpo_jsonl.py`](src/open-r1-multimodal/src/open_r1/grpo_jsonl.py). Please note that you may need to use different reward functions for your specialized tasks. Welcome to PR to add your own reward functions or share any other interesting findings!

The jsonl has the format as follows:
```json
{"id": 1, "image": "Clevr_CoGenT_TrainA_R1/data/images/CLEVR_trainA_000001_16885.png", "conversations": [{"from": "human", "value": "<image>What number of purple metallic balls are there?"}, {"from": "gpt", "value": "0"}]}
```

Note: The image path in the jsonl file should be relative to the image folder specified in `--image_folders`. The absolute path of the input image is constructed as `os.path.join(image_folder, data['image'])`. For example:
- If your jsonl has `"image": "folder1/image1.jpg"`
- And you specify `--image_folders "/path/to/images/"`
- The full image path will be `/path/to/images/folder1/image1.jpg`

Multiple data files and image folders can be specified using ":" as a separator:
```bash
--data_file_paths /path/to/data1.jsonl:/path/to/data2.jsonl \
--image_folders /path/to/images1/:/path/to/images2/
```

The script can be run like this:
```bash
torchrun --nproc_per_node="8" \
    --nnodes="1" \
    --node_rank="0" \
    --master_addr="127.0.0.1" \
    --master_port="12345" \
  src/open_r1/grpo_jsonl.py \
    --output_dir output/$RUN_NAME \
    --model_name_or_path Qwen/Qwen2.5-VL-3B-Instruct \
    --deepspeed local_scripts/zero3.json \
    --dataset_name <your_dataset_name> \
    --data_file_paths /path/to/your/data.jsonl \ # can be multiple, separated by ":"
    --image_folders /path/to/your/image/folder/ \ # can be multiple, separated by ":"
    ...
```
## Evaluation

![image](./assets/data.png)

> 1. Download the provided [RefGTA images](https://huggingface.co/datasets/omlab/VLM-R1/resolve/main/refgta.zip).
```bash
cd ./src/eval

# Remember to change the model path, image root, and annotation path in the script
python test_rec_r1.py # for GRPO
python test_rec_baseline.py # for SFT
```

## Acknowledgements

We would like to express our sincere gratitude to [DeepSeek](https://github.com/deepseek-ai/DeepSeek-R1), [Open-R1](https://github.com/huggingface/open-r1), [QwenVL](https://github.com/QwenLM/Qwen2.5-VL), [Open-R1-Multimodal](https://github.com/EvolvingLMMs-Lab/open-r1-multimodal), [R1-V](https://github.com/Deep-Agent/R1-V), [RefCOCO](https://github.com/lichengunc/refer), and [RefGTA](https://github.com/mikittt/easy-to-understand-REG/tree/master/pyutils/refer2) for providing open-source resources that contributed to the development of this project.

## Citation
If you find this project useful, welcome to cite us.
```bib
@misc{shen2025vlmr1,
  author       = {Shen, Haozhan and Zhang, Zilun and Zhang, Qianqian and Xu, Ruochen and Zhao, Tiancheng},
  title        = {VLM-R1: A stable and generalizable R1-style Large Vision-Language Model},
  howpublished = {\url{https://github.com/om-ai-lab/VLM-R1}},
  note         = {Accessed: 2025-02-15},
  year         = {2025}
}
```

README.md