在大语言模型(LLM)中调用(Function Calling) 自定义的结构化函数

embedded/2025/2/22 16:09:57/

函数调用(Function Calling) 指的是大语言模型(LLM)自动调用我们定义的结构化函数 ,比如这里的RouteQuery,它的作用是根据输入的问题内容,返回对应的数据类别(python_docsjs_docsgolang_docs)。

示例代码:

python"># 定义数据模型(Pydantic)
class RouteQuery(BaseModel):"""将用户查询路由到最相关的数据源。"""datasource: Literal["python_docs", "js_docs", "golang_docs"] = Field(..., description="根据用户问题,选择最相关的数据源来回答他们的问题。")# 创建 LLM(不加温度,保证稳定性)
llm = ChatGroq(temperature=0)# 让 LLM 通过函数调用返回结构化的 RouteQuery 结果
structured_llm = llm.with_structured_output(RouteQuery)# 定义路由器(将 Prompt 和 LLM 组合)
router = prompt | structured_llm

在这段代码中:

  1. RouteQuery 充当“函数”

    • 它定义了返回的结构化数据格式(datasource 只能是 "python_docs""js_docs""golang_docs")。
    • LLM 需要根据问题内容自动填充 datasource 字段,这就是 LLM 进行的函数调用。
  2. structured_llm = llm.with_structured_output(RouteQuery)

    • 这里 LLM 被要求输出符合 RouteQuery 结构的数据
    • 这相当于告诉 LLM:“你必须调用 RouteQuery 这个结构,返回 datasource。”
  3. router.invoke({"question": question}) 被调用时

    • router 会先用 ChatPromptTemplate 生成提示词,告诉 LLM 如何回答。
    • structured_llm 通过函数调用,让 LLM 直接返回符合 RouteQuery 结构的结果。
    • 最终 datasource 会被 LLM 填充,例如:
      python">result = router.invoke({"question": "为什么这段 Python 代码不能运行?"})
      print(result.datasource)  # 输出: 'python_docs'
      

2. 这个“函数”的作用是什么?

RouteQuery 这个“函数”并不会自己执行逻辑,而是充当 LLM 结构化输出的格式,其作用是让 LLM 直接返回结构化数据,而不是普通文本

这避免了 LLM 直接生成自由文本回答,提高了确定性和可控性。

比如,如果不使用函数调用,LLM 可能会返回:

"这个问题是关于 Python 的,应该参考 Python 官方文档。"

而使用函数调用后,它直接返回:

{"datasource": "python_docs"
}

这样,代码可以直接解析 datasource,无需对 LLM 输出进行复杂的文本分析或正则匹配,提高了可用性和自动化程度。


3. 为什么要用 LLM 进行函数调用,而不是自己写 if/else 判断?

如果问题是格式清晰、结构简单的(比如明确包含 “Python”、“JS” 这样的关键词),我们完全可以用 if 语句来判断:

python">def simple_router(question):if "Python" in question:return "python_docs"elif "JavaScript" in question or "JS" in question:return "js_docs"elif "Golang" in question or "Go" in question:return "golang_docs"return "unknown"

但现实中,问题可能是模糊的、不直接提及编程语言的

  • 「这个 dict.items() 方法在 for 循环里为什么出错?」(没有明说 Python)
  • 「怎么让 fetch 请求的超时更短?」(没有明说 JS)
  • 「为什么 goroutine 不能直接返回结果?」(没有明说 Golang)

这种情况下,if/else 规则就很难覆盖所有情况。LLM 可以结合上下文理解问题,并自动推测问题的语言,然后用函数调用返回结构化结果


4. 总结

  1. 函数调用指的是 RouteQuery 这个数据结构,它被 LLM 作为函数来调用,返回结构化的 datasource
  2. structured_llm = llm.with_structured_output(RouteQuery) 让 LLM 按照 RouteQuery 格式输出,确保返回值是 python_docsjs_docsgolang_docs,而不是自由文本。
  3. 相比传统 if/else 规则,LLM 可以自动理解问题的语义,进行更智能的分类,适用于更复杂的情况。

这种让 LLM 自动调用结构化函数的方法,提高了系统的确定性和可操作性,使得 LLM 生成的答案更容易在代码中使用。 🚀


http://www.ppmy.cn/embedded/164380.html

相关文章

Spring Cloud — Hystrix 服务隔离、请求缓存及合并

Hystrix 的核心是提供服务容错保护,防止任何单一依赖耗尽整个容器的全部用户线程。使用舱壁隔离模式,对资源或失败单元进行隔离,避免一个服务的失效导致整个系统垮掉(雪崩效应)。 1 Hystrix监控 Hystrix 提供了对服务…

堆、优先队列、堆排序

堆: 定义: 必须是一个完全二叉树(完全二叉树:完全二叉树只允许最后一行不为满,且最后一行必须从左往右排序,最后一行元素之间不可以有间隔) 堆序性: 大根堆:每个父节点…

AI赋能前端开发:如何提升你的问题解决能力?

在飞速发展的AI时代,前端开发面临着前所未有的挑战。快速迭代的需求、日益复杂的交互设计、以及多平台兼容性问题,都对开发者的技能和效率提出了更高的要求。 幸运的是,AI写代码工具的出现为我们提供了解决这些问题的有力武器,它正…

什么是向量化?ElasticSearch如何存储向量化?

向量化(Vectorization)是一种将数据或操作转换为向量的过程,以便利用并行计算和高效处理。向量化将非数值数据(如文本、图像)转换为数值向量,以便计算机处理。而向量化在AIGC中非常的常见,例如知识库对话等等。如果大家感兴趣,后面专门来聊聊。 向量长什么样?例如:[…

Huatuo热更新--如何使用

在安装完huatuo热更新插件后就要开始学习如何使用了。 1.创建主框渐Main 新建文件夹Main(可自定义),然后按下图创建文件,注意名称与文件夹名称保持一致 然后新建场景(Init场景),添加3个空物体…

深度学习数据集

1 huggingface datasets 需要先安装 datasets库 pip install datasets 用coco数据集举例,我们可以搜索coco,然后通过页面右侧的use this dataset或者是 clone respository来获取数据集 https://huggingface.co/datasets/phiyodr/coco2017 huggingface的…

HTTPS 通信流程

HTTPS 通信流程时序图: #mermaid-svg-HWoTbFvfih6aYUu6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-HWoTbFvfih6aYUu6 .error-icon{fill:#552222;}#mermaid-svg-HWoTbFvfih6aYUu6 .error-text{fill:#…

H3C交换机路由器防火墙FTP/TFTP服务器搭建。

软件介绍。 3CDaemon 2.0 - Download 3CDaemon 是一款集成了多种网络服务功能的工具软件,主要用于网络管理和文件传输,支持TFTP、FTP、Syslog等多种协议,广泛应用于网络设备的配置和管理。 1. 主要功能 TFTP服务器:支持TFTP协议…