AI应用开发 - AI Agent Practical Exercise
AI Agent 实战练习什么是 AI AgentAI Agent 是能够感知环境、自主决策并执行任务的智能系统。与传统 AI 不同AI Agent 不是被动响应输入而是能够主动规划、执行多步骤任务并调用外部工具。传统 AI: 输入 → 输出一次性的 AI Agent: 输入 → 思考 → 行动 → 观察 → 思考...循环迭代核心架构AI Agent 由四个核心组件构成组件作用本项目实现Model模型理解用户输入生成决策MiniMax M2Orchestration编排管理任务流程和执行逻辑LangChain AgentExecutorTools工具扩展 Agent 能力rag_search, calculator, time_queryMemory记忆存储历史信息短期记忆 长期记忆前置要求1. 环境准备# Python 3.11python3.11--version# 创建虚拟环境推荐python3.11-mvenv venvsourcevenv/bin/activate# macOS/Linux2. 安装依赖pipinstalllangchain langchain-core langchain-community langchain-openai pipinstallllama-index llama-index-llms-openai-like llama-index-embeddings-huggingface pipinstalllangchain-huggingface# embedding如果兼容pipinstallfaiss-cpu# 向量数据库pipinstallsentence-transformers# 嵌入模型pipinstallpendulum# 时间查询可选pipinstallrich# 输出美化可选3. API 准备本项目使用 MiniMax API你需要API KeyAPI Base URL模型名称完整代码importwarnings warnings.filterwarnings(ignore,categoryDeprecationWarning)importos os.environ[HF_ENDPOINT]https://hf-mirror.comfromlangchain_openaiimportChatOpenAIfromlangchain_core.toolsimporttoolfromlangchain.agentsimportcreate_tool_calling_agent,AgentExecutorfromlangchain_core.promptsimportChatPromptTemplatefromllama_index.coreimportVectorStoreIndex,Document,Settingsfromllama_index.llms.openai_likeimportOpenAILikefromllama_index.embeddings.huggingfaceimportHuggingFaceEmbeddingfromlangchain.memoryimportConversationBufferMemoryfromlangchain_community.vectorstoresimportFAISSfromlangchain_community.embeddingsimportHuggingFaceEmbeddings# LLM 配置 API_KEYyour-api-keyAPI_BASEhttps://api.minimax.chat/v1MODELMiniMax-M2.7llmChatOpenAI(temperature0.3,modelMODEL,openai_api_keyAPI_KEY,openai_api_baseAPI_BASE)# RAG 专用 LLMrag_llmOpenAILike(modelMODEL,api_baseAPI_BASE,api_keyAPI_KEY,is_chat_modelTrue)# Embedding 配置 embed_modelHuggingFaceEmbedding(model_namesentence-transformers/all-MiniLM-L6-v2)# LangChain 和 LlamaIndex 需要不同的 embedding 实例langchain_embed_modelHuggingFaceEmbeddings(model_namesentence-transformers/all-MiniLM-L6-v2)Settings.embed_modelembed_model# RAG 文档数据 documents[Document(textAI Agent 是能够感知环境、自主决策并执行任务的智能系统。),# ... 更多文档]# 构建索引 indexVectorStoreIndex.from_documents(documents)query_engineindex.as_query_engine(llmrag_llm)# 定义工具 tooldefrag_search(query:str)-str:查询内部知识库(RAG)responsequery_engine.query(query)returnstr(response)tooldefcalculator(expression:str)-str:数学计算器try:returnstr(eval(expression))exceptExceptionase:returnf计算错误:{str(e)}tooldeftime_query(city:str)-str:查询城市时间fromdatetimeimportdatetimetry:importpendulum dtpendulum.now(city)returndt.to_formatted_date_string() dt.to_time_string()exceptException:returndatetime.now().strftime(%Y-%m-%d %H:%M:%S)tools[rag_search,calculator,time_query]# Prompt 模板 promptChatPromptTemplate.from_messages([(system,你是一个AI Agent助手... 【可用工具】 1. rag_search: 查询知识库 2. calculator: 数学计算 3. time_query: 查询时间 【调用规则】 1. 知识性问题 → rag_search 2. 数学计算 → calculator 3. 时间问题 → time_query 【输出规则】 直接输出最终答案... ),(placeholder,{chat_history}),(user,{input}),(placeholder,{agent_scratchpad})])# 记忆系统 # 短期记忆内存memoryConversationBufferMemory(memory_keychat_history,return_messagesTrue)# 长期记忆磁盘MEMORY_DIR./memory_storeos.makedirs(MEMORY_DIR,exist_okTrue)defload_vector_memory():加载或创建向量记忆库index_pathos.path.join(MEMORY_DIR,index.faiss)pkl_pathos.path.join(MEMORY_DIR,index.pkl)ifos.path.exists(index_path)andos.path.exists(pkl_path):vectorstoreFAISS.load_local(MEMORY_DIR,langchain_embed_model,allow_dangerous_deserializationTrue)print(记忆已从磁盘加载)else:vectorstoreFAISS.from_texts([初始化记忆],langchain_embed_model)print(创建新的记忆库)returnvectorstore vectorstoreload_vector_memory()defsave_to_long_memory(user_input,output):保存对话到长期记忆vectorstore.add_texts([fUser:{user_input}| Assistant:{output}])vectorstore.save_local(MEMORY_DIR)# 创建 Agent agentcreate_tool_calling_agent(llmllm,toolstools,promptprompt)agent_executorAgentExecutor(agentagent,toolstools,max_iterations3,memorymemory)# 运行 print(Agent started)whileTrue:user_inputinput(You: )ifuser_input.lower()in[exit,quit]:break# 1. 检索长期记忆relevant_memoryvectorstore.similarity_search(user_input,k3)memory_text\n.join([doc.page_contentfordocinrelevant_memory])# 2. 注入 promptfull_inputf历史相关记忆:\n{memory_text}\n当前问题:\n{user_input}# 3. 执行resultagent_executor.invoke({input:full_input})outputresult[output]print(Agent:,output)# 4. 保存长期记忆save_to_long_memory(user_input,output)组件详解1. LLM 配置llmChatOpenAI(temperature0.3,# 0确定性1创造性modelMODEL,openai_api_keyAPI_KEY,openai_api_baseAPI_BASE)关键参数temperature: 控制输出随机性。0.3 适合需要准确答案的场景openai_api_base: 不同 API 服务商有不同的 base URL2. 工具定义使用tool装饰器定义工具tooldefcalculator(expression:str)-str:数学计算器 Args: expression: 数学表达式如 23*5 Returns: 计算结果字符串 try:returnstr(eval(expression))exceptExceptionase:returnf计算错误:{str(e)}工具描述的重要性描述越详细LLM 越能正确判断何时调用必须包含适用场景、不适用场景、参数说明、返回值格式3. Prompt 模板promptChatPromptTemplate.from_messages([(system,你是一个AI Agent助手...),(placeholder,{chat_history}),# 短期记忆注入点(user,{input}),(placeholder,{agent_scratchpad})# Agent 内部工作区])placeholder 类型{input}: 用户输入{chat_history}: 短期记忆ConversationBufferMemory{agent_scratchpad}: Agent 内部推理过程4. 记忆系统短期记忆memoryConversationBufferMemory(memory_keychat_history,return_messagesTrue# 返回 message 对象列表)存储当前会话的上下文由 AgentExecutor 自动管理每次对话后自动更新长期记忆vectorstoreFAISS.from_texts([初始化记忆],embed_model)vectorstore.save_local(MEMORY_DIR)# 持久化vectorstoreFAISS.load_local(...)# 加载使用向量数据库存储基于语义相似度检索持久化到磁盘重启后不丢失5. Agent 创建agentcreate_tool_calling_agent(llmllm,toolstools,promptprompt)agent_executorAgentExecutor(agentagent,toolstools,max_iterations3,# 最大迭代次数防止死循环memorymemory)关键参数max_iterations: 防止 Agent 在工具调用循环中卡住memory: 短期记忆管理器verbose: 是否输出调试信息完整项目结构AI Agent/ ├── AI Agent.py # 主程序 └── memory_store/ # 长期记忆存储目录 ├── index.faiss # FAISS 索引文件 └── index.pkl # 文档 pickle 文件测试验证测试 1基础工具调用You: AI Agent 有什么应用场景? Agent: [应调用 rag_search返回知识库中的答案]测试 2数学计算You: 帮我计算 25*1799 Agent: [应调用 calculator输出 524]测试 3短期记忆You: 帮我计算 25*1799 Agent: 524 You: 把刚才的结果乘以2 Agent: [应记住 524输出 1048]测试 4长期记忆重启后# 重启程序 You: 我们刚才做了什么运算? Agent: [应检索到之前的 25*1799524]常见问题1. 长期记忆没有持久化检查save_to_long_memory()是否在每次对话后调用load_vector_memory()是否在启动时调用vectorstore.save_local()是否执行2. 工具调用失败检查工具描述是否清晰参数格式是否正确max_iterations是否足够3. 短期记忆不生效检查prompt 是否包含{chat_history}placeholderreturn_messages是否为 TrueAgentExecutor 是否传入了memory参数进阶方向1. Multi-Tools 协作添加更多工具搜索、数据库、API 调用让 Agent 能够组合使用多个工具完成任务。2. 记忆优化短期记忆设置 token 限制避免超出 context window长期记忆添加时间戳支持按时间检索3. Multi-Agent 系统多个专业 Agent 协同工作如一个协调者 多个执行者。4. 评估与监控添加工具调用成功率、任务完成率等指标。关键概念回顾概念说明AI Agent自主决策、执行任务的智能系统Tool CallingLLM 调用外部工具的机制ReActThought → Action → Observation 循环短期记忆ConversationBufferMemory会话级长期记忆FAISS 向量数据库持久化RAG检索增强生成结合知识库回答问题