1、创建一个新的 CrewAI 项目 surprise_trip

crewai create crew surprise_trip
选择模型厂商和模型

生成.env
MODEL=gpt-4o
OPENAI_API_KEY=你的api_keySERPER_API_KEY=你的SERPER api_key

2、探索项目结构

3、配置代理

修改 agents.yaml文件。

# 个性化活动规划师 Agent
personalized_activity_planner:# 角色名称:用于识别 agent 的职责(对模型来说类似标题)role: >活动规划师# 目标描述:告诉 agent 它要完成的任务目标goal: >调研并寻找目的地的有趣活动和事件,确保这些内容符合旅行者的兴趣和年龄段# 背景故事:为 agent 赋予人设,增强语言模型的代入感,提升生成质量backstory: >你擅长根据旅行者的具体偏好和人群特点设计个性化的行程安排,你能快速找到最适合他们的活动组合,打造难忘的旅程。# 餐厅探索者 Agent
restaurant_scout:role: >餐厅侦查员goal: >寻找目的地评分高的餐厅和用餐体验,并推荐风景优美和有趣的场所backstory: >你是一个热爱美食的人,熟悉本地最棒的用餐地点,你总能找到既美味又有氛围的餐厅,同时也能发现风景优美和适合游玩的好地方。# 行程整合者 Agent
itinerary_compiler:role: >行程整合师goal: >整合所有调研到的信息,编排成一个完整的逐日行程安排,确保包含航班与酒店信息;请用中文输出;backstory: >你擅长组织和呈现信息,注重细节,能够把零散内容整合为一个条理清晰、愉快易行的旅行计划。

4、配置任务

修改这个 tasks.yaml文件。

# 个性化活动规划任务
personalized_activity_planning_task:# 任务描述:为旅行者寻找符合兴趣和年龄段的活动与事件description: >调研并发现适合在 {destination} 进行的有趣活动。重点关注符合旅行者兴趣和年龄段的活动和事件。利用互联网搜索工具和推荐引擎获取信息。旅行者信息如下:- 出发地: {origin}- 目的地: {destination}- 年龄: {age}- 酒店位置: {hotel_location}- 航班信息: {flight_information}- 旅行时长: {trip_duration}# 预期输出:旅行期间每天推荐的活动清单expected_output: >一份按天列出的活动与事件推荐清单。每一项应包含活动名称、地点、简要描述、适合旅行者的理由,并尽可能附上评论和评分信息。# 餐厅与风景地点探索任务
restaurant_scenic_location_scout_task:# 任务描述:寻找优质餐厅与适合游玩的风景地description: >在 {destination} 寻找高评分的餐厅和独特的用餐体验。推荐风景优美的地点和有趣的活动,符合旅行者偏好。使用互联网搜索工具、餐厅评论网站和旅行指南。提供多样化选择,满足不同口味与预算,并提供评分信息。旅行者信息如下:- 出发地: {origin}- 目的地: {destination}- 年龄: {age}- 酒店位置: {hotel_location}- 航班信息: {flight_information}- 旅行时长: {trip_duration}# 预期输出:每天推荐的餐厅与景点清单expected_output: >一份按天列出的推荐餐厅、风景地点和活动清单。每一项应包括名称、地址、菜系或活动类型、简要描述及评分信息。# 行程整合任务
itinerary_compilation_task:# 任务描述:整合所有信息为完整的行程规划文档description: >整合所有调研信息,编排出 {destination} 的完整日程安排。行程应包含航班、酒店信息、计划的每日活动与用餐安排。使用文本格式化与文档生成工具进行内容组织与美化。# 预期输出:结构化的日程表expected_output: >一份详细的旅行行程文档。内容应包含逐日安排,并整合航班、酒店、活动、餐厅和风景地点等信息。格式为 Markdown,不带“```”

5、配置团队

修改这个 crew.py文件

