From 644816de790d97435b84c6b28902df31cd2affa4 Mon Sep 17 00:00:00 2001 From: "2287551746@qq.com" <2287551746@example.com> Date: Sat, 25 Oct 2025 16:32:18 +0800 Subject: [PATCH] 2025.10.25 --- 01 Agent 入门 & 快速运行/README.md | 3 +- 02 LLM基础与调用/README.md | 6 +- .../1. 自定义函数调用.py | 91 ++++++++++++++ 03 Function calling与工具调用/2. API 调用.py | 83 +++++++++++++ 03 Function calling与工具调用/README.md | 6 + README.md | 115 ++++++++++++------ requirements.txt | 3 +- 7 files changed, 267 insertions(+), 40 deletions(-) create mode 100644 03 Function calling与工具调用/1. 自定义函数调用.py create mode 100644 03 Function calling与工具调用/2. API 调用.py create mode 100644 03 Function calling与工具调用/README.md diff --git a/01 Agent 入门 & 快速运行/README.md b/01 Agent 入门 & 快速运行/README.md index 3ef73f2..cb2b73a 100644 --- a/01 Agent 入门 & 快速运行/README.md +++ b/01 Agent 入门 & 快速运行/README.md @@ -1,4 +1,3 @@ - ## 💕注意事项 -代码可一键运行即可,主要是感受,没有关键知识点。 \ No newline at end of file +代码能一键运行即可,主要是感受,没有关键知识点。 \ No newline at end of file diff --git a/02 LLM基础与调用/README.md b/02 LLM基础与调用/README.md index 8608814..57dabf6 100644 --- a/02 LLM基础与调用/README.md +++ b/02 LLM基础与调用/README.md @@ -1,4 +1,6 @@ ## 💕注意事项 -1. llm模型调用是deepseek官网推荐的调用流程,这个结构是我们以后调用api常用的方法。 -2. 多轮问答agent涵盖llm、prompt、memory几个模块。如果想改变ai身份的提示词与初始提问,直接更改messages里的content即可。 \ No newline at end of file +- 知识点:**LLM了解与调用、Prompt编写与逻辑构思、多轮对话记忆、独立搭建一个智能体** + +1. llm模型调用:是deepseek官网推荐的调用流程,这个结构是我们以后调用api常用的方法。 +2. 多轮问答agent:涵盖llm、prompt、memory几个模块。如果想改变ai身份的提示词与初始提问,直接更改messages里的content即可。 \ No newline at end of file diff --git a/03 Function calling与工具调用/1. 自定义函数调用.py b/03 Function calling与工具调用/1. 自定义函数调用.py new file mode 100644 index 0000000..ecffdee --- /dev/null +++ b/03 Function calling与工具调用/1. 自定义函数调用.py @@ -0,0 +1,91 @@ +import os +from dotenv import load_dotenv +from openai import OpenAI +import json + +load_dotenv() + + +def create_client(): + api_key = os.getenv("OPENAI_API_KEY") + return OpenAI(api_key=api_key, base_url="https://api.deepseek.com") + +def get_weather(location): + # 模拟获得天气信息 + return f"{location}当前天气:23℃,晴,风力2级" + + +# 以下格式为固定写法,一般仅需改description与name +get_weather_func = { + "name": "get_weather", # 函数名称 + "description": "获取指定城市的天气情况", # 对该函数的描述 + "parameters": { + "type": "object", + "properties": { + "location": { + "type": "string", # 该参数类型 + "description": "城市名称,如北京、上海等" # 对该参数的描述 + } + }, + "required": ["location"] # 声明必填 + } +} + +# 固定写法,有多少个tool就往里追加多少个 +tools = [ + { + "type": "function", + "function": get_weather_func + } +] + +def chat_loop(agent_client, tools): + messages = [ + {"role": "system", + "content": "你是一个善解人意会热心回答人问题的助手。如果你感觉你回答不了当前问题,就会调用函数来回答。"}, + {"role": "user", "content": "北京今天的天气怎么样?"} + ] + response = agent_client.chat.completions.create( + model="deepseek-chat", + messages=messages, + tools=tools, # 调用工具 + tool_choice="auto" # 模型自主选择是否调用工具 + ) + message = response.choices[0].message + # 如果有该参数,证明ai调用了工具 + if message.tool_calls: + # 对每个可能要调用的工具进行循环 + for tool_call in message.tool_calls: + if tool_call.function.name == "get_weather": + # 解析参数 + args = json.loads(tool_call.function.arguments) # 获取用户关键词的参数 + location = args.get("location", "未知地点") + + # 调用真实参数 + weather_info = get_weather(location) + + # 将函数执行结果以"tool"角色传给模型,等待后面二次调用 + messages.append(message) # 先添加模型的原始响应 + messages.append({ + "role": "tool", + "tool_call_id": tool_call.id, + "name": tool_call.function.name, + "content": weather_info + }) + # 第二次调用,让模型基于工具返回的结果再生成最终答案 + final_res = agent_client.chat.completions.create( + model="deepseek-chat", + messages=messages + ) + print('已调用工具...') + print(f'回答:{final_res.choices[0].message.content}') + else: + # 模型没有要调用工具,直接返回 + print('未调用工具...') + print(f'回答:{response.choices[0].message.content}') + + + +if __name__ == '__main__': + client = create_client() + chat_loop(client, tools) diff --git a/03 Function calling与工具调用/2. API 调用.py b/03 Function calling与工具调用/2. API 调用.py new file mode 100644 index 0000000..a9bf95d --- /dev/null +++ b/03 Function calling与工具调用/2. API 调用.py @@ -0,0 +1,83 @@ +from dotenv import load_dotenv +from openai import OpenAI +import json +import os +import requests + +load_dotenv() + +def create_client(): + api_key = os.getenv("OPENAI_API_KEY") + return OpenAI(api_key=api_key, base_url="https://api.deepseek.com") + +# 通过api调用获得当前ip与位置 +def get_addr(): + res_ip = requests.get('https://ipapi.co/ip/').text + res_city = requests.get('https://ipapi.co/city/').text + return f'ip地址:{res_ip},所在城市:{res_city}' + + +get_addr_func = { + "name": "get_addr", # 函数名称 + "description": "获取用户的ip地址与城市", # 对该函数的描述 + "parameters": { + "type": "object", + "properties": {}, # 参数为空,那么这两个地方也是空的 + "required": [] + } +} + +tools = [ + { + "type":"function", + "function":get_addr_func + } +] + +def chat_loop(agent_client,tools): + messages = [ + {"role": "system","content": "你是一个善解人意会热心回答人问题的助手。如果你感觉你回答不了当前问题,就会调用函数来回答。"}, + {"role": "user", "content": "我现在在哪个城市,ip地址是多少?"} + ] + response = agent_client.chat.completions.create( + model="deepseek-chat", + messages=messages, + tools=tools, + tool_choice="auto" + ) + message = response.choices[0].message + if message.tool_calls: + for tool_call in message.tool_calls: + if tool_call.function.name == "get_addr": + # 解析参数 + # args = json.loads(tool_call.function.arguments) # 获取用户关键词的参数 + # location = args.get("location") + # 调用真实参数 + # your_info = get_weather(location) + + # 这里无参数,直接调用函数就行 + your_info = get_addr() + messages.append(message) + messages.append({ + "role": "tool", + "tool_call_id": tool_call.id, + "name": tool_call.function.name, + "content": your_info + }) + final_res = agent_client.chat.completions.create( + model="deepseek-chat", + messages=messages + ) + print('已调用工具...') + print(f'回答:{final_res.choices[0].message.content}') + else: + # 模型没有要调用工具,直接返回 + print('未调用工具...') + print(f'回答:{response.choices[0].message.content}') + + +if __name__ == '__main__': + client = create_client() + chat_loop(client, tools) + + diff --git a/03 Function calling与工具调用/README.md b/03 Function calling与工具调用/README.md new file mode 100644 index 0000000..9af7ed5 --- /dev/null +++ b/03 Function calling与工具调用/README.md @@ -0,0 +1,6 @@ +## 💕注意事项 + +- 知识点:**Function calling原理、工具函数封装、API接入实践、多轮调用流程、Agent能力扩展** + +1. 自定义函数调用:使用一个假函数来模拟完成function calling代码构建流程。重点是学会如何调用外部工具函数 +2. API调用:调用一个真的外部工具函数来完成API调用。重点是学会如何通过API文档学会构建一个可被调用的外部函数。强烈推荐自己找一个其他的任意API给AI作为测试,看它能否调用你提供的工具。 \ No newline at end of file diff --git a/README.md b/README.md index dc4deb7..6e1996e 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,88 @@ -# 💻 Agent Craft +# 🤖 Agent Craft > 智能体开发教学库 | A beginner-friendly guide to building AI agents +## 📘 项目简介 -🔥 从零开始上手agent智能体,掌握langchain、rag、prompt、langgraph等核心技术栈 +**Agent Craft** 是一个系统性开源教学项目,采用 **「博客讲解 + 代码实践」双驱动模式**,带你从零构建完整的 AI Agent 开发能力。 -本仓库专注于 AI Agent 开发的学习与实践,通过系统化的案例和详细的代码注释,帮助开发者快速掌握从基础LLM调用到复杂Agent构建的完整技能栈。 +- 📄 **配套博客详解**:每章内容均配有 CSDN + 深度文章,涵盖原理剖析、代码解析与调试技巧 +- 💻 **可运行代码仓库**:每个模块对应独立目录,含完整代码、注释与运行指引,支持本地复现 +- 🚀 内容覆盖:从 **Prompt 工程** 到 **LangChain / LangGraph / RAG / SDK 封装** +- ⚙️ 能力进阶:涵盖 **智能体思维链、工具调用、任务规划、多智能体协作** -💡 项目将持续更新,目标是构建一个系统、实用的 AI Agent 学习案例库。 - -📘 本仓库开箱即用,仅需配置 API_KEY。 - -✍️ 代码可与博客配套使用,博客会重点讲解Agent知识构建与流程解析。 - -博客同步发布: - -👉 [我的CSDN主页](https://blog.csdn.net/2401_87328929) - -👉 [CSDN对应专栏](https://blog.csdn.net/2401_87328929/category_12970267.html) - -🙋‍♂️ 技术交流 / 更新 / 答疑:微信 **a19731567148**(备注 GitHub) +> 💡 本仓库目标:帮助开发者从零构建可运行的智能体应用,真正理解 Agent 的底层逻辑,而不仅仅是“调用框架”。 --- -## 🚅 目录跳转 -| 仓库 | 博客 | 技术栈 | 知识点 | 难度 | -|---------------------------------------------------|------------------------------------------------|------------------|----------------------|-----| -| [01 Agent 入门 & 快速运行](https://github.com/Annyfee/agent-craft/tree/main/01%20Agent%20%E5%85%A5%E9%97%A8%20%26%20%E5%BF%AB%E9%80%9F%E8%BF%90%E8%A1%8C) | [🏠](https://blog.csdn.net/2401_87328929/article/details/153729555) | 基础LLM | Agent概念 | ⭐ | -| [02 LLM基础与调用](https://github.com/Annyfee/agent-craft/tree/main/02%20LLM%E5%9F%BA%E7%A1%80%E4%B8%8E%E8%B0%83%E7%94%A8) | [🏠](https://blog.csdn.net/2401_87328929/article/details/153735431) | LLM/API调用/Prompt | 调用模型接口、初识prompt、多轮对话 | ⭐ | +## 🧭 模块总览(16 模块) +> 💡 每个模块对应独立目录(含代码、说明与示例),可独立运行与学习。 +> 🔥 已更新至 03 Function Calling 与工具调用,持续更新中! + +| 章节 | 模块 | 博客 | 核心关键词 | 难度 | +|:-----------:|:--------------------------------------------------------|:-------------------------------------------------------------------:|:--------------------------------|:----:| +| 🏗️ **基础篇** | [01 Agent 入门 & 环境搭建](01%20Agent%20入门%20&%20环境搭建/) | [🏠](https://blog.csdn.net/2401_87328929/article/details/153729555) | Python · OpenAI API | ⭐ | +| | [02 LLM 基础调用](02%20LLM基础与调用/) | [🏠](https://blog.csdn.net/2401_87328929/article/details/153735431) | LLM API 调用 · 参数配置 | ⭐ | +| | [03 Function Calling 与工具调用](04%20FunctionCalling与工具调用/) | [🏠](https://blog.csdn.net/2401_87328929/article/details/153866573) | Function Call · 工具注册 | ⭐⭐ | +| ⚙️ **框架篇** | 04 LangChain 基础篇 | 🚧 撰写中 | Chain 架构 · Tool 使用 | ⭐⭐ | +| | 05 LangChain 进阶篇 | 🚧 | Memory · 多链协作 · Agent | ⭐⭐⭐ | +| | 06 LangGraph 入门 | 🚧 | Flow · Node · Edge 控制 | ⭐⭐⭐ | +| | 07 RAG 基础篇(Embedding & 向量) | 🚧 | 向量化 · 检索匹配 | ⭐⭐ | +| | 08 RAG 进阶篇(检索 + 生成) | 🚧 | RAG Pipeline · QA 系统 | ⭐⭐⭐ | +| 🧠 **智能篇** | 09 MCP 基础 | 🚧 | MCP 协议 · 客户端安装 | ⭐⭐ | +| | 10 MCP 进阶 | 🚧 | 在线模型接入 · 多轮任务 | ⭐⭐⭐ | +| | 11 MCP 高级 | 🚧 | 多服务组合 · 并发调用 | ⭐⭐⭐⭐ | +| | 12 多步骤任务规划(MCP Task Planning) | 🚧 | Task Planning · CoT | ⭐⭐⭐ | +| | 13 多智能体协作 | 🚧 | Multi-Agent · 通信机制 | ⭐⭐⭐⭐ | +| | 14 综合案例实战 | 🚧 | LangChain + RAG + Tool + Memory | ⭐⭐⭐⭐ | +| 🚀 **工程篇** | 15 部署与本地化 | 🚧 | Ollama · LM Studio · API代理 | ⭐⭐⭐ | +| | 16 Agent SDK 封装 | 🚧 | 模块化封装 · SDK 架构 | ⭐⭐⭐⭐ | --- +## 🧩 当前学习建议(适用于已完成模块) + +目前已开放模块:**01 ~ 03**。 +建议按顺序学习,每一章都有完整代码示例与注释。 + +### ✅ 模块 01 — Agent 入门 & 环境搭建 + +- **目标**:理解 Agent 概念,完成环境配置与首次调用。 +- **内容**:环境依赖、API Key 配置、最小可运行 Agent。 + +### ✅ 模块 02 — LLM 基础调用 + +- **目标**:掌握模型调用逻辑,初步构建智能体能力。 +- **内容**:LLM了解与调用、Prompt编写与逻辑构思、多轮对话记忆、独立搭建一个智能体。 + +### ✅ 模块 03 — Function Calling 与工具调用 + +- **目标**:实现 LLM 调用外部函数,赋予模型“执行力”。 +- **内容**:Function calling原理、工具函数封装、API接入实践、多轮调用流程、Agent能力扩展。 + +> 📌 后续模块将陆续开放(LangChain、RAG、MCP、多智能体等),建议先完整学习前 3 个模块,为进阶模块打好基础。 + +--- + +## 🧠 Agent Craft 的核心学习路径 + +> “让每个人都能真正理解 Agent 的底层逻辑,而不仅仅是调用框架。” + +我们采用 **渐进式构建** 的教学理念,从最基础的 Prompt 开始,逐步搭建完整的 AI Agent 能力栈: + +```mermaid +flowchart LR + A[Prompt 层] --> B[LLM 核心调用] + B --> C[LangChain 工具链] + C --> D[LangGraph 流程控制] + D --> E[RAG 检索增强生成] + E --> F[MCP 扩展能力] + F --> G[多智能体协作与规划] + G --> H[SDK 封装与部署] +``` + ## 🚀 快速开始 ### 1️⃣ 环境准备 @@ -53,6 +104,7 @@ cp .env.example .env ``` 在 `.env` 文件中配置: + ```env OPENAI_API_KEY=your_deepseek_api_key_here ``` @@ -64,22 +116,15 @@ OPENAI_API_KEY=your_deepseek_api_key_here ```bash python "01 Agent 入门 & 环境搭建/Agent-demo.py" ``` + --- -## 📚 学习路径 +## 🤝 参与和交流 -### 🎯 第一章:Agent 入门 & 快速运行 -- **核心技能**: 运行Agent-demo -- **学习目标**: 了解Agent是什么,怎么用 -- **技术要点**: 环境配置 +欢迎提交 **Issue / PR / 改进建议** -### 🎯 第二章:LLM基础与调用 -- **核心技能**: 多轮对话Agent构建 -- **学习目标**: 实现智能对话系统 -- **技术要点**: 对话历史、上下文管理、角色设定 +如果有商业/技术交流需求,请联系我: -## 🤝 贡献指南 -欢迎贡献代码 / 提交 Issue / Pull Request -- Fork 仓库 -- 创建分支进行修改 -- 提交 PR 并描述修改内容 +📬 微信:a19731567148(备注 GitHub) + +📖 个人博客:[CSDN 主页](https://blog.csdn.net/2401_87328929) diff --git a/requirements.txt b/requirements.txt index 4da8042..4e321f9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ dotenv~=0.9.9 python-dotenv~=1.1.1 -openai~=2.6.0 \ No newline at end of file +openai~=2.6.0 +requests~=2.32.5 \ No newline at end of file