news 2026/3/1 19:32:15

LangChain Function Calling终极宝典!文本标注与信息抽取实战,这篇全讲透了!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangChain Function Calling终极宝典!文本标注与信息抽取实战,这篇全讲透了!

前言

相比于传统纯文本的问答方式,Function Calling 允许我们以更结构化、更可控的方式从大模型中获取精准数据,为智能系统提供更强的上下文感知能力。

无论你是初学者,还是有一定开发经验的技术爱好者,这篇教程都将用清晰的逻辑、丰富的实例帮助你快速掌握这项关键能力。


基础知识:什么是Function Calling?

Function Calling 是 OpenAI 模型的一项高级能力,允许模型不直接生成回答,而是返回一个函数调用请求(包含函数名与参数),由开发者决定是否执行,执行后再将结果反馈回模型以继续对话流程。

这种设计的优势在于:

  • 增强可控性:我们可以检查模型的函数调用意图,避免错误调用。
  • 提升灵活性:可以加入校验机制、格式转换等操作。
  • 支持结构化输入输出:便于和已有系统对接,如数据库、API等。

Function Calling 通常和 Pydantic、LangChain 等配套使用,能够以更易维护的方式快速构建复杂的交互逻辑。那下面就让我们开始实战看看其作用吧!


实战Part1:文本标注(Tagging)

我们从一个简单的文本标注任务开始:

给定一段文本,判断其情感(正面/负面/中性)以及语言(如英文en、中文zh等)。

1.定义数据模型

在这一步,我们借助 Pydantic 创建一个用于情感与语言标注的数据结构,并用 LangChain 提供的工具将其转换为大模型可识别的 function 调用格式。这样,模型便能“知道”有哪些字段需要填写。

from pydantic import BaseModel, Fieldclass Tagging(BaseModel): sentiment: str = Field(description="文本的情感倾向,取值为 `pos`(正面)、`neg`(负面)或 `neutral`(中性)") language: str = Field(description="文本所用语言(ISO 639-1 语言代码)")

转换为函数结构后,大模型将会返回一个 JSON 格式的结构化调用请求,而不是直接输出文本:

from langchain_core.utils.function_calling import convert_to_openai_functionconvert_to_openai_function(Tagging)

2.构建对话链条

我们使用 LangChain 的ChatPromptTemplate构造提示词模板,同时绑定模型并明确指定调用的函数。这样可以保证模型不产生歧义,而是直接触发我们定义好的函数结构。在使用前我们可以需要先通过pip install -U langchain langchain-openai安装一下openai的配套库。