from crewai import Agent, Crew, Process, Task
from crewai.project import CrewBase, agent, crew, task# 如果你有自定义工具,可以取消以下注释导入自定义工具
# from surprise_travel.tools.custom_tool import MyCustomTool# 以下是 CrewAI 提供的内置工具,用于网页搜索与抓取
from crewai_tools import SerperDevTool, ScrapeWebsiteTool
from pydantic import BaseModel, Field
from typing import List, Optional# 活动模型类:表示一天中安排的某一项活动
class Activity(BaseModel):name: str = Field(..., description="活动名称")location: str = Field(..., description="活动地点")description: str = Field(..., description="活动描述")date: str = Field(..., description="活动日期")cousine: str = Field(..., description="餐厅的菜系类型")why_its_suitable: str = Field(..., description="为什么这项活动适合旅行者")reviews: Optional[List[str]] = Field(..., description="活动的评论列表")rating: Optional[float] = Field(..., description="活动评分")# 每日旅行计划模型类
class DayPlan(BaseModel):date: str = Field(..., description="当天的日期")activities: List[Activity] = Field(..., description="当天的活动列表")restaurants: List[str] = Field(..., description="当天推荐的餐厅列表")flight: Optional[str] = Field(None, description="当天的航班信息(如有)")# 整体行程模型类
class Itinerary(BaseModel):name: str = Field(..., description="行程名称,可以有趣一点")day_plans: List[DayPlan] = Field(..., description="每天的行程计划列表")hotel: str = Field(..., description="酒店信息")# 使用 CrewBase 装饰器标记为 Crew 项目的入口
@CrewBase
class SurpriseTravelCrew():"""SurpriseTravel 旅行策划团队(crew)"""# 代理配置文件路径(YAML 格式)agents_config = 'config/agents.yaml'# 任务配置文件路径(YAML 格式)tasks_config = 'config/tasks.yaml'# 个性化活动规划 agent@agentdef personalized_activity_planner(self) -> Agent:return Agent(config=self.agents_config['personalized_activity_planner'],  # 从配置文件加载 agent 设置tools=[SerperDevTool(), ScrapeWebsiteTool()],  # 使用搜索和网页抓取工具verbose=True,  # 输出详细执行日志allow_delegation=False,  # 禁止任务委托给其他代理)# 餐厅与景点推荐 agent@agentdef restaurant_scout(self) -> Agent:return Agent(config=self.agents_config['restaurant_scout'],tools=[SerperDevTool(), ScrapeWebsiteTool()],verbose=True,allow_delegation=False,)# 整合所有信息并输出最终行程的 agent@agentdef itinerary_compiler(self) -> Agent:return Agent(config=self.agents_config['itinerary_compiler'],tools=[SerperDevTool()],verbose=True,allow_delegation=False,)# 个性化活动规划任务@taskdef personalized_activity_planning_task(self) -> Task:return Task(config=self.tasks_config['personalized_activity_planning_task'],agent=self.personalized_activity_planner()  # 指定任务负责的 agent)# 餐厅与风景位置探索任务@taskdef restaurant_scenic_location_scout_task(self) -> Task:return Task(config=self.tasks_config['restaurant_scenic_location_scout_task'],agent=self.restaurant_scout())# 编译最终行程任务,并指定输出格式为 Itinerary 数据模型@taskdef itinerary_compilation_task(self) -> Task:return Task(config=self.tasks_config['itinerary_compilation_task'],agent=self.itinerary_compiler(),output_json=Itinerary  # 指定结构化输出格式)@taskdef reporting_task(self) -> Task:return Task(config=self.tasks_config['itinerary_compilation_task'],  # type: ignore[index]agent=self.itinerary_compiler(),output_file='report-01.md')# 将 agents 与 tasks 组装成一个完整的 crew 执行流@crewdef crew(self) -> Crew:"""创建 SurpriseTravel 团队,定义其执行流程"""return Crew(agents=self.agents,  # 所有注册的代理(通过 @agent 自动生成)tasks=self.tasks,  # 所有注册的任务(通过 @task 自动生成)process=Process.sequential,  # 顺序执行所有任务verbose=True,# 如需使用分层流程,也可使用以下配置:# process=Process.hierarchical, 参考:https://docs.crewai.com/how-to/Hierarchical/)

6、配置主函数

修改这个 main.py文件

