LangChain 入门 Tools 工具


模型(Model)是Agent的大脑,负责推理分析。而工具(Tools)则是Agent的手脚,负责执行任务,与外界交互。
image
一个完整的 Agent 至少要包含两个关键的部分:

  • 模型: 是 Agent 的大脑,负责推理、分析、规划任务步骤
  • 工具: 是 Agent 的手脚,负责执行任务,与外界交互

因此,定义带有工具的 Agent 的基本流程如下:

自定义工具

所谓的工具(Tools),本质就是一个可调用的函数,但是这个函数不是我们自己去调用,而是给模型调用。因此除了定义函数外,我们还需要清晰描述这个工具,让模型知道这个工具如何使用。包括下列信息:

  • 工具名
  • 工具的作用
  • 工具需要的参数

基于 Tool 描述工具【不推荐】

在 LangChain 中定义工具需要用到 @tool 装饰器,我们可以通过装饰器来定义工具名、工具的作用:

from langchain_core.tools import tool

@tool("square_root",descritpin="计算值平方根")
def square(x: float) -> float:
    return x ** 0.5

使用函数名和文档注释描述工具【推荐】

如果不@tool装饰器,没有定义工具名和作用描述,此时:

  • 工具名:默认就是函数名
  • 工具所需参数:默认就是函数的参数列表
  • 工具作用的描述:默认就是函数的文档注释
from langchain_core.tools import tool

@tool
def square_root(x: float) -> float:
    """计算值平方根"""
    return x ** 0.5

多参数

from langchain_core.tools import tool

@tool
def get_weather(location:str, units: str = "celsius", include_forecast: bool = False) -> str:
    """
    Get current weather and optional forecast.
    Args:
        location: city name or coordinates
        units: unit of degress
        include_forecast:dose it include the weather forecast
    """
    temp = 22 if units == "celsius" else 72
    result = f"Current weather in {location}:{temp} degrees {units[0].upper{}}"
    if include_forecast:
        result += "\Next 5 days: Sunny"
    return result

定义 Pydantic Model 描述参数

如果参数多了以后,上面的描述不太方便
如果函数的参数比较多,而且比较复杂,此时建议通过 pydantic model 来描述参数列表。

# 通过自定义 model 来约束入参
from pydantic import BaseModel, Field
from typing import Literal

# 例如一个查询天气的 tool
class WeatherInput(BaseModel):
    """查询天气的输入参数"""
    location: str = Field(description="City name or coordinates")
    units: Literal["celsius","fahrenheit"] = Field(
        default="celsius",
        description="Temperature unit preference"
    )
    include_forecast: bool = Field(
        default=False,
        description="Include 5-day forecast"
    )

@tool(args_schema=WeatherInput)
def get_weather(location:str, units: str = "celsius", include_forecast: bool = False) -> str:
    """
    Get current weather and optional forecast
    """
    temp = 22 if units == "celsius" else 72
    result = f"Current weather in {location}:{temp} degrees {units[0].upper()}"
    if include_forecast:
        result += "\nNext 5 days: Sunny"
    return result

工具调用方法

square_root.invoke({"x":467})

get_weather.invoke({"location":"杭州","include_forecast":False})

完整代码

from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain.tools import tool
from dotenv import load_dotenv
import os
from pydantic import BaseModel, Field
from typing import Literal
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage

# 加载环境变更值
load_dotenv()



# 例如一个查询天气的 tool
class WeatherInput(BaseModel):
    """查询天气的输入参数"""
    location: str = Field(description="City name or coordinates")
    units: Literal["celsius","fahrenheit"] = Field(
        default="celsius",
        description="Temperature unit preference"
    )
    include_forecast: bool = Field(
        default=False,
        description="Include 5-day forecast"
    )

@tool(args_schema=WeatherInput)
def get_weather(location:str, units: str = "celsius", include_forecast: bool = False) -> str:
    """
    Get current weather and optional forecast
    """
    temp = 22 if units == "celsius" else 72
    result = f"Current weather in {location}:{temp} degrees {units[0].upper()}"
    if include_forecast:
        result += "\nNext 5 days: Sunny"
    return result

@tool
def square_root(x: float) -> float:
    """计算值平方根"""
    return x ** 0.5

# 获取环境变更值
base_url = os.getenv("DASHSCOPE_BASE_URL")
api_key = os.getenv("DASHSCOPE_API_KEY")

