Agent Engineer-Day 1 初始智能体与大语言模型基础
本文摘要: 本文系统介绍了大语言模型智能体的核心概念与技术要点。首先阐述了智能体(Agent)与传统程序的区别,指出智能体是由LLM、工具、记忆和规划组成的系统,具有自主推理能力。其次讲解了LLM基础要素:Token作为文本处理单位、上下文窗口限制及解决方案、系统提示词的关键作用、温度参数对输出的影响。最后补充了安全实践,强调应避免直接使用eval()执行模型返回内容,推荐采用白名单机制确保系统安
一、初识智能体
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"
更多推荐


所有评论(0)