from langchain.prompts import ChatPromptTemplatefrom langchain_openai import ChatOpenAImodel = ChatOpenAI( model="qwen-turbo", base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", api_key="api_key"# 请替换成你的 API key)prompt = ChatPromptTemplate.from_messages([ ("system", "请仔细思考并按照要求对文本进行标注"), ("user", "{input}")])model_with_functions = model.bind( functions=[convert_to_openai_function(Tagging)], function_call={"name": "Tagging"})tagging_chain = prompt | model_with_functions

3.调用与解析结果

一切就绪后,我们调用该链条,并传入待标注的文本。模型会根据定义好的函数结构返回带有 sentiment 和 language 字段的结果:

print(tagging_chain.invoke({"input": "I love langchain"}))

输出结果如下:

content='' additional_kwargs={'function_call': {'arguments': '{"sentiment": "pos", "language": "en"}', 'name': 'Tagging'}} response_metadata={'token_usage': {'completion_tokens': 18, 'prompt_tokens': 241, 'total_tokens': 259, 'completion_tokens_details': None}, 'model_name': 'qwen-turbo', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None} id='run-6f20d16d-94a0-4a58-89ce-a95a3c8ed7cb-0'

可以看到其Function Call里面的arguments识别出来的是积极(pos)的情绪,并且也写出对应的语言英文(en)。为了进一步规范输出,我们还可以追加一个解析器,使得输出内容更清爽:

from langchain.output_parsers.openai_functions import JsonOutputFunctionsParsertagging_chain = prompt | model_with_functions | JsonOutputFunctionsParser()print(tagging_chain.invoke({"input": "I love langchain"}))

这样模型就只会选择出Function Call部分的内容,输出结果如下:

{'sentiment': 'pos', 'language': 'en'}

实战Part2:信息抽取(Extraction)

接下来我们尝试处理稍微复杂一点的结构化信息抽取任务:

“Joe is 30, his mom is Martha” —— 从中提取出人物姓名与年龄。

1.定义嵌套结构

本次任务需要抽取多个人物信息,因此我们将构建一个嵌套的结构体:外层是包含多个PersonInformation,内层是每个人的name和可选的age字段。

from typing import List, Optionalfrom pydantic import BaseModel, Fieldclass Person(BaseModel): name: str = Field(description="人物姓名") age: Optional[int] = Field(description="人物年龄,可缺失")class Information(BaseModel): people: List[Person] = Field(description="人物信息列表")

这一步是关键,Pydantic 允许我们通过这种嵌套结构清晰表达所需数据的层级关系。

2.注册为Function并绑定模型

有了数据结构后,我们仍需将其注册为函数形式供大模型调用,并指定函数名称:

info_fn = convert_to_openai_function(Information)extraction_model = model.bind(functions=[info_fn], function_call={"name": "Information"})

这样,模型收到输入后就会依据我们预设的结构,返回 people 字段对应的所有人物信息。

3.构造Prompt并执行链条

我们设置提示词,指导模型在抽取信息时不进行猜测,只输出明确表达的信息:

prompt = ChatPromptTemplate.from_messages([ ("system", "提取文本中所有人物姓名和年龄"), ("user", "{input}")])extraction_chain = prompt | extraction_model | JsonOutputFunctionsParser()

执行调用:

print(extraction_chain.invoke({"input": "Joe is 30, his mom is Martha"}))

输出结构如下:

{'people': [{'name': 'Joe', 'age': 30}, {'name': 'Martha', 'age': None}]}

可以看到大模型成功提取出了两个人的信息,一个是Joe,对应是30岁,另一个是Martha,没有年龄信息。假如我们只想要对应的人物信息而不需要people的话,我们也可以使用JsonKeyOutputFunctionsParser(key_name="people")获取更简洁的列表格式结果。

from langchain.output_parsers.openai_functions import JsonKeyOutputFunctionsParserextraction_chain = prompt | extraction_model | JsonKeyOutputFunctionsParser(key_name="people")print(extraction_chain.invoke({"input": "Joe is 30, his mom is Martha"}))

输出结构如下:

[{'name': 'Joe', 'age': 30}, {'name': 'Martha', 'age': None}]

这样我们就成功完成提取任务信息的任务啦!

完整代码如下所示:

from langchain_openai import ChatOpenAIfrom langchain_core.utils.function_calling import convert_to_openai_functionfrom pydantic import BaseModel, Fieldfrom langchain.prompts import ChatPromptTemplatefrom langchain.output_parsers.openai_functions import JsonOutputFunctionsParserfrom typing import List, Optionalfrom langchain.output_parsers.openai_functions import JsonKeyOutputFunctionsParsermodel = ChatOpenAI( model="qwen-turbo", base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", api_key="api_key"# 你的 API key)# class Tagging(BaseModel):# sentiment: str = Field(description="文本的情感倾向,取值为 `pos`(正面)、`neg`(负面)或 `neutral`(中性)")# language: str = Field(description="文本所用语言(ISO 639-1 语言代码)") # convert_to_openai_function(Tagging)# prompt = ChatPromptTemplate.from_messages([# ("system", "请仔细思考并按照要求对文本进行标注"),# ("user", "{input}")# ])# model_with_functions = model.bind(# functions=[convert_to_openai_function(Tagging)],# function_call={"name": "Tagging"}# )# tagging_chain = prompt | model_with_functions# print(tagging_chain.invoke({"input": "I love langchain"}))# tagging_chain = prompt | model_with_functions | JsonOutputFunctionsParser()# print(tagging_chain.invoke({"input": "I love langchain"}))# --------------------------class Person(BaseModel): name: str = Field(description="人物姓名") age: Optional[int] = Field(description="人物年龄,可缺失")class Information(BaseModel): people: List[Person] = Field(description="人物信息列表")info_fn = convert_to_openai_function(Information)extraction_model = model.bind(functions=[info_fn], function_call={"name": "Information"})prompt = ChatPromptTemplate.from_messages([ ("system", "提取文本中所有人物姓名和年龄"), ("user", "{input}")])extraction_chain = prompt | extraction_model | JsonOutputFunctionsParser()print(extraction_chain.invoke({"input": "Joe is 30, his mom is Martha"}))extraction_chain = prompt | extraction_model | JsonKeyOutputFunctionsParser(key_name="people")print(extraction_chain.invoke({"input": "Joe is 30, his mom is Martha"}))

总结

通过这篇教程,我们基于LangChain与OpenAI的Function Calling机制,完成了两个典型任务:

  • 文本标签识别(Tagging)
  • 嵌套结构信息抽取(Extraction)

你不仅学会了如何设计Pydantic模型、注册为函数、绑定模型、执行调用,还掌握了如何使用解析器解析函数结果,极大提升了对大模型调用逻辑的理解。

💡下节预告:网页抽取与多段文本分析

我们将进一步挑战真实内容处理任务:

  • 如何从整篇网页中提取结构化信息?
  • 如何批量提取被引用的论文标题与作者?
  • 面对数千字长文,如何用 LangChain 分段、并行处理?

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/28 0:15:15

别再看碎片信息了!一篇讲透6大AI智能体框架:Dify、Coze、n8n、AutoGen、LangChain、CrewAI,看完就懂如何选!

导读 本文系统性梳理了六大主流智能体框架,如**Dify、Coze、n8n、AutoGen。**从开发难度、语言支持、多Agent协作能力、可视化程度和适用场景五个维度进行横向对比,并提供选型决策树,帮助开发者选择合适的框架。 写在前面 【从零走向AGI】旨…

作者头像 李华
网站建设 2026/2/18 18:16:54

【微信支付全流程实战:JSAPI+H5 支付对接指南】

作为后端开发者,对接微信支付是绕不开的核心需求。本文将从微信开放平台配置、项目环境搭建、JSAPI 支付、H5 支付、支付回调处理五个核心模块,手把手教你完成微信支付全流程对接,全程附代码 截图,小白也能独立落地! …

作者头像 李华
网站建设 2026/2/27 12:18:26

DeepSeek-OCR部署:CUDA升级与vLLM配置

DeepSeek-OCR部署:CUDA升级与vLLM配置 在智能文档处理的浪潮中,OCR技术正经历一场由大模型驱动的范式变革。传统OCR系统面对复杂版式、多语言混排或低质量扫描件时常常力不从心,而DeepSeek-OCR凭借其基于Transformer架构的强大上下文理解能力…

作者头像 李华
网站建设 2026/3/1 17:41:46

高缺失率时序插补新突破:Glocal-IB 解锁全局 - 局部协同优化

本文约2300字,建议阅读5分钟 本文介绍了 Glocal-IB 范式提升高缺失时序插补性能。现有的时间序列插补(TSI)模型通常优化逐点重建损失,专注于恢复数值(局部信息)。然而在高缺失率下,这些模型在训…

作者头像 李华