惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threat Research - Cisco Blogs
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
WordPress大学
WordPress大学
Recorded Future
Recorded Future
The Register - Security
The Register - Security
Microsoft Azure Blog
Microsoft Azure Blog
Stack Overflow Blog
Stack Overflow Blog
爱范儿
爱范儿
大猫的无限游戏
大猫的无限游戏
Blog — PlanetScale
Blog — PlanetScale
H
Help Net Security
Webroot Blog
Webroot Blog
Help Net Security
Help Net Security
Forbes - Security
Forbes - Security
H
Hacker News: Front Page
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
云风的 BLOG
云风的 BLOG
Hacker News: Ask HN
Hacker News: Ask HN
Security Archives - TechRepublic
Security Archives - TechRepublic
Google Online Security Blog
Google Online Security Blog
Attack and Defense Labs
Attack and Defense Labs
T
Tailwind CSS Blog
J
Java Code Geeks
C
CXSECURITY Database RSS Feed - CXSecurity.com
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Cyberwarzone
Cyberwarzone
小众软件
小众软件
G
Google Developers Blog
SecWiki News
SecWiki News
V
V2EX
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Blog of Author Tim Ferriss
S
SegmentFault 最新的问题
MyScale Blog
MyScale Blog
S
Security Affairs
AI
AI
S
Securelist
D
Docker
人人都是产品经理
人人都是产品经理
T
Troy Hunt's Blog
罗磊的独立博客
The Hacker News
The Hacker News
阮一峰的网络日志
阮一峰的网络日志
Google DeepMind News
Google DeepMind News
宝玉的分享
宝玉的分享
P
Proofpoint News Feed
P
Proofpoint News Feed
Vercel News
Vercel News
Jina AI
Jina AI

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12) Snack JSONPath 项目架构分析 Claude Code Buddy 小析:一个非核心功能,如何体现产品的细节完成度 AI新时代下的图床管理方案-Cloudflare图床+MCP+Skills方案指南 化繁为简:顺丰速运App如何通过 HarmonyOS SDK实现专业级空间测量 从零实现富文本编辑器#13-React非编辑节点的内容渲染 AI开发-python-langchain框架(3-23-OpenAI Functions风格Tool Calling智能助手) .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut PbootCMS 网站内容数量多导致访问慢?这些实用优化方案帮你提速! - 家兴网络技术工作室 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 网站漏洞怎么发现并修复?一篇实用指南(附完整流程) - 家兴网络技术工作室 开了 TUN 模式还是直连?90% 的人都踩过这个坑 Github日报|2026年04月12日 - AI一族 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术 Etsy 把 1000 个 MySQL 分片迁进 Vitess:425TB 数据背后的真正问题不是性能,而是运维规模 MicroPython LVGL基础知识和概念:底层渲染与性能优化 - FreakStudio 数据库草图算法 Python 潮流周刊#146:CPython 引入 Rust 的进展 - 豌豆花下猫 最小生成树 - mofei1116 红日靶场七:从外网入口、容器逃逸到 AD 接管的完整利用链复盘 - YouDiscovered1t 分享四款开源且实用的 Kafka 管理工具 - 追逐时光者 vLLM 权重加载机制全解析:从挑战到理想架构 LCT 学习笔记 - ACehomoxue Avalonia UI 12.0.0 正式发布:架构演进和性能飞跃 - 张善友 当 AI Agent 把调用链拉长,延迟开始成为一门生意 conhost.exe 无法显示 U+2717 - 145a 太秀了,我把自己蒸馏成了 Skill!已开源 - 程序员鱼皮 ASP.NET Core 内存缓存实战:一篇搞懂该怎么配、怎么避坑 基于 Ghostty 带有分割标签页和为 Claude 编程设计的通知终端 - BugShare AI 焊死入口:教育的“操作系统级”重塑 - 郝hai 初级Java开发工程师使用sql脚本编写代码的过程是简单而且不糊涂 - CoderOilStation Claude Code通关手册(六):MCP协议完全指南 - 暮色之狐 边框灯光环绕动画特效实现指南 - Newbe36524 开源:子木蒸馏版的 SEO 审计工具 seo-audit-skill v1.0 我所理解的Python元模型 【从0到1构建一个ClaudeAgent】规划与协调-TodoWrite - 程序员Seven Claude 和 Codex 在审计 Skill 上性能差异探究 - ACai_sec AScript如何实现中文脚本引擎 - rockey627 【渗透测试】HTB Season10 Garfield 全过程wp - dynasty_chenzi Android 开发者为什么必须掌握 AI 能力?端侧视角下的技术变革 树状数组正确性证明 - AC-wyr 你的 AI 焦虑,可能比 AI 本身更危险——ATM 机没有消灭银行柜员,但恐慌消灭了你的判断力 - 我没有三颗心脏 一个拉胯的分库分表方案有多绝望?整个部门都在救火! - 冰河团队 动态规划入门必学之走方格问题 - Ofnoname PostgREST 与 PostgreSQL 角色权限配置全解析(生产级实践) - SheepDog1998 使用 UEFI 图形输出协议 GOP 在屏幕上显示图像的方法 - 阿源- Claude Code通关手册(五):组建你的AI专家团队,子代理系统 - 暮色之狐 一个程序员到架构师的催婚路之感悟(整整10年后的催婚相亲感悟) - MisterLip 用 Agent Skill 自动生成工作周报 - 赵康
AI Agent 30天速成|Day1 核心知识点全解析
云淡风轻YangG · 2026-06-16 · via 博客园_首页

AI Agent 全日制30天速成|Day1 核心知识点全解析

前言

本文是AI Agent 30天速成系列的第一天学习笔记,聚焦大模型基础核心概念、异步LLM调用封装、提示工程核心技巧与SSE流式接口开发,所有代码可直接运行,适合AI Agent开发入门学习者。

一、今日核心学习目标

  1. 吃透大模型Token、上下文窗口、核心调参、流式输出等基础概念
  2. 封装兼容OpenAI标准的异步LLM调用工具类(适配通义千问、DeepSeek)
  3. 掌握提示工程核心技巧,强制模型输出标准JSON格式
  4. 实现SSE流式返回简易接口,夯实Agent对话底层基础

二、核心理论知识点

1. 大模型基础核心概念

(1)Token与上下文窗口

  • Token:文本处理最小单位,中文1个汉字≈2token,英文1单词≈1token;是计费、上下文长度限制的核心单位。
  • 上下文窗口:模型单次请求输入+输出的Token总量上限(如qwen-turbo为128k),超限会导致文本截断、上下文丢失、输出不完整。

(2)高频调参(面试必考)

参数 作用 业务取值建议
temperature 控制输出随机性,0=完全确定,1=自由发散 知识库/工具调用:0.00.1;文案创作:0.70.9
top_p 核采样,控制候选词范围 工具场景0.1,创作场景0.8
max_tokens 限制单次返回最大输出长度 工具查询设512,长文档总结设2048

(3)两种输出模式

  • 同步complete:一次性返回完整结果,适合简单问答、批量处理场景
  • 流式stream(SSE):分段实时输出,前端聊天框、Agent产品必备

(4)统一接口规范

国内主流模型均兼容OpenAI v1接口格式,仅需更换base_urlapi_key,即可用一套代码对接所有模型。

2. 异步调用核心(Python后端重点)

  • 同步requests:阻塞线程,高并发场景性能极差
  • aiohttp异步:适配多并发对话、批量向量生成、流式输出,需封装超时控制、自动重试、异常捕获、请求限速

3. 提示工程三大核心

  1. CoT思维链:在Prompt中加入「请一步步思考,再给出最终答案」,减少推理类幻觉
  2. Few-shot少样本学习:提供1~3条标准输入输出示例,对齐输出格式
  3. 结构化输出约束:强制返回JSON格式,适配Function Calling、RAG检索、工具参数解析场景

三、今日开发难点 & 解决方案

难点1:流式SSE分段乱码、截断、合并错乱

  • data:分隔流式返回块,过滤空行、[DONE]结束标记
  • 缓冲区缓存不完整分片,拼接完整后再解析JSON
  • 封装全局复用的流式解析工具函数

难点2:模型返回自然文字而非标准JSON

  • Prompt明确禁止额外描述,仅返回JSON
  • 正则提取{}内的JSON片段
  • Pydantic模型二次校验,解析失败自动重调模型

难点3:多模型base_url、鉴权头不统一

  • 配置类预设各模型独立参数,代码仅传模型名称自动匹配

难点4:异步并发触发平台限流

  • 信号量控制并发数
  • 捕获429限流异常,实现指数退避重试

四、可直接运行的完整代码

1. 通用LLM异步封装类(llm_client.py)

import aiohttp
import asyncio
import re
from pydantic import BaseModel, Field
from typing import Optional, AsyncGenerator

