Agent Engineer-Day 1 初始智能体与大语言模型基础

一、初识智能体

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()函数

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

python 复制代码
x = 10
code = "x + 5" # 这只是一个普通的字符串

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

print(result)
# 输出: 15

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

现象:

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

  1. 可以写成: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"

相关推荐
2601_949868362 小时前
Flutter for OpenHarmony 电子合同签署App实战 - 数据持久化实现
java·数据库·flutter
霸王蟹2 小时前
Uni-app 跨端开发框架Unibest快速体验
前端·笔记·微信·uni-app·unibest
zihan03212 小时前
element-plus, el-table 表头按照指定字段升降序的功能实现
前端·vue.js·状态模式
三翼鸟数字化技术团队2 小时前
watchEffect的两种错误用法
前端·javascript·vue.js
码农阿豪2 小时前
基于Milvus与混合检索的云厂商文档智能问答系统:Java SpringBoot全栈实现
java·spring boot·milvus
局外人LZ2 小时前
Decimal.js 完全指南:解决前端数值精度痛点的核心方案
开发语言·前端·javascript
阿蒙Amon2 小时前
C#每日面试题-Task和Thread的区别
java·面试·c#
索荣荣2 小时前
Java异步编程终极实战指南
java·开发语言
shehuiyuelaiyuehao2 小时前
11String类型知识点
java·开发语言