# 指定使用 Python 解释器运行该脚本import sys
import warnings  # 导入警告处理模块
from datetime import datetime  # 导入处理日期和时间的模块from surprise_trip.crew import SurpriseTravelCrew  # 从项目中导入 SurpriseTravelCrew 类# 关闭特定模块中的语法警告(此处为 pysbd 模块)
warnings.filterwarnings("ignore", category=SyntaxWarning, module="pysbd")# 此主程序文件是为了在本地运行 crew 而设计的,请勿在此文件中添加不必要的逻辑。
# 你可以替换下面的 inputs 变量,它会自动填充任务和代理的信息。def run():"""运行 crew 执行流程。"""# 设置输入参数,可以根据需要修改。它会自动被各个任务和 agent 使用。inputs = {'origin': '上海虹桥机场(SHA)',  # 出发地'destination': '北京大兴机场(PKX)',  # 目的地'age': 31,  # 用户年龄'hotel_location': '北京朝阳区',  # 希望住的酒店位置'flight_information': '国航 CA1234,起飞时间为 2025年6月30日 上午10:00',  # 航班信息'trip_duration': '14 天'  # 旅行时长}try:# 实例化 SurpriseTravelCrew 并运行 crew 的 kickoff 方法(启动执行流程)SurpriseTravelCrew().crew().kickoff(inputs=inputs)except Exception as e:# 捕获并抛出异常,便于调试raise Exception(f"运行 crew 时发生错误: {e}")def train():"""训练 crew,执行指定次数的迭代。"""inputs = {'origin': '上海虹桥机场(SHA)',  # 出发地'destination': '北京大兴机场(PKX)',  # 目的地'age': 31,  # 用户年龄'hotel_location': '北京朝阳区',  # 希望住的酒店位置'flight_information': '国航 CA1234,起飞时间为 2025年6月30日 上午10:00',  # 航班信息'trip_duration': '14 天'  # 旅行时长}try:# 通过命令行参数获取迭代次数和保存的模型文件名# 使用 crew 的 train 方法进行训练SurpriseTravelCrew().crew().train(n_iterations=int(sys.argv[1]), filename=sys.argv[2], inputs=inputs)except Exception as e:# 捕获并抛出异常,便于调试raise Exception(f"训练 crew 时发生错误: {e}")def replay():"""从指定的任务 ID 开始回放 crew 执行过程。"""try:# 从命令行参数中获取任务 ID,并调用 replay 方法回放SurpriseTravelCrew().crew().replay(task_id=sys.argv[1])except Exception as e:# 捕获并抛出异常,便于调试raise Exception(f"回放 crew 时发生错误: {e}")def test():"""测试 crew 的执行逻辑,并返回评估结果。"""# 设置测试输入inputs = {"topic": "AI LLMs",  # 测试主题,例如大语言模型"current_year": str(datetime.now().year)  # 当前年份}try:# 从命令行参数中获取迭代次数和用于评估的 LLM 名称,调用 test 方法进行测试SurpriseTravelCrew().crew().test(n_iterations=int(sys.argv[1]), eval_llm=sys.argv[2], inputs=inputs)except Exception as e:# 捕获并抛出异常,便于调试raise Exception(f"测试 crew 时发生错误: {e}")

7、运行crew 启动项目

7.1、项目初始化(可选)
crewai install

7.2、启动项目

#要到项目根目录下

crewai run

8、查看思考和执行过程

中间省略...

9、效果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88299.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88299.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88299.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue脚手架与前后端交互

前言 。Vue.js作为一种流行的前端框架,提供了丰富的功能和灵活的架构,方便了开发者进行高效的开发。为了更好地使用Vue,Vue CLI(脚手架工具)成为了开发者进行项目创建和管理的重要工具。本文将结合Vue脚手架的使用场景…

【麻省理工】《how to speaking》笔记

【【麻省理工】《如何说话》一节课教你成为表达的王者】 开始 在演讲最开始的时候,你要告诉观众,在接下来的15分钟或一个小时之内,他们将会学到什么东西。这会让观众集中注意力去倾听。 PPT 你的幻灯片上的字要越少越好。因为听众的大脑一…

ESP32-HTML-08

一、html显示图片 1.工程包含Html需要显示的图片 2、CMakeLists.txt包含图片资源 举例&#xff1a; idf_component_register(SRCS main.cEMBED_FILES root.html favicon.ico) 3.html中图片的标签 <img src"motus.ico"> 4.后台代码的添加 static esp_e…

前端后端文件下载防抖实现方案

在 Vue 3 中实现下载文件防抖&#xff0c;可以通过封装一个防抖函数来控制下载请求的触发频率。以下是完整的实现方案&#xff1a; 1. 封装防抖工具函数 javascript 复制 下载 // utils/debounce.js export function debounce(func, delay) {let timer null;return funct…

【Linux网络与网络编程】15.DNS与ICMP协议

1. DNS 1.1 DNS介绍 TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序&#xff0c;但是 IP 地址不方便记忆&#xff0c;于是人们发明了一种叫主机名的字符串&#xff0c;并使用 hosts 文件来描述主机名和 IP 地址的关系。最初, 通过互连网信息中心(SRI-NIC)来…

Python打卡:Day35

复习日 浙大疏锦行

GoAdmin代码生成器实践

文章目录 前言创建SQL表格使用在线生成工具应用自动生成的代码数据变更时附加新的逻辑总结 前言 开源项目 go-admin&#xff0c;我一直用的是这个地址 https://github.com/GoAdminGroup/go-admin&#xff0c;不过最近发现了一个 Gin Vue 版本的 go-admin&#xff0c;对我解决…

web布局13

在 CSS 中有很多种类型的函数&#xff0c;其中可用于尺寸属性的函数主要有 calc() 、min() 、max() 、clamp() 等。这些 CSS 函数都可用来设置网格轨道尺寸&#xff0c;除此之外&#xff0c;还有一些专门用于设置网格轨道的函数&#xff0c;比如 repeat() 、minmax() 和 fit-co…

pdf转图片(png,jpg)的python脚本

pdf转图片&#xff08;png&#xff0c;jpg&#xff09;的python脚本 PDF转图片工具 1.安装库 pip install pymupdf 2.如果需要pdf转jpg的更改DEFAULT_FORMAT即可 3.一定注意要将脚本与待转化的.pdf文件放在同一个目录 4.运行脚本&#xff0c;将脚本所在目录所有.pdf文件转…

