AI Agent白手起家52: 从零搭建钉钉智能助手——资源准备与核心架构实现
纲要项目准备开发资源获取Python与VSCode环境配置大模型API Key获取硅基流动、CloseAIGitHub Copilot开启 AI 辅助编程钉钉开放平台应用创建与Stream模式配置LangSmith可观测性追踪开通项目架构概览目录结构核心模块关系Mermaid流程图实战开发从入口到智能体环境依赖与Poetry管理.env配置文件详解日志系统初始化钉钉WebSocket入口实现智能体核心类AIAgent主/备模型回退机制工具加载与记忆系统情感分析与动态提示词多用户记忆隔离session_id完整可运行代码示例总结与相关度说明项目准备资源一站式获取在动手写代码之前我们需要先把开发环境、模型 API、钉钉应用等资源全部备齐。资源类型获取方式用途Python 3.10python.org 下载安装运行环境VSCodecode.visualstudio.com 下载主力 IDEGitHub CopilotVSCode 内购订阅推荐专业版AI 辅助编码、调试大模型 API硅基流动siliconflow.cn或 CloseAI提供 LLM 推理能力搜索引擎SerpAPIserpapi.com 注册免费 key在线搜索工具钉钉应用open.dingtalk.com 创建“钉钉应用”非“机器人”消息收发、日程待办 APILangSmithsmith.langchain.com 注册并创建 API Key调用链追踪、成本监控Redis本地安装或 Docker 启动会话记忆存储硅基流动硅基流动与 CloseAI 使用要点硅基流动托管了大量国产开源模型DeepSeek、Qwen 等其 API 地址完全兼容 OpenAI 格式只需更换base_url即可。注册后完成实名认证在“模型广场”中复制模型名称如deepseek-ai/DeepSeek-R1然后在API 文档中获取接口地址和密钥。计费透明按 token 消费适合个人开发者。CloseAI 则整合了 OpenAI、Claude、Gemini、DeepSeek 等海外模型通过统一接口提供。需注意不同模型的base_url后缀不同例如 OpenAI 使用/v1Claude 使用/anthropic。在“密钥管理”页面创建密钥并在使用时指定正确的地址。安全提醒永远不要将 API Key 明文写在代码中应放入.env文件并用.gitignore排除。项目架构一览小浪助手是一个基于LangChain的单智能体通过钉钉Stream模式WebSocket与用户实时交互具备日程管理、待办创建、知识库问答和情绪检测能力。其核心架构如下WebSocket文本消息 用户ID钉钉用户入口: dingtalk_hook.pyAIAgent 核心类情感分析链动态提示词管理Redis 记忆系统主模型 OpenAI / 备用 DeepSeek工具集知识库检索在线搜索钉钉日历/待办 API生成回复用户消息经钉钉 WebSocket 传入后被入口函数捕获提取文本和发送者唯一 ID。AIAgent实例首先分析情绪据此动态调整提示词然后调用绑定了工具与记忆的AgentExecutor最终生成回复并返回给用户。实战开发从零编写核心代码环境初始化与项目结构使用Poetry管理依赖确保环境干净可复现。在项目根目录执行mkdirxiaolang-dingtalkcdxiaolang-dingtalk poetry init-npoetryaddlangchain langchain-openai langchain-community python-dotenv redis pydantic\dingtalk-stream chromadb tiktoken项目目录结构如下xiaolang-dingtalk/ ├── src/ │ ├── dingtalk_hook.py # 钉钉入口WebSocket 回调 │ ├── agent.py # AI智能体核心类 │ ├── tools/ │ │ ├── __init__.py │ │ ├── calendar.py # 钉钉日历工具 │ │ ├── task.py # 钉钉待办工具 │ │ ├── knowledge.py # RAG 知识库检索 │ │ └── search.py # 在线搜索 │ ├── chains/ │ │ └── emotion.py # 情感检测链 │ └── memory/ │ └── redis_memory.py # Redis 记忆封装 ├── .env # 环境变量不提交仓库 ├── pyproject.toml └── README.md配置环境变量.env# LLM 主模型 OPENAI_API_KEYsk-xxxx OPENAI_BASE_URLhttps://api.siliconflow.cn/v1 DEFAULT_MODELdeepseek-ai/DeepSeek-R1 # 备用模型 DEEPSEEK_API_KEYsk-xxxx DEEPSEEK_BASE_URLhttps://api.deepseek.com/v1 # 搜索引擎 SERPAPI_API_KEYxxxx # Redis REDIS_URLredis://localhost:6379/0 # 钉钉应用 DINGTALK_APP_KEYdingxxxx DINGTALK_APP_SECRETxxxx DINGTALK_ROBOT_CODExxxx # LangSmith 追踪 LANGCHAIN_TRACING_V2true LANGCHAIN_API_KEYls__xxxx LANGCHAIN_PROJECTxiaolang-dingtalk入口文件钉钉消息接收与回复使用钉钉官方dingtalk-stream库建立 WebSocket 连接注册消息回调。这里简化示例不依赖真实钉钉环境也能本地运行——我们用标准输入模拟消息收发但完整保留了多用户记忆隔离、调用智能体的真实流程。实际部署时只需将模拟部分替换为DingTalkStreamClient即可。# src/dingtalk_hook.pyimportosimportsysimportloggingfromdotenvimportload_dotenvfromagentimportAIAgent load_dotenv()# 配置日志logging.basicConfig(levellogging.INFO,format%(asctime)s - %(name)s - %(levelname)s - %(message)s)loggerlogging.getLogger(XiaoLang)# 全局用户存储模拟从钉钉回调中获取的 sender_iduser_store{}defget_or_create_user(sender_id:str):ifsender_idnotinuser_store:user_store[sender_id]{id:sender_id}returnuser_store[sender_id]defmain():logger.info(小浪助手启动中...)agentAIAgent()# 初始化智能体print(小浪助手已就绪输入 exit 退出。)# 模拟多用户交互输入格式为 用户ID: 消息内容whileTrue:try:rawinput( )ifraw.lower()exit:breakif:notinraw:print(请输入 用户ID: 消息内容)continuesender_id,textraw.split(:,1)sender_idsender_id.strip()texttext.strip()# 存储或获取用户信息get_or_create_user(sender_id)# 调用智能体replyagent.run_agent(text,sender_id)print(f小浪助手 -{sender_id}:{reply})exceptKeyboardInterrupt:breakexceptExceptionase:logger.error(f处理消息失败:{e})if__name____main__:main()真实钉钉连接时将main函数替换为DingTalkStreamClient的回调注册即可原理完全一致。智能体核心类AIAgent这个类封装了模型加载、工具注册、记忆管理、情感分析和动态提示词合成的全部逻辑。# src/agent.pyimportosimportjsonfromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportAgentExecutor,create_tool_calling_agentfromlangchain.toolsimporttoolfromlangchain.promptsimportChatPromptTemplate,MessagesPlaceholderfromlangchain.memoryimportConversationBufferMemoryfromlangchain_community.chat_message_historiesimportRedisChatMessageHistoryfromlangchain_core.runnablesimportConfigurableField load_dotenv()# ---------- 工具定义简化示例 ----------tooldefcreate_calendar_event(summary:str,start_time:str,end_time:str)-str:创建钉钉日程。参数 summary: 标题, start_time: 开始时间 ISO格式, end_time: 结束时间 ISO格式# 实际调用钉钉 API此处模拟成功returnf已创建日程「{summary}」时间{start_time}~{end_time}tooldefcreate_task(content:str,priority:strnormal)-str:创建钉钉待办。参数 content: 待办内容, priority: 优先级 low/medium/highreturnf已创建待办「{content}」优先级{priority}tooldefweb_search(query:str)-str:在线搜索最新信息fromlangchain_community.utilitiesimportSerpAPIWrapper searchSerpAPIWrapper()returnsearch.run(query)tools[create_calendar_event,create_task,web_search]# ---------- 情感分析链 ----------emotion_promptChatPromptTemplate.from_template(分析用户消息的情绪返回JSON: {{\emotion\: \positive/neutral/negative\, \score\: 0-10}}\n消息: {input}\nJSON:)classAIAgent:def__init__(self):# 1. 主模型可回退到备用模型primaryChatOpenAI(modelos.getenv(DEFAULT_MODEL,gpt-3.5-turbo),openai_api_keyos.getenv(OPENAI_API_KEY),base_urlos.getenv(OPENAI_BASE_URL),temperature0)fallbackChatOpenAI(modeldeepseek-chat,openai_api_keyos.getenv(DEEPSEEK_API_KEY),base_urlos.getenv(DEEPSEEK_BASE_URL),temperature0)self.llmprimary.with_fallbacks([fallback])# 2. 记忆系统基于 Redis支持多用户 sessionself.base_memoryConversationBufferMemory(memory_keychat_history,return_messagesTrue,input_keyinput,output_keyoutput)# 3. 情感分析 LLMself.emotion_llmChatOpenAI(modelgpt-3.5-turbo,temperature0)# 4. 基础提示词动态部分通过占位符注入base_promptChatPromptTemplate.from_messages([(system,你是小浪助手一个钉钉智能客服。你可以管理日程、创建待办、在线搜索。请友好专业地回复。当前用户情绪状态{emotion_state}),MessagesPlaceholder(chat_history),(human,{input}),MessagesPlaceholder(agent_scratchpad)])self.base_promptbase_prompt# 5. 构建可配置记忆的 Agentagentcreate_tool_calling_agent(self.llm,tools,base_prompt)self.agent_executorAgentExecutor(agentagent,toolstools,memoryself.base_memory,verboseTrue,handle_parsing_errorsTrue,).configurable_fields(memoryConfigurableField(idagent_memory,nameMemory,description可切换的记忆实例))defdetect_emotion(self,text:str)-dict:调用 LLM 分析情绪返回 dictchainemotion_prompt|self.emotion_llm resultchain.invoke({input:text})try:returnjson.loads(result.content)except:return{emotion:neutral,score:5}defget_memory_for_user(self,user_id:str)-ConversationBufferMemory:为特定用户创建独立的 Redis 记忆historyRedisChatMessageHistory(session_iduser_id,urlos.getenv(REDIS_URL,redis://localhost:6379/0))returnConversationBufferMemory(memory_keychat_history,chat_memoryhistory,return_messagesTrue,input_keyinput,output_keyoutput)defrun_agent(self,user_input:str,user_id:strdefault)-str:# 情绪分析emotionself.detect_emotion(user_input)# 根据情绪值动态调整提示词中的状态描述ifemotion[emotion]negativeandemotion[score]8:emotion_state强烈负面请主动将用户诉求创建为高优先级待办else:emotion_statef{emotion[emotion]}(分值{emotion[score]})# 合成带情绪状态的提示词dynamic_promptself.base_prompt.partial(emotion_stateemotion_state)# 重建 agent因为提示词变化需要新 agentfromlangchain.agentsimportcreate_tool_calling_agent agentcreate_tool_calling_agent(self.llm,tools,dynamic_prompt)# 获取用户专属记忆user_memoryself.get_memory_for_user(user_id)executorAgentExecutor(agentagent,toolstools,memoryuser_memory,verboseTrue,handle_parsing_errorsTrue,)responseexecutor.invoke({input:user_input})returnresponse[output]运行效果确保本地 Redis 已启动然后执行cdsrc python dingtalk_hook.py按提示输入user1: 帮我创建一个明天下午3点的会议主题是 AI 进展智能体将调用工具并回复。不同用户 ID 的消息会拥有各自独立的上下文记忆互不干扰。总结本文从零开始带领读者完成了钉钉智能助手项目的资源申请、环境搭建和核心代码编写。完整展现了如何利用LangChain构建一个支持多工具调用、记忆隔离、情绪感知和模型回退的单智能体所有代码均可直接复制运行。下一步你可以继续扩展工具集、接入真实钉钉 Stream 回调或迁移到LangGraph实现更复杂的多智能体协作。

