【AI大模型学习路线】第三阶段之RAG与LangChain——第十三章(理解Function Calling)如何使用 Function Calling 且保证鲁棒性?
欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “
学术会议小灵通
”或参考学术信息专栏:https://fighting.blog.csdn.net/article/details/146994798
LangChain 支持通过 tools
、function
、Runnable
模式将外部函数注册到 LLM 调用链中,让大模型“调用”你的函数来完成任务。这背后的机制依赖于:
Tool
, StructuredTool
)Pydantic
)问题 | 描述 |
---|---|
参数结构不匹配 | LLM 输出的参数字段缺失或类型错误 |
多函数选择歧义 | 多工具注册时,LLM无法准确选择目标函数 |
JSON 结构无效 | LLM输出无法被解析为合法结构 |
多轮对话混乱 | 用户意图改变但上下文未更新 |
from langchain.tools import tool
from pydantic import BaseModel
class RectangleInput(BaseModel):
length: float
width: float
@tool(args_schema=RectangleInput)
def calculate_area(length: float, width: float) -> str:
"""计算矩形面积"""
return f"The area is {length * width}"
from langchain.agents import initialize_agent, AgentType
from langchain.chat_models import ChatOpenAI
tools = [calculate_area]
llm = ChatOpenAI(model="gpt-4", temperature=0)
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.OPENAI_FUNCTIONS,
verbose=True
)
import logging
logging.basicConfig(level=logging.INFO)
try:
result = agent.run("帮我计算一个长是10,宽是5的矩形面积")
print("✅ Agent 返回结果:", result)
except Exception as e:
logging.error("❌ Agent 执行失败:%s", e)
class NDVIInput(BaseModel):
nir: float
red: float
@tool(args_schema=NDVIInput)
def calculate_ndvi(nir: float, red: float) -> str:
if red + nir == 0:
return "Error: NIR + RED 不能为 0"
ndvi = (nir - red) / (nir + red)
return f"NDVI is {ndvi:.2f}"
┌──────────────┐
│ 用户提问 │
└─────┬────────┘
▼
┌────────────────────┐
│ LLM + Prompt 模型 │
└─────┬────┬─────────┘
▼ ▼
┌─────────────┐ ┌────────────┐
│ RAG 检索模块 │ │ Tool 调用模块 │ ← @tool + schema
└─────────────┘ └────────────┘
▼ ▼
文档补全 JSON结构输出 → 调用Python函数
▼ ▼
合并最终回答(Agent输出)
建议 | 说明 |
---|---|
✅ 使用 args_schema=BaseModel |
自动生成 schema,限制结构 |
✅ AgentType 选用 OPENAI_FUNCTIONS |
原生支持 function_call 模式 |
✅ 增加日志与 try-except | 防止执行错误或未捕获异常 |
✅ 明确函数说明与输入限制 | 减少模型选择错误 |
✅ 使用多函数组合 + fallback(回退)逻辑 | 提高多任务处理能力 |