大模型本地部署,拥有属于自己的ChatGpt

ChatGpt 以其强大的信息整合和对话能力惊艳了全球,在自然语言处理上面表现出了惊人的能力。不管用于文案撰写还是程序辅助开发都大大提高了我们的工作效率,但是其使用有一定的门槛,让我们大多数人都望而却步,今天我们利用ollama实现本地大模型的步骤,让我们轻松拥有自己的…

【mcu】-老旧小区门禁电话改造指南

老旧小区门禁电话改造指南(四线制DIY方案) 一、明确四根线的功能(关键第一步) 通常四线制门禁电话的线缆定义如下(需用万用表验证): 线色 常见功能 电压/信号类型 检测方法 红线 电源正极(+12V) DC 12V(待机) 万用表直流档测对黑线电压 黑线 电源负极(GND) 0V 与…

word中如何快速打出上标?

在 Microsoft Word 中快速输入上标的方法有以下几种&#xff0c;推荐掌握 键盘快捷键法&#xff08;最常用高效&#xff09;&#xff1a; ⭐ 方法一&#xff1a;快捷键法&#xff08;强烈推荐&#xff0c;效率最高&#xff01;&#xff09; 输入需要上标的文字/数字&#xff0…

如何优化HarmonyOS 5的分布式通信性能?

以下是针对HarmonyOS 5分布式通信性能优化的系统性方案&#xff0c;结合核心技术特性与实践经验&#xff1a; 一、传输层优化 数据压缩与批处理 // 启用ZLIB压缩&#xff08;>1KB自动压缩&#xff09; DistributedConfig config new DistributedConfig.Builder().setCom…

Matplotlib图像处理三剑客:imshow(), imread(), imsave()

Matplotlib是Python中最著名的数据可视化库之一&#xff0c;它不仅能够绘制各种统计图表&#xff0c;还提供了强大的图像处理功能。本文将重点介绍Matplotlib中三个核心的图像处理方法&#xff1a;imshow()、imread()和imsave()&#xff0c;通过示例代码展示它们的使用方法。 …

[特殊字符]防止 MyBatis-Plus 中模糊查询 `%` 查出全表:实现通配符转义拦截器

目录标题 ❓为什么需要转义 % 和 _&#x1f9ea; 使用案例&#xff1a;防止传入 % 导致全表查询&#x1f3af; 支持哪些场景&#xff1f;✅ 拦截器实现思路&#x1f9e9; 核心拦截器代码实现&#x1f510; 可选忽略某些 SQL 的转义 ❓为什么需要转义 % 和 _ 在使用 MyBatis-Pl…

linux grep的一些坑

grep -a "commit" a.log 可以获取到所有的数据&#xff08;可以看到a.log所有的commit关键词&#xff09; 但cat a.log|grep "commit" 无法全部获取到&#xff08;只能看到a.log中部分的的commit&#xff09; 细分析和可能原因&#xff1a; 1. 二进制文件…

牛客 AI 面试 Ultra 版升级:开启招聘新纪元

每到招聘季&#xff0c;HR 们便陷入繁忙与焦虑。海量简历筛选耗费大量人力&#xff0c;初步面试耗费数周时间&#xff0c;好不容易安排好面试官与候选人时间&#xff0c;又可能因各种意外状况打乱节奏。而牛客 AI 面试 Ultra 版恰似一束光&#xff0c;照亮了招聘流程优化的道路…

OSS与NAS混合云存储架构:非结构化数据统一管理实战

AI训练集管理面临的核心挑战&#xff1a;数据规模爆炸式增长与访问模式多样化的矛盾。ImageNet等典型数据集已达150TB规模&#xff0c;传统单一存储方案面临三重困境&#xff1a; NAS在PB级场景下硬件成本呈指数增长OSS对象存储无法满足高频随机访问需求跨存储数据访问导致训练…

72、单元测试-常用测试注解

72、单元测试-常用测试注解 在单元测试中&#xff0c;常用的测试注解可以帮助组织和管理测试代码&#xff0c;提高测试的可读性和可维护性。以下是JUnit和TestNG框架中一些常用的测试注解及其功能&#xff1a; #### JUnit注解 1. **Test** - 标记一个方法为测试方法。 - 可以设…

强化学习在大型语言模型训练中的最新进展:开源项目深度分析报告

强化学习在大型语言模型训练中的最新进展&#xff1a;开源项目深度分析报告 引言 近年来&#xff0c;人工智能领域见证了大型语言模型(LLM)的迅速崛起&#xff0c;而强化学习作为机器学习的重要分支&#xff0c;在提升LLM推理能力方面展现出巨大潜力。随着OpenAI发布o1等推理…