ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

AI Agent白手起家50: 使用 LangChain 构建钉钉智能助手实战

2026/8/10 3:18:49 拓冰建站 浏览量
AI Agent白手起家50: 使用 LangChain 构建钉钉智能助手实战 纲要项目概览基于 LangChain 的单智能体“小浪助手”核心能力拆解RAG知识库问答钉钉日程与待办管理多轮对话与上下文记忆情绪检测与动态优先级调整系统架构前端钉钉机器人调度层LangChainAgent工具集知识库检索、在线搜索、钉钉 API记忆系统基于Redis的长短期记忆模型大语言模型LLM生成与意图识别单智能体概念与 LangChain 实现要点实战代码详解项目结构工具定义Tool封装记忆组件RedisChatMessageHistoryAgent 构建与执行流程情绪检测链完整可运行示例总结与相关度说明项目概览我们要构建的是一个名为“小浪助手”的单智能体它通过钉钉机器人对外提供服务核心功能包括基于RAG的专业知识问答自然语言驱动的日程安排与待办管理多轮对话能力能记住上下文实时检测用户情绪根据负面程度自动创建高优先级待办所有逻辑都使用 LangChain 编排工具调用由 LLM 自主决策记忆系统持久化在 Redis 中。核心概念与架构什么是单智能体在 AI 应用语境中智能体是一个能够感知环境、自主使用工具并做出决策的程序。单智能体指整个系统中只有一个决策中心它根据用户输入决定调用哪些工具、如何回应而多智能体则涉及多个协作或竞争的决策单元。本案例集中展示单智能体的设计、工具集成与记忆管理。系统架构用户通过钉钉发送消息钉钉机器人 WebhookLangChain Agent 入口情绪检测链意图识别工具调度知识库检索 向量数据库在线搜索钉钉 API 日程/待办Redis 记忆存储多轮对话上下文大语言模型生成最终回复架构分为输入、智能体决策、工具执行和记忆四个层次。用户消息进入后Agent 先分析情绪和意图再决定调用哪些工具工具返回结果后结合记忆与 LLM 生成回答。技术选型与关键模块模块技术/工具智能体框架LangChain大模型OpenAI / 兼容接口的 LLM知识库文档加载 → 文本分割 → 向量嵌入 → 向量数据库Chroma / FAISS记忆Redis (RedisChatMessageHistory)在线搜索搜索引擎 API 封装为 Tool钉钉 API钉钉开放平台 SDK封装日程、待办调用情绪检测基于 LLM 的链输出情绪标签和分值实战代码项目结构langchain-dingtalk-agent/ ├── agent.py # 主程序Agent 定义与启动 ├── tools/ │ ├── dingtalk.py # 钉钉日程、待办工具 │ ├── knowledge.py # RAG 知识库检索 │ └── search.py # 在线搜索工具 ├── chains/ │ └── emotion.py # 情绪检测链 ├── memory/ │ └── redis_memory.py # Redis 记忆配置 ├── config.py # 环境变量与密钥 └── requirements.txt依赖安装pipinstalllangchain langchain-openai langchain-community redis chromadb tiktoken python-dotenv配置文件config.pyimportosfromdotenvimportload_dotenv load_dotenv()OPENAI_API_KEYos.getenv(OPENAI_API_KEY)REDIS_URLos.getenv(REDIS_URL,redis://localhost:6379/0)DINGTALK_APP_KEYos.getenv(DINGTALK_APP_KEY)DINGTALK_APP_SECRETos.getenv(DINGTALK_APP_SECRET)记忆组件memory/redis_memory.pyfromlangchain_community.chat_message_historiesimportRedisChatMessageHistoryfromlangchain.memoryimportConversationBufferMemoryfromconfigimportREDIS_URLdefget_memory(session_id:str)-ConversationBufferMemory:为每个会话创建独立的 Redis 记忆historyRedisChatMessageHistory(session_idsession_id,urlREDIS_URL,)returnConversationBufferMemory(memory_keychat_history,chat_memoryhistory,return_messagesTrue,)工具定义钉钉工具tools/dingtalk.pyfromlangchain.toolsimporttoolimportrequestsfromconfigimportDINGTALK_APP_KEY,DINGTALK_APP_SECRETdefget_access_token():# 钉钉获取 access_token示例实现resprequests.get(https://oapi.dingtalk.com/gettoken,params{appkey:DINGTALK_APP_KEY,appsecret:DINGTALK_APP_SECRET},)returnresp.json().get(access_token)tooldefcreate_calendar_event(summary:str,start_time:str,end_time:str)-str:在钉钉日历中创建事件。参数 summary: 事件标题, start_time: ISO 格式开始时间, end_time: ISO 格式结束时间。tokenget_access_token()# 调用钉钉日历创建 API示例使用预留接口# 实际需使用钉钉日程接口 https://open.dingtalk.com/document/orgapp/create-calendar-eventreturnf已成功创建日程{summary}时间{start_time}至{end_time}tooldefcreate_task(content:str,priority:strnormal)-str:创建钉钉待办。参数 content: 待办内容, priority: 优先级 low/medium/high。tokenget_access_token()# 调用钉钉待办创建 APIreturnf已创建待办{content}优先级{priority}知识库工具tools/knowledge.pyfromlangchain.toolsimporttoolfromlangchain_community.vectorstoresimportChromafromlangchain_openaiimportOpenAIEmbeddingsfromconfigimportOPENAI_API_KEY# 假设向量数据库已预先构建存于 ./chroma_dbvectorstoreChroma(persist_directory./chroma_db,embedding_functionOpenAIEmbeddings(openai_api_keyOPENAI_API_KEY))tooldefsearch_knowledge_base(query:str)-str:搜索专业知识库传入用户问题返回相关文档片段。docsvectorstore.similarity_search(query,k3)ifnotdocs:return知识库中未找到相关信息。return\n\n.join([d.page_contentfordindocs])在线搜索工具tools/search.pyfromlangchain.toolsimporttoolfromlangchain_community.utilitiesimportSerpAPIWrapperimportostooldefweb_search(query:str)-str:在线搜索最新信息返回搜索摘要。searchSerpAPIWrapper(serpapi_api_keyos.getenv(SERPAPI_API_KEY))returnsearch.run(query)情绪检测链chains/emotion.pyfromlangchain_openaiimportChatOpenAIfromlangchain.chainsimportLLMChainfromlangchain.promptsimportPromptTemplateimportjson emotion_promptPromptTemplate(input_variables[user_input],template分析以下用户消息的情绪返回 JSON 格式 {{emotion: positive/neutral/negative, score: 0-10}}。 消息{user_input} JSON:)defdetect_emotion(user_input:str)-dict:llmChatOpenAI(modelgpt-3.5-turbo,temperature0)chainemotion_prompt|llm resultchain.invoke({user_input:user_input})try:returnjson.loads(result.content)except:return{emotion:neutral,score:5}Agent 主程序agent.pyimportosfromlangchain_openaiimportChatOpenAIfromlangchain.agentsimportAgentExecutor,create_openai_tools_agentfromlangchain.promptsimportChatPromptTemplate,MessagesPlaceholderfromtools.dingtalkimportcreate_calendar_event,create_taskfromtools.knowledgeimportsearch_knowledge_basefromtools.searchimportweb_searchfromchains.emotionimportdetect_emotionfrommemory.redis_memoryimportget_memoryfromconfigimportOPENAI_API_KEY# 1. 工具列表tools[create_calendar_event,create_task,search_knowledge_base,web_search]# 2. LLM 实例llmChatOpenAI(modelgpt-4,temperature0,openai_api_keyOPENAI_API_KEY)# 3. 系统提示词system_prompt你是小浪助手一个钉钉智能客服。你可以 - 回答关于产品的专业知识调用知识库 - 搜索最新信息调用在线搜索 - 管理用户的钉钉日程和待办 请友好、专业地回应用户。如果检测到用户情绪非常负面score 8主动将用户当前诉求创建为高优先级待办。promptChatPromptTemplate.from_messages([(system,system_prompt),MessagesPlaceholder(chat_history,optionalTrue),(human,{input}),MessagesPlaceholder(agent_scratchpad),])# 4. 构建 Agentagentcreate_openai_tools_agent(llm,tools,prompt)# 5. 模拟执行函数实际可接入钉钉 Webhookdefprocess_message(user_input:str,session_id:strdefault)-str:# 情绪检测emotion_resultdetect_emotion(user_input)# 如果负面情绪高自动追加创建待办的意图ifemotion_result[emotion]negativeandemotion_result[score]8:# 将需求描述直接传给 create_task 工具让 Agent 自己决策调用# 我们可以在提示里做引导这里简单修改输入user_input\n系统检测到强烈负面情绪请主动将相关诉求创建为高优先级待办memoryget_memory(session_id)agent_executorAgentExecutor(agentagent,toolstools,memorymemory,verboseTrue,handle_parsing_errorsTrue,)responseagent_executor.invoke({input:user_input})returnresponse[output]# 示例运行if__name____main__:# 模拟多轮对话sessionuser_123print(小浪助手,process_message(帮我预定后天上午10点的会议室主题是智能体技术讨论,session))print(小浪助手,process_message(我想起来后天早上有事相关的安排调整一下吧,session))print(小浪助手,process_message(算了我特别生气你们产品太难用了,session))运行说明准备环境变量文件.env填入OPENAI_API_KEY、REDIS_URL、SERPAPI_API_KEY及钉钉凭证。确保本地 Redis 服务已启动并事先构建好知识库向量数据库存于./chroma_db。运行python agent.py即可看到控制台输出。实际接入钉钉时将process_message作为 Webhook 处理函数即可。多轮对话的实现在 LangChain 中通过在 AgentExecutor 里注入memory即可实现上下文记录。这里使用ConversationBufferMemory配合RedisChatMessageHistory使会话历史在服务重启后依然保留。每次调用时传入相同的session_idAgent 就能读取之前的对话从而理解“相关的安排”这类指代。情绪检测与自动待办情绪检测链利用 LLM 输出结构化 JSON解析出情感倾向和分值。当负面分值达到阈值时主流程在原输入尾部追加提示引导 Agent 调用create_task工具。这种方式保持了 Agent 的自主决策能力同时又可植入业务规则。总结本博客基于“小浪助手”单智能体实战内容完整复现了一个使用 LangChain 构建的钉钉智能助手涵盖了架构设计、工具开发、记忆集成、情绪检测和可运行代码。读者可依据此模板快速扩展到多智能体或更多业务工具。