前言
在上篇文章,我们已对 Agent 有了最初步的了解。接下来我们深入了解下什么是 LLM,Prompt,并开始独立完成我们自己搭建的第一个 Agent。
一、了解 LLM
LLM:Large Language Model,即我们常说的大语言模型。市面上琳琅满目的如 deepseek,kimi,豆包,chatgpt,gemini 等都属于 LLM。 LLM 可以说是 Agent 最核心的那个大脑,没有大脑自然无法组织起一个 Agent 任何的行为。而如果想使用这些大语言模型,一般我们会选择到它们的官网上去获取 api-key。有了它作为 api 接口,我们就能自由的本地调用 ai。 同时 LLM 模型分为非常多类,有视觉模型的,有深度思考的(能看到 ai 思考链但返回数据比较慢),有蒸馏模型的,有闭源/开源的。我们日常使用 Agent,就得按需选择。 当然,可能有小伙伴会想本地部署 LLM。我们后面文章会教这点,但还是不太做推荐。很简单的道理,本地部署的 LLM 对个人而言只能是蒸馏版,自己玩用用可以,但没法在绝大多数生产项目级场景下使用。如果真需要本地部署或者数据敏感场景,一般也是公司花大价钱买一堆算力卡来做这个事。少数能预见的使用场景,也就是学习微调了(同样也需要非常高的显卡存储)。
二、LLM 怎么调用
我们这里以 deepseek 的 api-key 调用为例。
打开官方文档,用官方给我们的文档来完成调用:
其中略微讲解下:
api_key=os.environ.get('DEEPSEEK_API_KEY') 这里,就是让我们在环境变量中写入这个东西,这样的话,你就无需显式应用 api-key,能更好的保护隐私安全。当然如果你嫌麻烦,目前直接改成 api_key="xx" 也是可以的。
"role":"system": 角色是系统:系统提示词,即你要在这里给 ai 设定一个什么角色,比如你是一个猫娘。
"role":"user": 角色是用户:你对 ai 说的话。
stream=False 即是否允许流式输出,如果为 True,就是允许,你就能在控制台上看到输出结果像流水一样慢慢流出。反之则是得等生成完全才会返回。
如上,完成调用后,就能看到返回的信息了:

三、Prompt 基础逻辑
回忆下官方文档的这里:
{"role":"system","content":"You are a helpful assistant..."}这是什么?这就是Prompt(提示词)。
提示词是 Agent 构建中极其重要的一环。提示词即提示 ai 你是一个什么身份,在这个身份下你要干什么事情。比如你是一个智能客服/你是一个 NBA 智能预测比赛专家/你是一个猫娘,你负责帮助用户理解产品/帮助用户预测比赛/帮助用户...
你是一个 AI 助手,擅长解释技术概念。任务:用小学生能听懂的话,解释什么是大模型。要求:不超过 100 字,用中文回答。 如上:确定身份 + 给出任务 + 限定输出。 一个 Agent 好不好,一定程度上取决于这个提示词写的好不好,甚至市面上有专门的岗位就是提示词工程师。 同时,你肯定也能感觉出来,这个提示词明显写的非常的简单。实际上如果真要写项目的提示词,我们会采取更加复杂的写法来适应实际业务,举个例子:
你是一个智能生活助手,具备以下能力:
1. 调用 weather_api(location) 获取指定城市的天气数据
2. 根据温度、降水概率给出穿衣建议
请按以下步骤执行:
1. 理解用户需求,确定城市
2. 调用 weather_api 获取天气
3. 分析数据,生成建议
4. 用友好语气回复用户
输出规则:
- 如果需要调用工具,只输出 JSON 格式的工具调用指令
- 否则,正常回复用户
示例:
用户:北京今天穿什么?
AI:{"tool": "weather_api", "args": {"location": "北京"}}
如上,有角色、有流程、有能力(调用工具)、可以自动化。这才是 Prompt 的正确用法。 能调用工具这点我们下一节立马就会学到。其他的提示词写法其实你看类似的提示词多分析分析,或者多让 ai 帮你写写提示词,你跟着依葫芦画瓢对着多写,也能掌握个七七八八了。 Prompt 的几个关键概念这里一并提及: Zero/Few-shot:(控制模型生成方式)不给/给几个实例,让模型回答/模仿回答。实操:在提示词内直接加几行实例即可(请仿照下列文本格式输出...)。 Cot(Chain-of-thought):让模型思考步骤,提高复杂推理准确性。实操:在提示词内强调 - 请逐步思考/思考步骤如下...。 显而易见,理解与实操都很简单,这俩概念了解即可,在真正提示词编写过程中不必钻研太深。
四、简单交互实例(多轮问答 Agent)
了解完 LLM 与 Prompt,我们可以尝试搭建我们的第一个 Agent 了。 先确定好思路:我们打算让 ai 当一个老师,教我们历史知识,同时我们肯定希望它能保持记忆,记住上下文对话。而大模型在原始状态下是不会保存与用户的对话记忆的。所以我们需要为其加入点新功能: 再回到下面这个地方:
messages=[
{"role": "system", "content": "You are a helpful assistant"},
{"role": "user", "content": "Hello"}
]
除了提供各种角色身份外,它同样有个非常重要的特点:消息列表。
这意味着,如果我们想要多轮对话,让 ai 能记住我们的上下文,就可以通过不断往里面追加代码,让 messages 变得越来越多。
所以,我们可以通过 while True: 无限循环的方式不断往里追加 messages来实现我们的目的:
# ...
while True:
response = agent_client.chat.completions.create(
model="deepseek-chat",
messages=messages
)
answer = response.choices[0].message.content
print(f'回答:{answer}')
# 询问是否还有其他问题
user_input = input('您还有其他想继续问的吗 | (exit 退出)\n')
if user_input == "exit":
break
# 继续记录对话 (涵盖用户追问 + ai 上句回答)
messages.append({"role":"user","content":user_input})
messages.append({"role":"assistant","content":answer})
细心的同学已经发现了:这里加了个一个新 role:assistant,即助手。
它表示的身份是助手,即 ai 自己。所以我们这里为其添加的 content 是 answer。
如图,测试完成,符合我们预期,此时的它明显可以记忆上下文对话。
但同时仍要提醒一下:我们目前完成的很明显只是个 demo,它只能拥有短期记忆,在正规开发中记忆的写法肯定不会这么简单。后面随着学习的深入时,我们会构思应该用怎样的方式,让它拥有一个不错的可以长期存储,性能更优的解法。
五、总结
知识点概括:LLM 了解与调用、Prompt 编写与逻辑构思、多轮对话记忆、独立搭建一个智能体。 这里我们已初步掌握了如何做一个能用能玩的智能体,效果基本等同于市面上的大部分 ai 模型直接对话。但明显它的功能水平还差点意思,没有 agent 的'味儿'。 下篇内容我们会开始深入研究Function calling & 工具调用,让 ai 能利用外部的工具来干活。


