• 【LLM】基于LLM的agent应用(上)


    note

    • 在未来,Agent 还会具备更多的可扩展的空间。
      • 就 Observation 而言,Agent 可以从通过文本输入来观察来理解世界到听觉和视觉的集成;
      • 就 Action 而言,Agent 在具身智能的应用场景下,对各种器械进行驱动和操作。
    • Agent 是以核心智能模型来驱动的,一个可以具备能力从思考开始,最终做到完整输出的智能性结构。Agent 的发展很符合第一性原理,从最先的 Prompt,后面有人在写完的 Prompt 后面加通用的规划器。

    零、相关概念介绍

    在这里插入图片描述

    • 【狭义】openai定义的agent:Lilian Weng研究员指出agent应具有技能调用(Tool use)、记忆(Memory)和规划(Planning)能力
      • 推荐阅读:Marvin Minsky 的两本著作:《心智社会》和《情感机器》。Lilian Weng 文章:https://lilianweng.github.io/posts/2023-06-23-agent
    • 【广义】agent:以下几种能力:
    • Agent 的基础能力,包括常识推理、逻辑性等,来源于大模型提供的基础智能。所以我们对 Agent 这一层能力的设计,本质上都是对模型的优化。如果要改进 Agent 在这一方面的能力,通常需要更换或优化底层模型。
    • Agent 的角色扮演、情感理解和身份相关能力,与其记忆和拟人化角色设定的 Prompt 工程紧密相关。这部分称为“角色管理”,涉及到如何让 Agent 理解并扮演特定的角色或身份。
    • Agent 的技能调用能力,如编程、查询、绘图等,依赖于 Agent 之上的插件。OpenAI 的“Function calling”机制是一个经典的实现方 式,允许 Agent 调用外部的功能和资源。
    • Agent 的复杂思维能力,在基础智能之上,大模型通过人们构建的思维链、思维树等方式,学会更高层的思维方式。这种方法教会模型特定的模式或思维方式,从而提高其处理复杂问题的能力。

    在这里插入图片描述

    • COT(Chain of Thoughts):思维链,一种模拟人类逻辑和推理过程的推理框架,能够帮助大语言模型解决复杂的算术、常识及字符推理等任务。
    • TOT(Tree of Thoughts):思维树,一种模拟人类逻辑和推理过程的推理框架,允许语言模型通过考虑多种不同的推理路径和自我评估选择来进行深思熟虑的决策,以及在必要时向前看或回溯以做出全局选择。
    • Autonomy Agent:理想状态下能够在没有外部干预的情况下自主作出决策和执行任务的AI系统。
    • Multi-Agent:多个AI代理共同工作,相互协作或竞争以完成复杂任务的系统。
    • RAG:检索增强生成(Retrieval Augmented Generation),通过在生成响应之前从知识源检索相关信息来增强LLM的能力,适合需要查询数据库、文档或其他结构化/非结构化数据存储库的应用程序。

    一、人类与AI协同的三种模式

    在这里插入图片描述

    二、Generative Agents

    《Generative Agents: Interactive Simulacra of Human Behavior》
    25个agent进行交互,模拟人类行为。
    在这里插入图片描述

    参考:
    [1] 《Generative Agents: Interactive Simulacra of Human Behavior》中文阅读
    [2] https://arxiv.org/pdf/2304.03442.pdf

    三、一篇agent综述

    A Survey on LLM-based Autonomous Agents
    链接:https://github.com/Paitesanshi/LLM-Agent-Survey

    在这里插入图片描述

    四、微软的AutoGen 框架

    微软推出 AutoGen 框架,有哪些你喜欢的功能?

    9 月 29 日消息,微软近日发布了名为 AutoGen 的全新工具,帮助开发者创建基于大语言模型的复杂应用程序。
    微软表示开发者创建此类复杂应用程序,通常需要具备设计、实施和优化工作流程的专业知识,而本次推出 AutoGen 工具可以帮助开发者自动执行相关工作流程,简化搭建、优化等流程并实现自动化。

    微软表示 AutoGen 可以用于定义代理交互行为。开发人员可以使用自然语言和计算机代码为不同的应用程序编写灵活的对话模式。通过自动化多个 LLM 代理之间的聊天,开发人员可以轻松地让他们自主或根据人工反馈共同执行任务,包括需要通过代码使用工具的任务。

    AutoGen 工具的主要功能:

    • AutoGen 提供多代理会话框架作为高级抽象。使用此框架,可以方便地构建 LLM 工作流程。
    • AutoGen 提供一系列工作系统,涵盖来自各个领域和复杂性的广泛应用。
    • AutoGen 支持增强型 LLM 推理 API,可用于提高推理性能并降低成本。

    五、agent和function call

    gpt中的function call可以让开发者在调用 GPT-4 和 GPT-3.5-turbo 模型时,描述函数并让模型智能地输出一个包含调用这些函数所需参数的 JSON 对象。这种功能可以更可靠地将 GPT 的能力与外部工具和 API 进行连接,从而实现以下应用:

    • 创建聊天机器人:开发者可以通过调用外部工具,如 ChatGPT 插件,回答问题,或者将查询「北京的天气如何?」转换为调用 getCurrentWeather(location: string) 的函数。
    • 将自然语言转换为 API 调用或数据库查询:例如,将查询「这个月我的前十个客户是谁?」转换为调用 get_customers_by_revenue(start_date, end_date, limit) 的内部 API 调用,或者将查询「上个月 Acme 公司下了多少订单?」转换为使用 sql_query(query)的 SQL 查询。
    • 从文本中提取结构化数据:开发者可以定义一个名为 extract_people_data(people) 的函数,以提取在维基百科文章中提到的所有人物。

    六、chatglm3-6b的agent应用

    1. chatglm3的特点

    特点:

    • 更强大的基础模型: ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、数学、推理、代码、知识等不同角度的数据集上测评显示,ChatGLM3-6B-Base 具有在 10B 以下的预训练模型中最强的性能。
    • 更完整的功能支持: ChatGLM3-6B 采用了全新设计的 Prompt 格式,除正常的多轮对话外。同时原生支持工具调用(Function Call)、代码执行(Code Interpreter)和 Agent 任务等复杂场景。
    • 全新的 Agent 智能体能力:
      ChatGLM3 本次集成了自研的 AgentTuning 技术,激活了模型智能体能力,尤其在智能规划和执行方面,相比于ChatGLM二代提升 1000% ;开启国产大模型原生支持工具调用、代码执行、游戏、数据库操作、知识图谱搜索与推理、操作系统等复杂场景。

    2. ChatGLM3 对话格式

    为了避免用户输入的注入攻击,以及统一 Code Interpreter,Tool & Agent 等任务的输入,ChatGLM3 采用了全新的对话格式。

    (1)规定

    整体结构

    ChatGLM3 对话的格式由若干对话组成,其中每个对话包含对话头和内容,一个典型的多轮对话结构如下

    <|system|>
    You are ChatGLM3, a large language model trained by Zhipu.AI. Follow the user's instructions carefully. Respond using markdown.
    <|user|>
    Hello
    <|assistant|>
    Hello, I'm ChatGLM3. What can I assist you today?
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    对话头

    对话头占完整的一行,格式为

    <|role|>{metadata}
    
    • 1

    其中 <|role|> 部分使用 special token 表示,无法从文本形式被 tokenizer 编码以防止注入。metadata 部分采用纯文本表示,为可选内容。

    • <|system|>:系统信息,设计上可穿插于对话中,但目前规定仅可以出现在开头
    • <|user|>:用户
      • 不会连续出现多个来自 <|user|> 的信息
    • <|assistant|>:AI 助手
      • 在出现之前必须有一个来自 <|user|> 的信息
    • <|observation|>:外部的返回结果
      • 必须在 <|assistant|> 的信息之后

    (2)样例场景

    多轮对话
    • 有且仅有 <|user|><|assistant|><|system|> 三种 role
    <|system|>
    You are ChatGLM3, a large language model trained by Zhipu.AI. Follow the user's instructions carefully. Respond using markdown.
    <|user|>
    Hello
    <|assistant|>
    Hello, I'm ChatGLM3. What can I assist you today?
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    工具调用
    <|system|>
    Answer the following questions as best as you can. You have access to the following tools:
    [
        {
            "name": "get_current_weather",
            "description": "Get the current weather in a given location",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city and state, e.g. San Francisco, CA",
                    },
                    "unit": {"type": "string"},
                },
                "required": ["location"],
            },
        }
    ]
    <|user|>
    今天北京的天气怎么样?
    <|assistant|>
    好的,让我们来查看今天的天气
    <|assistant|>get_current_weather
    ```python
    tool_call(location="beijing", unit="celsius")
    ```
    <|observation|>
    {"temperature": 22}
    <|assistant|>
    根据查询结果,今天北京的气温为 22 摄氏度。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    代码执行
    • <|user|><|assistant|><|system|><|observation|> 四种 role。其中 <|assistant|> 的 metadata 只有 interpreter。
    <|system|>
    你是一位智能AI助手,你叫ChatGLM3,你连接着一台电脑,但请注意不能联网。在使用Python解决任务时,你可以运行代码并得到结果,如果运行结果有错误,你需要尽可能对代码进行改进。你可以处理用户上传到电脑上的文件,文件默认存储路径是/mnt/data/。
    <|user|>
    #File: /mnt/data/metadata.jsonl
    #Size: 35380
    #File uploaded
    文件中是否存在缺失值或异常值?
    <|assistant|>
    首先,我将读取您提供的文件,并查看其内容以确定是否存在缺失值或异常值。
    
    我们从加载文件开始:
    <|assistant|>interpreter
    ```python
    import json
    
    # Load the uploaded file
    data = []
    with open("/mnt/data/metadata.jsonl", 'r') as file:
        for line in file:
            data.append(json.loads(line))
    
    # Display the first few records to get a sense of the data
    data[:5]
    ```
    <|observation|>
    ```result
    [{'file_name': 'aceinthehole.png',
      'name': 'Ace in the Hole',
      'type': 'survivor',
      'description': 'Lady Luck always seems to be throwing something good your way.'},
     {'file_name': 'adrenaline.png',
      'name': 'Adrenaline',
      'type': 'survivor',
      'description': 'You are fuelled by unexpected energy when on the verge of escape.'},
     {'file_name': 'aftercare.png',
      'name': 'Aftercare',
      'type': 'survivor',
      'description': "Unlocks potential in one's aura reading ability."},
     {'file_name': 'agitation.png',
      'name': 'Agitation',
      'type': 'killer',
      'description': 'You get excited in anticipation of hooking your prey.'},
     {'file_name': 'alert.png',
      'name': 'Alert',
      'type': 'survivor',
      'description': 'Your acute senses are on high alert.'}]
    ```
    <|assistant|>
    该文件看起来包含有关某些条目的元数据,每个条目有以下字段:
    
    - `file_name`: 文件名称
    - `name`: 名称
    - `type`: 类型(例如 "survivor" 或 "killer")
    - `description`: 描述
    
    接下来,我将检查这些字段是否存在缺失值。
    <|assistant|>interpreter
    ```python
    # Check for missing values in each column
    missing_values = {key: sum(1 for item in data if key not in item) for key in data[0].keys()}
    
    missing_values
    ```
    <|observation|>
    ```result
    {'file_name': 0, 'name': 0, 'type': 0, 'description': 0}
    ```
    <|assistant|>
    每个字段都没有缺失值。这意味着每个条目都完整。
    
    接下来,我们可以检查是否存在任何潜在的异常值。这通常需要更深入的分析和对数据的了解,但我可以从一些基本的统计和分布开始进行检查。为了这样做,我们可以查看“type”字段的值分布,看看是否有任何意外的类别。
    <|assistant|>interpreter
    ```python
    # Check the distribution of values in the 'type' column
    type_distribution = {key: sum(1 for item in data if item['type'] == key) for key in set(item['type'] for item in data)}
    
    type_distribution
    ```
    <|observation|>
    ```result
    {'survivor': 116, 'killer': 103}
    ```
    <|assistant|>
    “type”字段有两个值:“survivor”和“killer”。其中,“survivor”有116个条目,而“killer”有103个条目。
    
    从这个初步的检查中,我们没有发现任何明显的异常值。
    
    如果您有任何特定的标准或其他字段需要检查,我可以为您提供更详细的分析。您还希望我检查什么呢?
    <|user|>
    帮我画一个爱心
    <|assistant|>interpreter
    ```python
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 爱心形状的参数方程
    def heart(t):
        x = 16 * np.sin(t) ** 3
        y = 13 * np.cos(t) - 5 * np.cos(2 * t) - 2 * np.cos(3 * t) - np.cos(4 * t)
        return x, y
    
    t = np.linspace(0, 2 * np.pi, 1000)
    x, y = heart(t)
    
    plt.figure(figsize=(6, 6))
    plt.plot(x, y, color='red')
    plt.axis('equal')
    plt.axis('off')
    plt.show()
    ```
    <|observation|>
    ```result
    【image】
    ```
    <|assistant|>
    这是一个爱心形状。我使用了参数方程来描述这个形状,并使用matplotlib进行了绘制。如果您有任何其他需求或问题,请随时告诉我。
    <|user|>  # End
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117

    在下一篇-【LLM】基于LLM的agent应用(下),将给出代码实践~

    附:体系

    在这里插入图片描述

    Reference

    [1] 当MLG邂逅AI,Copilot模式将成就「Growth Automation」时代
    [2] 大模型下半场,关于Agent的几个疑问
    [3] LLM-Native产品的变与不变
    [4] 聊聊我对AI Agents技术的一些看法.小夕
    [5] Agent = LLM+Planning+Feedback+Tool use
    [6] ChatGLM团队发布AI Agent能力评测工具AgentBench:GPT-4一骑绝尘,开源模型表现非常糟糕
    [7] 从 GPTs 聊到 Agent、LLMOps 以及开源的新机会.质朴发言
    [8] chatglm3.0发布,对应的权重,部署代码管上:
    模型:https://huggingface.co/THUDM/chatglm3-6b-base
    模型:https://huggingface.co/THUDM/chatglm3-6b
    [9] chatglm 32k版本:https://huggingface.co/THUDM/chatglm3-6b-32k
    [10] 低成本部署:https://github.com/THUDM/ChatGLM3/blob/main/DEPLOYMENT.md
    工具调用:https://github.com/THUDM/ChatGLM3/blob/main/tool_using/README.md
    github:https://github.com/THUDM/ChatGLM3
    [11] 智谱AI推出第三代基座大模型
    [12] https://modelscope.cn/models/ZhipuAI/chatglm3-6b/summary
    [13] 北大校友“炼丹”分享:OpenAI如何训练千亿级模型?
    [14] 大模型工具调用(function call)原理及实现:https://zhuanlan.zhihu.com/p/663770472
    [15] 万字解析 AI Agent:如何重构千亿美金市场,掀起软件生产革命?
    [16] Langchain-Chatchat项目:5.1-ChatGLM3-6B工具调用
    [17] 智谱ChatGLM3魔搭最佳实践教程
    [18] ChatGLM3 的工具调用(FunctionCalling)实现原理
    [19] XAgent:地址:🔗 https://github.com/OpenBMB/XAgent
    案例展示地址:🔗 https://x-agent.net/
    博客地址:🔗 https://blog.x-agent.net
    [20] Function Call: Chat 应用的插件基石与交互技术的变革黎明
    [21] https://platform.openai.com/docs/guides/function-calling
    [22] Automated Multi Agent Chat

  • 相关阅读:
    独立双样本T-Test 前 为什么要先进行列文检验(Levene‘s Test)
    gitpod.io,云端开发调试工具。
    HTTP 面试知识点提炼
    计算机组成原理——数的表示与计算
    Kubernetes学习笔记-kubernetes API服务器的安全防护(1)了解认证机制20220813
    C++ 结构体建造,输入,输出 入学信息
    深潜Kotlin协程(十八):冷热数据流
    HarmonyOS 快速入门TypeScript
    23个优秀开源免费BI仪表盘
    计算机视觉+人工智能面试笔试总结——深度学习基础题41~51
  • 原文地址:https://blog.csdn.net/qq_35812205/article/details/132502926