AI智能体培训第七天:小练习加考试加答题卡集合

浏览:134 | 发布于 2025-11-23

1、练习题

1.1、练习题1

使用DeepSeek Api接口,开发一个可以自由对话的机器人。具体要求如下:

  1. 注册deepseek api,如已经注册,可以直接使用。
  2. 通过调用deepseek的api,开发对话请求模块。
  3. 可实现多轮对话,具备记忆能力,之前聊的内容在后面的对话中有所体现。
  4. 记忆保存5轮,不是所有的记忆都一直保存,只记住最近5轮的对话内容。

注意事项:

  1. 推荐使用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班一共多少学生)。

 

注意事项:

  1. 推荐使用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 自身定义的能力协商与交互规范;其基本通信流程围绕 “发现 - 协商 - 调用 - 响应” 展开。

 

海涛贝塔(https://haitaobeta.com)属于海涛个人博客,欢迎浏览使用

联系方式:qq:52292959 邮箱:52292959@qq.com

备案号:粤ICP备18108585号 友情链接