欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 旅游 > 在大语言模型(LLM)中调用(Function Calling) 自定义的结构化函数

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

2025/2/23 16:07:08 来源:https://blog.csdn.net/u013565133/article/details/145757336  浏览:    关键词:在大语言模型(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 生成的答案更容易在代码中使用。 🚀

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词