diff --git a/mxAgent/samples/basic_demo/agent_test.py b/mxAgent/samples/basic_demo/agent_test.py new file mode 100644 index 0000000000000000000000000000000000000000..0d037fcb0d38794f7e6bfb8874413d8193b52cbf --- /dev/null +++ b/mxAgent/samples/basic_demo/agent_test.py @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved. + +import warnings +import argparse + +from loguru import logger + +from agent_sdk.agentchain.react_agent import ReactAgent, ReactReflectAgent +from agent_sdk.agentchain.tool_less_agent import ToollessAgent +from agent_sdk.llms.llm import get_llm_backend, BACKEND_OPENAI_COMPATIBLE +from samples.tools import QueryAccommodations, QueryAttractions, \ + QueryGoogleDistanceMatrix, QueryTransports, Finish + +warnings.filterwarnings('ignore') + +MAX_CONTEXT_LEN = 4096 + + +EXAMPLE = ''' +Question: Can you help with a 5 day trip from Orlando to New York? Departure date is March 10, 2022. +Thought: To create a travel itinerary, I need to find accommodations, transportation, and attractions in New York. I will first find hotels in New York. +Action: QueryAccommodations +Action Input: {"destination_city": "New York", "position": "Central Park", "rank": "four stars"} +Observation1: [{"title": "紐約市10 大最佳四星級酒店 - Tripadvisor", "url": "https://www.tripadvisor.com.hk/Hotels-g60763-zfc4-New_York_City_New_York-Hotels.html", "snippet": "紐約市四星級酒店 · 1. Moxy NYC Times Square · 3,825 則評論 · 2. 格甚溫酒店 · 1,155 則評論 · 3. 托米哈德森廣場飯店 · 3,277 則評論 · 4. 時代廣場愛迪生酒店 · 5. Hard ..."}, {"title": "中央公園酒店| 人氣優惠及套餐", "url": "https://www.agoda.com/zh-hk/park-central-hotel/hotel/new-york-ny-us.html", "snippet": "中央公園酒店是一家位於紐約市的4.0星級酒店,提供豪華的住宿體驗。酒店於2013年進行了最後一次翻新,確保客人能夠享受現代化的設施和舒適的環境。酒店擁有761間客房,提供 ..."}, {"title": "紐約中央公園艾美酒店(Le Méridien New York, Central Park)", "url": "https://www.agoda.com/zh-hk/viceroy-central-park-new-york_2/hotel/new-york-ny-us.html", "snippet": "紐約中央公園艾美酒店位於美國紐約市,是一家四星級酒店。這家酒店提供240間客房 ... 作為一家五星級酒店,紐約中央公園艾美酒店提供優質的服務和舒適的住宿環境 ..."}] +Thought: Now that I have found some hotels in New York, I will next find transportation options from Orlando to New York for the travel dates specified. I will use the QueryTransports API for this purpose. +Action: QueryTransports +Action Input: {"departure_city": "Orlando", "destination_city": "New York", "date": "2022-03-10", "requirement": "budget-friendly"} +Observation2: [{"title": "从奥兰多出发前往纽约的特价机票,往返 ...", "url": "https://www.tianxun.com/routes/orlb/nyca/orlando-to-new-york.html", "snippet": "查找从奥兰多飞往纽约最便宜的月份 ; 3月. ¥750 起 ; 4月. ¥927 起 ; 5月. ¥1,012 起 ; 6月. ¥1,107 起 ; 7月. ¥1,283 起."}, {"title": "从奥兰多国际出发前往纽约拉瓜迪亚的特价机票,往返 ...", "url": "https://www.tianxun.com/routes/mco/lga/orlando-international-to-new-york-laguardia.html", "snippet": "我们始终关注票价,方便您在几秒钟内锁定好价机票。目前,从奥兰多国际飞往纽约拉瓜迪亚最便宜的月份是十一月。"}] +Thought: Now that I have found some transportation options, I will proceed to find attractions in New York. I will use the QueryAttractions API to search for tourist attractions in New York. +Action: QueryAttractions +Action Input: {"destination": "New York"} +Observation3: - snippet: 從參觀紐約市最知名觀光景點開始:時代廣場、帝國大廈、自由女神像,然後利用剩餘的時間探索周圍地區推薦去處。 探索熱門體驗. 根據評等和預訂次數,看看其他旅客喜歡從事 ... + title: 紐約市10 大最佳旅遊景點(2024) - Tripadvisor + url: https://www.tripadvisor.com.hk/Attractions-g60763-Activities-New_York_City_New_York.html +- snippet: 紐約景點推薦 · 紐約景點#1 紐約中央公園 · 紐約景點#2 范德堡一號大樓 SUMMIT · 紐約景點#3 第五大道(Fifth Avenue) + · 紐約景點#4 大都會藝術博物館The ... + title: 【2024紐約景點】漫遊曼哈頓!26個必去行程&免費景點整理 + url: https://www.klook.com/zh-TW/blog/new-york-must-go/ +- snippet: 【紐約NewYork景點推薦】紐約「10大必去」打卡景點整理懶人包 · 紐約NewYork景點推薦-10大必去景點 · 1.中央公園(Central + Park) · 2.第五大道(Fifth Avenue) · 3.大都會 ... + title: 【紐約NewYork景點推薦】紐約「10大必去」打卡景點整理懶人包 + url: https://schoolaplus.com/articles-detail.asp?seq=35 +Thought: Now that I have found some attractions in New York, I will summarize the information and create a travel itinerary for the 5-day trip. I will use the Finish tool to provide the final answer. +Action: Finish +Action Input: {"plan details": "Day 1: Depart from Orlando to New York on March 10, 2022. Stay at the Park Central Hotel in Central Park. Visit the Empire State Building and Times Square. Have dinner at Lombardi's Pizza. +Day 2: Visit Central Park, the Metropolitan Museum of Art, and the American Museum of Natural History. Have lunch at Shake Shack and dinner at Le Pain Quotidien. +Day 3: Explore the Brooklyn Bridge, Brooklyn Heights, and DUMBO. Have lunch at Di Fara Pizza and dinner at Peter Luger Steak House. +Day 4: Visit the Statue of Liberty and Ellis Island. Have lunch at The Boil and dinner at Xi'an Famous Foods. +Day 5: Spend the day shopping on Fifth Avenue and visiting the Rockefeller Center. Have lunch at Shake Shack and dinner at Katz's Delicatessen."} +''' + + +def get_default_react_agent(api_base, api_key, llm_name, max_context_len): + llm = get_llm_backend(BACKEND_OPENAI_COMPATIBLE, api_base, api_key, llm_name).run + + tool_list = [QueryAccommodations, QueryTransports, QueryGoogleDistanceMatrix, QueryAttractions, Finish] + + agent = ReactAgent(llm=llm, tool_list=tool_list, max_context_len=max_context_len) + return agent + + +def get_default_react_agent_fewshot(api_base, api_key, llm_name, max_context_len): + llm = get_llm_backend(BACKEND_OPENAI_COMPATIBLE, api_base, api_key, llm_name).run + + tool_list = [QueryAccommodations, QueryTransports, QueryGoogleDistanceMatrix, QueryAttractions, Finish] + + agent = ReactAgent(llm=llm, example=EXAMPLE, tool_list=tool_list, max_context_len=max_context_len) + return agent + + +def get_default_toolless_agent(api_base, api_key, llm_name, max_context_len): + llm = get_llm_backend(BACKEND_OPENAI_COMPATIBLE, api_base, api_key, llm_name).run + + agent = ToollessAgent(llm=llm, max_context_len=max_context_len) + return agent + + +def get_default_react_reflect_agent(api_base, api_key, llm_name, max_context_len): + llm = get_llm_backend(BACKEND_OPENAI_COMPATIBLE, api_base, api_key, llm_name).run + + tool_list = [QueryAccommodations, QueryTransports, QueryGoogleDistanceMatrix, QueryAttractions, Finish] + agent = ReactReflectAgent(reflect_llm=llm, react_llm=llm, example=EXAMPLE, + tool_list=tool_list, max_context_len=max_context_len) + return agent + + +def test_react_agent(): + a = get_default_react_agent_fewshot(API_BASE, API_KEY, LLM_NAME, MAX_CONTEXT_LEN) + response = a.run("Can you help with a 5 day trip from Orlando to Paris? Departure date is April 10, 2022.") + + logger.info(f"5 day trip from Orlando to Paris:{response.answer}") + + +def test_toolless_agent(): + a = get_default_toolless_agent(API_BASE, API_KEY, LLM_NAME, MAX_CONTEXT_LEN) + response = a.run("Can you help with a 5 day trip from Orlando to Paris? Departure date is April 10, 2022.", + text="given information") + + logger.info(f"5 day trip from Orlando to Paris:{response.answer}") + + +def test_react_reflect_agent(): + a = get_default_react_reflect_agent(API_BASE, API_KEY, LLM_NAME, MAX_CONTEXT_LEN) + response = a.run("Can you help with a 5 day trip from Orlando to Paris? Departure date is April 10, 2022.", + text="given information") + + logger.info(f"5 day trip from Orlando to Paris:{response.answer}") + + +def get_args(): + parse = argparse.ArgumentParser() + parse.add_argument("--model_name", type=str, default="Qwen1.5-32B-Chat", help="OpenAI客户端模型名") + parse.add_argument("--base_url", type=str, default="http://10.44.115.108:1055/v1", help="OpenAI客户端模型地址") + parse.add_argument("--api_key", type=str, default="EMPTY", help="OpenAI客户端api key") + return parse.parse_args().__dict__ + + +if __name__ == "__main__": + args = get_args() + API_BASE = args.pop("base_url") + API_KEY = args.pop("api_key") + LLM_NAME = args.pop("model_name") + logger.info("react agent test begin") + test_react_agent() + logger.info("react agent test end") + + logger.info("toolless agent test begin") + test_toolless_agent() + logger.info("toolless agent test end") + + logger.info("react reflect agent test begin") + test_react_reflect_agent() + logger.info("react reflect agent test end") + + + + + + + diff --git a/mxAgent/samples/basic_demo/agent_traj_systhesis.py b/mxAgent/samples/basic_demo/agent_traj_systhesis.py new file mode 100644 index 0000000000000000000000000000000000000000..651a0a3162411bec0c39e7581ef5a3aa135d9518 --- /dev/null +++ b/mxAgent/samples/basic_demo/agent_traj_systhesis.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved. + +import os +import warnings +import argparse + +from langchain._api import LangChainDeprecationWarning +from loguru import logger +from tqdm import tqdm + +from agent_sdk.agentchain.react_agent import ReactAgent +from agent_sdk.common.enum_type import AgentRunStatus +from agent_sdk.llms.llm import get_llm_backend, BACKEND_OPENAI_COMPATIBLE +from samples.tools import QueryAttractions, QueryTransports, QueryAccommodations, \ + QueryRestaurants, QueryGoogleDistanceMatrix +from mxAgent.samples.basic_demo.agent_test import EXAMPLE + + +warnings.filterwarnings('ignore') +warnings.filterwarnings('ignore', category=DeprecationWarning) +warnings.filterwarnings('ignore', category=LangChainDeprecationWarning) + +os.environ["WORKNING_DIR"] = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + +MAX_CONTEXT_LEN = 4096 + + +def get_default_react_agent(api_base, api_key, llm_name, max_context_len): + llm = get_llm_backend(BACKEND_OPENAI_COMPATIBLE, api_base, api_key, llm_name).run + tool_list = [QueryAttractions, QueryTransports, QueryAccommodations, QueryRestaurants, QueryGoogleDistanceMatrix] + return ReactAgent(llm=llm, example=EXAMPLE, tool_list=tool_list, max_context_len=max_context_len) + + +def get_args(): + parse = argparse.ArgumentParser() + parse.add_argument("--model_name", type=str, default="Qwen1.5-32B-Chat", help="OpenAI客户端模型名") + parse.add_argument("--base_url", type=str, default="http://10.44.115.108:1055/v1", help="OpenAI客户端模型地址") + parse.add_argument("--api_key", type=str, default="EMPTY", help="OpenAI客户端api key") + return parse.parse_args().__dict__ + + +if __name__ == "__main__": + args = get_args() + API_BASE = args.pop("base_url") + API_KEY = args.pop("api_key") + LLM_NAME = args.pop("model_name") + agent = get_default_react_agent(API_BASE, API_KEY, LLM_NAME, MAX_CONTEXT_LEN) + + queries = [ + "Book a rental car for two people in Salt Lake City from April 15 to April 18, 2022.", + "Research and list down outdoor activities suitable for adrenaline junkies in Moab \ +between April 12 and 14, 2022.", + "Write a short itinerary for a weekend trip to Nashville, starting on April 15, including live music venues." + ] + + s = AgentRunStatus() + + for query in tqdm(queries): + result = agent.run(query) + s.total_cnt += 1 + if agent.finished: + s.success_cnt += 1 + agent.save_agent_status("./save_instructions.jsonl") + agent.reset() + logger.info("\n") + logger.info("*" * 150) + logger.info(f"Question: {query}") + logger.info("*" * 150) + logger.info(f"Final answer: {result.answer}") + logger.info("*" * 150) + logger.info(f"Trajectory Path: {result.scratchpad}") + logger.info("*" * 150) + + logger.info(f"success rates: {s}") + logger.info(f"Total success rates: {s}") diff --git a/mxAgent/samples/basic_demo/intent_router.py b/mxAgent/samples/basic_demo/intent_router.py new file mode 100644 index 0000000000000000000000000000000000000000..e59df3d28cdfcfc1ba5c00b3951ff6d8162d57df --- /dev/null +++ b/mxAgent/samples/basic_demo/intent_router.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved. + + +import argparse +from loguru import logger +from agent_sdk.llms.llm import get_llm_backend, BACKEND_OPENAI_COMPATIBLE +from agent_sdk.agentchain.router_agent import RouterAgent + +INTENT = { + "query_flight": "用户期望查询航班信息", + "query_attraction": "用户期望查询旅游景点信息", + "query_hotel": "用户期望查询酒店和住宿信息", + "plan_attraction": "用户期望给出旅行规划建议", + "whimsical": "异想天开", + "other": "其他不符合上述意图的描述" +} + +querys = [ + "帮我查一下从北京去深圳的机票", + "帮我查一下北京的旅游景点", + "我想去北京旅游", + "去北京旅游可以住在哪里呢,推荐一下", + "帮我去书城买本书", "我想上天" +] + + + + +def get_args(): + parse = argparse.ArgumentParser() + parse.add_argument("--model_name", type=str, default="Qwen1.5-32B-Chat", help="OpenAI客户端模型名") + parse.add_argument("--base_url", type=str, default="http://10.44.115.108:1055/v1", help="OpenAI客户端模型地址") + parse.add_argument("--api_key", type=str, default="EMPTY", help="OpenAI客户端api key") + return parse.parse_args().__dict__ + +if __name__ == "__main__": + args = get_args() + API_BASE = args.pop("base_url") + API_KEY = args.pop("api_key") + LLM_NAME = args.pop("model_name") + llm = get_llm_backend(backend=BACKEND_OPENAI_COMPATIBLE, + api_base=API_BASE, api_key=API_KEY, llm_name=LLM_NAME).run + agent = RouterAgent(llm=llm, intents=INTENT) + for query in querys: + response = agent.run(query) + agent.reset() + logger.info(f"query: {query}, intent: {response.answer}") diff --git a/mxAgent/samples/basic_demo/traj_generate_test.py b/mxAgent/samples/basic_demo/traj_generate_test.py new file mode 100644 index 0000000000000000000000000000000000000000..4b175e2ccc9c8dfd8d2ecb4c2e1cc75eff583f67 --- /dev/null +++ b/mxAgent/samples/basic_demo/traj_generate_test.py @@ -0,0 +1,110 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved. + +import json +import os +import warnings +import argparse +from typing import Callable, List +from tqdm import tqdm +from loguru import logger +from langchain._api import LangChainDeprecationWarning + +from agent_sdk.agentchain.base_agent import BaseAgent +from agent_sdk.agentchain.single_action_agent import SingleActionAgent +from agent_sdk.llms.llm import get_llm_backend, BACKEND_OPENAI_COMPATIBLE +from samples.tools import QueryAccommodations, QueryAttractions, QueryRestaurants, \ + QueryTransports, QueryGoogleDistanceMatrix + +os.environ["WORKING_DIR"] = os.path.dirname( + os.path.dirname(os.path.realpath(__file__))) + +warnings.filterwarnings('ignore') +warnings.filterwarnings('ignore', category=DeprecationWarning) +warnings.filterwarnings('ignore', category=LangChainDeprecationWarning) + + +class TrajectoryGenerator: + + @staticmethod + def generate(output_path: str, agent: BaseAgent, load_dataset: Callable[[], List[str]], **kwargs): + questions = load_dataset() + for q in tqdm(questions): + try: + agent.run(q, **kwargs) + agent.save_agent_status(output_path) + agent.reset() + + except Exception as err: + logger.warning(f"generate traj failed, query: {q}, agent: {agent.name}, err: {err}") + continue + + @staticmethod + def _check_data_format(data): + if not isinstance(data, list): + raise ValueError("Data should be a list of dict") + + if len(data) == 0: + raise ValueError("Data should not be empty") + + if not isinstance(data[0], dict): + raise ValueError("Data item should be a dict") + + alpaca_format_keys = ["instruction", "input", "output", "status"] + data_keys_set = set(data[0].keys()) + + if not all([key in data_keys_set for key in alpaca_format_keys]): + raise ValueError("need alpaca data format") + + def _load_data_from_file(self, data_path): + if not os.path.exists(data_path): + raise FileNotFoundError(f"File not found: {data_path}") + + if data_path.endswith(".jsonl"): + data = [json.loads(line) for line in open(data_path, "r")] + else: + raise ValueError("Unknown file format") + + self._check_data_format(data) + return data + + +def get_single_action_agent(api_base, api_key, llm_name): + tool_list = [ + QueryAccommodations, QueryAttractions, QueryRestaurants, + QueryTransports, QueryGoogleDistanceMatrix + ] + llm = get_llm_backend(BACKEND_OPENAI_COMPATIBLE, + api_base, api_key, llm_name).run + return SingleActionAgent(llm=llm, tool_list=tool_list, max_steps=5) + + +def get_args(): + parse = argparse.ArgumentParser() + parse.add_argument("--model_name", type=str, default="Qwen1.5-32B-Chat", help="OpenAI客户端模型名") + parse.add_argument("--base_url", type=str, default="http://10.44.115.108:1055/v1", help="OpenAI客户端模型地址") + parse.add_argument("--api_key", type=str, default="EMPTY", help="OpenAI客户端api key") + return parse.parse_args().__dict__ + + +if __name__ == "__main__": + args = get_args() + API_BASE = args.pop("base_url") + API_KEY = args.pop("api_key") + LLM_NAME = args.pop("model_name") + single_agent = get_single_action_agent(API_BASE, API_KEY, LLM_NAME) + queries = [ + "Write a review of the hotel \"The Beach House\" in Charlotte Amalie.", + "Book a flight from Evansville to Sacramento for April 10th.", + "Create a list of top 5 attractions in Hilo for a solo traveler.", + "Compare the prices of hotels in Newark for a 3-night stay.", + "Book a hotel room in Paducah for April 12th.", + "Write a travel blog post about visiting the Golden Gate Bridge in San Francisco.", + "Recommend the best mode of transportation from Flagstaff to Phoenix.", + "Determine the best time to visit the Statue of Liberty.", + "Compare the prices of car rentals in Seattle.", + "What are the top - rated museums in Harrisburg?" + ] + generator = TrajectoryGenerator() + generator.generate(output_path="./save_instructions.jsonl", agent=single_agent, + load_dataset=lambda: queries) diff --git a/mxAgent/samples/travel_agent_demo/front/chat_bot_release.py b/mxAgent/samples/travel_agent_demo/front/chat_bot_release.py new file mode 100644 index 0000000000000000000000000000000000000000..28cbb7359bcab28fda5f59643ec52598a3a68152 --- /dev/null +++ b/mxAgent/samples/travel_agent_demo/front/chat_bot_release.py @@ -0,0 +1,58 @@ +import streamlit as st +from samples.travel_agent.travelagent import TravelAgent + +if __name__ == "__main__": + st.set_page_config( + page_title="旅游规划agent" + ) + st.logo("logo.jpg") + st.markdown('
您好,我是旅游规划agent,擅长旅行规划、景点攻略查询
+例如:从北京到西安旅游规划
+例如:西安有哪些免费的博物馆景点
+例如:查一下西安的酒店
""" + with col2: + st.markdown(helloinfo, unsafe_allow_html=True) + + for message in st.session_state.messages: + with st.chat_message(message["role"]): + st.empty() + st.markdown(message["content"]) + + prompt = st.chat_input("send message") + if prompt is not None: + st.session_state.messages.append({"role":"user", "content":prompt}) + placeholder1.empty() + placeholder2.empty() + placeholder3.empty() + + agent = st.session_state["agent"] + + with st.chat_message("user"): + st.markdown(prompt) + + with st.chat_message("assistant"): + with st.spinner("thinking..."): + response = agent.run(query=prompt, stream=True) + if isinstance(response, str): + st.markdown(response) + else: + response = st.write_stream(response) + + st.session_state.messages.append({"role":"assistant", "content":response}) \ No newline at end of file diff --git a/mxAgent/samples/travel_agent_demo/travelagent.py b/mxAgent/samples/travel_agent_demo/travelagent.py new file mode 100644 index 0000000000000000000000000000000000000000..01f04d057106387c079d66024ebe25d8a729ebf2 --- /dev/null +++ b/mxAgent/samples/travel_agent_demo/travelagent.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- +# Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved. + +from abc import ABC +import argparse +from loguru import logger + +from agent_sdk.llms.llm import get_llm_backend, BACKEND_OPENAI_COMPATIBLE +from agent_sdk.agentchain.recipe_agent import RecipeAgent +from agent_sdk.agentchain.router_agent import RouterAgent +from agent_sdk.agentchain.tool_less_agent import ToollessAgent +from agent_sdk.agentchain.base_agent import AgentRunResult + +from samples.tools.tool_query_accommodations import QueryAccommodations +from samples.tools.tool_query_transports import QueryTransports +from samples.tools.tool_query_attractions import QueryAttractions +from samples.tools.tool_summary import PlanSummary +from samples.tools.tool_general_query import GeneralQuery +from samples.tools.tool_query_weather import QueryWeather + + +PESUEDE_CODE = """步骤1:根据用户问题中对景点相关的需求,从网络中搜索相关的景点信息 +步骤2:根据用户的问题,从网络中查询相关的出行交通信息。 +步骤3:根据用户的问题,从网络中搜索相关的住宿和酒店信息; +步骤4:根据用户的问题,查询用户需要的城市天气情况; +步骤5:总结以上的出行信息、景点游玩、住宿信息等。""" +TRANSPORT_INST = """步骤1:根据用户的输入问题,从网络中查询相关的出行交通信息""" +ATTRACTION_INST = "步骤1:根据用户问题中对景点相关的需求,从网络中搜索相关的景点信息" +HOTEL_INST = """步骤1:根据用户的问题,从网络中搜索相关的住宿和酒店信息,""" +WEATHER_INST = "步骤一:根据用户的问题,查询用户需要的城市天气情况" +OTHER_INST = """步骤1:根据用户的输入,从互联网中查询相关的解答""" + + +GENERAL_FINAL_PROMPT = """你是一个擅长文字处理和信息总结的智能助手,你的任务是将提供的网页摘要信息进行总结,并以markdown的格式进行返回, +请添加适当的词语,使得语句内容连贯,通顺 +请将content和snippet的信息进行综合处理,进行总结,生成一个段落。 +涉及到url字段时,使用超链接的格式将网页url链接到网页title上。 +参数介绍】: +title:网页标题 +url:网页链接 +snippet:网页摘要信息 +content:网页的内容总结 +下面是JSON格式的输入: +{text} +请生成markdown段落:""" + +WEATHER_FINAL_PROMPT = """你是一个擅长文字处理和信息总结的智能助手, +当前的工作场景是:天气出行建议;输入的内容是JSON格式的用户所查询城市未来的天气预报,请将这些信息总结为的自然语言展示天气预报的信息,并对用户的出游给除建议, +根据天气的情况,你可以做出一些出行建议,比如是否需要雨具、防晒、保暖等 +请添加适当的词语,使得语句内容连贯,通顺,并尽可能保留输入的信息和数据,但不要自行杜撰信息。 +提供的信息以JSON的格式进行展示 +【参数介绍】: +date:日期 +day_weather:白天的天气情况 +day_wind_direction:白天风向 +day_wind_power: 白天风力 +night_weather:夜晚的天气情况 +night_wind_direction:夜晚风向 +night_wind_power: 夜晚风力 +max_degree: 最高温 +min_degree:最低温 +下面是JSON格式的输入: +{text} +请生成markdown段落: +""" +PLANNER_FINAL_PROMPT = """你是一个擅长规划和文字处理的智能助手,你需要将提供的信息按照下面的步骤撰写一份旅游攻略,输出markdown格式的段落, +你可以添加适当的语句,使得段落通顺,但不要自己杜撰信息。 +步骤】 +1. 根据【用户需要旅行的天数】,将输入的景点分配到每一天的行程中,每天2-3个景点,并介绍景点的详细情况 +2. 叙述输入中推荐的住宿情况,详细介绍酒店的详细情况,和预定链接 +3. 叙述输入中查询的交通安排,详细介绍每个出行方案的价格、时间、时长等详细情况,和预定链接 +4. 介绍输入中天气预报的情况,根据天气的情况,你可以做出一些出行建议,比如是否需要雨具、防晒、保暖等 +【参数介绍】: +title:网页标题 +url:网页链接,满足用户需求的酒店筛选结果 +content:网页主要内容提取物 +snippet:网页摘要信息 +输入的信息以JSON格式,下面是的输入: +{text} +请生成markdown段落:""" + + + +TRAVEL_PLAN = "TRAVEL_PLAN" +QUERY_ATTRACTION = "QUERY_ATTRACTION" +QUERY_HOTEL = "QUERY_HOTEL" +QUERY_TRANSPORT = "QUERY_TRANSPORT" +QUERY_WEATHER = "QUERY_WEATHER" +OTHERS = "OTHERS" + +classifer = [TRAVEL_PLAN, QUERY_ATTRACTION, QUERY_HOTEL, QUERY_TRANSPORT, QUERY_WEATHER, OTHERS] + +INST_MAP = { + TRAVEL_PLAN :PESUEDE_CODE, + QUERY_ATTRACTION :ATTRACTION_INST, + QUERY_HOTEL:HOTEL_INST, + QUERY_TRANSPORT :TRANSPORT_INST, + QUERY_WEATHER :WEATHER_INST, + OTHERS:OTHER_INST +} + +FINAL_PMT_MAP = { + TRAVEL_PLAN :PLANNER_FINAL_PROMPT, + QUERY_ATTRACTION :GENERAL_FINAL_PROMPT, + QUERY_HOTEL:GENERAL_FINAL_PROMPT, + QUERY_TRANSPORT :GENERAL_FINAL_PROMPT, + QUERY_WEATHER :WEATHER_FINAL_PROMPT, + OTHERS: GENERAL_FINAL_PROMPT + +} + +TOOL_LIST_MAP = { + TRAVEL_PLAN :[QueryAccommodations, QueryAttractions, QueryTransports, PlanSummary, QueryWeather], + QUERY_ATTRACTION :[QueryAttractions], + QUERY_HOTEL:[QueryAccommodations], + QUERY_TRANSPORT :[QueryTransports], + QUERY_WEATHER : [QueryWeather], + OTHERS:[] +} + +intents = { + TRAVEL_PLAN :"询问旅行规划,问题中要求旅游项目日程安排、交通查询、查询当地住宿等方面的能力", + QUERY_ATTRACTION :"查询旅游项目、景区、旅游活动", + QUERY_HOTEL: "仅查询酒店和住宿信息", + QUERY_TRANSPORT : "与现实中出行、乘坐交通、如高铁、动车、飞机、火车等相关的意图", + QUERY_WEATHER :"包括气温、湿度、降水等与天气、天气预报相关的意图", + OTHERS :"与旅游场景不相干的查询" +} + + + +class TalkShowAgent(ToollessAgent, ABC): + def __init__(self, llm, prompt="你的名字叫昇腾智搜,是一个帮助用户完成旅行规划的助手,你的能力范围包括:'\ + 目的地推荐、行程规划、交通信息查询、酒店住宿推荐、旅行攻略推荐,请利用你的知识回答问题,这是用户的问题:{query}", + **kwargs): + super().__init__(llm, prompt, **kwargs) + self.query = "" + + def _build_agent_prompt(self, **kwargs): + return self.prompt.format( + query=self.query + ) + + +class TravelAgent: + @classmethod + def route_query(cls, query): + router_agent = RouterAgent(llm=llm, intents=intents) + classify = router_agent.run(query).answer + if classify not in classifer or classify == OTHERS: + return TalkShowAgent(llm=llm) + return RecipeAgent(name=classify, + description="你的名字叫昇腾智搜,是一个帮助用户完成旅行规划的助手,你的能力范围包括:目的地推荐、行程规划、交通信息查询、酒店住宿推荐、旅行攻略推荐", + llm=llm, + tool_list=TOOL_LIST_MAP[classify], + recipe=INST_MAP[classify], + max_steps=3, + max_token_number=4096, + final_prompt=FINAL_PMT_MAP[classify]) + + def run(self, query, stream): + agent = self.route_query(query) + return agent.run(query, stream=stream) + + +def get_args(): + parse = argparse.ArgumentParser() + parse.add_argument("--model_name", type=str, default="Qwen1.5-32B-Chat", help="OpenAI客户端模型名") + parse.add_argument("--base_url", type=str, default="http://10.44.115.108:1055/v1", help="OpenAI客户端模型地址") + parse.add_argument("--api_key", type=str, default="EMPTY", help="OpenAI客户端api key") + return parse.parse_args().__dict__ + +if __name__ == "__main__": + args = get_args() + base_url = args.pop("base_url") + api_key = args.pop("api_key") + llm_name = args.pop("model_name") + + llm = get_llm_backend(backend=BACKEND_OPENAI_COMPATIBLE, + api_base=base_url, api_key=api_key, llm_name=llm_name).run + query = "帮我制定一份从北京到上海6天的旅游计划" + + travel_agent = TravelAgent() + res = travel_agent.run(query, stream=True) + if isinstance(res, AgentRunResult): + logger.info("-----------run agent success-------------") + logger.info(res.answer) + else: + for char in res: + logger.debug(char)