lang-chain/graph agent 开发库介绍
2026/8/26 15:32:35 网站建设 项目流程

1. LLM

ChatOpenAI

2. Message

fromlangchain_core.messagesimport(AIMessage,BaseMessage,HumanMessage,SystemMessage,ToolMessage,)

3. tool

LangChain 的 Tool 设计其实很直观——工具就是一个注册方法(函数),
写清楚它能干啥, 什么时候用, 由 LLM 来决定具体的调用时机与传参。

2.1 将函数注册为 tool

frompydanticimportBaseModel,Fieldfromlangchain_core.toolsimporttoolclassWeatherInput(BaseModel):city:str=Field(description="城市名称,如'杭州'、'北京'")date:str=Field(description="日期,格式 YYYY-MM-DD")@tool(args_schema=WeatherInput)defget_weather(city:str,date:str)->str:"""查询指定城市指定日期的天气预报。当用户问到天气相关问题时使用。"""# 实际调用天气 APIreturnf"{city}{date}的天气:晴,25°C"

@tool 装饰器会自动提取函数的 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 LLM

TOOLS=[query_weather_by_city,calculator]llm:ChatOpenAI=get_llm()llm_with_tools:Runnable[LanguageModelInput,AIMessage]=llm.bind_tools(TOOLS)messages:list[BaseMessage]=[SystemMessage(content=SYSTEM_PROMPT),HumanMessage(content=question),]resp=llm_with_tools.invoke(messages)forcallinresp.tool_calls:# 并行工具调用:一次响应可能请求多个工具;每个 call 的 id 都必须# 有对应 ToolMessage 回填,否则下一轮请求会被网关 400 拒掉result=_TOOL_MAP[call["name"]].invoke(call["args"])messages.append(ToolMessage(content=json.dumps(result,ensure_ascii=False),tool_call_id=call["id"],))

skill

skill 是 知识注入 和 工具关联.
自己开发 agent时, 如何实现像 cc 那样自动加载.claude/skills目录 这样的效果呢?
Q:langchain 中有没有 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-reviewer"""returnskills.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 工具加载具体技能指令。"}

参考

  1. my blog, Python 装饰器 decorator

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询