相关新闻

Volar AI扩展跨平台支持现状与技术解析

Volar AI扩展跨平台支持现状与技术解析

1. Volar AI扩展的现状与背景解析Volar作为Vue官方推荐的开发工具,近期推出了AI扩展功能,但当前仅正式支持macOS平台。这一限制让不少Windows和Linux开发者感到困惑。作为长期使用Vue全家桶的全栈开发者,我深入研究了这一现象背后的技术原因和…

2026/10/17 3:46:18 阅读更多 →
OpenMDAO 2025路线图解读:未来多学科优化框架的发展方向

OpenMDAO 2025路线图解读:未来多学科优化框架的发展方向

OpenMDAO 2025路线图解读:未来多学科优化框架的发展方向 【免费下载链接】OpenMDAO OpenMDAO repository. 项目地址: https://gitcode.com/gh_mirrors/op/OpenMDAO OpenMDAO作为一款强大的多学科优化框架,2025年将迎来一系列重要升级。本文将深入…

2026/10/16 15:28:42 阅读更多 →
未来展望:Ketcher路线图与社区贡献完全指南

未来展望:Ketcher路线图与社区贡献完全指南

未来展望:Ketcher路线图与社区贡献完全指南 【免费下载链接】ketcher Web-based molecule sketcher 项目地址: https://gitcode.com/gh_mirrors/ke/ketcher Ketcher作为一款开源的Web分子编辑器,凭借其高性能、良好的可移植性和轻量级特点&#x…

