用 Ollama 搭本地智能体,关键并不是让模型直接操作整台电脑,而是把少量、可审计的函数交给模型选择。下面做一个“查找笔记文件”的最小智能体:模型只能列出指定目录里的 .txt 文件,不能访问目录外路径,也不能修改文件。
先确认工具调用链路
Ollama 的官方工具调用文档说明,客户端把工具定义随消息发给模型;模型返回工具名称和参数,真正执行函数的是你的程序。聊天 API 文档列出了 messages、tools 和响应中的工具调用字段。因此,权限边界应写在程序里,不能只靠提示词。

先安装 Ollama,并按官方快速开始拉取一个明确支持工具调用的模型。模型标签会变化,正式使用前在模型页核对 capabilities。Python 端安装客户端:
python -m pip install ollama
mkdir notes
在 notes 目录新建 project.txt 和 meeting.txt,内容可以是无敏感信息的测试文本。
写一个受限工具
from pathlib import Path
from ollama import chat
NOTES = Path("notes").resolve()
def list_notes(keyword: str) -> list[str]:
keyword = keyword.strip().casefold()
return [
p.name for p in NOTES.glob("*.txt")
if keyword in p.name.casefold()
]
tools = [{
"type": "function",
"function": {
"name": "list_notes",
"description": "按文件名关键词列出 notes 目录中的 txt 文件",
"parameters": {
"type": "object",
"properties": {"keyword": {"type": "string"}},
"required": ["keyword"]
}
}
}]
messages = [{"role": "user", "content": "查找文件名含 project 的笔记"}]
response = chat(model="qwen3", messages=messages, tools=tools)
messages.append(response.message)
for call in response.message.tool_calls or []:
if call.function.name != "list_notes":
raise RuntimeError("拒绝未授权工具")
result = list_notes(call.function.arguments["keyword"])
messages.append({
"role": "tool",
"tool_name": "list_notes",
"content": str(result)
})
final = chat(model="qwen3", messages=messages, tools=tools)
print(final.message.content)
如果你使用的模型标签不是 qwen3,只替换 model 值,工具白名单和路径限制不要删。
怎么判断智能体真的工作
- 问“查找 project”,结果应出现
project.txt,不应出现无关文件。 - 问“删除 project.txt”,程序必须拒绝,因为根本没有暴露删除工具。
- 问“列出上级目录”,函数仍只搜索已经固定的
notes目录。
运行后先核对工具名称、参数和返回文件名,再决定是否增加新工具。生产环境还要给每次调用记录用户、参数和结果,并对写操作加入人工确认。
适用边界
这是一段依据官方接口编写的本地演示,没有代替你在具体模型版本上执行。模型可能不发起工具调用,或生成不合规参数;程序必须把这两种情况当作失败处理。不要把任意 shell、任意路径读取或数据库管理员权限直接交给模型。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/32382.html