跳转至

2.1 大模型的Agent潜力

学习目标

  • 了解大模型的复杂任务规划能力
  • 了解大模型的工具调用能力
  • 了解大模型的反思和评估能力

对大模型多任务能力的最初步实践是基于提示词的,单纯使用提示词已经可以完成相当一部分复杂子任务,可以将多个这样的提示词步骤组合起来,用于完成复杂任务。

一、复杂任务规划

你是一位旅行规划助手,今天是2025年9月16日,我计划10月1日到10月7日从北京出发到张家界旅行,帮我规划一下所需的各种事项,用mermaid代码输出成甘特图。
gantt
    title 北京-张家界国庆旅行计划 (2025.10.1-10.7)
    dateFormat  YYYY-MM-DD
    axisFormat  %m-%d

    section 交通
    机票预订       :done, 2025-09-20, 3d
    机场接送预约   :crit, 2025-09-25, 2d
    北京-张家界航班 :active, 2025-10-01, 1d
    张家界-北京返程 :active, 2025-10-07, 1d

    section 住宿
    酒店比价       :done, 2025-09-18, 4d
    武陵源区预订   :crit, 2025-09-22, 2d
    天门山附近住宿 :crit, 2025-09-24, 1d

    section 行程
    天门山国家公园 :active, 2025-10-02, 1d
    张家界大峡谷   :active, 2025-10-03, 1d
    黄龙洞游览     :active, 2025-10-04, 1d
    袁家界-杨家界 :active, 2025-10-05, 1d
    金鞭溪徒步     :active, 2025-10-06, 1d

    section 准备
    天气预报查询   :2025-09-28, 2d
    登山装备采购   :2025-09-26, 3d
    电子票证准备   :crit, 2025-09-30, 1d

可以在这个网址直接看甘特图:Online FlowChart & Diagrams Editor - Mermaid Live Editor

旅行规划

二、调用工具

可以直接使用大模型在提示词的引导下调用工具

主文件

import json
import ollama

def callModel(prompt):
    response = ollama.chat(
        model='qwen2.5:7b',
        messages=[{'role': 'user', 'content': prompt}]
    )
    print(response['message']['content'])
    return response['message']['content']

def checkTools(query):

    prompt = ("""你是一位可靠的个人助理,现在为你提供【工具集】,根据【用户问题】判断是否需要使用其中的工具,并按照【指定格式】输出。

        【工具集】
        [getTrainSchedule]
        getTrainSchedule的作用是根据指定的日期、起点城市名称和终点城市名称,查询列车班次

        【指定格式】
        {"是否需要调用【工具集】中的工具":"是",
        "需要调用的工具名称":"getTrainSchedule",
        "调用工具需要的参数":{"queryDate":"10月12日","start":"上海","end":"北京"}}

        【用户问题】
        """ + query)

    toolCall = callModel(prompt)
    return toolCall

def callTools(toolCall):
    with open('tools.py', 'r', encoding='utf-8') as f:
        content = f.read()
    argsStr = ",".join(str(key)+'="'+toolCall["调用工具需要的参数"][key]+'"' for key in toolCall["调用工具需要的参数"])
    print(argsStr)
    content+="\ntoolRes="+str(toolCall["需要调用的工具名称"])+"("+argsStr+")"
    print(content)
    exec(content)
    toolResult = locals()["toolRes"]
    return toolResult

def getAnswer(query):
    toolCall = json.loads(checkTools(query))
    print("checkTools results:*********************************")
    print(toolCall)
    if toolCall["是否需要调用【工具集】中的工具"] == "是":
        toolRes = callTools(toolCall)
        print("callTools results:*********************************")
        print(toolRes)
        prompt = "你是一位可靠的个人助理,用户的问题是:"+query+"。 查询工具得到的结果是:"+toolRes+"。 根据这些信息,给出合理的回复。"
        finalResult = callModel(prompt)
    else:
        prompt = "你是一位可靠的个人助理,用户的问题是:" + query + "。 根据这些信息,给出合理的回复。"
        finalResult = callModel(prompt)
    return finalResult

if __name__ == '__main__':
    query = "我要在本周六到北京旅行,帮我规划一下行程,要求尽可能快捷舒适。"
    result = getAnswer(query)
    print(result)

工具文件

#查询可购买的火车票
def getTrainSchedule(queryDate,start,end):
    """根据指定的日期、起点城市名称和终点城市名称,查询列车班次"""
    print("获取列车时刻表")
    result = [["D81","12:24","14:30","北京西站","540"],["K4427","15:38","21:30","北京站","220"]]
    resultStr = "您查询的在 "+queryDate+" 这一天从 "+start+" 到 "+end+" 的列车共有 "+str(len(result))+"班:\n"
    for res in result:
        resultStr+=res[0]+" 次列车:发车时间为: "+res[1]+" 到站时间为: "+res[2]+" 发车站为: "+res[3]+" 票价为: "+res[4]+"\n"
    return resultStr

判定调用工具的结果

{'是否需要调用【工具集】中的工具': '是', '需要调用的工具名称': 'getTrainSchedule', '调用工具需要的参数': {'queryDate': '10月12日', 'start': '上海', 'end': '北京'}}

运行结果

大模型直接调用工具

三、反思与评估

你是一位社会问题专家,针对下面这份【对中秋节送月饼礼盒的看法】发表自己的意见,该看法是否全面?哪些方面可以改进?
【对中秋节送月饼礼盒的看法】
🌕 ‌传统与现实的碰撞‌

‌情感纽带的作用‌:送月饼礼盒是中秋节的“标配”,尤其对爷爷奶奶那辈人来说,收到礼盒就像收到一份“我在乎你”的信号。虽然我觉得直接视频通话更实在,但不得不承认,拆礼盒时他们的笑容是真的开心。
‌同学间的微妙社交‌:班里有人会带进口月饼分给大家,包装闪得像奢侈品。虽然味道差不多,但莫名觉得“贵的就是高级”——这大概就是广告洗脑吧(笑)。
📦 ‌吐槽点与反思‌

‌过度包装太浪费‌:拆开五层纸盒才见到四块月饼,环保课上学的“减量生活”瞬间破功。
‌甜到齁的陷阱‌:爸妈总说“传统月饼糖油超标”,但外婆非要塞给我吃,最后只能偷偷喂给小区流浪狗(对不起狗狗!)。
💡 ‌我们这代的改良建议‌

‌轻量化礼盒‌:用再生纸做包装,附赠种子贺卡(种出来是桂花苗多酷啊!)。
‌口味革命‌:为什么不能出螺蛳粉月饼?年轻人可能更想收到奶茶味月饼,至少比五仁月饼有话题性!
‌总结‌:月饼礼盒像一场跨越年代的对话,我们既要尊重传统,也该勇敢加入Z世代的小叛逆~

(P.S. 如果明年能收到偶像联名月饼,我愿意连续一个月不喝奶茶!🤫)

月饼礼盒改进意见