计算机访问系统

免费在家构建智能体:开源工具与模型


你可以仅使用免费工具和开源模型,在笔记本电脑上构建一个功能完整的多智能体系统。无需信用卡,无API速率限制,无供应商锁定。代价是什么?推理速度较慢,能力略低。但对于学习、实验和小规模自动化来说,这完全足够。

本指南结束后,你将拥有一个运行在自己硬件上的本地研究智能体——能够搜索网络、读取文件、综合信息——完全免费。

开源智能体开发的理由

成本现实

Claude API定价对于生产工作负载是合理的,但学习和实验会迅速累积费用。本地推理完全消除了这个顾虑——以零边际成本无限迭代。

隐私与数据控制

某些工作负载无法发送到云API。患者数据、专有代码、敏感业务逻辑——都受益于留在你的机器上。本地模型提供同样的智能行为,而不让任何数据离开你的硬件。

现实检验

7-13B参数的开源模型在复杂推理、代码生成和指令遵循方面明显落后于前沿模型。对于精度至关重要的生产场景,商业API仍是最佳选择。对于学习和原型开发,本地模型非常出色。

选择你的开源LLM

LLM家族

  • Llama(Meta):支持最广泛的家族。Llama 3能力特别强。
  • Mistral:质量/参数比优秀。Mistral-7B超越其体量。
  • Phi(Microsoft):极其高效的小型模型。Phi-3 Mini无需GPU即可运行。
  • Qwen(阿里巴巴):强大的多语言性能。

模型大小与硬件需求

模型参数量化显存速度质量
Phi-3 Mini3.8B4-bit4GB非常快良好
Mistral-7B7B4-bit8GB良好
Llama-3-8B8B4-bit8GB非常好
Llama-3-13B13B4-bit10GB中等非常好
Mixtral-8x7B46.7B (MoE)4-bit24GB优秀

量化:为什么重要

量化压缩模型权重以使用更少内存。一个7B参数的模型以全精度需要约28GB内存。同一模型以4-bit量化只需约4GB,质量损失极小。

按硬件的起点建议:

  • 笔记本(8-16GB内存): 4-bit的Phi-3 Mini或Mistral-7B
  • 有中端GPU的台式机: Mistral-7B或Llama-3-8B,带GPU加速
  • 有高端GPU的台式机: 4-bit的Mixtral-8x7B或Llama-3-70B

本地推理设置

Ollama:最简单的入门点

Terminal window
# 在macOS上安装
brew install ollama
# 在Linux上安装
curl -fsSL https://ollama.com/install.sh | sh
# 下载Mistral-7B
ollama pull mistral
# 硬件较慢时的更轻量选项
ollama pull phi3
# 启动推理服务器
ollama serve

验证是否正常工作:

Terminal window
curl http://localhost:11434/api/generate -d '{
"model": "mistral",
"prompt": "用一句话说明什么是AI智能体?",
"stream": false
}'

LM Studio:图形界面替代方案

LM Studio 是一个桌面应用程序,提供图形界面来下载和运行模型。它公开了一个兼容OpenAI的API端点。

开源智能体框架

框架最适合学习曲线
LangChain广泛工具支持中等
LangGraph状态机工作流中高等
AutoGen多智能体对话
CrewAI基于角色的多智能体系统低至中等

从AutoGen或LangChain开始。 AutoGen更快上手原型;LangChain对智能体循环给予更多控制。

构建你的第一个智能体:本地研究助手

环境设置

Terminal window
python3 -m venv agent-env
source agent-env/bin/activate
pip install langchain langchain-ollama langchain-community duckduckgo-search

完整智能体

