一、初识智能体

1. 能否从“使用者”视角切换为“构建者”视角?

        问:在动手体验实现第一个智能体中,你看到的不仅仅是一个会说话的机器人,而是一个系统。是否可以意识到,这个系统里“聪明的大脑”(LLM)和“干活的手”(Tools/API)是分离的?

        答:清晰地认识到,LLM在这里只是一个负责“生成文本”或“决定下一步做什么”的组件,而不是整个系统的全部

2. 是否理解了“AI Native”与“传统软件”的区别?

        问:体验的这个智能体Agent,它的下一步是 人类写死的if/else(比如:如果用户问天气,就跳到天气函数),还是LLM自己推理决定的(比如:LLM看了用户的问题,自己输出“我觉得应该查天气”)?

        答:LLM自己推理决定的。LLM的鲁棒性(LLM能处理意图,而不是死板的关键词)与泛化性更强(当你给它100个工具时,人写if/else 会累死, 但LLM可以根据语境自动选择最合适的那个)

· 传统程序: 流程是人写死的。程序员写了 if "天气" in 用户输入:run_weather_tool()。如果用户说“我想知道外面冷不冷”,程序可能因为没匹配到关键词而直接傻掉

· AI Native Agent: 流程是LLM决定的。你给LLM一个工具箱(里面有天气工具),LLM看了用户的“我想知道外面冷不冷”, 自己推理出:“用户觉得冷不冷取决于天气 -> 我手里有查气温的工具 -> 所以我应该调用天气工具”

3. 能否用一句话定义Agent?

        问:“Agent和Chatgpt到底有什么区别?”

        答:Chatgpt只是一个模型(Model),只负责输入输出文本;而Agent是一个系统,它包含“模型+记忆+规划+工具(感知与行动)”;Agent = LLM + Tools + Memory + Planning

4. 什么是大预言模型驱动的智能体?

        答:它不仅仅是执行预设程序的脚本,而是能够自主推理和使用工具的决策者。

二、 大语言模型基础

1.Token词元

        Token是模型处理文本的最小单位,你可以把它理解为“AI世界的字节”或者“计费货币”。

核心:LLM不读字,它读的是Token。文本进入模型前会被切碎

英文:1个单词 大约为 1.3个Token(比如“Apple"可能就是1个Token,但生僻词就会被拆开)

中文:1个汉字 大约为 0.6~1个Token(取决于模型, 国产模型如DeepSeek/Qwen 对中文优化更好更省Token;GPT-4 稍微贵一点)

大约: 1000个token 大约等于700个中文字

场景举例:

        你发出的指令是:“请总结这份财报。”(这只是 1 条指令,不到 10 个 Tokens)。 但你附带的财报 PDF 内容有 5 万字(这大约是 40,000 到 60,000 Tokens)。

结论: 消耗的是 内容长度,而不是指令条数。

2. 128k Context Window 意味着什么?

核心:这就代表着模型的”短期记忆容量“ ,Agent的内存条

公式: 系统提示词(System)+历史对话(History)+ 当前问题(Input)+ 模型回答(Output)<= 128k

为什么这是”死穴“?

        答:因为128k 是 输入与输出共享的。如果你输入了一个127k的文件,剩下1k空间可能输出不了几句话就因为达到上限就被强行截断了

解决方案:要么”切断“最早的记忆,要么用另一个LLM把历史记录”总结“成一段话

3.  系统提示词 (System Prompt) —— Agent 的“出厂设置”

原理: API 调用通常包含三种角色:System(设定)、User(用户输入)、Assistant(模型回复)。

•痛点:

         ◦ Agent 之所以能叫 Agent,全靠你在 System Prompt 里写了一句咒语:“你是一个全能助手,你有权使用以下工具:[搜索、计算器]...”。

         ◦ 开发关键: 在第四章写代码时,你会发现所有复杂的逻辑(ReAct),其实本质上都是你写的一段超长的 System Prompt。

4. 温度 (Temperature) —— Agent 的“疯癫调节器”

• 原理: 一个 0 到 1(或 2)之间的参数,控制输出的随机性。

•痛点:

        ◦ 写 Agent 必须设为 0: 当你让 Agent 调用工具(比如输出 JSON 格式去查天气)时,必须把 Temperature 设为 0。

         ◦ 为什么? 因为如果有一点点随机性,模型可能就会把 {"action": "search"} 错写成 {"action": "search"....哎呀我编不下去了"},导致你的代码正则匹配失败,系统崩溃。

三、Supplementary information

1.eval()函数

核心:把字符串变成可运行的代码

x = 10
code = "x + 5" # 这只是一个普通的字符串

result = eval(code) # 字符串变成了可以运行的代码

print(result)
# 输出: 15

1.1 为什么不能用eval()直接运行 大模型发回来的函数名?

现象:

1.大模型返回字符串:"generate_work_report"

2. 可以写成:eval("generate_work_report()") ->成功运行报表函数

看起来十分方便。但是如果大模型“幻觉”了,或者被恶意攻击(Prompt Injection),它不再返回"generate_work_report",而是返回了这样一段字符串:

"__import__('os').system('rm -rf /')" (这是Linux 下删除所有文件的命令)

或在Windows下:"__import__('os').system('format c:')"

后果对比
你的代码写法 当遇到恶意字符串时的反应 结果
使用eval() “好的,这是一段代码,马上运行!” 电脑被清空,项目报废
使用字典映射(我们现在的写法) available_tools.get("恶意代码字符串") 查无此人。字典里没有这个键,返回None或报错

这就是为什么要写看似麻烦的available_tools字典。它就是一个"白名单"。我们只允许大模型调用我们字典里注册过的函数。

2. strptime与strftime

        二者是互逆的过程。str parse time 把str 解析为 time eg:"2024-01-28" 解析为datetime(2024, 1, 28); str format time 把time 转化为 str eg:datetime(2024, 1,28)转化为"2024-01-28"

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