当前位置: 首页 > article >正文

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

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

示例代码:

# 定义数据模型(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 填充,例如:
      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 语句来判断:

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.kler.cn/a/555183.html

相关文章:

  • oppo,汤臣倍健,康冠科技25届春招内推
  • Android init阶段loop回环设备的使用
  • 如何清理cache-loader生成的缓存目录?
  • 【时时三省】(C语言基础)用N-S流程图表示算法
  • 上位机知识篇---setuptools
  • 基于Linux平台的多实例RTSP|RTMP直播播放器深度解析与技术实现
  • 机器学习_15 支持向量机知识点总结
  • 大模型常识:什么是大模型/大语言模型/LLM
  • IntelliJ IDEA中Maven配置全指南
  • SpringBoot 中封装 Cors 自动配置
  • 解决npm问题:错误的代理设置
  • 【爬虫 JS 逆向实战 - 请求载荷加密详细教程】
  • Pycharm+CodeGPT+Ollama+Deepseek
  • 【Java进阶学习 第二篇】Java中的final关键字
  • vue语法---09双向数据绑定
  • IDEA单元测试插件 SquareTest 延长试用期权限
  • DeepSeek VS ChatGPT-速度、准确性和成本
  • Linux中POSIX应用场景
  • 适用于复杂背景的YOLOv8改进:基于DCN的特征提取能力提升研究
  • 在 Java 中解析 JSON 数据