【智能体开发】《LangChain核心技术与LLM项目实践》_76.[第8章 Agent系统] Zero-shot ReAct:无需示例的即时推理

炸裂副标题:告别"示例依赖症"!Zero-shot ReAct如何让LLM像人类一样"边想边做",零样本也能玩转复杂任务推理
全文总结:本文将彻底拆解LangChain中Zero-shot ReAct的核心机制——无需任何示例,仅凭自然语言指令就能让大模型自主完成"思考→行动→观察"的循环推理。从ReAct论文原理到LangChain实战代码,从新手最常踩的5大坑到企业级项目的性能优化,手把手教你打造真正"会思考"的AI Agent。读完这篇文章,你将掌握:ReAct的底层设计哲学、LangChain的Zero-shot Agent实现细节、工具调用的最佳实践、以及如何让Agent在复杂场景中稳定输出。
文字目录:
- 核心原理篇:ReAct的"思考-行动-观察"哲学
- LangChain实战篇:Zero-shot Agent的代码实现
- 工具设计篇:让Agent"手上有活"的关键
- 性能优化篇:推理链失控怎么办
- 场景应用篇:从Demo到生产的跨越
嗨,大家好呀,我是你的老朋友精通代码大仙。接下来我们一起学习 《LangChain核心技术与LLM项目实践》,震撼你的学习轨迹!
“一看就会,一写就废”——这句话是不是戳中了你学AI Agent的痛处?
我见过太多同学,跟着教程跑通了Demo,换个问题就崩;抄了GitHub上的代码,到自己项目里就成了"人工智障"。尤其是做Agent的时候,最崩溃的就是:明明给了很多示例(Few-shot),换个问法模型就不会了,或者示例一多,Token烧得比火箭还快。
今天咱们聊的Zero-shot ReAct,就是来解决这个"示例依赖症"的。它让大模型像人类一样,零样本就能学会"边想边做"——不需要你喂一堆例子,仅凭自然语言描述,就能自主完成多步骤推理。
这对新手意味着什么?意味着你可以快速原型、灵活迭代、低成本试错。不用为每个场景准备精心设计的示例,Agent的泛化能力直接拉满。
但坑也不少。很多人以为Zero-shot就是"什么都不给",结果Agent变成无头苍蝇;有人工具描述写得太随意,模型选错工具还硬撑;还有人遇到推理链爆炸,账单看得肉疼……
接下来,我把这些坑一个个给你填平。
一、核心原理篇:ReAct的"思考-行动-观察"哲学
点题:什么是ReAct?为什么Zero-shot能work?
ReAct = Reasoning(推理)+ Acting(行动)
这是2022年Google研究院提出的范式,核心思想很简单:让大模型像人一样,先思考再行动,观察结果后再继续思考。
传统的Chain-of-Thought(思维链)只会"想",不会"做";传统的工具调用只会"做",不会"想"。ReAct把两者结合了:
用户问题 → 思考(Thought)→ 行动(Action)→ 观察(Observation)→ 思考 → 行动 → ... → 最终答案
Zero-shot的关键:不需要给模型看"别人是怎么做的示例",而是靠精心设计的Prompt模板,让模型理解这个循环结构本身。
痛点分析:新手最容易误解的3个点
误区1:以为Zero-shot就是"什么都不给"
我见过这样的代码:
# 错误示范:完全空白的Prompt
agent = initialize_agent(
tools,
llm,
agent="zero-shot-react-description", # 用了Zero-shot
agent_kwargs={"prefix": ""} # 把系统提示清空了!
)
结果呢?模型根本不知道要按"Thought→Action→Observation"的格式输出,要么直接瞎猜答案,要么输出格式混乱,解析报错。
误区2:混淆Zero-shot和Few-shot的适用场景
有同学问:“既然Zero-shot这么香,还要Few-shot干嘛?”
错了。Zero-shot适合工具描述清晰、推理步骤可预期的场景。如果你的任务需要特定输出格式(比如必须按某个JSON结构返回),或者涉及复杂的业务规则,Few-shot往往更稳定。
误区3:忽视Observation的"断点续传"作用
新手常犯的错误:把Observation当成普通输出,没意识到它是下一轮思考的输入。比如:
Thought: 我要查北京天气
Action: get_weather("北京")
Observation: {"temp": 25, "condition": "sunny"} # 这里断了!
[下一轮] Thought: 现在我要查上海天气 # 完全忘了北京的结果
模型没有利用上Observation的信息,推理链条断裂。
解决方案:正确理解Zero-shot的"隐式示例"
Zero-shot不是"无示例",而是把示例结构内化到Prompt模板中。
LangChain的ZeroShotAgent默认使用的Prompt长这样(简化版):
Answer the following questions as best you can. You have access to the following tools:
{tools}
Use the following format:
Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question
Begin!
Question: {input}
Thought:
看到没?格式说明本身就是"结构化的示例"。模型通过这段描述,理解了要遵循的推理模式。
正确用法:
from langchain.agents import initialize_agent, AgentType
from langchain.tools import Tool
# 工具描述要清晰!这是Zero-shot的关键
tools = [
Tool(
name="Calculator",
func=lambda x: eval(x),
description="Useful for math calculations. Input should be a valid Python expression."
),
Tool(
name="Search",
func=search_func,
description="Useful for searching current information. Input should be a search query string."
)
]
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, # 明确指定类型
verbose=True # 一定要开!方便调试
)
# 运行
result = agent.run("What is 25 * 4 + the current temperature in Beijing?")
关键技巧:verbose=True必须开!这样你能看到完整的Thought-Action-Observation链条,排查问题一目了然。
小结
Zero-shot ReAct的精髓在于用结构化的Prompt模板替代人工示例,让模型自主掌握"思考-行动-观察"的循环。新手务必理解:工具描述的质量直接决定Agent的表现,而Observation的传递是推理连贯的生命线。
二、LangChain实战篇:Zero-shot Agent的代码实现
点题:从0到1搭建可运行的Zero-shot Agent
LangChain提供了多层抽象,但很多人被initialize_agent的便捷性"惯坏了",遇到定制需求就抓瞎。这一节我们拆解到底层,让你知其然更知其所以然。
痛点分析:被initialize_agent坑过的那些年
痛点1:黑盒封装,调试困难
# 新手常用(但难以定制)
agent = initialize_agent(tools, llm, agent="zero-shot-react-description")
一旦输出格式不对,或者想修改Prompt,完全不知道从哪下手。
痛点2:Output Parser不匹配导致无限循环
Zero-shot ReAct要求模型严格按格式输出:
Thought: ...
Action: ...
Action Input: ...
但模型偶尔输出:
Thought: I need to calculate this
Action: Calculator
Action Input: 25 * 4 # 少了引号,或者多了换行
如果Parser不够健壮,就会解析失败→重试→再失败→死循环,直到触达max_iterations。
痛点3:Prompt模板被覆盖,工具描述丢失
# 错误:直接覆盖整个template,丢失了tools的自动注入
agent_kwargs = {
"system_message": "You are a helpful assistant." # 覆盖了默认模板!
}
结果模型根本不知道有哪些工具可用。
解决方案:手动组装Agent,掌控每个环节
步骤1:自定义Prompt模板(保留核心结构)
from langchain.agents import ZeroShotAgent, Tool, AgentExecutor
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
# 核心:保留{tools}和{tool_names}的占位符!
template = """Answer the following questions as best you can, but speaking as a pirate would speak. You have access to the following tools:
{tools}
Use the following format:
Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question
Begin! Remember to speak as a pirate when giving your final answer.
Question: {input}
{agent_scratchpad}"""
prompt = PromptTemplate(
template=template,
input_variables=["input", "agent_scratchpad"],
partial_variables={
"tools": "", # 后续通过ZeroShotAgent填充
"tool_names": "" # 同上
}
)
步骤2:创建LLM Chain
llm_chain = LLMChain(llm=llm, prompt=prompt)
步骤3:组装ZeroShotAgent
tools = [
Tool(
name="Search",
func=search.run,
description="useful for when you need to answer questions about current events"
),
Tool(
name="Calculator",
func=calculator.run,
description="useful for doing mathematical calculations"
)
]
# 关键:使用ZeroShotAgent的类方法创建,自动处理tools的注入
agent = ZeroShotAgent(
llm_chain=llm_chain,
allowed_tools=[t.name for t in tools],
# 自定义输出解析器(增强鲁棒性)
output_parser=CustomReActOutputParser()
)
步骤4:配置AgentExecutor(控制循环行为)
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent,
tools=tools,
verbose=True,
max_iterations=10, # 防止无限循环
max_execution_time=60, # 超时控制
early_stopping_method="generate", # 超时后如何结束
handle_parsing_errors=True # 关键!自动处理解析错误
)
关键技巧:自定义Output Parser增强鲁棒性
from langchain.agents import AgentOutputParser
from langchain.schema import AgentAction, AgentFinish
import re
class CustomReActOutputParser(AgentOutputParser):
def parse(self, text: str):
# 更宽松的正则匹配
# 处理各种变体:Action: Calculator / Action:Calculator / Action: "Calculator"
# 匹配Final Answer
if "Final Answer:" in text:
return AgentFinish(
{"output": text.split("Final Answer:")[-1].strip()},
text
)
# 匹配Action(多种格式)
action_match = re.search(
r"Action\s*:\s*([^\n]+)",
text,
re.IGNORECASE
)
action_input_match = re.search(
r"Action\s*Input\s*:\s*([^\n]*)",
text,
re.IGNORECASE
)
if action_match and action_input_match:
action = action_match.group(1).strip().strip('"\'')
action_input = action_input_match.group(1).strip()
return AgentAction(action, action_input, text)
# 完全无法解析时,返回一个"思考"动作让模型重试
return AgentFinish(
{"output": "I need to think again about this problem."},
text
)
小结
手动组装Agent虽然代码量多了,但每个环节都可控。特别是自定义Output Parser和配置handle_parsing_errors=True,能大幅提升生产环境的稳定性。记住:agent_scratchpad是维护对话历史的关键变量,不要遗漏。
三、工具设计篇:让Agent"手上有活"的关键
点题:工具描述是Zero-shot的"隐形示例"
在Zero-shot场景下,模型完全依赖工具的自然语言描述来决定:要不要用、用哪个、怎么用。工具描述就是你的"API文档",写得好不好,直接决定Agent的智商。
痛点分析:工具描述的"坑人"写法
反面教材1:描述太模糊
Tool(
name="DataTool",
func=data_func,
description="This tool handles data stuff." # 什么数据?怎么处理?
)
模型:???我用还是不用?
反面教材2:参数说明缺失
Tool(
name="Search",
func=search,
description="Search for information." # 输入格式是?关键词还是自然语言?
)
结果模型输入{"query": "python"},实际函数期望的是普通字符串"python",报错。
反面教材3:工具过多导致选择困难
给Agent塞了20个工具,描述还都很像。模型每次都要从20个里选,决策负担爆炸,容易选错或反复切换。
解决方案:工具描述的"STAR法则"
我总结了一个工具描述模板:
[功能]:这个工具做什么(一句话)
[输入]:期望的输入格式,包括类型、示例
[输出]:返回什么,格式如何
[场景]:什么时候用,什么时候不用
实战示例:天气查询工具
def get_weather(location: str, date: str = "today") -> dict:
"""
查询指定城市和日期的天气。
"""
# 实现省略...
weather_tool = Tool(
name="WeatherQuery",
func=lambda x: get_weather(**eval(x) if x.startswith("{") else {"location": x}),
description="""Query weather information for a specific location and date.
Use this tool when:
- The user asks about weather, temperature, rain, or climate conditions
- You need current or forecast weather data
Do NOT use this tool for:
- Historical weather records (use HistoryWeatherTool instead)
- General climate questions not about specific dates
Input format: A JSON string with keys "location" (required, city name in English or Chinese) and "date" (optional, default "today", format "YYYY-MM-DD" or "today"/"tomorrow")
Example inputs:
- {"location": "Beijing", "date": "today"}
- {"location": "上海", "date": "2024-12-25"}
- {"location": "New York"} # uses default date
Output: JSON with fields {"temperature": int, "condition": str, "humidity": int, "wind": str}
"""
)
关键技巧:动态工具选择
工具太多时,可以用检索式工具选择:
from langchain.tools import Tool
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
# 为每个工具创建embedding
tool_descriptions = [t.description for t in all_tools]
tool_embeddings = OpenAIEmbeddings().embed_documents(tool_descriptions)
# 构建向量库
tool_db = FAISS.from_texts(tool_descriptions, OpenAIEmbeddings(), metadatas=[{"index": i} for i in range(len(all_tools))])
def get_relevant_tools(query: str, k: int = 3):
"""根据用户查询,动态选择最相关的k个工具"""
docs = tool_db.similarity_search(query, k=k)
indices = [d.metadata["index"] for d in docs]
return [all_tools[i] for i in indices]
# 每次运行前动态选择工具
relevant_tools = get_relevant_tools(user_query)
agent = initialize_agent(relevant_tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION)
小结
工具描述是Zero-shot Agent的**“零样本学习材料”**。投入时间打磨描述,收益远超预期。记住:描述要具体、边界要清晰、场景要明确。工具过多时,动态选择比全量加载更聪明。
四、性能优化篇:推理链失控怎么办
点题:Zero-shot的"自由"是把双刃剑
没有示例约束,模型可能"想太多"——反复调用工具、循环推理、甚至 hallucinate(幻觉)出不存在的结果。这一节解决成本控制和稳定性两大难题。
痛点分析:推理链的"三大噩梦"
噩梦1:无限循环
Thought: I need to check the weather
Action: WeatherQuery
Action Input: Beijing
Observation: {"temp": 25}
Thought: Let me also check Shanghai
Action: WeatherQuery
Action Input: Shanghai
Observation: {"temp": 28}
Thought: What about Guangzhou?
...(永无止境)
原因:模型没有"任务完成"的判断标准,或者Prompt里缺少终止条件。
噩梦2:幻觉工具调用
Thought: I need to search for this
Action: GoogleSearch # 实际根本没有这个工具!只有Search
Action Input: python tutorial
结果:Parser找不到GoogleSearch,报错重试,浪费Token。
噩梦3:过度推理
简单问题被复杂化:
用户问:2+2等于几?
模型:Thought: This is a math problem, I should use Calculator...(10步后)Final Answer: 4
明明可以直接答,非要走完整流程。
解决方案:四层防护体系
第一层:Prompt层面的"紧箍咒"
在Prompt里明确添加效率约束:
Important constraints:
- Use tools ONLY when necessary. For simple questions, answer directly.
- Do NOT make more than 3 tool calls for a single question.
- If you have enough information to answer, stop immediately with Final Answer.
- Do NOT ask follow-up questions or expand the scope.
第二层:Executor层面的硬性限制
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent,
tools=tools,
max_iterations=5, # 最多5轮
max_execution_time=30, # 30秒超时
early_stopping_method="generate", # 超时后强制生成答案
# 关键:自定义回调监控
callbacks=[CostTrackerCallback()]
)
第三层:工具层面的"防呆"设计
class SmartTool(Tool):
def __init__(self, *args, max_calls_per_query=3, **kwargs):
super().__init__(*args, **kwargs)
self.max_calls = max_calls_per_query
self.call_count = 0
def __call__(self, *args, **kwargs):
self.call_count += 1
if self.call_count > self.max_calls:
return "Error: This tool has been called too many times. Please try to answer with available information."
return super().__call__(*args, **kwargs)
第四层:后验分析与自动优化
from langchain.callbacks import FileCallbackHandler
# 记录每次运行的完整轨迹
handler = FileCallbackHandler("agent_logs.jsonl")
# 事后分析:哪些查询导致了长链条?
def analyze_logs(log_file):
long_chains = []
for line in open(log_file):
record = json.loads(line)
if record["iterations"] > 3:
long_chains.append({
"query": record["input"],
"chain_length": record["iterations"],
"tools_used": record["actions"]
})
# 找出模式,优化Prompt或工具
return long_chains
高级技巧:自适应推理深度
def create_adaptive_agent(query: str, llm, base_tools):
"""根据查询复杂度,动态选择Agent策略"""
# 先用LLM判断复杂度
complexity_prompt = f"""Rate the complexity of this query from 1-3:
1: Simple factual question (can answer directly)
2: Requires single tool use
3: Requires multiple steps or tools
Query: {query}
Rating (1-3):"""
rating = int(llm.predict(complexity_prompt).strip())
if rating == 1:
# 直接回答,不走Agent
return DirectAnswerChain(llm)
elif rating == 2:
# 简化版Agent,限制更严格
return create_limited_agent(base_tools, max_iter=2)
else:
# 完整Agent
return create_full_agent(base_tools, max_iter=5)
小结
Zero-shot的自由度需要多层约束来平衡。从Prompt的软性引导到Executor的硬性限制,再到工具的防呆设计,层层递进。记住:没有监控就没有优化,务必记录运行日志做后验分析。
五、场景应用篇:从Demo到生产的跨越
点题:Zero-shot ReAct的真实战场
前面都是单Agent、单轮对话。实际项目中,你需要:多Agent协作、与RAG结合、会话记忆、流式输出……这一节打通"最后一公���"。
痛点分析:生产环境的"水土不服"
痛点1:会话状态丢失
# Demo代码:每次run都是独立的
result1 = agent.run("查北京天气")
result2 = agent.run("那上海呢?") # 完全不知道"那"指什么!
痛点2:与RAG的"左右互搏"
RAG检索了一堆文档,Agent又自己去搜索,信息冲突怎么办?
痛点3:并发下的工具状态混乱
多个用户同时调用,工具的内部状态互相干扰。
解决方案:生产级架构设计
方案1:带记忆的Zero-shot Agent
from langchain.memory import ConversationBufferMemory
from langchain.agents import initialize_agent
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
agent = initialize_agent(
tools,
llm,
agent=AgentType.CONVERSATIONAL_REACT_DESCRIPTION, # 注意类型变了!
memory=memory, # 注入记忆
verbose=True
)
# 现在支持多轮了
agent.run("查北京天气") # 第一轮
agent.run("和上海比哪个热?") # 第二轮,能理解上下文
但注意:CONVERSATIONAL_REACT_DESCRIPTION不是纯Zero-shot,它内置了Few-shot示例。如果你坚持要纯Zero-shot,需要手动改造:
from langchain.memory import ConversationBufferWindowMemory
# 纯Zero-shot + 手动记忆注入
memory = ConversationBufferWindowMemory(k=3, memory_key="history")
# 自定义Prompt,把历史对话注入
template = """...
Previous conversation:
{history}
Current question: {input}
Thought:
"""
prompt = PromptTemplate(
template=template,
input_variables=["history", "input", "agent_scratchpad"],
partial_variables={"tools": "", "tool_names": ""}
)
方案2:RAG与Agent的"分层决策"
def hybrid_rag_agent(query: str, llm, retriever, tools):
"""先RAG,不够再Agent"""
# 第一层:RAG尝试
docs = retriever.get_relevant_documents(query)
context = "\n".join([d.page_content for d in docs])
# 让LLM判断RAG结果是否足够
judge_prompt = f"""Based on the following context, can you directly answer the question?
If yes, provide the answer. If no, say "NEED_TOOLS".
Context: {context[:2000]}
Question: {query}
Answer or "NEED_TOOLS":"""
response = llm.predict(judge_prompt)
if "NEED_TOOLS" not in response:
return response # RAG直接搞定
# 第二层:Agent介入,但把RAG结果作为工具之一
enhanced_tools = tools + [
Tool(
name="RetrievedKnowledge",
func=lambda x: context,
description="Previously retrieved relevant documents. Use this first before searching."
)
]
agent = initialize_agent(
enhanced_tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION
)
return agent.run(query)
方案3:工具的状态隔离
from contextvars import ContextVar
import threading
# 每个请求的工具实例隔离
class StatefulTool:
_context = ContextVar('tool_context', default=None)
def __init__(self):
self.local = threading.local()
def __call__(self, input: str):
# 获取当前请求上下文
ctx = self._context.get()
if not ctx:
raise RuntimeError("No context set")
# 每个请求独立的实例
if not hasattr(self.local, 'instance'):
self.local.instance = self._create_instance(ctx)
return self.local.instance.process(input)
def _create_instance(self, context):
# 根据上下文创建隔离的实例
pass
# 在API层设置上下文
@app.post("/chat")
async def chat(request: Request):
token = StatefulTool._context.set(request.session_id)
try:
result = agent.run(request.query)
return result
finally:
StatefulTool._context.reset(token)
方案4:流式输出与中间状态暴露
from langchain.callbacks import AsyncIteratorCallbackHandler
async def streaming_agent_run(query: str):
callback = AsyncIteratorCallbackHandler()
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
callbacks=[callback]
)
# 后台运行Agent
task = asyncio.create_task(agent.arun(query))
# 实时流式输出Thought和Action
async for token in callback.aiter():
yield {
"type": "token",
"content": token
}
# 最终结果
result = await task
yield {
"type": "final",
"content": result
}
前端可以实时展示:“正在思考…”、“正在调用天气API…”,用户体验大幅提升。
小结
生产环境的Agent需要记忆、分层、隔离、流式四大能力。Zero-shot ReAct作为核心推理引擎,需要与周边系统紧密配合。记住:没有银弹,根据场景选择合适的架构组合。
写在最后
聊到这里,Zero-shot ReAct的方方面面咱们都过了一遍。从最初的"这是什么",到"怎么实现",再到"怎么用好",最后到"怎么上生产"——这条路,我踩过的坑都给你标出来了。
说实话,Agent这个领域变化太快。半年前的主流方案,现在可能就被新模型能力替代了。但ReAct的核心理念——让模型显式地思考、行动、观察——这个设计思想是持久的。无论底层模型怎么变,这种结构化的推理模式都有价值。
给正在学习Agent的你几点真心话:
第一,别怕报错。Agent的调试比传统程序复杂10倍,因为涉及LLM的不确定性。verbose=True是你的好朋友,把每次的Thought-Action-Observation链条打印出来,逐行分析,慢慢就有手感了。
第二,工具描述值得花时间。我见过太多项目,工具描述随便写两行,然后抱怨Agent"不聪明"。记住:Zero-shot场景下,工具描述就是你的API文档,写不清楚,模型当然用不好。
第三,从简单开始。不要一上来就搞多Agent协作、复杂记忆机制。先用单Agent、两个工具、固定问题跑通,再逐步扩展。饭要一口一口吃,Agent要一步一步调。
第四,关注成本。ReAct的推理链可能很长,Token消耗肉眼可见。上线前务必做压力测试,设置好max_iterations和超时控制。我见过有人账单爆炸,就是因为没做这层防护。
编程之路不易,但每一步成长都算数。Agent开发是个新领域,大家都还在摸索,你现在的困惑和踩坑,都是未来的竞争力。保持好奇,持续学习,你也能成为驾驭AI Agent的高手。
咱们下篇文章见!
关注私信备注:“资料代找获取”,全网计算机学习资料代找:例如:
《课程:2026 年多模态大模型实战训练营》
《课程:AI 大模型工程师系统课程 (22 章完整版 持续更新)》
《课程:AI 大模型系统实战课第四期 (2026 年开课 持续更新)》
《课程:2026 年 AGI 大模型系统课 23 期》
《课程:2026 年 AGI 大模型系统课 21 期》
《课程:AI 大模型实战课 8 期 (2026 年 2 月最新完结版)》
《课程:AI 大模型系统实战课三期》
《课程:AI 大模型系统课程 (2026 年 2 月开课 持续更新)》
《课程:AI 大模型全阶课程 (2025 年 12 月开课 2026 年 6 月结课)》
《课程:AI 大模型工程师全阶课程 (2025 年 10 月开课 2026 年 4 月结课)》
《课程:2026 年最新大模型 Agent 开发系统课 (持续更新)》
《课程:LLM 多模态视觉大模型系统课》
《课程:大模型 AI 应用开发企业级项目实战课 (2026 年 1 月开课)》
《课程:大模型智能体线上速成班 V2.0》
《课程:Java+AI 大模型智能应用开发全阶课》
《课程:Python+AI 大模型实战视频教程》
《书籍:软件工程 3.0: 大模型驱动的研发新范式.pdf》
《课程:人工智能大模型系统课 (2026 年 1 月底完结版)》
《课程:AI 大模型零基础到商业实战全栈课第五期》
《课程:Vue3.5+Electron + 大模型跨平台 AI 桌面聊天应用实战 (2025)》
《课程:AI 大模型实战训练营 从入门到实战轻松上手》
《课程:2026 年 AI 大模型 RAG 与 Agent 智能体项目实战开发课》
《课程:大模型训练营配套补充资料》
更多推荐
所有评论(0)