LLM
综述
- agent
- 提示词prompt
- 工作流搭建
- 模型部署和高并发(资源优化和分配)
- 开发框架
- langchain
- pytorch
- tensorflow
- hugginface
- 模型训练与微调
- 高质量微调数据与评估
- 微调原理
- LLM蒸馏 (大模型到小模型)
- 多模态
- 知识库搜索
- Embbedings和向量库
- RAG技术
- RAG多模态处理
- RAG调优
- AI Coding
- 如何使用和经验
- AI开发与AI重构
- 分工与协作:前端、后段、产品经理
- 部署Claude Code (信创要求高: 国央企、军队)
几个模型大厂和六小厂
云计算、GPU租赁:阿里云、火山引擎、AutoDL
OPC(一个人公司,one person company)
行业场景


2C企业:
需要流量、成交口碑、副购、成本,
低价值低投入场景:文案、图片生成、数字人、网络信息搜索、对话数据解析、模版文件处理、软件操作、票据处理、简历面试
高价值高投入:图片定制生成、营销视频、视频行为分析、在线客服/销售、个性化服务、声音合成、产品效果展示、产品创意设计、合规审查、数据可视化、企业知识库

模型能力不行时需要工程应用处理
2B企业(生产性企业,利润低):
需求:稳定生产、提高效率、降低成本
低价值低投入:生产计划、采购计划、市场数据抓取、系统软件操作
高价值高投入:生产质量、生产设备监测、视频行为分析、原料消耗管理、调度物流配置、仓储管理、价格预测
服务企业:
需求:升级产品和服务、提升竞争力、降低服务成本、推出AI新产品和新服务
国央企:
需求:优化资源配置、提高办事效率、加快响应速度、安全防护

提示词工程
系统提示词和用户提示词,prompt是与LLM打交道的唯一方式。应用层的技术是为了拼出一个合适的promt。
- 身份设定
- 背景设定
- 参考资料
- 样例
- 没有样例:Zero-Shot
- 一个样例:One-Shot
- 多个样例:Few-Shot
- 如何动态添加样例而不是手写样例
- RAG:Retrieval-Augmented Generation(回答问题之前先做一轮内部知识搜索)
- 将参考资料和样例放在prompt中,就叫做In-Context-Learning(下一轮对话需要注入上下文,否则会忘掉)
- 模型接收提示词有字数限制,且内容多性能下降,需要知识库塞入这些内容。
- 构建知识库:
- 分析场景是宽场景还是窄场景
- 搜集文件(pdf、word、md、html、表格、图片)并纯文字化-》
- 分块/切片(100~2000文字)(ai、agent、人工)-〉
- 技巧:每一个切片是一个对立的主题(一行一个主题)
- 技巧:人为切分固定数量的文本
- 技巧:问答对格式,一个问答对为一个chunk,优先使用rag而不是微调
- 向量化embedding和存储
- 优化检索结果
- 没有检索到
- 检索到了但是相似度不高
- LLM调用知识库:
- 用户query-》向量化embedding
- 在向量库中搜索相似的向量
- 拼接提示词(系统提示词+搜索到的知识向量+原始query向量)=》最终提示词
- 最终提示词给LLM并给出反馈

- RAG:Retrieval-Augmented Generation(回答问题之前先做一轮内部知识搜索)
- 指令
- 限制条件
RAG的高级技巧:双向奔赴
用户的query如何在向量库中找出来对应的信息,
融合策略:
- Query改写(依靠LLM):
- 汇总上下文信息,总结用户核心诉求作为query
- query默认是用户问题
- query的样式多种多样
- 用户会多轮的形式提问
- 多意图query
- 反问型query
- 条件型query,哪些需要检索知识库哪些检索数据库
- 模糊指代型query
- 对比型query
- 上下文依赖型query
- Agentic RAG:在检索RAG前agent判断是否进行改写query,针对上下文分析对RAG检索几次,如何拼接成提示词
- 汇总上下文信息,总结用户核心诉求作为query
- 知识库处理技巧
- 对场景的理解:清除用户会问什么,怎么问
- 对技术的理解:问题的分类、不同问题对应的知识库、每个知识库的知识处理方式
- 举例:
- coze知识库 爬虫-》转纯文本txt,
- 知识和问题内容不对等、长度不对等,需要使用excel表格填充问题和知识内容对,用LLM根据知识内容生成用户问题
- 将问题变成数学向量放入向量库并加入meta信息(即对应的知识出处,创建时间、元文字的其他信息)
- 微信对答知识库
- 问答对(多个问题一个回答)
- 长视频知识库
- 视频变成文字处理方式:
- 视频归类
- 演讲类画面不重要音频为重
- 找一个工具分离出音频
- 找一个工具把声音转成文字(一般6万到8万字)
- 切片(LLM辅助切片,观察数据梳理数据:例如最小颗粒度的知识点不会超过1000个文字),先取1000个字,让LLM分析讲了几个主题,将第一个主题的文字长度输出出来,再从第一个主题后的第一个文字开始取1000个文字,重复上述工作
- 如果LLM切的不好,你要通过提示词告诉它你的主题是如何定义的
- 三元组(问题、知识内容、图片),问题放入向量库并把知识和图片放入向量对应的meta元文字中
- 视频画面传递信息
- 两种类型交替出现(切割视频)
- 演讲类画面不重要音频为重
- 视频归类
- 视频变成文字处理方式:
- coze知识库 爬虫-》转纯文本txt,
- 举例:
Agent
workflow agent 工作流智能体
设计agent时要给大语言模型多大的空间
- LLM幻觉
- LLM只会说,不会做
- LLM规划的步骤不可靠
如何应对极强的准确度、可控性=》模型提供智能,agent保证结果。 - 意图识别,分流(function call)
- 对其中每种意图做工作流(功 能模块)或者skill
问:例如五道口有地铁站吗
操作:
1、检索知识库
2、执行工作流(地点意图)
得到两个结果,检索知识库的回答结果和工作流输出结果。将两个结果拼成最终的提示词给LLM让它给出反馈结果。