2026/10/16 22:32:40 阅读更多 →

最新新闻

车牌识别技术全解析:从原理到项目落地的完整指南

车牌识别技术全解析:从原理到项目落地的完整指南

1. 从一次小区门口的经历说起前几天傍晚,我开车回小区,刚好赶上晚高峰。门口道闸前排着几辆车,换作以前,这个点多少要堵一阵子——取卡、刷卡、掏手机扫码,每辆车磨叽十几秒,长队就排到了马路上。但那天不一…

2026/10/17 3:45:56 阅读更多 →
大模型训练优化器深度解析:从SGD到AdamW的演进与实战配置

大模型训练优化器深度解析:从SGD到AdamW的演进与实战配置

大模型训练跑到一半 loss 突然发散、把优化器从 Adam 换成 SGD 后收敛反而更慢、同一个模型在不同框架里效果对不上——这些坑我都在实际训练中踩过。排查到最后,十有八九不是网络结构写错了,而是对优化器的理解差了一层。优化器看着就是一行 API 调用&a…

2026/10/17 3:45:56 阅读更多 →
微服务核心技术与实战:注册中心、分布式事务与流量治理解析

微服务核心技术与实战:注册中心、分布式事务与流量治理解析

聊到微服务,很多人第一反应就是一堆“八股文”:注册中心选型、分布式事务、熔断降级、服务拆分原则……背得滚瓜烂熟,但真扔到生产环境,一压测、一故障演练,问题就全暴露出来了。这篇文章不是帮大家背答案,…