print("初始化模型")
# 初始化模型
model = init_chat_model(
    model = "qwen3.6-plus",
    model_provider="openai", # 指定模型提供者(阿里兼容 openai)
    base_url = base_url,
    api_key = api_key,
    temperature = 1.5,
    top_p = 0.9,
)


# 创建 agent
agent = create_agent(
    model=model,  # 不需要加 "openai:" 前缀
    tools=[get_weather,square_root],
)

# 测试 get_weather 工具
messages = agent.stream(
    {"messages": [HumanMessage(content="苏州接下来几天的天气如何?")]}, # 模型会根据用户的输入进行智能选择工具
    stream_mode="messages"
)

for token, metadata in messages:
    if token.content:
        print(token.content, end="", flush=True)

# 测试 square_root 工具
response = agent.invoke(
    {"messages": [HumanMessage(content="467和529的平方根是多少?")]} # 模型会根据用户的输入进行智能选择工具
)

for message in response['messages']:
    print(message.pretty_print())

返回内容

D:\OpenSource\Python\VipLangChain\.venv\Scripts\python.exe D:\OpenSource\Python\VipLangChain\tools.py 
初始化模型
Current weather in 苏州:22 degrees C
Next 5 days: SunnyCurrent weather in 苏州:22 degrees C
Next 5 days: Sunny根据最新天气预报,苏州目前的气温是 **22°C**。接下来的5天天气预报均为**晴天**。
================================ Human Message =================================

467和529的平方根是多少?
None
================================== Ai Message ==================================
Tool Calls:
  square_root (call_c92492e390ef49f382c2f270)
 Call ID: call_c92492e390ef49f382c2f270
  Args:
    x: 467
  square_root (call_6cb8193b9bc9400ba9c5f239)
 Call ID: call_6cb8193b9bc9400ba9c5f239
  Args:
    x: 529
None
================================= Tool Message =================================
Name: square_root

21.61018278497431
None
================================= Tool Message =================================
Name: square_root

23.0
None
================================== Ai Message ==================================

467的平方根约为 **21.61**(精确值约 21.61018)
529的平方根正好是 **23**
None

Process finished with exit code 0

image

预定义工具

https://docs.langchain.com/oss/python/integrations/tools
image

示例

Tavily search integration
让你的智能体能够联网

  • 注册API KEY
    https://www.tavily.com/
    image
  • 配置环境变更:.env 文件中增加 TAVILY_API_KEY
  • 安装依赖:uv add langchain-tavily

.env

# tavily.com
TAVILY_API_KEY=tvly-dev-XXX

# 使用 tavily 作为 Web 搜索工具
from dotenv import load_dotenv

# 加载环境变更值
load_dotenv()
 
from langchain_tavily import TavilySearch

search_tool = TavilySearch(
    max_results=5,
    topic="general",
    # include_answer=False,
    # include_raw_content=False,
    # include_images=False,
    # include_image_descriptions=False,
    # search_depth="basic",
    # time_range="day",
    # include_domains=None,
    # exclude_domains=None
)

response = search_tool.invoke("陈式太极拳")

print(response)
D:\OpenSource\Python\VipLangChain\.venv\Scripts\python.exe D:\OpenSource\Python\VipLangChain\tools_search.py 
{'query': '陈式太极拳', 'follow_up_questions': None, 'answer': None, 'images': [], 'results': [{'url': 'https://baike.baidu.com/item/%E9%99%88%E6%B0%8F%E5%A4%AA%E6%9E%81%E6%8B%B3/359628', 'title': '陈氏太极拳', 'content': '陈氏太极拳(chen style tai chi),明末清初陈王庭创编的拳种,是集技击、强体、健身、益智和修性为一体的独特运动方式,将阴阳、动静、正反、有无、形神等对立统一的内容', 'score': 0.8861155, 'raw_content': None}, {'url': 'https://zh.wikipedia.org/zh-hans/%E9%99%B3%E6%B0%8F%E5%A4%AA%E6%A5%B5%E6%8B%B3', 'title': '陈氏太极拳 - 维基百科', 'content': '陈氏太极拳,发源于河南省焦作,是太极拳的一个重要分支和流派,原为陈家沟拳术,集长拳、炮拳及红拳之术,有关陈氏太极拳的起源说法不一,而陈氏则坚持“陈氏太极拳”是当今各', 'score': 0.8591094, 'raw_content': None}, {'url': 'https://philcheung.com/TaiChi/Chan/OF18.htm', 'title': '陳式太極拳精要十八式', 'content': '陳式太極拳源自河南溫縣陳家溝。據載明末武將陳王庭晚年隱居造拳而創。後來陳氏家族世代相傳﹐ 不斷提煉成為一種健身和技擊﹑內外兼收的拳術。 陳式太極拳盛譽數百年﹑名家', 'score': 0.76992935, 'raw_content': None}, {'url': 'https://www.youtube.com/watch?v=1AbmcKn1Amc', 'title': 'Chen style Tai Chi Freestyle 陈氏太极', 'content': 'Master Bao demonstrating a Chen-style Tai Chi routine which he had choreographed. The routine alternates between slow and fast movements,', 'score': 0.68748367, 'raw_content': None}, {'url': 'http://jp-chentaiji.net', 'title': '陳氏太極拳協会', 'content': '陳氏太極拳とは. 太極拳の誕生についていろいろな説がありますが、陳氏の始祖陳卜(650年前)が太極拳を創出したと言われています。', 'score': 0.6760432, 'raw_content': None}], 'response_time': 1.01, 'request_id': 'f237055f-01a3-41d0-ab00-6bffec88964d'}

Process finished with exit code 0 

智能体的方式调用

如果没有使用工具,将根据模型的训练数据回答

import os
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from dotenv import load_dotenv
from langchain_tavily import TavilySearch
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage


# 加载环境变更值
load_dotenv()



# 获取环境变更值
base_url = os.getenv("DASHSCOPE_BASE_URL")
api_key = os.getenv("DASHSCOPE_API_KEY")

print("初始化模型")
# 初始化模型
model = init_chat_model(
    model = "qwen3.6-plus",
    model_provider="openai", # 指定模型提供者(阿里兼容 openai)
    base_url = base_url,
    api_key = api_key,
    temperature = 1.5,
    top_p = 0.9,
)

search_tool = TavilySearch(
    max_results=5,
    topic="general",
    # include_answer=False,
    # include_raw_content=False,
    # include_images=False,
    # include_image_descriptions=False,
    # search_depth="basic",
    # time_range="day",
    # include_domains=None,
    # exclude_domains=None
)

# response = search_tool.invoke("陈式太极拳")
# print(response)


# 创建 agent
agent = create_agent(
    model=model, 
    tools=[search_tool],
    system_prompt="你是一个智能助手,你使用工具来解决用户问题"
)


response = agent.invoke(
    {"messages": [HumanMessage(content="陈式太极拳")], "tools": [search_tool]}
)


for message in response['messages']:
    print(message.pretty_print())

输出


D:\OpenSource\Python\VipLangChain\.venv\Scripts\python.exe D:\OpenSource\Python\VipLangChain\tools_search.py 
初始化模型
================================ Human Message =================================

陈式太极拳
None
================================== Ai Message ==================================
Tool Calls:
  tavily_search (call_744ff20e82854219972ce920)
 Call ID: call_744ff20e82854219972ce920
  Args:
    query: 陈式太极拳
    search_depth: basic
    topic: general
None
================================= Tool Message =================================
Name: tavily_search

{"query": "陈式太极拳", "follow_up_questions": null, "answer": null, "images": [], "results": [{"url": "https://zh.wikipedia.org/zh-hans/%E9%99%B3%E6%B0%8F%E5%A4%AA%E6%A5%B5%E6%8B%B3", "title": "陈氏太极拳 - 维基百科,自由的百科全书", "content": "## 目录. # 陈氏太极拳. * Čeština \"Čchen (styl tchaj-ťi) – 捷克语\"). | 此条目之**中立性有争议**。其内容、语调可能**带有明显的个人观点或地方色彩。** *(2013年12月9日)* 加上此模板的编辑者需在讨论页说明此文中立性有争议的原因,以便让各编辑者讨论和改善。在编辑之前请务必察看讨论页。 |. | 此条目**需要补充更多来源**。 *(2013年2月13日)* 请协助补充多方面可靠来源以改善这篇条目,无法查证的内容可能会因为异议提出而被移除。 致使用者:请搜索一下条目的标题(来源搜索:\"陈氏太极拳\" — 网页、新闻、书籍、学术、图像),以检查网络上是否存在该主题的更多可靠来源(判定指引)。 |. **陈氏太极拳**,发源于河南省焦作,是太极拳的一个重要分支和流派,原为陈家沟拳术,集长拳、炮拳及红拳之术,有关陈氏太极拳的起源说法不一,而陈氏则坚持“陈氏太极拳”是当今各家太极拳的始祖。. 根据武术史家唐豪 \"唐豪 (1896年)\")考证,**陈家沟拳术**是源自明末清初河南省温县陈家沟人陈王廷(约1600年-1680年),此后世代相传,有传子不传女之说。故而,外人不得窥其貌,更难知其髓。一直到陈长兴(1771-1853)传拳与河北广平府(今邯郸永年)杨露禅(1799年-1872年)后,“**陈家沟拳术**”才被世人所见。唐豪进一步推断,“**陈家沟拳术**”渐次衍变为当今之“**陈氏太极拳**”。但据杨氏、吴氏等其他太极名门的历史传承记载,陈长兴的太极拳实乃蒋发所传,但这些记载均无确切根据。. 陈氏太极拳有大、小架之分,亦有新、老架之别。其它套路还包括器械和对练等等。. 此二套路属大架系列,为陈氏十四世陈长兴在家传的拳架中所总结与编排的。老架以缠丝为轴心,贯穿于整个套路。古朴而无花架势。一路拳以柔为主。主要练习并建立起陈氏太极拳的功底。因此也有人称一路拳为基础拳,练功拳。有了一定的一路拳功底,再近一步学习二路拳。二路拳,亦称炮捶,以刚为主。尤其突出太极八门劲的四隅劲:采、列、肘、靠。有了一路拳的松,二路拳的松活弹抖就能更好地发挥出来。. 此套路原被称为新架。在陈发科所编之套路流传之后,此套路逐称为小架。小架为陈氏十四世陈有本所创。此套路除去劲发于外的动作,把劲路涵于套路当中,蓄而待发。整套拳打起来温文尔雅,有儒者之风范。. 此二套路属大架系列,为陈氏十七世陈发科由老架编排而成,经其子陈照奎定型为新架。新架尤其突出缠丝螺旋的动作。在套路上以松活弹抖,节节贯穿,胸腰运化,转关折叠等特点独树一帜。. 陈氏太极也包含了许多器械套路,主要包括:单剑、双剑、单刀、双刀、双锏、枪、大刀、杆等等。. 陈氏太极剑的的传统套路共五十八个动作,剑法多样,有劈、刺、撩、挂;点、崩、云、架;穿、提、扫、抹;带、斩、截、托等。其特点是刚柔相济,快慢相间,以身带剑,灵活多变;运动路线缠绵曲折,风格别致,有很高的强身健体的价值。. 潘咏周、王鹤林、王梦弼、三位老师,传承陈发科先生的老架,其拳架柔和内敛,其中又以潘咏周的弟子较多,影响力超过其他两位老师。. 台中有两位陈氏传人,一位是谢栋梁老师,传承以陈正雷体系之陈氏太极拳为主(包含:老架一二路、新架一二路、刀枪剑棍及大刀、五种推手套路及实战),另外亦传陈小旺体系38式。另一位则以江弦苍老师于传承潘咏周体系之陈氏太极拳老架一路与炮捶二路为主。 台南李章仁老师于传承杜毓泽体系之陈氏太极拳为主并传承特有太极长拳,大肆套,小红炮等陈氏少见或失传拳种。 台南则以吴木村老师于传承陈正雷体系之陈氏太极拳为主。 现今亦有陈发科嫡孙当代陈氏太极拳掌门人陈小旺体系之太极拳在台湾传拳。. ## 陈家沟四大金刚. 陈氏第十八世陈照丕和陈照奎所授之弟子众多。其中,以陈家沟四位:陈小旺、陈正雷、王西安,朱天才均为近代大架之代表人物。. 同代十八世陈克忠,陈克第也培养了许多小架代表。如陈伯先、陈伯祥、陈清环、陈俊凌、陈六有等。. * 沈家桢 顾留馨,《陈式太极拳 \"陈式太极拳 (书)\")》,台北:大展出版社. * 潘咏周,《陈氏太极拳大全》,台北:太极拳陈氏分会,初版. | 历史 | * 二里头文化 * 仰韶文化 * 河南龙山文化 * 河南历史 |. | 语言 | * 中原官话 * 河南话 * 郑州话 * 洛阳话 * 徐州话 * 蚌埠话 |. | 世界文化遗产 | * 龙门石窟 * 登封“天地之中”历史建筑群 * 殷墟 |. * 太极拳 (人类非物质文化遗产代表作) \"Category:太極拳 (人類非物質文化遺產代表作)\").", "score": 0.89720124, "raw_content": null}, {"url": "https://baike.baidu.com/item/%E9%99%88%E6%B0%8F%E5%A4%AA%E6%9E%81%E6%8B%B3/359628", "title": "陈氏太极拳", "content": "陈氏太极拳(chen style tai chi),明末清初陈王庭创编的拳种,是集技击、强体、健身、益智和修性为一体的独特运动方式,将阴阳、动静、正反、有无、形神等对立统一的内容", "score": 0.8861155, "raw_content": null}, {"url": "https://www.youtube.com/watch?v=1AbmcKn1Amc", "title": "Chen style Tai Chi Freestyle 陈氏太极", "content": "Master Bao demonstrating a Chen-style Tai Chi routine which he had choreographed. The routine alternates between slow and fast movements,", "score": 0.68748367, "raw_content": null}, {"url": "https://www.youtube.com/watch?v=TjuCpN-xcZg", "title": "Chen Style Tai Chi 陈氏太极拳", "content": "Chen Style Tai Chi 陈氏太极拳. 28K views · 2 years ago. #taichi ... 陈氏太极老架一路74 (背面) -Part 1. David Bao (暴一宏)•67K views · 25:33.", "score": 0.6580885, "raw_content": null}, {"url": "https://philcheung.com/TaiChi/Chan/OF18.htm", "title": "Chan's Tai Chi Old Flrame 18 Form", "content": "| Yin Yang | **ӷ nQK**    Chen Style Tai Chi Chuan, The 18 Form | Return    ^W |. | [ӷ            mq | **Mۦ**     1N\\_ Opening Tai Chi  2NoP Buddha's Attendant Pounds The Mortar  3Ni Lazy About Tying The Coat  4Nʥ| Six Sealing And Four Closing  5N@ Single Whip  6NbG The White Crane Spreads It's Wings    7Nצ Walk Forward Diagonally  8NO Brush Knee  9NB Three Steps Forward  10Nд Hidden Fist Punch  11N High Pat On the Horse  12Nޤ@ Side Kick With Left Heel    13Nɤk The Jade Lady Works At Shuttles  14N Wave Hands  15N ਭ\\ Turn Body with Double Lotus Kick  16NY The Cannon Fists  17NoP Buddha's Attendant Pounds The Mortar  18N Closing | **Mܽd/t**       zLHU (YouTube) iѦ/Y೯ӷnQK ʧ@R       A) ӷnQK - p (sЪ)    B) ӷnQK-I    C) aQKӷ- i    D) ӷnQK - ѥܽd    E) 18 Form with English narrative: Part I     F) 18 Form with English narrative:   Part II            G) s[@ -  (The Tai Chi Kid)             H) ӷnQK (GZt) |.", "score": 0.64880073, "raw_content": null}], "response_time": 1.45, "request_id": "11b9eb37-5745-4a39-ab4a-0974e5bc96e1"}
None
================================== Ai Message ==================================
Tool Calls:
  tavily_search (call_1fdfc002c1f4497682a285be)
 Call ID: call_1fdfc002c1f4497682a285be
  Args:
    query: 陈式太极拳特点 套路 分类 传承人
    search_depth: advanced
    topic: general
None
================================= Tool Message =================================
Name: tavily_search

{"query": "陈式太极拳特点 套路 分类 传承人", "follow_up_questions": null, "answer": null, "images": [], "results": [{"url": "https://www.cssn.cn/dfpd/dh/202506/t20250619_5882232.shtml", "title": "陈氏太极拳第十一代嫡宗传人:太极拳——中国文化和哲学之所在-中国社会科学网", "content": "《中国社会科学报》:陈氏太极拳分为老架、新架和器械(刀、枪、剑、棍等),您能否介绍一下这三者间的联系和区别?\n\n陈正雷:整体而言,陈氏太极拳老架一路拳以柔为主,柔中有刚;二路拳以刚为主,刚中有柔。两路拳相辅相成,互为其根,直至达到刚柔相济,浑然一圆。\n\n  陈氏太极拳新架,其特点是架式宽大,低沉稳重。拳架以“掤捋挤按”四正手的运用为主,以“采挒肘靠”四隅手的运用为辅;以柔化劲为主,发劲为辅,柔中寓刚,力求柔顺。外形以缓柔稳为主,疾刚跳跃为辅。运劲方法要求以身领手,突出螺旋缠丝劲的练习,以腰为轴,旋腕转膀,旋腰转脊,旋踝转膝,胸腰折迭,形成一系列的空间曲线运动。\n\n  陈氏太极拳老架一路、二路(又名炮捶)由温县陈家沟人陈氏十四世陈长兴在祖传拳架套路的基础上将太极拳套路由博归约、精炼归纳而成,后人称其为陈氏太极拳老架(亦称大架)。陈氏太极拳新架一、二路属陈长兴传统老架系列,则由十七世祖陈发科先师所创,陈发科晚年于北京传拳时,在老架的基础上,经过无数次的实战后总结整理而成。\n\n  无论是短器械、长器械、双器械、单器械、轻器械、重器械,它都是练习手、眼、身法、步法协调的一种方法,等于把手臂加长,而且还要能跟身法相结合,把内气贯到器械的锋刃上。它还得靠基本功,你练太极拳,身体协调了,内劲充实了,然后把手臂加长,照样还能协调一致。\n\n《中国社会科学报》:太极拳有五大流派——陈、杨、武、吴和孙,据说其他四大流派都是从陈氏太极拳演变而来的,其过程如何?几大流派间又有何区别? [...] 陈正雷:关于陈氏太极拳的源流如前所述,为免受地方匪盗危害,精通拳械的陈氏始祖陈卜在村中设立武学社,传授子孙习拳练武。明末清初,九世祖陈王廷系明末文庠生、清初武庠生,文武双全,曾只身闯玉带山,劲阻登封武举李际遇叛乱,为清廷在山东平定盗匪立过战功,在河南、山东负有盛名却不为清廷重用。陈王廷报国无门,收心隐退,在耕作之余,依据自己祖传之一百单八式长拳,博采众家精华,创造出了一套阴阳相合、刚柔相济的新型拳术——太极拳(包括太极拳五路、炮捶一路、双人推手及刀、枪、棍、剑、锏、双人粘枪等器械套路等),即陈氏太极拳。\n\n  清道光年间,十四世祖陈长兴拳艺高超,编著太极拳十大要注、太极拳点头篇、太极拳用武要言。。  \n  第六大要領 以意行氣", "score": 0.39978877, "raw_content": null}], "response_time": 1.51, "request_id": "f12e8806-5eb7-4890-a189-e63b40ff4054"}
None
================================== Ai Message ==================================

### 陈式太极拳(Chen-style Tai Chi)

**陈式太极拳**是五大太极拳流派(陈、杨、武、吴、孙)中的**创始流派**,也是最早形成系统套路的太极拳种。它以刚柔相济、快慢相间、螺旋缠绕的独特风格著称,不仅具有极高的养生价值,还保留了较强的技击性。

以下是关于陈式太极拳的详细核心要点:

---

#### 1. 起源与历史传承
*   **始祖创拳:** 起源于河南省焦作市温县陈家沟。据史料和拳谱记载,明末清初的**陈王廷**(陈氏第九世)是陈式太极拳的创始人。他在祖传长拳的基础上,博采各家精华,结合了古代导引、吐纳之术以及中医经络学说,创编出了这种内外兼修的新拳术。
*   **由家传走向世传:**
    *   **早期:** 陈家沟有“传男不传女,传内不传外”的家规。
    *   **转折点:** 传至十四世**陈长兴**时,他打破了门户之见,将拳术传给河北永年人**杨露禅**(后来的杨式太极拳祖师)。这使得太极拳开始向外传播。
*   **进京传拳与定型:**
    *   十七世祖**陈发科**于1928年进京授拳,被称为“陈家沟走向北京传拳第一人”。他在北京传授拳术期间,不仅保留了传统老架的精髓,还通过实战总结出更加科学、舒展的新练法,即后来广为流传的“陈式新架”。
    *   陈发科的儿子**陈照奎**后来将这一套定型套路带回了陈家沟,并推向全国。

---

#### 2. 主要特点(技术风格)
与其他太极流派偏柔偏缓的风格不同,陈式太极拳保留了更多原始武术的发力特征,其核心特点可概括为:

*   **缠丝劲(核心):** 讲究全身如丝线缠绕,动作呈螺旋状。包括手缠、臂缠、腰缠、腿缠等。这种缠丝劲在技击上表现为听劲灵敏、引化有力。
*   **刚柔相济、快慢相间:** 行拳过程中,速度有明显的节奏变化,并非一味的慢。动作有蓄(慢)有发(快),有柔化有刚发。
*   **松活弹抖(发劲):** 在动作末端或技击点上,常伴有瞬间的爆发力(Fajin)。这需要全身极度放松,通过脚下的根基、腰部的扭转,将力量瞬间传导至肢体末端。
*   **低架沉稳:** 相比其他流派,陈式太极往往要求更低的桩功架式,锻炼下盘的稳固与腰腿力量。

---

#### 3. 主要套路分类
陈式太极拳体系丰富,主要分为“架”和“器械”:

*   **老架(传统架):**
    *   由陈长兴所创,后经陈发科定型。动作以柔顺为主,刚辅之。
    *   **老架一路:** 以练柔劲为主,是建立基本功的基础套路(74式)。
    *   **老架二路(炮捶):** 以刚为主,快多慢少,发力动作较多。
*   **新架:**
    *   由陈发科晚年定型的83式套路,经其子陈照奎推广。新架的特点是动作更加细腻、螺旋缠绕的动作更复杂,突出了“胸腰折叠”和细腻的节节贯穿。
*   **小架(新架以外的另一系统):**
    *   由陈有本创编,后传于陈青萍(赵堡太极拳与之相关)。特点是动作小、步法活,劲路含蓄不外露,更加细腻精巧。
*   **器械与推手:**
    *   **器械:** 包括太极剑、太极单刀、双刀、枪、棍等。
    *   **推手:** 太极拳的对练形式,包括单推手、双推手(掤捋挤按)、大捋、乱采花(活步推手)等,是检验拳术功夫的重要手段。

---

#### 4. 代表性人物(传承谱系脉络)
*   **早期祖师:** 陈王廷(创拳) $\rightarrow$ 陈长兴(传杨露禅、整理老架)。
*   **近代关键人物:**
    *   **陈发科**:将陈式太极拳带出陈家沟,在名手如林的北京武林确立声誉,定式现代陈式太极拳。
    *   **陈照奎**:陈发科之子,为陈式太极拳的现代规范化及向全国大城市的推广做出巨大贡献。
*   **“四大金刚”:**
    *   指现代陈正雷、陈小旺、王西安、朱天才。这四位当代名家均为陈发科、陈照奎一脉的杰出传人(大架系列),是改革开放后让陈式太极拳走向世界的关键推手。

#### 总结
陈式太极拳被誉为“太极拳之源”,它不仅有柔和缓慢的一面,更具有爆发力和攻防含义。对于习练者来说,练习陈式太极不仅能强身健体(对腰腿力量、内脏按摩有很好效果),也是了解中国传统武术发力机制和阴阳哲学的极佳途径。
None

Process finished with exit code 0


优化

目前的搜索智能体存在两个问题

  • 官方默认的 tavily 工具过于复杂

    内部定义了很多参数,都会发给模型,这样的话会浪费 token
    如果我们的业务比较简单,只需要一个 query 条件查询,用官方的工具就过于浪费 token了。

  • 结果中不包含网页数据源,可信底低

    缺少了来源的引用

解决思路:

  • 自定义 tavily 工具
  • 结构化输出

自定义 tavily 工具

LangChain 官方提供的 tavily 工具包含了完整的参数列表,会导致额外的流量和Token消耗。因此,对于简单的业务,我们建议大家利用tavily自定义工具

tavily = TavilySearch(
    max_results=5,
    topic="general",
)

# 然后自己封装为tool
# 这样传给模型的参数信息,就是我们定义工具的参数信息
@tool
def web_search(query: str):
    """Search the web for information"""
    return search_tool.invoke(query)

定义结构化输出实体

from pydantic import BaseModel,Field

# Agent 回答内容引用的网页信息
class Reference(BaseModel):
    """Reference to a source"""
    url: str = Field(description="The url of the web page cited in the answer")
    title: str = Field(description="The title of the web page cited in the answer")

# Agent 的回答内容
class AnswerInfo(BaseModel):
    answer: str = Field(description="The answer to the user's question")
    references: list[Reference] = Field(description="A list of references to the web pages cited in the answer")

完整代码

带引用地址

import os
from langchain.agents import create_agent
from langchain.chat_models import init_chat_model
from langchain.tools import tool
from dotenv import load_dotenv
from langchain_tavily import TavilySearch
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage


# 加载环境变更值
load_dotenv()



# 获取环境变更值
base_url = os.getenv("DASHSCOPE_BASE_URL")
api_key = os.getenv("DASHSCOPE_API_KEY")


from pydantic import BaseModel,Field

# Agent 回答内容引用的网页信息
class Reference(BaseModel):
    """Reference to a source"""
    url: str = Field(description="The url of the web page cited in the answer")
    title: str = Field(description="The title of the web page cited in the answer")

# Agent 的回答内容
class AnswerInfo(BaseModel):
    answer: str = Field(description="The answer to the user's question")
    references: list[Reference] = Field(description="A list of references to the web pages cited in the answer")
 
search_tool = TavilySearch(
    max_results=5,
    topic="general", 
)
 
# 然后自己封装为tool
# 这样传给模型的参数信息,就是我们定义工具的参数信息
@tool
def web_search(query: str):
    """Search the web for information"""
    return search_tool.invoke(query)


# 创建 agent
agent = create_agent(
    model="deepseek-chat",
    tools=[web_search],
    system_prompt="你是一个智能助手,你使用工具来解决用户问题",
    response_format=AnswerInfo # 要用 deepseek-chat , Qwen response_format 会报错,目前还没解决
)

response = agent.invoke(
    {"messages": [HumanMessage(content="陈式太极拳")], "tools": [search_tool]}
)
 
print(response['structured_response']) 

answer='# 陈式太极拳\n\n## 概述\n\n**陈式太极拳**(亦称陈氏太极拳)是中国太极拳的一个重要分支和流派,发源于河南省焦作市温县陈家沟,由明末清初的陈王廷(约1600年-1680年)所创编。它是集技击、强体、健身、益智和修性为一体的独特运动方式,将阴阳、动静、正反、有无、形神等对立统一的内容融为一体。\n\n## 历史渊源\n\n- **创始人**:陈王廷(明末清初),在陈家沟世代相传,早期有"传子不传女"的规矩\n- **外传关键**:陈长兴(1771-1853)打破族规,将拳术传给外姓人杨露禅,后衍生出杨式太极拳\n- **重要人物**:陈发科(陈氏十七世)于1928年赴北京传拳,将陈氏太极拳带出陈家沟,是向外传拳第一人\n\n## 主要流派分支\n\n陈式太极拳是众多太极拳流派的源头:\n1. **杨式太极拳** — 陈长兴传杨露禅\n2. **吴式太极拳** — 杨露禅传吴全佑\n3. **武式太极拳** — 陈青萍传武禹襄\n4. **孙式太极拳** — 武禹襄一脉传孙禄堂\n5. **忽雷太极拳** — 陈青萍传李景延\n\n## 主要套路体系\n\n### 按架型分类\n\n| 类型 | 特点 | 创编者 |\n|------|------|--------|\n| **老架(大架)** | 以缠丝为轴心,古朴无花架势,一路以柔为主,二路(炮捶)以刚为主 | 陈长兴 |\n| **新架(大架)** | 突出缠丝螺旋动作,松活弹抖,节节贯穿 | 陈发科、陈照奎 |\n| **小架** | 除去劲发于外的动作,涵劲于内,蓄而待发,温文尔雅 | 陈有本 |\n\n### 经典套路\n- **83式太极拳**(老架一路)\n- **71式炮捶**(老架二路)\n- **精要十八式**\n\n### 器械套路\n包括单剑、双剑、单刀、双刀、双锏、枪、大刀、杆等。\n\n## 风格特点\n\n陈式太极拳的核心特点包括:\n- **缠绕折叠** — 以"缠丝劲"为核心,周身缠法\n- **松活弹抖** — 松柔中带有弹抖发力\n- **快慢相间** — 动作节奏变化丰富\n- **刚柔相济** — 柔化与刚发结合\n- **连绵不断** — 动作如江河奔腾,一气呵成\n\n## 陈家沟"四大金刚"\n\n当代陈式太极拳的代表人物(均为陈氏第十八世传人):\n- **陈小旺**\n- **陈正雷**\n- **王西安**\n- **朱天才**\n\n## 地位与影响\n\n2006年,太极拳被列入中国首批国家级非物质文化遗产名录。陈式太极拳作为太极拳的重要源头,对全世界太极拳的发展产生了深远影响。从北京传遍全中国,并从中国走向全世界。' references=[Reference(url='https://zh.wikipedia.org/zh-hans/%E9%99%B3%E6%B0%8F%E5%A4%AA%E6%A5%B5%E6%8B%B3', title='陈氏太极拳 - 维基百科'), Reference(url='https://baike.baidu.com/item/%E9%99%88%E6%B0%8F%E5%A4%AA%E6%9E%81%E6%8B%B3/359628', title='陈氏太极拳 - 百度百科')]
posted @ 2026-06-09 12:24  VipSoft  阅读(10)  评论(0)    收藏  举报