#!/usr/bin/env python3
"""
使用Ollama + LangChain的本地研究智能体
前提条件:
- ollama serve(在后台运行)
- ollama pull mistral
- pip install langchain langchain-ollama langchain-community duckduckgo-search
"""
import json
from langchain_core.tools import tool
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama import ChatOllama
from langchain.agents import AgentExecutor, create_react_agent
from duckduckgo_search import DDGS
@tool
def search_web(query: str) -> str:
"""使用DuckDuckGo在网络上搜索信息。"""
try:
with DDGS() as ddgs:
results = list(ddgs.text(query, max_results=5))
if not results:
return "未找到结果。"
return json.dumps(
[{"title": r["title"], "snippet": r["body"], "url": r["href"]}
for r in results],
indent=2, ensure_ascii=False
)
except Exception as e:
return f"搜索失败:{e}"
@tool
def read_file(filepath: str) -> str:
"""读取本地文件并返回其内容。"""
try:
with open(filepath, "r") as f:
return f.read()
except FileNotFoundError:
return f"文件未找到:{filepath}"
@tool
def calculate(expression: str) -> str:
"""安全地评估简单的算术表达式。"""
try:
result = eval(expression, {"__builtins__": {}}, {})
return str(result)
except Exception as e:
return f"计算错误:{e}"
llm = ChatOllama(
model="mistral",
base_url="http://localhost:11434",
temperature=0.3,
)
prompt = ChatPromptTemplate.from_messages([
("system", """你是一个研究助手。使用你的工具回答问题。
可用工具:{tool_names}
工具描述:{tools}
严格遵循此格式:
Thought: 我需要找出什么?
Action: 工具名称
Action Input: 工具的输入
Observation: 工具结果
...(根据需要重复)
Thought: 现在我有足够的信息了。
Final Answer: 你的完整答案"""),
("user", "{input}"),
("placeholder", "{agent_scratchpad}"),
])
tools = [search_web, read_file, calculate]
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
max_iterations=8,
handle_parsing_errors=True,
)
if __name__ == "__main__":
result = agent_executor.invoke({
"input": "现在最流行的三个开源LLM是什么?给出名称和每个的关键特性。"
})
print(f"\n最终答案:\n{result['output']}")

运行

Terminal window
# 终端1:启动Ollama
ollama serve
# 终端2:运行智能体
python research_agent.py

扩展能力:无需API的工具

本地数据库访问

import sqlite3
@tool
def query_database(sql: str) -> str:
"""对本地数据库执行只读SQL查询。"""
try:
conn = sqlite3.connect("data.db")
cursor = conn.cursor()
cursor.execute(sql)
rows = cursor.fetchall()
columns = [desc[0] for desc in cursor.description]
conn.close()
return json.dumps([dict(zip(columns, row)) for row in rows], indent=2)
except Exception as e:
return f"数据库错误:{e}"

使用嵌入的本地文档搜索

Terminal window
pip install sentence-transformers chromadb
from sentence_transformers import SentenceTransformer
import chromadb
model = SentenceTransformer("all-MiniLM-L6-v2")
client = chromadb.Client()
collection = client.create_collection("docs")
@tool
def search_docs(query: str) -> str:
"""通过语义相似度搜索本地文档。"""
results = collection.query(
query_embeddings=[model.encode(query).tolist()],
n_results=3
)
return json.dumps(results["documents"][0], indent=2)

现实世界的限制与解决方案

延迟

每个推理步骤预计需要2-30秒。策略:

  • 设计更少步骤的智能体;越简单越快
  • 尽可能批量处理工具调用

精度差距

缓解策略:

  • 更短、更明确的提示 — 精确指定预期格式
  • 将复杂任务分解为步骤
  • 在返回给智能体之前验证工具输出
  • 工具使用时使用0.1-0.3的temperature

部署:从笔记本到持续运行

Docker

FROM python:3.12-slim
RUN pip install langchain langchain-ollama langchain-community duckduckgo-search
COPY research_agent.py .
ENV OLLAMA_HOST=host.docker.internal:11434
CMD ["python3", "research_agent.py"]

Systemd服务(Linux)

Terminal window
sudo systemctl enable ollama
sudo systemctl start ollama

深入探索:家庭多智能体系统

def run_pipeline(question: str) -> str:
research_result = researcher.invoke({"input": question})
final_output = writer.invoke({
"input": f"基于此研究,写一个清晰的摘要:\n{research_result['output']}"
})
return final_output["output"]

开源智能体开发今天就很实用。路径是:Ollama用于推理,LangChain或AutoGen用于智能体循环,DuckDuckGo用于搜索,你机器的文件系统用于其他一切。

从简单开始——上面的研究智能体。让它运行起来。然后添加第二个工具。然后添加第二个智能体。


相关文章