2026/10/17 3:45:56 阅读更多 →
错误数据也能加速模型蒸馏?8倍训练效率提升的底层逻辑与实战复现

错误数据也能加速模型蒸馏?8倍训练效率提升的底层逻辑与实战复现

第一次看到这个标题的时候,我是先皱眉再拍大腿的。皱眉是因为“错误数据”这四个字跟咱们平时做数据清洗时“坏样本必须扔掉”的信仰直接对着干;拍大腿是因为细想之后,这件事确实成立,而且底层逻辑比想象中硬核得多。这项来自 202…

2026/10/17 3:45:56 阅读更多 →
CentOS 7部署Flink v1.12实战:流批一体入门与standalone集群搭建

CentOS 7部署Flink v1.12实战:流批一体入门与standalone集群搭建

1. 项目概述:为什么在 CentOS 上部署 Flink v1.12 是一个务实的测试起点 Flink v1.12 是 Apache Flink 历史上一个承前启后的关键版本——它首次将 Blink 引擎完全合并进主干,统一了 SQL 执行层与 DataStream API 的底层运行时;同时正式废弃…

2026/10/17 3:45:56 阅读更多 →
PyTorch模型跨框架部署:ONNX转TensorFlow实战与避坑指南

PyTorch模型跨框架部署:ONNX转TensorFlow实战与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 3:44:56 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →