Function calling(函数调用)是大语言模型(Large Language Models, LLMs)的一项高级功能,它允许模型在生成响应时调用外部工具、API 或自定义函数,以扩展模型的能力。以下是对这一概念的详细解释,我将从定义、工作原理、实现方式、示例、优势和局限性等方面进行阐述。

1. 定义和背景

  • 什么是函数调用?
    在LLMs中,函数调用是指模型不是简单地生成文本响应,而是根据用户查询的需要,动态决定是否调用预定义的外部函数。这些函数可以执行特定任务,如搜索网络、执行代码、获取实时数据等。模型会输出一个“函数调用请求”,然后系统执行该函数,并将结果反馈给模型,模型再基于结果生成最终响应。

  • 为什么需要函数调用?
    LLMs如GPT系列、Grok或Claude,本质上是基于训练数据的预测模型,它们没有实时访问外部世界的权限(如互联网、数据库)。函数调用解决了这一局限,让模型能“借力”外部工具,实现更准确、动态的交互。例如,模型无法直接知道当前天气,但可以通过调用天气API来获取。

  • 发展历史简述
    函数调用最早在OpenAI的GPT-3.5和GPT-4中普及(称为“Function Calling”或“Tool Use”)。其他模型如Google的Gemini、Anthropic的Claude也支持类似功能。xAI的Grok模型(如Grok 4)也集成这一能力,支持多种工具调用。

2. 工作原理

函数调用通常涉及以下步骤:

  • 步骤1: 解析用户查询
    模型分析输入,判断是否需要外部帮助。如果查询涉及实时数据、计算或特定操作,模型会选择合适的函数。

  • 步骤2: 生成函数调用请求
    模型输出一个结构化的调用格式(如JSON对象),指定函数名、参数等。例如:

    {
      "function_name": "web_search",
      "arguments": {
        "query": "当前北京天气"
      }
    }
    

    这不是直接响应用户,而是“中间输出”给系统。

  • 步骤3: 执行函数
    系统(后端框架)执行指定的函数,并返回结果(如搜索结果的JSON数据)。

  • 步骤4: 整合结果生成响应
    模型接收函数结果,作为额外上下文,生成最终用户可见的响应。

  • 关键技术

    • 工具描述(Tool Schema):每个函数都有一个描述文件(通常是JSON Schema),包括函数名、参数类型、描述等。模型在训练或微调时学习如何使用这些描述。
    • 并行调用:高级模型支持同时调用多个函数,提高效率。
    • 状态管理:有些系统支持状态ful调用(如REPL代码解释器),前一次调用结果可影响后一次。

3. 实现方式

  • 在模型层面
    LLMs通过微调(fine-tuning)学习函数调用。训练数据包括“查询 → 函数调用 → 结果 → 响应”的示例。模型的输出被约束为特定格式(如XML或JSON),以确保可解析。

  • 在系统层面

    • API集成:如OpenAI的Chat Completions API,支持tools参数定义函数。
    • 框架支持:LangChain、Haystack等库简化了函数调用链的构建。
    • 安全机制:函数调用需遵守安全规则(如不允许有害操作),模型会拒绝违规查询。
  • 示例代码(Python中使用OpenAI API)

    import openai
    
    # 定义工具
    tools = [
        {
            "type": "function",
            "function": {
                "name": "get_weather",
                "description": "获取指定城市的天气",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "location": {"type": "string", "description": "城市名"}
                    },
                    "required": ["location"]
                }
            }
        }
    ]
    
    # 调用模型
    response = openai.chat.completions.create(
        model="gpt-4",
        messages=[{"role": "user", "content": "北京今天天气如何?"}],
        tools=tools
    )
    
    # 如果模型决定调用函数
    if response.choices[0].message.tool_calls:
        tool_call = response.choices[0].message.tool_calls[0]
        # 执行函数并反馈结果
    

    这展示了如何在代码中实现函数调用。