# 模型配置映射
MODEL_CONFIG = {
    "qwen-turbo": {
        "base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions",
        "api_key": "你的通义千问key"
    },
    "deepseek-chat": {
        "base_url": "https://api.deepseek.com/v1/chat/completions",
        "api_key": "你的deepseek key"
    }
}

# 结构化输出校验模型示例
class OrderQueryResp(BaseModel):
    order_name: str = Field(description="订单名称")
    order_price: float = Field(description="订单价格")
    delivery_status: str = Field(description="配送状态")

class AsyncLLMClient:
    def __init__(self, model_name: str = "qwen-turbo"):
        self.model = model_name
        self.conf = MODEL_CONFIG[model_name]
        self.semaphore = asyncio.Semaphore(5)  # 最大并发5

    async def _request(self, payload: dict, stream: bool = False):
        headers = {
            "Authorization": f"Bearer {self.conf['api_key']}",
            "Content-Type": "application/json"
        }
        timeout = aiohttp.ClientTimeout(total=60)
        async with self.semaphore:
            async with aiohttp.ClientSession(timeout=timeout) as session:
                try:
                    async with session.post(self.conf["base_url"], json=payload, headers=headers) as resp:
                        if resp.status != 200:
                            err = await resp.text()
                            raise Exception(f"模型接口异常: {resp.status}, {err}")
                        if stream:
                            return self._stream_parse(resp)
                        return await resp.json()
                except aiohttp.ClientError as e:
                    raise Exception(f"网络请求失败: {str(e)}")

    async def _stream_parse(self, response) -> AsyncGenerator[str, None]:
        buffer = ""
        async for chunk in response.content.iter_chunked(1024):
            buffer += chunk.decode("utf-8")
            # 分割流式块
            while "data:" in buffer:
                idx = buffer.find("data:")
                end_idx = buffer.find("\n\n", idx)
                if end_idx == -1:
                    break
                data_block = buffer[idx+5:end_idx].strip()
                buffer = buffer[end_idx+2:]
                if data_block == "[DONE]":
                    return
                try:
                    import json
                    data = json.loads(data_block)
                    content = data["choices"][0]["delta"].get("content", "")
                    if content:
                        yield content
                except:
                    continue

    async def chat_sync(self, prompt: str, temperature: float = 0.1) -> str:
        payload = {
            "model": self.model,
            "messages": [{"role": "user", "content": prompt}],
            "temperature": temperature,
            "stream": False
        }
        res = await self._request(payload)
        return res["choices"][0]["message"]["content"]

    async def chat_stream(self, prompt: str, temperature: float = 0.1):
        payload = {
            "model": self.model,
            "messages": [{"role": "user", "content": prompt}],
            "temperature": temperature,
            "stream": True
        }
        async for text in await self._request(payload, stream=True):
            yield text

    # 强制JSON输出封装
    async def chat_json(self, prompt: str, resp_model: BaseModel) -> BaseModel:
        json_prompt = f"""
        {prompt}
        严格要求:仅返回标准JSON,禁止任何解释、注释、markdown、多余文字。
        JSON字段要求:{resp_model.model_json_schema()}
        """
        raw = await self.chat_sync(json_prompt, temperature=0.0)
        # 正则提取JSON
        match = re.search(r"\{.*\}", raw, re.S)
        if not match:
            # 解析失败重试一次
            raw = await self.chat_sync(json_prompt, temperature=0.0)
            match = re.search(r"\{.*\}", raw, re.S)
            if not match:
                raise Exception("模型无法输出合法JSON")
        json_str = match.group()
        return resp_model.model_validate_json(json_str)

# 测试入口
async def test_client():
    client = AsyncLLMClient("qwen-turbo")
    # 测试1:同步JSON结构化输出
    res = await client.chat_json(
        prompt="模拟一个手机订单信息",
        resp_model=OrderQueryResp
    )
    print("结构化结果:", res.model_dump())

    # 测试2:流式输出
    print("\n流式输出:")
    async for chunk in client.chat_stream("简单介绍AI Agent"):
        print(chunk, end="")

if __name__ == "__main__":
    asyncio.run(test_client())

2. FastAPI流式对话接口(main.py)

from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import asyncio
from llm_client import AsyncLLMClient

app = FastAPI(title="Day1 LLM流式服务")
llm = AsyncLLMClient()

# SSE封装生成器
async def stream_generator(user_prompt: str):
    yield "data: 开始生成回答\n\n"
    async for text in llm.chat_stream(user_prompt):
        yield f"data: {text}\n\n"
    yield "data: [DONE]\n\n"

