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

推荐订阅源

V
V2EX
爱范儿
爱范儿
Martin Fowler
Martin Fowler
T
The Blog of Author Tim Ferriss
B
Blog RSS Feed
博客园 - 聂微东
G
GRAHAM CLULEY
Engineering at Meta
Engineering at Meta
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
WordPress大学
WordPress大学
Scott Helme
Scott Helme
AI
AI
S
Security Affairs
T
Threat Research - Cisco Blogs
M
MIT News - Artificial intelligence
T
Troy Hunt's Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
人人都是产品经理
人人都是产品经理
AWS News Blog
AWS News Blog
T
Threatpost
Cyberwarzone
Cyberwarzone
www.infosecurity-magazine.com
www.infosecurity-magazine.com
U
Unit 42
V
Vulnerabilities – Threatpost
J
Java Code Geeks
博客园 - Franky
月光博客
月光博客
Blog — PlanetScale
Blog — PlanetScale
NISL@THU
NISL@THU
D
Docker
小众软件
小众软件
N
News and Events Feed by Topic
Microsoft Security Blog
Microsoft Security Blog
Y
Y Combinator Blog
A
Arctic Wolf
D
DataBreaches.Net
云风的 BLOG
云风的 BLOG
Forbes - Security
Forbes - Security
量子位
PCI Perspectives
PCI Perspectives
美团技术团队
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
I
InfoQ
Security Archives - TechRepublic
Security Archives - TechRepublic
有赞技术团队
有赞技术团队
腾讯CDC
P
Proofpoint News Feed
S
Security @ Cisco Blogs
G
Google Developers Blog
C
Cisco Blogs

博客园 - AlfredZhao

数据乱成一锅粥,还能先做本体吗? SQL*Plus 执行中文 SQL 文件,如何避开乱码坑 Podman 报错:普通用户无法运行 rootless Podman 怎么办 语义层构建:企业级AI落地绕不开的关键 AI时代最扎心的真相:人类在打杂,AI在做决策 Win7老系统登录报错怎么解?PuTTY这次真能救急 Linux 主机防火墙如何同时开启 80 和 443? AI 编程变更记录:知识加工模块与博客工厂模块的状态重新定义 一篇搞定:用 curl 测试私有部署模型联通性 DBA除了修库,还能把经验变成更大的价值 原本3GB+ 的 Docker 镜像直接缩成500M RAG技术从1.0到4.0,系统为何越来越“会想” 生产环境里,为什么不建议把普通端口直接暴露到公网? ORACLE默默地搞了个免费的智能体工厂 GPT 省钱,不是别用最新模型,而是别浪费缓存 Docker 容器时区不对,`timedatectl` 不存在怎么办? AI 编程工作总结:从体验问题到模块能力建设 OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G? vi 删除指定范围的行,不用再反复按 dd AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 AI编程系列01:裸 API 账单场景下,如何自建 LLM 用量可视化看板 氛围编程实战系列:先规划清楚学习路径 入门:我的第一个Vibe Coding实践程序 Linux时区修改为CST 如何在Oracle Agent Factory中配置国内厂商的LLM? Oracle Deep Data Security (Deep Sec) 初体验 APEX实战第13篇:全套开发环境的本地配置与恢复实践 Codex 和 OpenClaw,到底差在哪? 微信对接OpenClaw的常见问题和解决方案 在群晖NAS上配置OpenClaw:一次踩坑后的保姆级教程(完整修订版) 用Docker安全驯服OpenClaw,并打通社交软件 RAG 时代的“破壁人”:为什么你的大模型应用急需 Docling? 为什么 AI 服务器首选 Ubuntu?难道 OEL 和 RHEL 不香吗? APEX实战第12篇:Oracle APEX 工作区密码忘记了怎么办? AI开发者如何无痛部署Oracle AI Database 26ai环境 Oracle 26ai 本地通用版这次是真的来了 Docker 快速入门:手把手教你打包 Python 应用 APEX实战第11篇:图形界面轻松解锁工作区账户 APEX实战第10篇:手把手教你给APEX打补丁 APEX实战第9篇:手把手教你集成RAS轻松实现真正的数据安全 LangChain、LangFlow、LangGraph:一文讲清三大 LLM 框架的定位与差异 使用 Oracle 官方 HR Demo 快速验证 RAS 功能(小白实战指南) Oracle RAS:AI时代企业数据安全核心 新版MOS(My Oracle Support)主要变化 APEX实战第8篇:ORDS连库报错574?一招根治用户过期问题 为什么 Iceberg 在数据湖领域这么火
小白学AI开发01:创建第一个示例Agent
AlfredZhao · 2026-01-14 · via 博客园 - AlfredZhao

在 LangChain 开发中,我们的核心工作是写 Prompt(提示词)。

除此之外,还需要了解下python基础,简单了解即可,不需要系统学习,这就是AI时代对技术爱好者的红利。

01 | 构建独立的python环境

使用miniconda构建独立的python环境。

官方网站:https://www.anaconda.com/

选择适合你的,我这里直接选择图形化安装的Miniconda:

下载后安装:

关闭并重新打开终端。此时你会看到命令行前面多了个 (base),这说明 Conda 已经接管了环境。

然后创建 Python 3.12 专属学习环境:

# 创建环境并指定 Python 版本
conda create -n lc python=3.12 -y

# 激活环境
conda activate lc

Tips:如果创建环境,遇到让同意服务/条款之类,直接按提示命令执行同意即可。

后面测试不同功能的python程序肯定免不了引用各种类型的包,我们统一放到 requirements.txt 中,后续新环境也可以直接一键安装需要引入的相关包。

pip install -r requirements.txt

定期维护requirements.txt文件:

langchain
langchain-openai
python-dotenv

