旅行智能推荐助手一、准备工作获取实时搜索的apitavily-pythonAI 搜索 API 客户端用于获取实时的网络搜索结果可以在官网注册后获取 API。我们先在终端创建一个新环境命名为ai-agent当时设置的镜像是清华源的注意把梯子关了conda create -n ai-agent python3.11 -y然后再激活环境conda activate ai-agent用国内的镜像源安装pip install requests openai tavily-python -i https://pypi.tuna.tsinghua.edu.cn/simple二、编写智能体并测试打开vscode选择我们刚刚创建的环境。创建travel_agent.py文件# travel_agent.py 智能旅行助手完整代码 import os import re import requests from openai import OpenAI from tavily import TavilyClient # 1. 系统提示词智能体的指令 AGENT_SYSTEM_PROMPT 你是一个智能旅行助手。你的任务是分析用户的请求并使用可用工具一步步地解决问题。 # 可用工具: - get_weather(city: str): 查询指定城市的实时天气。 - get_attraction(city: str, weather: str): 根据城市和天气搜索推荐的旅游景点。 # 输出格式要求: 你的每次回复必须严格遵循以下格式包含一对Thought和Action Thought: [你的思考过程和下一步计划] Action: [你要执行的具体行动] Action的格式必须是以下之一 1. 调用工具function_name(arg_namearg_value) 2. 结束任务Finish[最终答案] # 重要提示: - 每次只输出一对Thought-Action - Action必须在同一行不要换行 - 当收集到足够信息可以回答用户问题时必须使用 Action: Finish[最终答案] 格式结束 # 2. 工具1查询天气 def get_weather(city: str) - str: url fhttps://wttr.in/{city}?formatj1 try: response requests.get(url, timeout10) response.raise_for_status() data response.json() current data[current_condition][0] desc current[weatherDesc][0][value] temp current[temp_C] return f{city}当前天气{desc}气温{temp}℃ except Exception as e: return f天气查询失败{str(e)} # 3. 工具2景点推荐Tavily搜索 def get_attraction(city: str, weather: str) - str: api_key os.environ.get(TAVILY_API_KEY) if not api_key: return 错误未设置Tavily API Key tavily TavilyClient(api_keyapi_key) query f{city} {weather}天气 适合去的旅游景点推荐 try: res tavily.search(queryquery, search_depthbasic, include_answerTrue) return res.get(answer, 未找到推荐信息) except Exception as e: return f景点搜索失败{str(e)} # 工具注册 available_tools { get_weather: get_weather, get_attraction: get_attraction } # 4. LLM 客户端 class OpenAICompatibleClient: def __init__(self, model: str, api_key: str, base_url: str): self.model model self.client OpenAI(api_keyapi_key, base_urlbase_url) def generate(self, prompt: str, system_prompt: str) - str: print(\n→ 正在调用大模型...) try: messages [ {role: system, content: system_prompt}, {role: user, content: prompt} ] resp self.client.chat.completions.create( modelself.model, messagesmessages, temperature0.1 ) return resp.choices[0].message.content except Exception as e: return f模型调用失败{str(e)} # 5. 填写你的 KEY # 1. 大模型 API 信息 API_KEY 替换成自己的 BASE_URL 替换成自己的 MODEL_ID 替换成自己的 # 2. Tavily API Key搜索景点用 TAVILY_API_KEY 替换成自己的 os.environ[TAVILY_API_KEY] TAVILY_API_KEY # 初始化LLM llm OpenAICompatibleClient( modelMODEL_ID, api_keyAPI_KEY, base_urlBASE_URL ) # 6. 智能体主循环 if __name__ __main__: user_query 你好请帮我查询一下今天北京的天气然后根据天气推荐一个合适的旅游景点。 history [f用户请求{user_query}] print( * 50) print(用户输入, user_query) print( * 50) # 最多循环5次 for round_num in range(5): print(f\n 第 {round_num1} 轮思考 ) # 构造完整prompt full_prompt \n.join(history) # 调用LLM llm_response llm.generate(full_prompt, AGENT_SYSTEM_PROMPT) print(模型输出\n, llm_response) # 截断多余内容 match re.search(r(Thought:.*?Action:.*?)(?\nThought|\Z), llm_response, re.DOTALL) if match: llm_response match.group(1).strip() history.append(llm_response) # 解析Action action_match re.search(rAction: (.*), llm_response) if not action_match: obs 无法解析Action history.append(fObservation: {obs}) continue action action_match.group(1).strip() # 如果是Finish结束任务 if action.startswith(Finish): ans re.findall(rFinish\[(.*?)\], action)[0] print(\n任务完成最终回答\n, ans) break # 解析工具名和参数 tool_name re.findall(r(\w)\(, action)[0] args dict(re.findall(r(\w)([^]), action)) # 执行工具 if tool_name in available_tools: obs available_tools[tool_name](**args) else: obs f工具{tool_name}不存在 print(f\nObservation: {obs}) history.append(fObservation: {obs})我选用的大模型是qwen-turbo打开阿里云百炼通义千问平台https://bailian.console.aliyun.com/用阿里云账号登录没有就注册一个要实名认证右上角进入API Key 管理 → 创建 API Key设置好后执行该文件。最后输出(ai-agent) PS D:\Project\ai-agent C:\Users\HUANG\.conda\envs\ai-agent\python.exe d:/Project/ai-agent/travel_agent.py 用户输入 你好请帮我查询一下今天北京的天气然后根据天气推荐一个合适的旅游景点。 第 1 轮思考 → 正在调用大模型... 模型输出 Thought: 用户需要查询北京的天气并根据天气推荐一个旅游景点。首先我需要调用工具获取北京的实时天气。 Action: function_nameget_weather(city北京) Observation: 北京当前天气Sunny气温26℃ 第 2 轮思考 → 正在调用大模型... 模型输出 Thought: 现在我有了北京的天气信息接下来我需要根据天气推荐一个合适的旅游景点。 Action: function_nameget_attraction(city北京, weatherSunny) Observation: 北京天坛和颐和园在晴天特别适合游览这两个地方有丰富的历史和美丽的景色。 第 3 轮思考 → 正在调用大模型... 模型输出 Thought: 根据天气信息我已找到适合的旅游景点。现在可以向用户推荐这些景点。 Action: Finish[北京今天天气晴朗气温26℃推荐您去北京天坛和颐和园游览这两个地方在晴天特别适合有丰富的历史和美丽的景色。] 任务完成最终回答 北京今天天气晴朗气温26℃推荐您去北京天坛和颐和园游览这两个地方在晴天特别适合有丰富的历史和美丽的景色。 (ai-agent) PS D:\Project\ai-agent