@app.get("/chat/stream")
async def chat_stream(prompt: str):
    return StreamingResponse(
        stream_generator(prompt),
        media_type="text/event-stream"
    )

if __name__ == "__main__":
    import uvicorn
    uvicorn.run("main:app", reload=True)

五、实操练习任务

  1. 替换代码中的API Key,运行llm_client.py测试JSON结构化输出,观察Pydantic校验效果
  2. 启动FastAPI服务,访问http://127.0.0.1:8000/docs调试流式接口
  3. 修改temperature参数(0/0.9),对比模型输出随机性差异
  4. 构造模糊Prompt,验证模型JSON输出重试逻辑

六、高频面试题 & 标准答案

基础问答

1. 什么是Token?上下文窗口超限会出现什么问题?

Token是大模型处理文本的最小单位(中文1字≈2token,英文1单词≈1token),是计费和上下文限制的核心单位。
上下文窗口超限后果:输入被截断导致上下文丢失、多轮对话失忆;输出不完整、逻辑断裂;接口返回400错误;长文本生成任务提前终止。

2. temperature参数作用?工具调用为何推荐0~0.1?

temperature控制输出随机性(0~2),值越低输出越确定,值越高越发散。
工具调用要求参数精准,高随机性会导致参数非法、格式错乱,0~0.1接近贪心采样,能最大化结构化参数准确率。

3. 同步输出与流式SSE的区别及适用场景?

  • 同步输出:一次性返回完整结果,适合后端调用、批量任务、离线处理
  • 流式SSE:分段实时输出,适合前端聊天界面、长文本生成,降低用户等待感知

4. 主流模型兼容OpenAI接口的原因?

OpenAI是行业事实标准,兼容后可一套代码对接多模型、复用生态工具链、降低学习成本、灵活选型对比效果。

5. 大模型接口异常及处理方案?

  • 超时:设置分级超时,搭配指数退避重试
  • 429限流:信号量控并发、速率限制、指数退避重试
  • 401鉴权失败:校验密钥,触发告警不重试
  • 格式异常:正则提取+Pydantic校验+自动重试

工程实操题

1. 强制模型返回标准JSON的3种方案?

  1. Prompt强约束:明确格式要求,禁止多余内容
  2. 接口参数指定:使用response_format=json_object(OpenAI)或厂商对应参数
  3. Function Calling:将JSON定义为函数参数Schema
  4. 后处理兜底:正则提取JSON+Pydantic校验+解析失败重试
  5. temperature=0降低随机性

2. 流式SSE分片截断的解决方案?

  • 缓冲区缓存不完整分片,按data:拆分完整块后解析
  • 仅处理完整的SSE协议行,捕获单条解析异常不中断整体流
  • 全量拼接后二次校验格式

3. requests同步 vs aiohttp异步(并发场景)

维度 requests(同步) aiohttp(异步)
并发模型 多线程/多进程,阻塞IO,切换开销大 单线程协程,非阻塞IO,切换开销极低
并发上限 线程数受限,高并发资源占用高 单线程支撑上千并发,资源占用低
开发成本 逻辑简单,调试容易 需async/await改造,调试复杂度高
适用场景 低并发脚本、简单单次调用 高并发批量调用、服务端后端、Agent多工具并行

4. 控制并发防止429限流的方案?

  • 信号量限制并发数
  • 令牌桶/漏桶控制QPS
  • 捕获429后指数退避重试
  • 连接池复用减少建连开销
  • 限流时降级到备用模型/缓存结果

拓展思考题

1. 多轮对话Token接近上限的优化方案?

  • 滑动窗口:仅保留最近N轮对话
  • 对话摘要:用模型生成历史对话精简摘要
  • 向量检索:仅召回与当前问题相关的历史片段
  • 分层记忆:拆分短期/长期记忆,按需提取
  • 冗余清洗:精简无效文本

2. 工具调用为何必须结构化JSON输出?

  • 机器可直接解析,无需NLP处理
  • 格式稳定,降低参数错误概率
  • 可前置校验字段/类型,快速发现问题
  • 适配通用Agent框架,降低耦合度
  • 异常易追溯、易兜底

总结

Day1重点掌握大模型基础概念、异步LLM封装、结构化输出与SSE流式接口开发,这些是AI Agent开发的核心底层能力。后续将基于此拓展多轮对话、记忆模块、工具调用等进阶内容,建议反复调试代码,吃透面试高频考点。