1、练习题
1.1、练习题1
使用DeepSeek Api接口,开发一个可以自由对话的机器人。具体要求如下:
- 注册deepseek api,如已经注册,可以直接使用。
- 通过调用deepseek的api,开发对话请求模块。
- 可实现多轮对话,具备记忆能力,之前聊的内容在后面的对话中有所体现。
- 记忆保存5轮,不是所有的记忆都一直保存,只记住最近5轮的对话内容。
注意事项:
- 推荐使用jupyter notebook环境开发
这题也是下午操作考试的考试题。
1.2、练习题2
使用LangChain 框架和DeepSeek API,开发一个基于ReAct架构的智能体(Agent)。具体要求如下:
1、注册DeepSeek API,获取有效的 API Key。
2、调用 DeepSeek API 实现智能体核心模块。
3、实现ReAct 架构(Reasoning + Acting),包括思考(Thought)、行动(Action)、观察(Observation)的循环流程。
4、开发两个自定义工具(Tools):
- 计算器工具:执行数学运算(如 calculate: "3 * 5 + 2")。
- 班级人数查询工具:返回指定班级的人数(如 ask_num_students: "class 1")。
智能体需能处理多步骤任务(例如:计算 1班和和 2班一共多少学生)。
注意事项:
- 推荐使用jupyter notebook环境开发
1.2.1、react_agent.py代码
"""
基于 LangChain 和 DeepSeek API 的 ReAct 智能体
使用新版 LangChain API
实现了思考(Thought)、行动(Action)、观察(Observation)的循环流程
"""
import os
import re
from typing import List, Annotated, ClassVar, Dict
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.tools import BaseTool
from langchain_core.messages import HumanMessage, SystemMessage
from pydantic import BaseModel, Field
# 加载环境变量
load_dotenv()
# ==================== 自定义工具 1: 计算器 ====================
class CalculatorInput(BaseModel):
"""计算器输入模型"""
expression: str = Field(description="要计算的数学表达式,例如: '3 * 5 + 2'")
class CalculatorTool(BaseTool):
"""计算器工具:执行数学运算"""
name: str = "calculator"
description: str = "用于执行数学计算。输入一个数学表达式(如 '3 * 5 + 2'),返回计算结果。"
args_schema: type[BaseModel] = CalculatorInput
def _run(self, expression: str) -> str:
"""执行计算"""
try:
# 清理表达式,只保留数字和运算符
expression = expression.strip()
# 安全评估数学表达式
result = eval(expression, {"__builtins__": {}}, {})
return f"计算结果: {expression} = {result}"
except Exception as e:
return f"计算错误: {str(e)}"
async def _arun(self, expression: str) -> str:
"""异步执行"""
return self._run(expression)
# ==================== 自定义工具 2: 班级人数查询 ====================
class ClassStudentInput(BaseModel):
"""班级人数查询输入模型"""
class_name: str = Field(description="班级名称,例如: 'class 1' 或 '1班'")
class ClassStudentTool(BaseTool):
"""班级人数查询工具:返回指定班级的学生人数"""
name: str = "ask_num_students"
description: str = "查询指定班级的学生人数。输入班级名称(如 'class 1' 或 '1班'),返回该班级的学生人数。"
args_schema: type[BaseModel] = ClassStudentInput
# 模拟班级数据库
class_data: ClassVar[Dict[str, int]] = {
"1班": 30,
"2班": 28,
"3班": 32,
"4班": 29,
"class 1": 30,
"class 2": 28,
"class 3": 32,
"class 4": 29,
}
def _run(self, class_name: str) -> str:
"""查询班级人数"""
try:
class_name = class_name.strip().lower()
# 尝试匹配班级名称
for key, value in self.class_data.items():
if key.lower() == class_name:
return f"{key} 有 {value} 名学生"
# 尝试提取数字
match = re.search(r'\d+', class_name)
if match:
class_num = match.group()
for key in [f"{class_num}班", f"class {class_num}"]:
if key.lower() in [k.lower() for k in self.class_data.keys()]:
original_key = [k for k in self.class_data.keys() if k.lower() == key.lower()][0]
return f"{original_key} 有 {self.class_data[original_key]} 名学生"
return f"未找到班级: {class_name}。可用班级: 1班, 2班, 3班, 4班"
except Exception as e:
return f"查询错误: {str(e)}"
async def _arun(self, class_name: str) -> str:
"""异步执行"""
return self._run(class_name)
# ==================== ReAct Agent 实现 ====================
class DeepSeekReActAgent:
"""基于 DeepSeek API 的 ReAct 智能体(使用 LLM with Tools)"""
def __init__(self, api_key: str = None, base_url: str = None, model: str = "deepseek-chat"):
"""
初始化 ReAct Agent
Args:
api_key: DeepSeek API Key
base_url: DeepSeek API Base URL
model: 使用的模型名称
"""
# 从环境变量或参数获取配置
self.api_key = api_key or os.getenv("DEEPSEEK_API_KEY")
self.base_url = base_url or os.getenv("DEEPSEEK_BASE_URL", "https://api.deepseek.com")
if not self.api_key:
raise ValueError("请在 .env 文件中设置 DEEPSEEK_API_KEY")
# 初始化 LLM(DeepSeek 兼容 OpenAI API 格式)
self.llm = ChatOpenAI(
model=model,
openai_api_key=self.api_key,
openai_api_base=f"{self.base_url}/v1",
temperature=0,
max_tokens=2000,
)
# 初始化工具
self.tools = self._setup_tools()
# 将工具绑定到 LLM
self.llm_with_tools = self.llm.bind_tools(self.tools)
def _setup_tools(self) -> List[BaseTool]:
"""设置工具列表"""
calculator = CalculatorTool()
class_student = ClassStudentTool()
return [calculator, class_student]
def _create_system_prompt(self) -> str:
"""创建系统提示"""
tools_desc = "\n".join([f"- {tool.name}: {tool.description}" for tool in self.tools])
return f"""你是一个智能助手,可以通过思考和使用工具来回答问题。
可用工具:
{tools_desc}
请按照 ReAct 模式工作:
1. Thought(思考):分析问题,决定下一步行动
2. Action(行动):如果需要,调用合适的工具
3. Observation(观察):查看工具返回的结果
4. 重复以上步骤,直到得出最终答案
请用中文回答问题。"""
def run(self, question: str, max_iterations: int = 10) -> str:
"""
运行 Agent 处理问题(使用工具调用)
Args:
question: 用户问题
max_iterations: 最大迭代次数
Returns:
Agent 的回答
"""
try:
print(f"\n{'='*60}")
print(f"问题: {question}")
print(f"{'='*60}\n")
messages = [
SystemMessage(content=self._create_system_prompt()),
HumanMessage(content=question)
]
iteration = 0
while iteration < max_iterations:
iteration += 1
print(f"--- 迭代 {iteration} ---")
# 调用 LLM
response = self.llm_with_tools.invoke(messages)
messages.append(response)
# 检查是否有工具调用
if not response.tool_calls:
# 没有工具调用,返回最终答案
print(f"\n[最终答案] {response.content}\n")
return response.content
# 处理工具调用
for tool_call in response.tool_calls:
tool_name = tool_call["name"]
tool_args = tool_call["args"]
print(f"\n[工具调用] {tool_name}")
print(f"[参数] {tool_args}")
# 查找并执行工具
tool = next((t for t in self.tools if t.name == tool_name), None)
if tool:
result = tool.invoke(tool_args)
print(f"[结果] {result}")
# 将工具结果添加到消息历史
from langchain_core.messages import ToolMessage
messages.append(ToolMessage(
content=result,
tool_call_id=tool_call["id"]
))
else:
print(f"[错误] 未找到工具: {tool_name}")
print()
return "达到最大迭代次数,未能完成任务"
except Exception as e:
import traceback
print(f"\n[执行错误] {str(e)}")
print(traceback.format_exc())
return f"执行错误: {str(e)}"
def chat(self):
"""交互式对话模式"""
print("=" * 60)
print("DeepSeek ReAct 智能体已启动!")
print("=" * 60)
print("可用工具:")
for tool in self.tools:
print(f" - {tool.name}: {tool.description}")
print("\n输入 'quit' 或 'exit' 退出\n")
while True:
try:
question = input("\n请输入问题: ").strip()
if question.lower() in ['quit', 'exit', '退出']:
print("再见!")
break
if not question:
continue
self.run(question)
except KeyboardInterrupt:
print("\n\n再见!")
break
except Exception as e:
print(f"\n[错误] {str(e)}\n")
# ==================== 测试示例 ====================
def test_examples():
"""运行测试示例"""
print("\n" + "=" * 60)
print("运行测试示例")
print("=" * 60 + "\n")
# 创建 Agent
agent = DeepSeekReActAgent()
# 测试案例
test_cases = [
"3乘以5加2等于多少?",
"1班有多少学生?",
"1班和2班一共有多少学生?",
"计算 (10 + 5) * 3 的结果",
"3班和4班的学生总数是多少?",
]
for i, question in enumerate(test_cases, 1):
print(f"\n{'='*70}")
print(f"测试案例 {i}")
print('='*70)
agent.run(question)
# ==================== 主函数 ====================
def main():
"""主函数"""
print("""
╔══════════════════════════════════════════════════════════╗
║ DeepSeek ReAct 智能体 ║
║ 基于 LangChain + DeepSeek API ║
╚══════════════════════════════════════════════════════════╝
""")
# 检查 API Key
if not os.getenv("DEEPSEEK_API_KEY"):
print("[错误] 请先在 .env 文件中配置 DEEPSEEK_API_KEY")
print("\n请编辑 .env 文件,添加:")
print("DEEPSEEK_API_KEY=your_api_key_here")
return
# 选择模式
print("选择运行模式:")
print("1. 交互式对话模式")
print("2. 运行测试示例")
choice = input("\n请选择 (1/2): ").strip()
try:
if choice == "1":
agent = DeepSeekReActAgent()
agent.chat()
elif choice == "2":
test_examples()
else:
print("无效选择,启动交互式模式...")
agent = DeepSeekReActAgent()
agent.chat()
except Exception as e:
import traceback
print(f"\n[启动失败] {str(e)}")
print(traceback.format_exc())
print("\n请确保:")
print("1. 已安装所有依赖: pip install -r requirements.txt")
print("2. 已正确配置 .env 文件中的 DEEPSEEK_API_KEY")
if __name__ == "__main__":
main()
1.2.2、运行并测试效果
python react_python.py
2、考试
2.1、理论考试
单选+多选+判断,总计90题,10分钟交卷,99分。
2.2、实践考试
上午的练习题1的题目,几乎完全一样,代码已经发下来了,只要在本地能运行起来就能及格。
3、每日答题卡
最后附上每天的答题卡,一共6张,有些内容上课根本就没讲到,自己用豆包搜索答案。
3.1、第一天
3.1.1、什么是大模型?
3.1.2、什么是智能体?
3.1.3、智能体的重要性有哪些?
3.2、第二天
3.2.1、基于大模型的应用开发需要进行哪些环境的准备?
答:基于大模型的应用开发,环境准备核心围绕 “底层依赖搭建→大模型接入→开发调试工具→部署运行环境” 四大维度展开。具体准备如下:1、基础开发环境(必备,全场景通用);2、大模型接入环境(核心,决定模型调用方式);3、开发框架与工具链(提升效率,适配大模型应用特性);4、部署与运行环境(开发完成后,上线可用);5、安全与合规环境(企业级应用必备)。
3.2.2、大语言模型(LLM)作为智能体的“认知核心”,主要弥补了传统智能体哪些方便的能力短板?
答:LLM 作为智能体 “认知核心”,核心是弥补了传统智能体在自然语言理解、复杂逻辑推理、自主决策与泛化能力上的关键短板。
3.2.3、阐述大语言模型中人设和逻辑的重要性?
答:LLM 中人设和逻辑是决定其输出质量与实用价值的核心,人设保障 “输出一致性”,逻辑确保 “输出有效性”,二者缺一不可。
3.3、第三天
3.3.1、基于大语言模型的AI智能体是什么,有哪些组成的部分?
答:基于大语言模型的 AI 智能体,是以 LLM 为 “认知核心”,能自主理解需求、规划任务、调用工具并完成目标的智能系统,核心是具备 “自主决策 + 闭环执行” 能力。由感知模块、规划模块、执行模块和记忆模块组成。
3.3.2、使用LangChain开发智能体有哪些优势?
答:LangChain 作为专门为构建 LLM 应用和智能体设计的框架,其优势主要体现在降低开发门槛、提升开发效率和增强系统扩展性上。
3.3.3、ReAct的框架原理是什么,LangChain实现ReAct的具体方式是什么?
答:ReAct(Reasoning + Acting)是一种让大语言模型交替进行推理思考和行动操作的范式,核心是模拟人类解决问题的思维与行动流程。LangChain 通过封装 ReAct 的核心逻辑,提供了开箱即用的 ReAct 智能体实现。LangChain提供了标准化的 ReAct 提示词模板和create_react_agent构建函数,封装了思考 - 行动循环的执行逻辑。
3.4、第四天
3.4.1、简述类似AutoGPT的自主执行智能体的特点?
答:类似 AutoGPT 的自主执行智能体,核心是摆脱人类持续干预、自主完成复杂任务,其特点围绕自主决策、高效任务处理、灵活适配等维度展开。具体如下:1、强目标导向和自主规划;2、闭环自我迭代和反馈修正;3、多工具集成与跨系统交互;4、具备记忆和环境适配能力;3、支持多任务并行与模块化扩展。
3.4.2、简述AutoGPT的典型的工作流程?
答:AutoGPT 的典型工作流程围绕用户设定的目标展开,以自主任务拆解、执行、反思迭代为核心,形成闭环循环直至任务完成,具体步骤如下:1、目标初始化输入;2、任务拆解与优先级排序;3、生成指令并调用工具执行;4、记忆存储与上下文整合;5、自我反思评估与流程迭代;6、任务完成与输出结果。
3.4.5、使用LangChain开发AutoGPT有哪些核心优势?
答:LangChain 为开发 AutoGPT 这类自主智能体提供了全方位的基础设施支持,其核心优势在于模块化组件复用、工具链集成和闭环流程管理,能大幅降低开发复杂度。
3.5、第五天
3.5.1、MCP协议在智能体系统中的核心作用是什么?
答:MCP(模型上下文协议)作为智能体与外部系统交互的标准化框架,其核心作用是解决智能体集成外部工具和数据源时的复杂性、碎片化等问题,为智能体高效完成复杂任务筑牢基础
3.5.2、MCP客户端在智能体交互流程中扮演什么角色?
答:MCP 客户端在智能体交互流程中是核心的中介与通信枢纽,既是智能体(LLM)与 MCP 服务器之间的 “翻译官”,也是二者通信的管理者与协调者。
3.5.3、通过搭建简易MCP客户端,能够掌握哪些关键技能?
答:搭建简易 MCP 客户端的过程,能让你系统性掌握从协议理解到工程实践的多维度关键技能,具体可分为以下核心方向:1. MCP 协议与标准化通信能力;2、客户端 - 服务器(C/S)架构设计思维;3、错误处理与异常场景应对;4、智能体交互与上下文协作;5、工程化实践与调试能力;6、工具集成与生态对接意识。
3.6、第六天
3.6.1、简述MCP服务器在智能体架构中的核心作用,并说明它与MCP客户端的区别。
答:MCP 服务器是智能体架构中连接外部工具与数据的核心枢纽,为智能体提供实际的资源访问和工具执行能力;而 MCP 客户端则是智能体与服务器之间的通信中介,二者在角色、功能和交互模式上有着本质区别。简单来说,客户端是 “传讯者”,负责智能体与服务器的通信协调;服务器是 “执行者”,负责实际的资源提供和工具调用落地。
3.6.2、一个标准的MCP服务器通常包含哪些关键组成部分?请说明各部分的主要功能。
答:标准的 MCP 服务器围绕功能提供与通信交互两大核心,包含能力定义组件、通信协议处理组件、安全控制组件及采样交互组件等关键部分。1、能力定义组件,这是 MCP 服务器的核心功能载体,负责向客户端暴露智能体所需的工具、资源和提示模板,是服务器价值的核心体现。2、通信协议处理组件,负责与 MCP 客户端进行标准化通信,处理底层协议解析和数据传输逻辑。3、安全控制组件,保障服务器访问和数据交互的安全性,防止权限滥用和数据泄露。4、采样交互组件,这是 MCP 服务器的特色组件,实现服务器与智能体的双向交互。
3.6.3、MCP服务器的通讯机制基于什么协议?其基本流程包含哪几个阶段?
答:MCP 服务器的通信机制主要基于JSON-RPC 2.0 协议(部分扩展实现会结合 WebSocket/HTTP 作为传输层),同时兼容 MCP 自身定义的能力协商与交互规范;其基本通信流程围绕 “发现 - 协商 - 调用 - 响应” 展开。