工作流和skill
工作流和skill是提前开发好的功能模块,大语言模型有function call能力(大语言模型能够看到用户的自然语言命令、要求和问题,并有能力自主判断是否要调用某个功能模块(工具)、调用哪些功能模块、调用工具时的参数是什么),但是你要把这些可被调用的工具写到系统提示此中,否则大语言模型不知道都有哪些工具可被它支配。
react agent 推理型智能体
通用agent例如open claw龙虾、permis爱马仕、manus、codex、claude使用推理智能体。
专用agent例如某个场景无自主性,工作流智能体。
有些任务无法提前设定步骤怎么办?
react:reasoning+acting:推理(要采用什么行动)、行动、整理并获得反馈,三者多轮循环,每轮循环都在更新拼接新的提示词。
推理阶段:
- LLM推理使用哪个工具。返回文本
- 我们要给出若干可用的行动工具skill到系统提示词中,让大语言从里面挑选。
- 输出行动的名称。
行动阶段: - 提前写好的行动代码(可以是人也可以是LLM写)
反馈阶段: - agent拼接提示词
例如AutoGPT
模版提示词拼接内容:
三个板块
- 引导LLM思考
- 列出所有行动工具:ListFileNames、AskDocument
- 输出的内容是当前最新的任务执行记录
模拟循环过程:
- step0:
- 原始提示词
- LLM给出调用工具文本名
{"action": ListFileNames} - agent执行
ListFileNames,返回文本
1 | 各类电子产品销售数据.xlsx |
- step 1:
- 新的拼接提示词=原始提示词+上轮返回的文本
1 | 各类电子产品销售数据.xlsx |
- LLM给出调用工具文本
1 | { |
- agent执行AskDocument
- AskDocument执行结果的文本
1 | 2023年供应商月销售额任务管理方案.pdf |
step 2:
- 新提示词=原始提示词+上两轮提示词的结果,拼接在一起。
- LLM给出的决策文本
1 | { |
- agent执行
InspectExcel - 返回文本结果
react agent不怕大模型犯错,
思维链 Chain of Thought
用提示词引导到模型给出推理文字,然后再做任务
大模型无法反思只能一次输出内容,而agent有loop可以不断拼接提示词每次都让大模型输出内容可以达到反思的能。

agent平台
多模态
视觉与语言的打通
一个模型同时看懂语言和视觉,模型可以输出文字、也可以输出图片和视频,好处视觉转译文字、融合推理(融合图片的推理和文字推理)、视觉编辑。
视觉识别与视觉推理
传统视觉识别模型:没有推理、精度高、需要提前定义类型
- Yolo:目标识别,快
- Unet:具体区域的分割,慢
- 输入:1024*768图片
- 输出:1024*768图片,每一个像素都被标注属于哪个对象
- 优势:模型小、部署和使用成本低、识别精度高
- 劣势:需要单独标注、训练模型
多模态模型:有推理过程、精度低 - Gemini、GPT
- 优势:无需标注、无需训练、直接使用、有推理能力
- 劣势:部署成本高、精度低
视觉生成:人工智能生成内容(Artificial Intelligence Generated Content,简称AIGC)
模型能力不足时的综合方案。
能力不足:只写提示词给模型,生成的视频无法满足需求。
例如:
- 海报生成
- 漫剧:对象的一致性问题
- 电商视频
- 中长尾商品素材匮乏
- 爆款商品延展性差
- 内容需求量大,制作成本高
- 生产流程长,协同效率低
- 素材管理智能程度低
- 优质内容的筛选和复用难
- 效果反馈不及时
- 精细化内容营销难
电商视频生成
- 视频片段组合
- 由哪些片段组合的
- 这些片段哪来的
- 如何得到视频片段:品牌视频切片、产品展示切片、模特展示切片、直播切片
- AI+人工:json格式化切片
1 | { |
-
通过代码或工具,将视频中的音频分离
-
从音频中提取文字
-
通过多模态模型对画面进行文字描述
-
人工补充修改文字描述
-
整理成结构化信息
- 切片后的视频还需要配置结构化文字描述
- 打标签,你要自定义有哪些标签,不能让LLM瞎打标签。

-
用普通LLM不用多模态模型(因为每个片段都有丰富的结构化文本描述)排列、拼接视频片段。
- 渐进式批露:当提供的视频片段的结构文字数量很多时,让LLM规划视频内容,有多少条视频描述产品痛点、多少条产品描述、多少条促销,根据LLM挑选的各条视频+文字结构,然后排列,最后我们来实现视频的最终拼接。
-
生成内容
1、文生视频
2、图生视频
3、分析商家有什么(衣服)、没有什么(模特)
4、将衣服穿到模特身上,例如flux、catVTON,但是衣服穿到模特身上总是会出问题,例如衣服变形,穿着不到位。
catVTON局部重绘:将涂抹掉的区域重新绘制

涂抹不到位问题:
1、手动涂抹
2、对一个模特的涂抹区域打标签,例如短裤区域涂抹、7分裤区域涂抹、全身裤区域涂抹,图片+结构化文本。

3、为模特添加背景:人工+LLM梳理提示词模版 -
套模版
模型能力不足时的综合方案的评价
1、水涨船高型
2、擎天柱型
大模型原理和API使用
ChatGPT如何训练出来的
- 搜集数据,监督学习模型
- 训练奖励模型(reward model),对监督模型给出的文本结果使用Rank List (RLHF) 人工排序,奖励模型给监督模型对同一个问题生成的多个文本结果排序(打分),两者对比更新奖励模型
- 训练强化模型(ppo),将强化模型生成的文本给奖励模型,让奖励模型给结果打分
不同语言模型的token如何定义
token是大语言模型处理文本的最小单元。token被转换成一个数字向量。不同模型使用不同的分词器(tokenizer)类定义token。
特殊token:分隔符、结束符、开始符。
控制大模型生成文本的多样性参数:
- 温度temperature:在模型计算出下一个token所有可能的概率分布后,temperature调整分布的平滑度。高温度会让低概率的token更容易选中,更具创造性但是会不稳。
- Top P核采样:它设定一个概率阈值(P),然后从高到低累加所有token的概率,直到总和超过P为止。模型只会在这个累加出来的核心词汇表中选择下一个token。Top P越大候选词汇表越大。
大语言模型中的超能力
- 联网搜索
LLM会根据用户提问涉及的咨询自动调用搜索工具Tool,并将问题转化为多个简洁的搜索关键词。接着程序调用搜索引擎API获取信息,将该信息作为上下文提供给模型。 - 读取文件:将不同格式的信息翻译成结构化的文本
- word/excel
- 图片
- 音频/视频
- 记忆能力
- LLM本身无状态,每次对话都是全新互动,
- 短期记忆:为了记忆系统会在每次对话时将最近几轮的问答作为上下文信息拼接到新提示词中发给模型。
- 长期记忆:将信息存到数据库,使用时系统从数据库中读取信息并给模型。
- LLM本身无状态,每次对话都是全新互动,
API使用
API调用的是部署在云端的远程模型,而非自己电脑里的大模型。API Key是你的身份凭证,相当于门禁卡,需在代码中配置且不可泄漏;流式输出(streaming)让回答像打字机逐字呈现。
1 | review = '这款音效特别好 给你意想不到的音质。' |
系统角色:角色扮演
用户角色:提问
dashscope阿里百炼工具箱封装了大模型接口。
Function Call
- 使用model=“qwen-max”
- 编写 get_current_weather
- 模型根据用户需求调用get_current_weather
大模型看图表
ocr是一比一还原文字,大模型不会一比一还原文字
运维事件处理
- 理解告警内容
- 分析排查function call
- 报告结果
框架
LangChain, LangGraph, DeepAgents,LlamaIndex, Hermes, OpenClaw, nanobot
AI编程
- cursor rules:长期记忆
- 全局规则:适用于所有项目
- 项目规则:适用当前项目
- 优先级:项目规则>全局规则
- 全局rules会变成context engineering,软约束
- 不重复造轮子,如果之前有实现过的类似的,你需要先理解实现逻辑,然后再进行修改和完善。
- 生成的注释用中文,使用UTF-8编码
- 你的操作系统是MacOS/Windows/Ubuntu
- 如果用户没有明确说,就不需要编写测试脚本,也不需要写专门的项目说明md。
- 代码中不要使用emoji。
- 如果是代码迁移的时候(一个项目迁移到另一个项目中作为一个功能模块),先copy再改写,不要直接重复写一遍(容易有漏的或者错误的)
- 写代码不考虑fallback,不考虑旧兼容,没有老用户处理思路是“消除fallback触发场景”而不是“加更多兜底”
- 不一定要折中方案(折中方案就是还没有想好),方案清晰合理,不过度优化:
- 方案评估:帮我梳理,给我建议及置信度(0-100)
- 先执行置信度>=90的,针对>=75且<90的,方案分批调研,然后再做置信度>=90
- 项目rules:
- 在各项目遇到的Bug => 分析整理成共性经验,写到全局rules中
- cursor为例的功能讲解
- agent模式
- 简单任务
- 完整的自主智能体,同时编辑多个文件,独立执行多步骤任务:
- plan模式
- 复杂任务:调研产生md放到docs文件夹中
- debug模式
- 专治疑难杂症,粘贴错误信息,AI自动分析堆栈、定位原因、提供修复方案
- ask模式
- 纯咨询,不修改代码,用于解释代码逻辑、学习新技术、讨论架构方案
- agent模式
- 一个文件夹用于一个项目
- 模型
- Auto
- Opus4.8:Anthropic旗舰大模型,擅长复杂算法、架构设计和长上下文理解,适合高难度任务
- Composer2.5:基于Kimi K2.5
- Sonnet4.6:性价比之选,日常编码
- GPT-5.5:在特定语言python/JS和架构上有优势,与Claude互补
- GPT-5.5 Codex: 擅长严格的代码逻辑、检查
- Claude code + deepseek-V4-pro
- 配置claude
- claude --dangerously-skip-permissions
- coding plan => glm-5.1(国产最好)
- 智谱、阿里云百炼、腾讯、字节、讯飞
flask: Python Web框架,给前端页面提供数据接口
echarts:百度的图表框架(图表库),有丰富的图表样式
prompt中添加Harness 马具,约束
harness约束
目标+关键点=》让agent写一个plan.md
Function Calling与MCP
agent = llm(大脑) + tools(工具)+RAG(私有话知识库)
tools = function call 或者 MCP或者skills
Function Calling:大模型与真实世界交互的桥梁,从语言理解到具体行动
- 扩展模型能力
- 结构化输出
- 动态决策流程
例子:门票助手
目标:门票助手,对门票业务进行查询
功能:
-
查询某天的门票销量,按周进行统计
-
统计某月的入园人数
-
查询某个时间范围内各销售渠道的订单金额排名
数据表: -
表名tkt_orders
-
字段名

结果:ai有50%能写对,如何技术化语言、模块化方式提升写对概率 -
system prompt: 角色+建表sql语句+私有知识+few shot(示例,错题本)
-
Tools:基于Qwen Agent使用
@register_tool('exc_sql'),其他模型的装饰器可能不同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# ====== exc_sql 工具类实现 ======
class ExcSQLTool(BaseTool):
"""
SQL查询工具,执行传入的SQL语句并返回结果。
"""
description = '对于生成的SQL,进行SQL查询' #调用条件
parameters = [{
'name': 'sql_input',
'type': 'string',
'description': '生成的SQL语句',
'required': True
}] #调用时需要的参数,这里只有一个参数,该参数有含义描述,类型以及是不是必须输入的参数
def call(self, params: str, **kwargs) -> str:
import json
args = json.loads(params)
sql_input = args['sql_input']
database = args.get('database', 'ubr')
# 创建数据库连接
engine = create_engine(
f'mysql+mysqlconnector://student123:student321@rm-uf6z891lon6dxuqblqo.mysql.rds.aliyuncs.com:3306/{database}?charset=utf8mb4',
connect_args={'connect_timeout': 10}, pool_size=10, max_overflow=20
)
try:
df = pd.read_sql(sql_input, engine)
# 返回前10行,防止数据过多
return df.head(10).to_markdown(index=False)
except Exception as e:
return f"SQL执行出错: {str(e)}" -
配置大模型
1
2
3
4
5
6
7
8
9llm_cfg = {
'model': 'qwen-turbo-latest',
'timeout': 30,
'retry_count': 3,
} -
初始化agent实例
1
2
3
4
5
6
7
8
9
10
11
12
13bot = Assistant(
llm=llm_cfg,
name='门票助手',
description='门票查询与订单分析',
system_message=system_prompt,
function_list=['exc_sql'], # 只传工具名字符串
) -
创建app(gui或者tui)
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
68def app_tui():
"""终端交互模式
提供命令行交互界面,支持:
- 连续对话
- 文件输入
- 实时响应
"""
try:
# 初始化助手
bot = init_agent_service()
# 对话历史
messages = []
while True:
try:
# 获取用户输入
query = input('user question: ')
# 获取可选的文件输入
file = input('file url (press enter if no file): ').strip()
# 输入验证
if not query:
print('user question cannot be empty!')
continue
# 构建消息
if not file:
messages.append({'role': 'user', 'content': query})
else:
messages.append({'role': 'user', 'content': [{'text': query}, {'file': file}]})
print("正在处理您的请求...")
# 运行助手并处理响应
response = []
for response in bot.run(messages):
print('bot response:', response)
messages.extend(response)
except Exception as e:
print(f"处理请求时出错: {str(e)}")
print("请重试或输入新的问题")
except Exception as e:
print(f"启动终端模式失败: {str(e)}")
def app_gui():
"""图形界面模式,提供 Web 图形界面"""
try:
print("正在启动 Web 界面...")
# 初始化助手
bot = init_agent_service()
# 配置聊天界面,列举3个典型门票查询问题
chatbot_config = {
'prompt.suggestions': [
'2023年4、5、6月一日门票,二日门票的销量多少?帮我按照周进行统计',
'2023年7月的不同省份的入园人数统计',
'帮我查看2023年10月1-7日销售渠道订单金额排名',
]
}
print("Web 界面准备就绪,正在启动服务...")
# 启动 Web 界面
WebUI(
bot,
chatbot_config=chatbot_config
).run()
except Exception as e:
print(f"启动 Web 界面失败: {str(e)}")
print("请检查网络连接和 API Key 配置") -
针对已有代码的改写方式:
- 使用
@脚本名指定要修改的代码
- 使用
-
门票助手可视化数据表
- 编写新的工具(函数),传入markdown的图表,进行可视化
- 无法处理大表,展示不全
- 在原
exc_sql工具的基础上修改,增加画图功能,返回结果增加数据表markdown可视化 (推荐、代码展示如下) - 使用LLM查询数据表并根据 LLM response的文字做图
- 软约束、费token、不一定准
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
class ExcSQLTool(BaseTool):
"""
SQL查询工具,执行传入的SQL语句并返回结果,并自动进行可视化。
"""
description = '对于生成的SQL,进行SQL查询,并自动可视化'
parameters = [{
'name': 'sql_input',
'type': 'string',
'description': '生成的SQL语句',
'required': True
}]
def call(self, params: str, **kwargs) -> str:
import json
import matplotlib.pyplot as plt
import io, os, time
import numpy as np
from sqlalchemy import text # 导入text类型用于处理原生SQL
args = json.loads(params)
sql_input = args['sql_input']
print('sql_input=', sql_input)
database = args.get('database', 'ubr')
engine = create_engine(
f'mysql+pymysql://student123:student321@rm-uf6z891lon6dxuqblqo.mysql.rds.aliyuncs.com:3306/{database}?charset=utf8mb4',
connect_args={'connect_timeout': 10}, pool_size=10, max_overflow=20
)
# 使用 SQLAlchemy 的 text() 包装 SQL 语句,避免格式化问题
df = pd.read_sql(text(sql_input), engine)
print('df=', df)
md = df.head(10).to_markdown(index=False)
# 自动创建目录
save_dir = os.path.join(os.path.dirname(__file__), 'image_show')
os.makedirs(save_dir, exist_ok=True)
filename = f'bar_{int(time.time() * 1000)}.png'
save_path = os.path.join(save_dir, filename)
# 生成图表
generate_chart_png(df, save_path) #使用
img_path = os.path.join('image_show', filename)
img_md = f''
return f"{md}\n\n{img_md}"
# ========== 通用可视化函数 ==========
def generate_chart_png(df_sql, save_path):
columns = df_sql.columns
x = np.arange(len(df_sql))
# 获取object类型
object_columns = df_sql.select_dtypes(include='O').columns.tolist()
if columns[0] in object_columns:
object_columns.remove(columns[0])
num_columns = df_sql.select_dtypes(exclude='O').columns.tolist()
if len(object_columns) > 0:
# 对数据进行透视,以便为每个日期和销售渠道创建堆积柱状图
pivot_df = df_sql.pivot_table(index=columns[0], columns=object_columns,
values=num_columns,
fill_value=0)
# 绘制堆积柱状图
fig, ax = plt.subplots(figsize=(10, 6))
# 为每个销售渠道和票类型创建柱状图
bottoms = None
for col in pivot_df.columns:
# 避免格式化字符问题,对可能包含Y的字符串进行处理
label_str = str(col)
safe_label = label_str.replace('%', '%%').replace('{', '{{').replace('}', '}}')
ax.bar(pivot_df.index, pivot_df[col], bottom=bottoms, label=safe_label)
if bottoms is None:
bottoms = pivot_df[col].copy()
else:
bottoms += pivot_df[col]
else:
print('进入到else...')
bottom = np.zeros(len(df_sql))
for column in columns[1:]:
# 避免格式化字符问题
label_str = str(column)
safe_label = label_str.replace('%', '%%').replace('{', '{{').replace('}', '}}')
plt.bar(x, df_sql[column], bottom=bottom, label=safe_label)
bottom += df_sql[column]
# 对x轴标签进行安全处理,避免格式化问题
safe_xtick_labels = []
for val in df_sql[columns[0]]:
val_str = str(val)
safe_val = val_str.replace('%', '%%').replace('{', '{{').replace('}', '}}')
safe_xtick_labels.append(safe_val)
plt.xticks(x, safe_xtick_labels)
plt.legend()
plt.title("销售统计")
# 对x轴标签也进行安全处理
xlabel_str = str(columns[0])
safe_xlabel = xlabel_str.replace('%', '%%').replace('{', '{{').replace('}', '}}')
plt.xlabel(safe_xlabel)
plt.ylabel("门票数量")
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig(save_path)
plt.close() - 编写新的工具(函数),传入markdown的图表,进行可视化
MCP:model context protocol,开放协议标准,目的是标准化LLM与外部数据源、工具及服务之间的交互方式。

function call与MCP区别
| 维度 | function call | MCP |
|---|---|---|
| 定位 | 模型厂商私有接口(OpenAI,Qwen) | 开放协议类似HTTP/USB-C |
| 扩展性 | 需为每个模型单独适配 | 一次开发,多模型兼容 |
| 复杂性 | 适合简单、单次调用任务 | 支持多轮对话(复杂上下文管理) |
| 生态依赖 | 依赖特定模型(gpt-4) | 跨模型、跨平台(claude、cursor) |
| 安全性 | 依赖云端API密钥 | 支持本地化数据控制 |
| 性质 | 功能 | 协议 |
| 范围 | 特定场景(单一数据源与功能) | 通用(多数据源、多功能) |
| 目标 | 扩展模型能力 | 统一接口,实现互操作 |
- 架构与组件
MCP采用客户端-服务器(Client-Server)架构,核心组件:- MCP Host:运行AI模型的环境,如Claude Desktop、Cursor IDE
- MCP Client:嵌入在Host中的组件,负责发起请求并与MCP Server通信
- MCP Server:轻量级服务,提供特定功能(查询、API调用),供AI模型调用
- 核心功能:
- Resources(知识扩展):提供结构化数据(数据库、文档)以增强AI上下文理解
- Tools(工具调用):允许AI执行外部操作(发送邮件、查询Git、调用智能合约)
- Prompts(提示模版):预定义的指令模版,优化AI的任务执行
搭建MCP

使用在线版的function call, 配置一个json文档,codex在toml文档中配置参考,参考魔塔社区。

- mcpServers(他在一对花括号中)是function call list中的工具名字
- amap-maps是mcp名字
模式:
- sse:http协议建立长链接,中转
- stdio (standard I/O):直连,需要key
Skills是进阶版的function call,有一个SKILL.md
- 元数据yaml,定义原数据100个token
- 使用/指导说明书,加载完整的SKILL.md
MCP SDK功能
python mcp sdk
pip install mcp
- 创建MCP Server:提供标准化的API,供AI模型调用外部功能(如文件操作、数据库查询)
- 注册工具(tools):通过
@mcp.tool()装饰器,将python函数暴露给AI模型使用 - 安全交互:支持权限控制,确保AI不会越权访问敏感数据
- 跨平台兼容:支持与OpenAI、Anthropic Claude等LLM集成
- 启动mcp inspector调试命令(有一个网页端来调试):mcp dev <python脚本>
FastMCP是python MCP SDK中的轻量级服务器框架:
- 简单易用:仅需几行代码即可启动MCP Server
- 支持多种传输方式:如stdio,http
- 自动工具发现(让agent发现):通过
@mcp.tool()注解自动注册函数(mcp服务),供AI使用
mcp服务文件txt_counter.py
1 | import os |
客户端agent使用mcp服务文件assistant_mcp_txt_bot.py
1 | """基于 Assistant 实现的文本计数智能助手 |
mcp的应用场景
- 发邮件
- 桌面管理
- 私有知识管理
- 系统的对接
数据源的质量很重要
做一个决策 vs 做一个好的决策
之前的[LLM中使用function call](<./LLM.md>/#大模型原理和API使用)和在agent中使用function call的差异
- agent:给agent注册FC,agent内置了拦截和调用
- LLM:给LLM注册FC,然后自己拦截,自己调用FC
Agent工具开发
AI Agent
Agent = LLM + tool + RAG

- LLM:自主理解、规划、执行复杂任务。
- 规划planning:任务分解为较小的、可管理的子目标。
- 记忆memory:短期记忆,进行上下文学习;长期记忆,一般通过外部载体存储(文件、数据库)和快速检索实现。
- 工具使用tool use:调用外部API,获取额外信息。
智能体自主规划设计
- 反应式reactive
- 深思熟虑式deliberative
- 混合式hybrid
生成智能体
Q:如何定义Agent
A:非代码提示词方式
智能体与环境交互
智能体之间信息传播
智能体的关系记忆

AI Agent框架对比
| 框架工具 | 核心定位 | 架构特点 | 适用场景 |
|---|---|---|---|
| LangChain | 开源LLM应用开发框架 | 基于链(chain)的线性或分支工作流,支持Agent模式 | 快速构建RAG,对话系统、工具调用等线性任务 |
| LangGraph | LangChain的扩展,专注于复杂工作流 | 基于图(Graph)的循环和条件逻辑,支持多Agent协作 | 需要循环、动态分支或状态管理的复杂任务(如自适应RAG、多Agent系统) |
| Qwen-Agent | 通义千问的AI Agent框架 | 基于阿里云大模型,支持多模态交互与工具调用 | 开源,集成多种工具,MCP调用 |
| Coze | 字节跳动的无代码AI Bot平台 | 可视化拖拽界面,内置知识库、多模态插件 | 快速部署社交平台机器人、轻量级工作流 |
| Dify | 开源LLM应用开发平台 | API优先,支持Prompt工程与灵活编排 | 开发者定制化LLM应用,需深度集成或私有化部署 |
| OpenClaw,Hermes | Agent+Skills(内置一些Skills,例如read_file,write_file,cron,web search) | 两段式调用,第一段:Skills(元数据name,description)决定调用什么工具;第二段:指导说明书SKILL.md说明怎么调,read_file通过加载这个SKILL.md了解具体的调用方法 | |
| Q:Agent和工作流的区别 | |||
| A:Agent开放型,自主性,需要外界(对话)推动;工作流固定的套路 |
反应式模式
该模式适合简单的问题,基于当前环境做决策,无长期规划。
工作原理:
- 感知:获取环境输入
- 决策:LLM立即响应
- 执行:执行动作并观察结果,循环往复直至任务完成

1 | #!/usr/bin/env python |
agent方式中的大模型调用哪个工具是根据语义概率选择的。
对比RAG方式:文件切分chunks =》筛选Top5 Chunks =〉prompt提示词;整个pipeline稳定。
对于复杂任务,推荐Tool,同时RAG提供指导说明书few shot示例(错题本)。
- 情况一:如果用户提问了xxxx,你可以通过XXXTool,Tool2查找相关的信息。
- 情况二:
深思熟虑模式

模式流程:
- 感知:获取环境信息
- 建模:更新内部世界状态表示
- 推理:生成候选计划并模拟结果
- 决策:选择最优方案执行
相比反应式堆叠了多个工具(pipeline)
1 | #!/usr/bin/env python |

混合式模式Hybrid Agent Architecture
混合模式会根据意图识别出是使用反应式还是深思熟虑式的规划。
三层设计:
- 底层(反应式):即时处理紧急任务(如避障)
- 中层(协调):管理任务优先级(可选),大模型LLM意图识别
- 顶层(深思熟虑):进行长期目标规划(如路径优化)
运作机制:
通过仲裁系统(如监督器sensor)动态切换模式:
- 紧急情况-》启用反应式快速响应
- 常规情况-〉启用深思熟虑规划

1 | #!/usr/bin/env python |
虚线代表条件边,由LLM的响应结果决定走哪条边


- 如果最后一条 AI 消息包含工具调用 → 跳转到
ToolNode执行工具。 - 如果没有工具调用 → 说明模型已经完成回答,工作流结束。
1 | 用户 |
如果 reactive_agent 生成的最后一条 AIMessage 里有 tool_calls
→ 去 tools 执行工具
如果没有 tool_calls
→ 去 extract_response 整理最终回答
1 | reactive_agent |
LangGraph/LangChain:工作流模式(固定流程图,mermaid)组合各子Agent成一个整体
Qwen-Agent: Agent模式
1 | #!/usr/bin/env python |
Agent的能力优化与效果评估
Agent效果评估(测试代码)架构:
- LangSmith (基于LangChain/LangGraph开发)
- Prompt Ops
- OpenEval (开源评估)
- LangFuse (非LangChain家族的评估)
建立测试集
- 简单直接的查询数据
- 市场状况查询(今天上证指数表现如何)
- 账户信息查询(我的投资组合中科技股占比)
- 基础概念解释(什么是ETF)
- 复杂分析查询
- 投资组合调整建议
- 长期财务规划
- 风险评估和应对策略
- 步骤
- 收集数据:整合市场数据、客户画像、历史数据
- 深度分析:构建市场模型、分析多种可能情景
- 生成建议:形成多个方案并选择最优解
LangSimth
1 | #!/usr/bin/env python |
上述代码中提示词一般在yaml文件中,管理提示词。
1 | REACTIVE_PROMPT: | |
LangSmith测评使用步骤
- 官网配置API KEY
- 配置LangSmith环境变量
LANGCHAIN_TRACING_V2=true
1 | # ==================== LangSmith 配置 ==================== |
- 配置LangSmith的RunnableConfig: 标签和原数据
RunnableConfig:给数据打标签tag(分类)

用于区分多个任务评测,哪个agent项目,针对哪条数据,A/B测试(修改提示词后的版本REACTIVE_PROMPT V1.0和REACTIVE_PROMPT V2.0);metadata记录额外信息(示例备注)
1 | # 准备 LangSmith 配置(如果启用) |
- 使用config字段运行LangChain的agent
result = agent.invoke(initial_state, config=config)- agent.invoke()就是调用工作流(初始值initial_state),运行agent
运行后LangSmith的记录效果

点击记录后

点击waterfall的到类似前端network的时序图

LangSmith可以创建数据集,然后添加样本。

LangSmith可以对多个样本进行批量测试,代码如下
1 | #!/usr/bin/env python |
自动批量评测步骤
- 定义测试数据集
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# 测试用例:反应式查询(简单查询)
REACTIVE_TEST_CASES = [
{
"inputs": {
"user_query": "今天上证指数的表现如何?",
"customer_id": "customer1"
},
"expected_outputs": {
"processing_mode": "reactive",
"should_contain": ["上证指数", "点位", "涨跌"]
}
},
{
"inputs": {
"user_query": "我的投资组合中科技股占比是多少?",
"customer_id": "customer1"
},
"expected_outputs": {
"processing_mode": "reactive",
"should_contain": ["科技", "占比", "投资组合"]
}
},
{
"inputs": {
"user_query": "请解释一下什么是ETF?",
"customer_id": "customer1"
},
"expected_outputs": {
"processing_mode": "reactive",
"should_contain": ["ETF", "基金", "交易"]
}
}
]
# 测试用例:深思熟虑查询(复杂分析)
DELIBERATIVE_TEST_CASES = [
{
"inputs": {
"user_query": "根据当前市场情况,我应该如何调整投资组合以应对可能的经济衰退?",
"customer_id": "customer1"
},
"expected_outputs": {
"processing_mode": "deliberative",
"should_contain": ["投资组合", "调整", "经济衰退", "建议"]
}
},
{
"inputs": {
"user_query": "考虑到我的退休目标,请评估我当前的投资策略并提供优化建议。",
"customer_id": "customer1"
},
"expected_outputs": {
"processing_mode": "deliberative",
"should_contain": ["退休", "投资策略", "评估", "建议"]
}
},
{
"inputs": {
"user_query": "我想为子女准备教育金,请帮我设计一个10年期的投资计划。",
"customer_id": "customer1"
},
"expected_outputs": {
"processing_mode": "deliberative",
"should_contain": ["教育金", "10年", "投资计划", "建议"]
}
}
] - 创建每个评估内容(处理模式、响应式agent、深思熟虑agent)的评估器类型,继承于
RunEvaluator类- 类中定义
def evaluate_run(self, run:Run, example: Example, **kwargs)函数 - 在函数中设置人工标签和运行智能体的输出

- 类中定义
- prompt版本控制
1
2
3
4config = RunnableConfig(
run_name = "coordination-prompt-v3",
tags=["prompt-v3"]
) - 优点:
- 回归测试(对历史的测试再跑一遍)
- 个性化evaluate

提示词工程运维优化
Prompt Ops是一种工程化方法,用于系统地管理、测试、优化和监控LLM应用中的提示(Prompt),确保提示的质量和一致性,实现持续改进。

OpenEvals
之前LangSmith的评估器是自己建立的简单评估,现在使用基于LLM的评估器即OpenEvals
LangSmith可以通过openeval调用多种内置评估器

LangSmith是一个框架:有后段(后台)、前端(网页)
Openevals是一个评估器集合、评估相关的资源库
LangSmith与Openevals可以配合使用

qianwen+openevals
1 | #!/usr/bin/env python |
LangSmith+OpenEvals
1 | #!/usr/bin/env python |
评估器使用步骤:
-
定义要评估的函数,返回结构化待评估的字段
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
34def predict(inputs: dict) -> dict:
"""投顾助手预测函数,用于 LangSmith 评估"""
try:
user_query = inputs.get("user_query", "")
customer_id = inputs.get("customer_id", "customer1")
if not user_query:
return {
"output": "用户查询为空,无法处理",
"final_response": "用户查询为空,无法处理"
}
result = run_wealth_advisor(user_query=user_query, customer_id=customer_id)
# 返回格式化的输出
# 为了支持评估器,将 processing_mode 信息包含在输出中
final_response = result.get("final_response", "")
processing_mode = result.get("processing_mode", "unknown")
# 将 processing_mode 信息添加到输出文本中(用于评估器提取)
output_text = f"[处理模式: {processing_mode}]\n\n{final_response}"
return {
"output": output_text,
"final_response": final_response,
"processing_mode": processing_mode,
"query_type": result.get("query_type", "unknown")
}
except Exception as e:
return {
"output": f"执行错误: {str(e)}",
"final_response": f"执行错误: {str(e)}",
"error": str(e)
} -
创建评估 LLM
1
2
3
4
5eval_llm = ChatTongyi(
model_name="qwen-turbo",
dashscope_api_key=os.getenv("DASHSCOPE_API_KEY"),
temperature=0
) -
创建评估器列表(包含预定义和自定义评估器)
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
53evaluators = [
# 预定义评估器
create_llm_as_judge(
prompt=ANSWER_RELEVANCE_PROMPT,
feedback_key="relevance",
judge=eval_llm,
continuous=True,
use_reasoning=False,
),
create_llm_as_judge(
prompt=CONCISENESS_PROMPT,
feedback_key="conciseness",
judge=eval_llm,
continuous=True,
use_reasoning=False,
),
create_llm_as_judge(
prompt=RAG_HELPFULNESS_PROMPT,
feedback_key="helpfulness",
judge=eval_llm,
continuous=True,
use_reasoning=False,
),
create_llm_as_judge(
prompt=HALLUCINATION_PROMPT,
feedback_key="hallucination",
judge=eval_llm,
continuous=True,
use_reasoning=False,
),
create_llm_as_judge(
prompt=TOXICITY_PROMPT,
feedback_key="toxicity",
judge=eval_llm,
continuous=True,
use_reasoning=False,
),
# 自定义评估器(参考 2-langsmith_testing_evaluation.py)
create_llm_as_judge(
prompt=PROCESSING_MODE_PROMPT,
feedback_key="processing_mode",
judge=eval_llm,
continuous=True,
use_reasoning=False,
),
create_llm_as_judge(
prompt=RESPONSE_COMPLETENESS_PROMPT,
feedback_key="response_completeness",
judge=eval_llm,
continuous=True,
use_reasoning=False,
),
] -
LangSmith 集成
1
2
3
4
5
6
7
8results = evaluate(
predict,
data=dataset_name,
evaluators=evaluators,
client=client,
experiment_prefix="wealth-advisor-openevals",
max_concurrency=1 # 串行执行,避免 API 限流
)
LangFuse
1 | #!/usr/bin/env python |
非LangChain家族的agent工具,例如QwenAgent
LangFuse <—> LangSmith
DeepEval <—> OpenEvals
Agent自主规划与工具开发
Harness Engine
Q:什么是Harness
A: 控制模型输出,随着业务复杂度、模型内部复杂度要高,外部管理模型的架构(记录信息、管理执行资源)复杂度也越高,这个外部管理的架构就是Harness。
Q:Harness的架构有哪些
A:agent loop中有意图识别、选择规划、执行具体行动,在循环过程中能否通过外部工具管理起来,管理每次的执行结果作为每个管理节点,管理选择规划与具体执行过程中的资源(限制)

CoT=Chain of Thought:前置输入token块影响后置token的输出,Step by Step, 不要跳过中间的token块而输出后置输出token
agent 任务中的工作空间用来管理过程中的信息、状态。
下一步会发展到:长任务(问题:思考过程依赖前置内容所以容易产生误差,误差会被放大)、自演进(问题:)
Anthropic改进方法:


Harness Engineering的5种分析单位,严格说用户外层控制为Harness工程,


蓝色:系统层
绿色:
红色:组织架构层

skills使用的策略是渐进式披露到模型中(不是一次全部输入到模型中,而是多次)。
skills在自己的agent中实现需要达到L3级别,L4和L5是企业落地,ci是持续集成。
系统层开发等级:

Harness不是prompt也不是Agent Loop

搭建类似Hermes Agent的自进化长期记忆
- 模型本身没有记忆
- 模型能够多轮对话,依赖我们给它提供上下文,最简单的方式是把所有的会话记录都传给它。
- 模型可接受的上下文长度有限(历史会话+当前输入+最新输出)
记忆系统四个动作 对比 RAG - RAG
- 对话素材录入 (预处理)
- 切块
- 切块索引
- 向量化
- 向量知识库 (预处理)
- 用户提问 (实时发生)
- 问题转写
- 向量化
- 在知识库做向量匹配
- 输出匹配的对话

记忆系统
- 对话素材录入 (预处理)
- 写入
- 修正
- 遗忘
- 召回
单用户|单项目|全局整个Agent
^
|
稳定规则层 (system prompt)
^
|
任务经验层(Todo list, plan) -------》 工作记忆
^
|
原事件层



记忆压缩:
- 对话结构化
压缩的原理就是让LLM把对话拆分成若干结构字段的结构化输出,提纲挈领

- 分批次处理
- 合并同类对话
召回
(03),(04),(05),(06),(07)是本次课的目录中的代码序号


存储方式:文件.jsonl/数据库
已有对话处理流程不是实时发生: - 事件触发:当前会话的上下文满了/用户手动按了一下极易清理
- 定时任务触发:每天3:00
实现Hermes中的多Agent协作、主Agent调度
目的:复杂任务下需要多个Agent协同工作完成。
难点:主Agent怎样调度子Agent,同时避免上下文污染。

对主Agent来说各子任务的结论信息是有用的。即关心给子Agent的输入和返回的输出。
对子Agent来说各中间状态的过程信息是必要的,需要维护各个状态的信息,因为Agent不具备记忆性。
让主Agent处理的信息更少,让各子任务相互隔离。
一个Agent的基本结构:

每个子Agent能力各有千秋:
- Deep Research
- Search
复杂任务时面临的问题:

解决的设计方式:

DAG: LangGraph的特点动态行动图(有向无环图)
主Agent关心:
- 任务的拆解
- 任务的分发(分发给哪个子Agent是根据子Agent的描述信息决定)
- 任务的回收评价
- 最终结论输出
子Agent关心: - 任务的承接
- 任务的执行
- 任务的结果汇总
- 任务的结果返回
ACP和A2A
ACP: Agent Client Protocol
ACP: 把本地Agent接成标准会话,主Agent分发时如何将任务传递给子Agent。

ACP Client:
- 归一:使用方(主Agent)如何发出指令、回收结果
ACP Adapter: - 归一:子Agent适配器来完成Client端收信息,把结果返回给Client。
- 将发布端和适配端相互解开。

左侧负责对接,右侧负责业务




A2A
重量级ACP
企业级AI部署 从硬件选型到框架选择
Embedding模型
Embedding模型本质是LLM+池化层,大模型简化板。
LLM推理中的数据搬运
内存墙,将token运到显存中的过程限制计算速度,SRAM(静态随机存取存储器)HBM(高带宽内存)
- 数据复用
- 并行归约与协作计算
- 结果聚合与缓存
AI服务核心:高并发原理与性能监控调优
高并发内存瓶颈
KV Cache提升效率,将上一轮计算使用的KV放入缓存,下一轮计算直接使用上一轮KV,以及计算本轮KV。
- 瓶颈1:内部碎片(请求空间多了),外部碎片(请求内存不连续的区域)
- 瓶颈2:动态长度导致
- 瓶颈3:Copy-on-Decoding开销,例如beam search(每次搜索多个而不是一个)
pageAttention:
内存分成许多block,用block表管理和维护。每个block可存16个token。block表记录了block块的索引。 - 按需分配:用多少token分配多少个block。
- 写时复制:各样本公用一些块,同时每个样本有自己私有的块。
- 动态重排:不需要连续空间,有离散空间也可以用。
vLLM架构详解

推测解码
传统解码:一个一个token输出
推测解码:小模型(Draft model)一次输出多个token,大模型(Target model)给生成的token打分,大于阈值接收否则修改,大模型对拒绝的token生成候选token然后思索后给出最终token。打分过程快,思索过程慢。
MEDUSA推理框架
像美杜莎多头一样,每次预测多个token。
贪心算法只顾当前节点得分最高,不管整个路径中的得分最高。
Beam search保留多个路径,找路径中得分最高的路径。


Typical acceptance: 概率接收,超参temperature。
不再需要Draft Model (小模型),不用大模型打分。
EAGLE推理框架
增加了特征提取层,提取token特征向量比直接用token ID有更好的预测。包含草稿阶段和大模型验证阶段。token vector + token ID共同预测。

增大大模型接收的概率提升推理速度。
vLLM性能监控与调优
关键指标

SGLang 深度优化:Radix 缓存与复杂任务的极致吞吐
SGLang和vLLM
vLLM: 解决模型如何跑得快
- PageAttention(解决KV碎片)
- Continuous Batching(解决GPU空闲)
- 推测解码(加速Decode)
SGLang:处理业务逻辑
PD架构分离 – Prefill/Decode解耦
Prefill:模型处理用户输入(Prompt)阶段
- 做什么:读入Prompt的问题/提示,计算token的KV Cache。
- 计算特点:计算密集型–大量矩阵乘法,GPU算力是瓶颈
- 关键指标:TTFT(Time to First Token)
- 资源需求:高算力、高并行度
Decode:模型生成答案(逐个吐字)阶段 - 做什么:基于生成的内容,逐个预测下一个token(自回归生成–之前的历史token生成当前一个token)
- 计算特点:内存带宽密集型:每一步只计算一个token,瓶颈在读取KV Cache,GPU计算单元大量空闲。
- 关键指标:TPOT(Time Per Output Token)
- 资源需求:大显存,高内存带宽

SGLang大模型底层语言,一种为LLM设计的结构化生成语言,用于简化和加速复杂语言模型程序的编程和执行。
前端:语言,基于python的大语言模型(包含对话信息)编程
后端:运行时
vLLM像是一个组件,启动大模型提供API服务,API调用
SGLang颗粒度更细,深入到语法层面
SGLang系统中的RadixAttention
一种用于高效重用LLM推理过程中的KV Cache的方法。
- 基数树(Radix Tree):分节点(前缀)、分类存储KV值
- LRU(最近最少使用)逐出策略:优先逐出最久未使用的缓存条目。
- 缓存感知调度:合理调度编排提升缓存命中率,优先处理前缀匹配更长的请求。

约束解码(Compressed FSM有限状态机)
短剧视频换脸
LangChain:多任务应用开发
LangChain组件:
- model:大模型
- prompt:管理提示词
- memory:保存上下文
- index:结构化文档
- chains:编排
- agents:代理-观察-思考-行动