4. 示例应用

  • 实时信息获取:用户问“今天比特币价格?”,模型调用crypto API,返回最新价格。
  • 代码执行:用户问“计算π的前100位”,模型调用代码解释器,运行Python代码如import mpmath; mpmath.mp.dps = 100; print(mpmath.pi)
  • 搜索与总结:用户问“最近AI新闻”,模型调用web搜索,总结结果。
  • 复杂链式调用:用户问“计划去东京旅行,查天气并推荐景点”,模型先调用天气API,再调用地点搜索API,最后整合响应。
  • 在Grok中的示例:如本系统,支持web_searchcode_execution等工具,用于处理查询。

5. 优势

  • 扩展性:让LLMs从“静态生成器”变为“智能代理”,处理复杂任务。
  • 准确性:减少幻觉(hallucination),因为数据来自可靠来源。
  • 交互性:支持多轮对话,如用户追问时可复用先前函数结果。
  • 效率:并行调用减少延迟。

6. 局限性和挑战

  • 依赖外部服务:如果API downtime或网络问题,调用失败。
  • 安全风险:需防止模型被诱导调用有害函数(如“jailbreak”攻击)。
  • 成本:每次调用增加计算和API费用。
  • 复杂性:函数描述需精确,否则模型可能误用。
  • 隐私:调用外部API可能泄露用户数据。

总之,函数调用是大语言模型向AGI(人工通用智能)演进的关键一步,它桥接了模型的内部知识与外部世界。如果你有特定模型(如Grok)的函数调用示例或代码实现需求,我可以进一步扩展!

LangChain Framework 详解

LangChain 是一个开源框架,用于简化基于大语言模型(Large Language Models, LLMs)的应用程序开发。它允许开发者将 LLMs 与外部数据源、工具和内存等组件“链式”连接起来,构建复杂的 AI 应用,如聊天机器人、检索增强生成(RAG)系统和智能代理(Agents)。LangChain 于 2022 年 10 月由 Harrison Chase 推出,现已成为 LLM 应用开发的领先工具之一。

以下是 LangChain 的标志性 Logo:

1. 核心概念和架构

LangChain 的设计是模块化的,主要组件包括:

  • Models:支持多种 LLM(如 OpenAI、Anthropic、Google、Hugging Face 等),提供统一接口,便于切换模型。
  • Prompts:提示模板管理,支持动态插入变量和 few-shot 示例。
  • Chains:将多个组件串联起来,形成工作流。例如:提示 → LLM 调用 → 输出解析。
  • Memory:内存管理,支持对话历史持久化(如 ConversationBufferMemory)。
  • Indexes/Retrievers:数据索引和检索,支持向量数据库(如 Pinecone、FAISS),用于 RAG。
  • Agents/Tools:代理系统,允许 LLM 动态决定调用外部工具(如搜索、计算器、API)。
  • Callbacks:用于监控和调试。

LangChain 的典型架构图如下(展示组件间连接):

2. 生态系统(2025 年现状)
  • LangChain:核心框架,用于快速构建简单到中等复杂的 LLM 应用。
  • LangGraph:低级代理编排框架,支持多代理协作、循环控制和状态管理,更适合复杂代理工作流。
  • LangSmith:调试、监控和评估工具,支持追踪链路、A/B 测试和性能优化(框架无关)。
  • LangServe:将链部署为 API 服务。

截至 2025 年,LangChain 已下载超过 7000 万次,支持数百种集成,焦点转向可靠代理工程。

3. 主要优势
  • 模块化和可扩展:易于组合组件,快速原型开发。
  • 多模型支持:避免供应商锁定。
  • RAG 和 Agents 支持强大:擅长处理外部数据和工具调用。
  • 社区活跃:开源(GitHub: langchain-ai/langchain),文档完善。
  • 生产就绪:结合 LangSmith 可监控和优化。
4. 局限性和批评
  • 复杂性:抽象层多,对于简单任务可能过度工程化,导致调试困难。
  • 性能开销:链式调用可能引入延迟。
  • 版本兼容:快速迭代有时导致 breaking changes。
  • 替代品兴起:许多开发者转向更轻量或专精框架(如 LlamaIndex 用于 RAG,CrewAI 用于多代理)。
5. 常见应用场景
  • 聊天机器人和虚拟助手。
  • RAG 系统(基于私有数据回答问题)。
  • 文档总结、代码分析。
  • 多代理协作(如自动化任务)。
6. 简单示例(Python)
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.chains import LLMChain

llm = ChatOpenAI(model="gpt-4o")
prompt = ChatPromptTemplate.from_template("解释{topic}的概念,用简单中文。")
chain = LLMChain(llm=llm, prompt=prompt)

print(chain.run(topic="LangChain"))
7. 与替代品的比较(2025 年)
  • LlamaIndex:更专注 RAG 和数据索引,适合知识密集应用。
  • Haystack:搜索和 RAG 强,生产级管道。
  • CrewAI / AutoGen:多代理协作更简单。
  • DSPy:提示优化框架,更声明式。
  • Semantic Kernel:微软出品,多语言支持。

LangChain 适合快速构建代理和通用 LLM 应用;复杂代理推荐 LangGraph。

官方文档:https://docs.langchain.com/
GitHub:https://github.com/langchain-ai/langchain
官网:https://www.langchain.com

LangChain Framework 简明详解

LangChain 是开源框架,用于简化大语言模型(LLM)应用开发,帮助开发者将 LLM 与外部数据、工具、内存等组件“链式”连接,构建聊天机器人、RAG 系统和智能代理。2022 年 10 月由 Harrison Chase 推出,已成为主流 LLM 开发工具。

核心组件:

  • Models:统一接口,支持 OpenAI、Anthropic、Hugging Face 等多种 LLM。
  • Prompts:动态提示模板管理。
  • Chains:组件串联,形成工作流(如提示 → LLM → 输出解析)。
  • Memory:对话历史持久化。
  • Retrievers/Indexes:向量数据库集成,支持 RAG(如 Pinecone、FAISS)。
  • Agents/Tools:代理系统,LLM 动态调用外部工具(搜索、API、计算器)。
  • Callbacks:监控与调试。

生态系统(2025 年):

  • LangChain:核心框架,适合快速构建通用应用。
  • LangGraph:复杂代理编排,支持多代理、循环与状态管理。
  • LangSmith:调试、追踪、评估工具(生产级)。
  • LangServe:将链部署为 REST API。

优势:

  • 模块化、易扩展、多模型支持。
  • RAG 与 Agents 能力强。
  • 社区活跃,开源(GitHub 下载超 7000 万)。

局限性:

  • 抽象层多,简单任务可能过度复杂。
  • 快速迭代易导致版本不兼容。
  • 替代品:LlamaIndex(RAG 专精)、CrewAI/AutoGen(多代理)、DSPy(提示优化)。

常见场景:

  • 聊天机器人、文档问答、代码分析、自动化任务。

简单示例(Python):

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.chains import LLMChain

llm = ChatOpenAI(model="gpt-4o")
prompt = ChatPromptTemplate.from_template("用简单中文解释{topic}")
chain = LLMChain(llm=llm, prompt=prompt)
print(chain.run(topic="LangChain"))

LangGraph 详解

LangGraph 是 LangChain 生态中的一个开源框架,专为构建状态化、多代理应用而设计。它提供低级别的编排工具,帮助开发者创建可靠、可控的智能代理系统,支持从简单工作流到复杂多代理协作的各种场景。作为一个独立库,LangGraph 可以不依赖 LangChain 使用,但通常与 LangChain 结合以增强功能。

1. 目的和背景

LangGraph 的主要目的是解决大语言模型(LLM)在构建长期运行、状态化代理时的挑战。它聚焦于代理编排的核心能力,如持久化执行、流式传输、人机交互(Human-in-the-loop)和内存管理。不同于传统框架的抽象化,LangGraph 提供底层基础设施,让开发者自定义代理工作流,适用于自动化现实任务、对话代理和复杂任务处理。例如,它可以构建支持人类审查的代理系统,确保代理在复杂场景中保持可靠性和可控性。

LangGraph 于 2023 年左右推出,由 LangChain Inc. 开发,受 Pregel(Google 论文)和 Apache Beam 等系统启发。其设计灵感来源于 NetworkX,用于图结构的管理。 截至 2025 年 12 月,LangGraph 已广泛用于生产环境,支持云部署和多代理协作,焦点转向更强的容错性和扩展性。

2. 关键特性
  • 状态持久化:内置内存管理,支持短期工作内存(用于当前推理)和长期跨会话内存,确保代理在中断后能恢复执行。
  • 人机交互:允许在任意节点插入人工监督,如检查、修改或批准代理动作,支持“时间旅行”(回滚状态)。
  • 流式传输:原生支持按令牌流式输出和中间步骤实时显示,提升用户体验。
  • 图结构编排:使用节点(nodes)和边(edges)定义工作流,支持单一代理、多代理、层次化或循环控制。
  • 调试与观测:集成 LangSmith,提供可视化追踪执行路径、状态变化和性能指标。
  • 生产部署:通过 LangGraph Platform 支持水平扩展、自动重试、智能缓存和多种部署模式(云、混合、自托管)。
  • 可扩展性:与 LangChain 组件(如模型、提示和工具)无缝集成,适用于大规模 AI 工作负载。
3. 工作原理

LangGraph 将代理工作流建模为图(graph)。核心组件包括:

  • State:共享数据结构(如 MessagesState),存储消息历史或自定义状态。
  • Nodes:代表执行函数,如 LLM 调用、工具使用或自定义逻辑。
  • Edges:定义节点间的连接,支持条件分支、循环和顺序流。

工作流程:

  1. 定义 StateGraph:指定状态 schema。
  2. 添加节点和边:从 START 到 END 构建图。
  3. 编译并运行:调用 graph.invoke() 执行,状态在节点间传递。
  4. 支持持久化:使用检查点(如 SQLite 或 PostgreSQL)保存状态,实现中断恢复。

例如,一个简单代理的原理:用户输入进入 START,流向 LLM 节点生成响应,然后结束。复杂场景可添加条件边(如如果响应不满意,则循环回人工节点)。

4. 示例
  • 基本 Hello World 示例(Python 代码):

    from langgraph.graph import StateGraph, MessagesState, START, END
    
    def mock_llm(state: MessagesState):
        return {"messages": [{"role": "ai", "content": "hello world"}]}
    
    graph = StateGraph(state_schema=MessagesState)
    graph.add_node("mock_llm", mock_llm)
    graph.add_edge(START, "mock_llm")
    graph.add_edge("mock_llm", END)
    compiled_graph = graph.compile()
    result = compiled_graph.invoke({"messages": [{"role": "user", "content": "hi!"}]})
    print(result)
    

    输出:包含用户消息和 AI 响应的状态。

  • 多代理示例:构建客户支持代理,一个节点生成草稿,另一个审查;添加人类批准边,确保输出可靠。

  • 实际应用:自动化代码文档生成(使用代理链调用 RAG 和语义重排序);或构建对话代理,支持长期内存和实时流式交互。

5. 优势
  • 灵活性:低级 API 允许完全自定义,超越黑箱代理框架。
  • 可靠性:内置容错、重试和持久化,适合生产级部署。
  • 集成性:与 LangSmith(调试)和 LangServe(API 部署)无缝结合。
  • 开发者友好:支持 LangGraph Studio 用于可视化原型设计和共享。
6. 局限性
  • 学习曲线陡峭:低级抽象要求开发者熟悉图结构和状态管理,对于简单任务可能过度复杂。
  • 性能开销:复杂图可能引入延迟,需要优化。
  • 版本迭代:快速更新可能导致兼容性问题。
  • 替代品:如 CrewAI(更简单多代理)或 AutoGen(微软的多代理框架),但 LangGraph 在状态化和编排上更强大。
7. 与 LangChain 的区别
  • LangChain:高层框架,提供预构建的链(chains)、代理和 RAG 组件,适合快速开发通用 LLM 应用。
  • LangGraph:低级框架,专注于状态图和多代理编排,是 LangChain 的底层支持。LangChain 基于 LangGraph 构建更抽象的工具,而 LangGraph 提供更细粒度的控制,适用于复杂、自定义工作流。
8. 安装与资源
  • 安装:pip install -U langgraph
  • 官方文档:https://docs.langchain.com/oss/python/langgraph/overview
  • 官网:https://www.langchain.com/langgraph
  • GitHub:https://github.com/langchain-ai/langgraph

如果你需要特定代码示例、教程或更深入的某个特性解释,请随时告知!

LangGraph 多代理(Multi-Agent)示例详解

LangGraph 特别适合构建多代理系统,通过将每个代理定义为图中的节点(node),并用边(edge)控制协作流程,实现复杂任务的分工与协调。常见模式包括共享消息协作、监督者(Supervisor)路由、层次化团队(Hierarchical Teams)和代理间手递(Handoffs)。

以下是官方和社区常见的多代理示例(基于 2025 年最新文档和教程):

1. 简单多代理协作(Multi-Agent Collaboration)
  • 描述:多个专长代理(如研究代理、绘图代理)共享消息列表,协作完成任务(如研究主题并生成图表)。

  • 架构:代理作为节点,消息在共享状态中传递,无明确监督者。

  • 官方教程:https://langchain-ai.github.io/langgraph/tutorials/multi_agent/multi-agent-collaboration/

  • 应用:研究 + 可视化任务。

2. 监督者模式(Supervisor with Members)
  • 描述:一个监督者代理路由任务到专长成员代理(如搜索代理、数学代理),成员完成后再返回监督者。

  • 优势:监督者动态决定下一个代理,避免单个代理工具过多导致性能下降。

  • 官方示例:LangGraph 仓库中的 supervisor 示例。

  • 应用:客服系统、复杂查询路由(如城市信息查询:天气、酒店、航班代理)。

3. 层次化代理团队(Hierarchical Agent Teams)
  • 描述:多层监督者,每个子团队有自己的监督者,上层监督者协调团队。
  • 优势:处理大规模任务,避免单一监督者负载过重。
  • 官方教程:https://langchain-ai.github.io/langgraph/tutorials/multi_agent/hierarchical_agent_teams/
  • 应用:大型研究系统、企业级自动化(如多个部门协作)。
4. 其他热门示例
  • 研究代理团队:受 STORM 论文启发,主编辑代理协调研究、写作、审查代理。示例:GPT Researcher 项目。

  • 城市信息系统(AWS 示例):监督者协调天气、活动、酒店等专长代理。

  • Swarm 风格:代理动态手递控制(使用 langgraph-swarm 库)。

  • 报告写作:规划 → 生成 → 反思 → 修订的多代理循环。

简单代码框架(监督者示例)
from langgraph.graph import StateGraph, START, END
from langgraph.prebuilt import create_react_agent

# 定义专长代理
research_agent = create_react_agent(llm, tools=[search_tool])
chart_agent = create_react_agent(llm, tools=[chart_tool])

# 监督者节点:决定路由
def supervisor(state):
    # 根据最后消息路由到 "research" 或 "chart" 或 END
    ...

graph = StateGraph(State)
graph.add_node("supervisor", supervisor)
graph.add_node("research", research_agent)
graph.add_node("chart", chart_agent)
# 添加条件边...
app = graph.compile()

资源推荐

  • 官方多代理教程:https://langchain-ai.github.io/langgraph/tutorials/multi_agent/
  • 博客:https://blog.langchain.com/langgraph-multi-agent-workflows/
  • GitHub 示例:https://github.com/langchain-ai/langgraph (examples/multi_agent 文件夹)
  • YouTube 演示:搜索 “LangGraph Multi-Agent Workflows”

这些示例展示了 LangGraph 的灵活性:从简单协作到生产级层次系统。如果你需要某个具体示例的完整代码或实现细节,请告诉我!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