02 | 创建第一个示例Agent

这里仿照LangChain官方文档,构建一个简单的Agent。

因为笔者暂时没有Claude模型可用,所以替换为国内的模型,在我们学习测试阶段,基本是没啥影响的。

vi basic.py

import os
from dotenv import load_dotenv
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from langchain.tools import tool

# 加载 .env 文件中的 SILICONFLOW_API_KEY
load_dotenv()

# 1. 定义工具:必须要写清晰的 Docstring(函数注释)
@tool
def get_weather(city: str) -> str:
    """获取指定城市的实时天气情况。"""
    return f"{city} 的天气总是阴雨连连!"

# 2. 初始化 SiliconFlow 模型
llm = ChatOpenAI(
    model="deepseek-ai/DeepSeek-V3", 
    api_key=os.getenv("SILICONFLOW_API_KEY"),
    base_url="https://api.siliconflow.cn/v1",
    temperature=0.1
)

# 3. 创建 Agent
agent = create_agent(
    model=llm,
    tools=[get_weather],
    system_prompt="你是一个乐于助人的天气助手。"
)

# 4. 运行
if __name__ == "__main__":
    response = agent.invoke(
        {"messages": [{"role": "user", "content": "北京天气怎么样?"}]}
    )
    # 打印最后一条消息(AI 的回答)
    print(response["messages"][-1].content)

03 | 增强这个示例Agent

汉化并稍微改造下官方的示例,使其适用于我们的测试环境:

vi enhance.py

import os
from dataclasses import dataclass
from dotenv import load_dotenv

from langchain_openai import ChatOpenAI
from langchain.agents import create_agent
from langchain.tools import tool, ToolRuntime
from langgraph.checkpoint.memory import InMemorySaver
from langchain.agents.structured_output import ToolStrategy

load_dotenv()

# 1. 定义系统提示词(要求 AI 做个“谐音梗”专家)
SYSTEM_PROMPT = """你是一位专业的资深天气预报员,说话极其幽默,特别喜欢讲“谐音梗”。

你有权使用以下两个工具:
- get_weather_for_location: 获取特定城市的天气。
- get_user_location: 获取当前用户的所在地。

如果用户询问天气,请务必确认地点。如果用户说的是“我这儿”或“我这里”,请调用 get_user_location 获取他们的位置。"""

# 2. 定义上下文结构(存储用户信息)
@dataclass
class Context:
    """自定义运行时上下文。"""
    user_id: str

# 3. 定义工具
@tool
def get_weather_for_location(city: str) -> str:
    """获取指定城市的天气情况。"""
    return f"{city} 的天气总是阳光灿烂!"

@tool
def get_user_location(runtime: ToolRuntime[Context]) -> str:
    """根据用户 ID 获取其地理位置。"""
    user_id = runtime.context.user_id
    # 模拟数据库:用户 1 在北京,其他在珠海
    return "北京" if user_id == "1" else "珠海"

# 4. 配置你的模型 (SiliconFlow)
model = ChatOpenAI(
    model="deepseek-ai/DeepSeek-V3",
    api_key=os.getenv("SILICONFLOW_API_KEY"),
    base_url="https://api.siliconflow.cn/v1",
    temperature=0.7  # 稍微提高随机性,让谐音梗更有创意
)

# 5. 定义响应格式(汉化字段描述,让 AI 明白填什么)
@dataclass
class ResponseFormat:
    """Agent 的结构化回复格式。"""
    # 幽默的谐音梗回复
    punny_response: str
    # 任何关于天气的有趣信息(如果有的话)
    weather_conditions: str | None = None

# 6. 设置记忆存储
checkpointer = InMemorySaver()

# 7. 创建 Agent
agent = create_agent(
    model=model,
    system_prompt=SYSTEM_PROMPT,
    tools=[get_user_location, get_weather_for_location],
    context_schema=Context,
    response_format=ToolStrategy(ResponseFormat),
    checkpointer=checkpointer
)

# --- 运行测试 ---

# 设置会话 ID
config = {"configurable": {"thread_id": "test_user_001"}}

# 第一次提问
print("--- 第一次对话 ---")
response = agent.invoke(
    {"messages": [{"role": "user", "content": "外面天气怎么样?"}]},
    config=config,
    context=Context(user_id="1")
)

# 访问结构化结果
res = response['structured_response']
print(f"AI: {res.punny_response}")
print(f"详情: {res.weather_conditions}")

print("\n--- 第二次对话(测试记忆) ---")
# 第二次提问
response = agent.invoke(
    {"messages": [{"role": "user", "content": "谢谢你!我在哪里?"}]},
    config=config,
    context=Context(user_id="1")
)

res = response['structured_response']
print(f"AI: {res.punny_response}")

这段示例代码的核心逻辑是:

第一次对话:

用户问:“外面天气怎么样?”(没说地点)。
AI 思考:系统提示词告诉我,如果地点不明,先去查用户在哪。
动作:AI 调用 get_user_location -> 得到“北京” -> 调用 get_weather_for_location -> 得到天气。
回复:根据 ResponseFormat 吐出一个谐音梗。

第二次对话:

用户问:“谢谢你!我在哪里?”
AI 思考:由于有 thread_id 和 checkpointer,AI 记得上一次查询的结果。
动作:它不需要再次查工具,直接从记忆里提取信息并回复。

然后手工将代码中的 user_id 改为2,再次运行,就会根据工具 get_user_location 中的示例逻辑,得到地点为”珠海“,两次执行的效果参考如下:

该段示例代码虽然简单,但其实已经能展现出一个企业级 AI 智能体(Agent)的缩影。它涵盖了现代 AI 开发中最核心的三个支柱:工具调用(Tool Use)、上下文记忆(Memory)、以及结构化输出(Structured Output)。