一、介绍功能调用特性使模型能够充当自然语言与现实世界行动及数据之间的桥梁。
本文将介绍如何使用 Ollama 实现 功能调用 以使用 Gemma 3 —— Google 强大的开源大型语言模型 (LLM) ——进行实时搜索。我们还将通过一个动手示例展示本地 LLM 模型如何与外部工具(如 API 或 Python 函数)进行互动。
作者的图片
什么是函数调用呢?功能呼叫使模型不仅能生成文本,还能与外部工具、API和服务互动,将自然语言转化为实际操作行为。
函数调用的主要用途:-- 数据检索 — 从API、数据库或其他来源动态检索信息(如天气预报、股票行情和文档资料)。
- 工具执行 — 执行Python函数或脚本来进行计算、自动化处理或控制设备。
- 多代理协作 — 让代理系统之间互相分配任务,并当需要时调用专门工具。
让我们一步一步地分解如何在Gemma3中调用函数。
一步一步拆解:解释如下:
以下决策过程展示了Gemma 3在Ollama上运行会怎样决定直接回应用户的指令或问题,还是触发一个功能调用(比如,像Serper这样的外部API)。
作者的图片
先决条件在开始写代码之前,请确认本地计算机已经满足以下先决条件:
- Python 3.8+
- Ollama 安装好了(下载 Gemma3–1B, 4B ,12B ,27B)- 我在这个演示中使用的是 27B 参数
- Serper.dev Serper.dev 的 Google 搜索 API 密钥
首先,我们来创建一个虚拟环境吧。
python -m venv venv
source venv/bin/activate
创建虚拟环境并激活它
安装需要的Python包
请运行以下命令:
pip install gradio ollama requests pydantic python-dotenv
import gradio as gr # 导入Gradio库,用于构建用户界面
import ollama # 导入ollama库
import requests # 导入requests库,用于处理HTTP请求
import json # 导入json库,用于处理JSON数据
import os # 导入os库,用于与操作系统进行交互
from dotenv import load_dotenv # 导入load_dotenv函数,用于加载环境变量
from pydantic import BaseModel, Field # 导入BaseModel和Field类,用于数据验证
from typing import Optional, Dict, Any, List # 导入类型提示相关的类和函数
第二步:设置环境变量
对于 SERPER_API_KEY,从 https://serpapi.com/dashboard 下载密钥,每月免费搜索 100 条。
SERPER_API_KEY=你的serper_api_key_here
第三步:用Gemma 3设置Ollama
- 从 https://ollama.ai/ 下载并安装 Ollama
2. 加载 Gemma3 模型。
ollama pull gemma3:27b
使用 Pydantic 来定义搜索和函数调用的结构化输入输出:(例如,定义数据的格式和结构)
from pydantic import BaseModel, Field
from typing import Optional, Dict, Any
class SearchParameters(BaseModel):
query: str = Field(..., description="搜索的查询词")
class FunctionCall(BaseModel):
name: str
parameters: Dict[str, Any]
class SearchResult(BaseModel):
title: str
link: str
snippet: str
def to_str(self) -> str:
return f"详情: 标题: {self.title}\n链接: {self.link}\n概要: {self.snippet}"
第五步:使用Serper API实现Google搜索功能
当 Gemma 3 触发时,聊天机器人将查询传递给 google_search 函数。此函数使用 Serper API 获取实时搜索结果,并返回以结构化格式的第一个结果。
def google_search(query: str) -> SearchResult: # 这是谷歌搜索函数
url = "https://google.serper.dev/search" # 搜索URL
headers = {
'X-API-KEY': SERPER_API_KEY,
'Content-Type': 'application/json'
}
payload = json.dumps({"q": query}) # 构造请求体
response = requests.post(url, headers=headers, data=payload)
results = response.json()
if not results.get('organic'): # 如果没有找到有机结果,那就抛个异常吧
raise ValueError("没有找到搜索结果哦。")
first = results['organic'][0] # 获取第一个结果
return SearchResult(
title=first.get("title", "没有标题哦"),
link=first.get("link", "没有链接哦"),
snippet=first.get("snippet", "没有摘要哦") # 如果没有摘要,返回提示信息
)
第六步:定义系统提示、函数调用格式和搜索功能
系统提示作为Gemma 3 LLM的指引,就像一系列规则一样,指导模型如何做决定——是直接回答问题还是触发一个函数调用,比如搜索。
这个系统提示可以帮助模型:
- 决定何时使用其内部知识。
- 知道何时需要调用外部搜索功能。
- 将功能调用结果格式化为精确的JSON结构。
# 系统消息给模型
SYSTEM_MESSAGE = """你是一个训练数据截止到2023年的AI助手。尽可能直接回答问题,必要时进行搜索。
决策流程:
1. 对于历史事件(2023年以前):
→ 直接根据你的训练数据回答
2. 对于2023年的事件:
→ 如果你有明确的知识 → 直接回答
→ 如果对细节不确定 → 使用搜索
3. 对于当前事件(2023年之后):
→ 一律使用搜索
4. 对于不变的信息(科学事实、概念等):
→ 直接根据你的训练数据回答
函数调用格式:
当你需要搜索时,仅用JSON对象回应,不包含其他文本,不包括反引号:
{
"name": "google_search",
"parameters": {
"query": "搜索关键词"
}
}
搜索函数:
{
"name": "google_search",
"description": "搜索实时更新的信息",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "搜索关键词"
}
},
"required": ["query"]
}
}
"""
第七步:从UI界面(gradio)到大模型的聊天流程
- 用户输入
- 格玛决定回应或调用函数
- 搜索执行并生成响应
# 模型名称
MODEL_NAME = "gemma3:27b"
# 定义 process_message(user_input):
def process_message(user_input):
"""处理用户消息(user_input)并返回响应"""
try:
response = ollama.chat(
model=MODEL_NAME,
messages=[
{"role": "system", "content": SYSTEM_MESSAGE},
{"role": "user", "content": user_input}
]
)
# 获取模型的响应
model_response = response['message']['content']
# 尝试将响应解析为函数调用
function_call = parse_function_call(model_response)
if function_call and function_call.name == "google_search":
search_params = SearchParameters(**function_call.parameters)
search_query = search_params.query
...
...
...
注意:SYSTEM_MESSAGE
在上下文中应该被定义或翻译。
步骤8:启动Gradio
python function-calling-gemma.py # 调用gemma函数的Python脚本
用户输入查询内容 → 2025年的Google Cloud Next 大会日期是什么? → Gemma3 触发响应 → 函数调用 → Google 搜索
- 用户输入查询内容 → 2019年的超级碗冠军是谁? → Gemma3 回答 [无需调用函数]
调用Gemma 3功能演示
GitHub 代码库完整源代码可在GitHub上找到:Function-Calling-Gemma3
总的来说
结尾本文展示了如何使用 Gemma 3(Google 的开源 LLM),使用 Ollama、Gradio 和 Serper API 来实现 Gemma 3 的功能,这些功能带有函数调用能力。我们还可以扩展这一功能来实现文件摘要功能、实现任务自动化,并进一步应用到多代理框架如 CrewAI 或 AutoGen。
共同學習,寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章