
1. LLMChatOpenAI2. Messagefromlangchain_core.messagesimport(AIMessage,BaseMessage,HumanMessage,SystemMessage,ToolMessage,)3. toolLangChain 的 Tool 设计其实很直观——工具就是一个注册方法(函数),写清楚它能干啥, 什么时候用, 由 LLM 来决定具体的调用时机与传参。2.1 将函数注册为 toolfrompydanticimportBaseModel,Fieldfromlangchain_core.toolsimporttoolclassWeatherInput(BaseModel):city:strField(description城市名称如杭州、北京)date:strField(description日期格式 YYYY-MM-DD)tool(args_schemaWeatherInput)defget_weather(city:str,date:str)-str:查询指定城市指定日期的天气预报。当用户问到天气相关问题时使用。# 实际调用天气 APIreturnf{city}{date}的天气晴25°Ctool 装饰器会自动提取函数的 docstring 和 签名, LLM 看到的是这样一段描述工具名: get_weather描述: 查询指定城市指定日期的天气预报。当用户问到天气相关问题时使用。参数: { city: string(城市名称), date: string(日期) }LLM 根据这段描述判断用户在问天气我该调用这个工具然后生成 {“city”: “杭州”, “date”: “2026-08-19”} 作为参数。tool 装饰器源码, 详见参考 [1] 中的 lang-chain tool 定义章节. 核心逻辑就是装饰器拿到原函数 → 用 inspect 提取名字、docstring、参数类型 → 返回一个包装后的 Tool 对象。2.2 bind to LLMTOOLS[query_weather_by_city,calculator]llm:ChatOpenAIget_llm()llm_with_tools:Runnable[LanguageModelInput,AIMessage]llm.bind_tools(TOOLS)messages:list[BaseMessage][SystemMessage(contentSYSTEM_PROMPT),HumanMessage(contentquestion),]respllm_with_tools.invoke(messages)forcallinresp.tool_calls:# 并行工具调用一次响应可能请求多个工具每个 call 的 id 都必须# 有对应 ToolMessage 回填否则下一轮请求会被网关 400 拒掉result_TOOL_MAP[call[name]].invoke(call[args])messages.append(ToolMessage(contentjson.dumps(result,ensure_asciiFalse),tool_call_idcall[id],))skillskill 是 知识注入 和 工具关联.自己开发 agent时, 如何实现像 cc 那样自动加载.claude/skills目录 这样的效果呢?Qlangchain 中有没有 skill 这个 预定义的 class, 来应对 这个 场景?A没有.实现 Skill 加载器在 Agent loop 里注入 Skill. 在每次构建上下文时根据用户意图选择合适的 Skill 注入.Deep Agents Skills如果你要从零搭 Agent用 Deep Agents 的 create_deep_agent FilesystemBackend 是最省事的基本就是 CC Skills 的开源复刻版注入 prompt# 1. 定义 Skill 字典skills{sql-expert: # SQL 专家规则 你是一个 SQL 专家遵循以下规范 - 所有查询必须加 LIMIT - 生产环境禁止 DELETE 不带 WHERE ,code-reviewer: # 代码审查规则 ... ,}# 2. 用一个 tool 做按需加载tooldefload_skill(name:str)-str:加载指定技能的完整指令。name 参数可选值sql-expert, code-reviewerreturnskills.get(name,f未知技能可选值{list(skills.keys())})# 3. 用 middleware 注入初始摘要fromlangchain.agents.middlewareimportAgentMiddlewareclassSkillMiddleware(AgentMiddleware):defbefore_model(self,state,runtime):# 只在 system prompt 里列出可用 Skill 名称skill_list\n.join(f-{k}forkinskills)return{system_prompt:f可用技能\n{skill_list}\n使用 load_skill 工具加载具体技能指令。}参考my blog, Python 装饰器 decorator