引言:为什么我们需要本地AI助手?

2026年,AI Agent无疑是最火热的技术方向。从LangGraph到CrewAI,从AutoGen到Smolagents,各类Agent框架层出不穷。然而,面对琳琅满目的云端API和复杂的框架生态,很多开发者都有一个共同的疑问:能不能在本地搭建一套完全自主可控的AI助手,让它帮我完成信息采集、邮件处理、文档撰写和报告生成等一系列日常自动化工作?

答案是肯定的。事实上,截至2026年,LangGraph已经成为Python生态中最广泛采用的生产级AI工作流编排框架,被Klarna、Replit、Elastic等知名公司信赖。结合Ollama等本地模型部署工具,完全可以用一台普通电脑零成本构建功能完备的本地AI助手。

本教程将以30多个详细步骤,手把手带你从零搭建一套本地AI助手系统,覆盖:信息采集与资料整理、邮件自动收发、日报生成、月报生成、年终总结PPT制作五大核心功能。


第一部分:技术选型与整体架构(第1-5步)

第1步:理解AI Agent的核心概念

在动手编码之前,有必要先理解AI Agent究竟是什么。传统的聊天机器人只能被动回答问题,而AI Agent能够主动规划、调用工具并执行多步骤任务。想象一下:如果你问“我本月在餐饮上花了多少钱?”,普通的聊天机器人无法回答,但一个拥有数据库查询工具的Agent可以:思考→调用交易搜索工具→获取数据→生成答案。

这正是我们构建本地AI助手的核心价值所在——让它真正“有手有脚”地去执行任务。

第2步:核心技术栈选型

本教程将采用以下技术栈:

  • LangGraph:作为核心Agent编排框架。它基于图结构组织Agent逻辑,支持状态管理、条件分支和循环执行,是目前生产级Agent应用的首选。
  • CrewAI(可选) :如果你偏向角色分工明确的团队协作模式,CrewAI提供了一种角色化Agent编排范式。
  • Smolagents:Hugging Face推出的轻量级Agent框架,整个核心逻辑仅约1000行代码,可作为轻量级替代方案。
  • Ollama:本地大模型推理引擎,支持运行Llama、Qwen、DeepSeek等开源模型,完全离线免费。
  • LlamaIndex:RAG检索增强生成框架,用于构建私有知识库。
  • ScrapeGraphAI:基于LLM的智能网页爬取库。

框架对比建议:LangGraph最适合需要精细控制流程和状态的复杂工作流;CrewAI适合多角色协作场景(如研究+写作+审核);Smolagents适合对代码透明度和可定制性有高要求的场景。本教程以LangGraph为主展开。

第3步:了解整体系统架构

┌─────────────────────────────────────────────────────────────┐
│                    本地AI助手系统架构                          │
├─────────────────────────────────────────────────────────────┤
│  【用户交互层】                                              │
│      CLI / Web UI                                           │
├─────────────────────────────────────────────────────────────┤
│  【Agent编排层】← 核心                                      │
│      LangGraph StateGraph(节点 + 边 + 状态)               │
├─────────────────────────────────────────────────────────────┤
│  【工具层】                                                  │
│      Web爬取工具 │ 邮件收发工具 │ 报告生成工具 │ PPT生成工具 │
├─────────────────────────────────────────────────────────────┤
│  【知识层】                                                  │
│      LlamaIndex RAG │ 本地向量数据库                        │
├─────────────────────────────────────────────────────────────┤
│  【模型层】                                                  │
│      Ollama(Qwen/Llama/Gemma)                             │
└─────────────────────────────────────────────────────────────┘

分层架构的优势在于:每一层可以独立演进、替换或优化,这是生产级Agent系统的基本要求。

第4步:硬件与软件环境准备

硬件要求

  • CPU:4核心以上(现代处理器即可)
  • 内存:至少16GB(推荐32GB)
  • 显卡:如有NVIDIA GPU(16GB以上显存或以上可运行主流中型模型),无GPU也可运行CPU版本的小型模型
  • 存储:至少50GB空闲空间

软件要求

  • Python 3.10或更高版本
  • Git
  • Docker(可选,用于部署Dify等工作流平台)
  • 现代操作系统(Windows 10/11、macOS或Linux)

第5步:创建Python虚拟环境

# 创建项目目录
mkdir local-ai-assistant
cd local-ai-assistant

# 创建虚拟环境(Windows)
python -m venv venv
venv\Scripts\activate

# 创建虚拟环境(macOS/Linux)
python3 -m venv venv
source venv/bin/activate

# 升级pip
pip install --upgrade pip

第二部分:本地大模型部署(第6-11步)

第6步:安装Ollama

Ollama是目前最简单易用的本地模型部署工具,它能让你在几分钟内跑通一个大模型。

Windows:前往ollama.com/download/Windows下载安装程序运行。

macOS/Linux:使用命令行安装:

# macOS/Linux
curl -fsSL https://ollama.com/install.sh | sh

# Linux 也可以通过包管理器安装

安装完成后,Ollama通常会自动启动服务。如需手动启动,运行:

ollama serve

服务默认运行在 http://localhost:11434

第7步:下载并运行本地模型

推荐选择Qwen 2.5 4B版本,它在性能和硬件需求之间取得了良好的平衡,仅需约3.5GB内存。

# 下载并运行Qwen 2.5
ollama run qwen2.5:7b

# 或选择更小的4B版本
ollama run qwen2.5:4b

模型选择参考

模型 参数量 显存要求 适用场景
Qwen 2.5 7B 7B 8GB 通用场景(推荐)
Qwen 2.5 4B 4B 4GB 轻量级设备
Gemma 4 E4B 4.5B 6GB 多模态任务
DeepSeek R1 14B 14B 16GB 高精度推理

第8步:验证Ollama模型调用

新建test_ollama.py测试模型是否正常:

import requests
import json

url = "http://localhost:11434/api/generate"
payload = {
    "model": "qwen2.5:7b",
    "prompt": "你好,请简单介绍一下你自己。",
    "stream": False
}

response = requests.post(url, json=payload)
result = response.json()
print(result["response"])

第9步:安装LangChain和LangGraph核心库

pip install langchain langgraph langchain-community langchain-ollama

第10步:配置LangChain与Ollama集成

from langchain_ollama import ChatOllama

# 初始化本地模型
llm = ChatOllama(
    model="qwen2.5:7b",
    base_url="http://localhost:11434",
    temperature=0.7,
    top_p=0.9,
    # 可选配置
    # num_ctx=8192,  # 上下文长度
)

# 测试调用
response = llm.invoke("你好,请用一句话介绍什么是LangGraph")
print(response.content)

第11步:理解LangGraph的核心概念

在继续编码前,需要掌握LangGraph的三个核心概念:

  • State(状态) :使用TypedDict定义Agent运行过程中全局共享的数据结构。
  • Node(节点) :Agent执行的每个动作都是一个节点函数,接收当前状态,返回状态更新。
  • Edge(边) :连接节点,决定流程走向,支持条件分支和循环。
from typing import TypedDict, Annotated
from langgraph.graph import StateGraph, START, END

class AgentState(TypedDict):
    messages: list
    current_task: str
    task_result: str

第三部分:构建Agent的“工具箱”——工具开发(第12-17步)

第12步:理解LangGraph的工具机制

在LangGraph中,工具就是Agent可以调用的Python函数。LLM会根据用户问题自主决定何时调用哪个工具。这与传统的函数调用不同——工具的选择权交给了LLM。LangGraph并不抽象提示或架构,而是提供了支撑长时运行、状态化工作流的基础设施。

第13步:构建网页信息采集工具

使用ScrapeGraphAI库实现智能网页爬取。ScrapeGraphAI是一种基于LLM的网页抓取库,你只需要告诉它“需要提取什么信息”,它就能自动完成爬取。

# 安装依赖
# pip install scrapegraphai playwright
# playwright install

from langchain_core.tools import tool
from scrapegraphai.graphs import SmartScraperGraph

@tool
def scrape_webpage(url: str, prompt: str) -> dict:
    """
    从指定网页提取信息。
    
    Args:
        url: 目标网页URL
        prompt: 要提取的信息描述,如"提取公司简介、产品列表和联系方式"
    
    Returns:
        提取的信息字典
    """
    graph_config = {
        "llm": {
            "model": "ollama/qwen2.5:7b",
            "model_tokens": 8192,
            "format": "json",
        },
        "verbose": True,
        "headless": True,
    }
    
    scraper = SmartScraperGraph(
        prompt=prompt,
        source=url,
        config=graph_config
    )
    
    result = scraper.run()
    return result

第14步:批量网页信息采集增强

对于需要同时爬取多个URL的场景,可以使用ScriptCreatorMultiGraph生成多页爬取脚本:

from scrapegraphai.graphs import ScriptCreatorMultiGraph

@tool
def batch_scrape_websites(urls: list, prompt: str) -> list:
    """批量爬取多个网页并提取信息"""
    results = []
    for url in urls:
        try:
            result = scrape_webpage(url, prompt)
            results.append({"url": url, "data": result})
        except Exception as e:
            results.append({"url": url, "error": str(e)})
    return results

第15步:构建邮件收发工具

pip install yagmail imaplib2 python-mailchimp

发送邮件工具:

import yagmail

@tool
def send_email(to: str, subject: str, body: str) -> str:
    """
    发送邮件。
    
    Args:
        to: 收件人邮箱
        subject: 邮件主题
        body: 邮件正文
    
    Returns:
        发送结果状态
    """
    # 需要在环境变量中配置邮箱信息
    # SENDER_EMAIL: 发件人邮箱
    # SENDER_PASSWORD: 邮箱授权码(非登录密码)
    import os
    
    try:
        yag = yagmail.SMTP(
            user=os.environ.get("SENDER_EMAIL"),
            password=os.environ.get("SENDER_PASSWORD")
        )
        yag.send(to=to, subject=subject, contents=body)
        return f"邮件已成功发送至 {to}"
    except Exception as e:
        return f"邮件发送失败: {str(e)}"

接收邮件工具(使用IMAP协议):

import imaplib
import email
from email.header import decode_header

@tool
def fetch_recent_emails(limit: int = 10) -> list:
    """
    获取收件箱中的最新邮件。
    
    Args:
        limit: 获取邮件数量
    
    Returns:
        邮件列表
    """
    import os
    
    imap = imaplib.IMAP4_SSL("imap.gmail.com")  # 根据实际邮箱提供商调整
    imap.login(os.environ.get("SENDER_EMAIL"), os.environ.get("EMAIL_PASSWORD"))
    imap.select("INBOX")
    
    status, messages = imap.search(None, "ALL")
    email_ids = messages[0].split()[-limit:]
    
    emails = []
    for e_id in email_ids:
        status, msg_data = imap.fetch(e_id, "(RFC822)")
        msg = email.message_from_bytes(msg_data[0][1])
        
        subject = decode_header(msg["Subject"])[0][0]
        if isinstance(subject, bytes):
            subject = subject.decode()
        
        emails.append({
            "subject": subject,
            "from": msg["From"],
            "date": msg["Date"],
        })
    
    imap.close()
    imap.logout()
    return emails

第16步:构建日报/月报生成工具

from datetime import datetime
import json

@tool
def generate_daily_report(tasks_completed: list, issues: list, plan_next: list) -> str:
    """
    根据输入信息生成日报。
    
    Args:
        tasks_completed: 已完成任务列表
        issues: 遇到的问题列表
        plan_next: 明日计划列表
    
    Returns:
        格式化后的日报文本
    """
    today = datetime.now().strftime("%Y年%m月%d日")
    
    report = f"""
## 日报 - {today}

### 今日完成
{chr(10).join(f'- {task}' for task in tasks_completed)}

### 遇到的问题
{chr(10).join(f'- {issue}' for issue in issues) if issues else '- 无'}

### 明日计划
{chr(10).join(f'- {plan}' for plan in plan_next)}

---
生成时间: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
"""
    return report


@tool
def generate_monthly_report(weekly_summaries: list, highlights: list) -> str:
    """根据每周总结生成月报"""
    month = datetime.now().strftime("%Y年%m月")
    
    report = f"""
## 月度总结报告 - {month}

### 本月工作亮点
{chr(10).join(f'- {highlight}' for highlight in highlights)}

### 周度汇总
{chr(10).join(f'{chr(10).join(w_summary)}' for w_summary in weekly_summaries)}

---
报告生成时间: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
"""
    return report

第17步:构建年终总结PPT生成工具

PPT生成需要python-pptx库:

pip install python-pptx markdown
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
import markdown
from bs4 import BeautifulSoup

@tool
def generate_yearly_ppt(content: dict, output_path: str = "yearly_summary.pptx") -> str:
    """
    根据内容字典生成年终总结PPT。
    
    Args:
        content: 包含以下键的字典:
            - title: PPT标题
            - summary: 年度总结文本
            - achievements: 成就列表
            - projects: 重点项目列表(每项含name和description)
            - next_year_plan: 来年计划列表
        output_path: 输出文件路径
    
    Returns:
        生成状态信息
    """
    prs = Presentation()
    
    # 标题页
    title_slide = prs.slides.add_slide(prs.slide_layouts[0])
    title = title_slide.shapes.title
    subtitle = title_slide.placeholders[1]
    title.text = content.get("title", "年终工作总结")
    subtitle.text = f"报告期间:{datetime.now().strftime('%Y')}年"
    
    # 年度概述页
    summary_slide = prs.slides.add_slide(prs.slide_layouts[1])
    summary_slide.shapes.title.text = "年度工作概述"
    content_box = summary_slide.placeholders[1]
    content_box.text = content.get("summary", "")
    
    # 主要成就页
    achievements_slide = prs.slides.add_slide(prs.slide_layouts[1])
    achievements_slide.shapes.title.text = "主要工作成就"
    achievements_text = "\n".join(f"• {ach}" for ach in content.get("achievements", []))
    achievements_slide.placeholders[1].text = achievements_text
    
    # 重点项目页
    for project in content.get("projects", []):
        project_slide = prs.slides.add_slide(prs.slide_layouts[1])
        project_slide.shapes.title.text = project.get("name", "项目名称")
        project_slide.placeholders[1].text = project.get("description", "")
    
    # 来年计划页
    plan_slide = prs.slides.add_slide(prs.slide_layouts[1])
    plan_slide.shapes.title.text = "来年工作计划"
    plan_text = "\n".join(f"• {plan}" for plan in content.get("next_year_plan", []))
    plan_slide.placeholders[1].text = plan_text
    
    # 保存
    prs.save(output_path)
    return f"PPT已成功生成:{output_path}"

第四部分:组装LangGraph多节点Agent(第18-25步)

第18步:定义Agent的全局状态

from typing import TypedDict, Annotated, List
from langgraph.graph.message import add_messages

class AssistantState(TypedDict):
    """Agent的全局状态定义"""
    messages: Annotated[list, add_messages]  # 对话历史
    current_intent: str  # 用户意图分类
    scraped_data: dict  # 爬取到的数据
    email_content: dict  # 邮件内容
    report_content: str  # 生成的报告
    ppt_content: dict  # PPT内容
    execution_status: str  # 执行状态
    errors: List[str]  # 错误记录

第19步:创建工作流节点(节点定义)

from langgraph.graph import StateGraph, START, END
from langchain_ollama import ChatOllama
from langchain.agents import create_agent

# 初始化LLM
llm = ChatOllama(model="qwen2.5:7b", base_url="http://localhost:11434")

# 工具列表
tools = [scrape_webpage, batch_scrape_websites, send_email, 
         fetch_recent_emails, generate_daily_report, 
         generate_monthly_report, generate_yearly_ppt]

# 使用create_agent构建基础Agent
agent = create_agent(
    model=llm,
    tools=tools,
    system_prompt="""你是一个智能的工作辅助助手。你的职责包括:
    1. 从网页中采集和整理信息
    2. 收发邮件
    3. 生成日报、月报和年终总结PPT
    4. 帮助用户自动化日常办公任务
    
    请根据用户的请求,选择合适的工具来完成任务。
    """
)

第20步:构建条件路由函数

def route_by_intent(state: AssistantState) -> str:
    """根据用户意图决定下一步走向"""
    last_message = state["messages"][-1]["content"].lower()
    
    if any(keyword in last_message for keyword in ["爬取", "采集", "网页", "信息提取"]):
        return "scrape"
    elif any(keyword in last_message for keyword in ["邮件", "发送", "收件箱"]):
        return "email"
    elif any(keyword in last_message for keyword in ["日报", "每日报告"]):
        return "daily_report"
    elif any(keyword in last_message for keyword in ["月报", "月度报告"]):
        return "monthly_report"
    elif any(keyword in last_message for keyword in ["年终", "PPT", "总结"]):
        return "yearly_ppt"
    else:
        return "general_chat"

第21步:组装完整的StateGraph

from langgraph.graph import StateGraph, START, END

workflow = StateGraph(AssistantState)

# 添加所有节点
workflow.add_node("classify", route_by_intent)  # 路由节点
workflow.add_node("scrape", scrape_node)
workflow.add_node("email", email_node)
workflow.add_node("daily_report", daily_report_node)
workflow.add_node("monthly_report", monthly_report_node)
workflow.add_node("yearly_ppt", yearly_ppt_node)
workflow.add_node("general_chat", general_chat_node)

# 定义边
workflow.add_edge(START, "classify")
workflow.add_conditional_edges("classify", route_by_intent, {
    "scrape": "scrape",
    "email": "email",
    "daily_report": "daily_report",
    "monthly_report": "monthly_report",
    "yearly_ppt": "yearly_ppt",
    "general_chat": "general_chat"
})

# 每个工作节点完成后回到分类(支持多轮交互)
workflow.add_edge("scrape", "classify")
workflow.add_edge("email", "classify")
workflow.add_edge("daily_report", "classify")
workflow.add_edge("monthly_report", "classify")
workflow.add_edge("yearly_ppt", "classify")
workflow.add_edge("general_chat", "classify")
workflow.add_edge("classify", END)

app = workflow.compile()

第22步:Define具体节点的实现

def scrape_node(state: AssistantState) -> AssistantState:
    """信息采集节点"""
    prompt = state["messages"][-1]["content"]
    result = scrape_webpage.invoke({"url": extracted_url, "prompt": prompt})
    state["scraped_data"] = result
    state["messages"].append({
        "role": "assistant",
        "content": f"已采集到以下信息:\n{result}"
    })
    return state

def email_node(state: AssistantState) -> AssistantState:
    """邮件处理节点"""
    # 根据用户意图发送/接收邮件
    last_msg = state["messages"][-1]["content"]
    if "发送" in last_msg:
        # 使用LLM提取邮件信息
        # 实际代码中需要解析参数...
        pass
    elif "收件箱" in last_msg:
        emails = fetch_recent_emails()
        state["email_content"] = emails
    return state

def daily_report_node(state: AssistantState) -> AssistantState:
    """日报生成节点"""
    # 这里可以从用户的对话中提取任务信息
    # 简化版:询问用户并提供模板
    state["messages"].append({
        "role": "assistant",
        "content": "请提供以下信息:\n1. 今日完成的任务\n2. 遇到的问题\n3. 明日的计划"
    })
    return state

def general_chat_node(state: AssistantState) -> AssistantState:
    """通用对话节点"""
    response = llm.invoke(state["messages"][-1]["content"])
    state["messages"].append({
        "role": "assistant",
        "content": response.content
    })
    return state

第23步:运行Agent工作流

def run_assistant(user_input: str, state: AssistantState = None):
    if state is None:
        state = {
            "messages": [],
            "current_intent": "",
            "scraped_data": {},
            "email_content": {},
            "report_content": "",
            "ppt_content": {},
            "execution_status": "idle",
            "errors": []
        }
    
    state["messages"].append({"role": "user", "content": user_input})
    final_state = app.invoke(state)
    
    return final_state

# 测试
result = run_assistant("帮我从 https://ollama.com 爬取这个网站的主要功能介绍")
print(result["messages"][-1]["content"])

第24步:添加持久化状态(Checkpointing)

LangGraph支持持久化执行,Agent可以在失败后从上次中断的位置自动恢复:

from langgraph.checkpoint.sqlite import SqliteSaver

# 创建SQLite存储
memory = SqliteSaver.from_conn_string("checkpoints.db")

workflow = StateGraph(AssistantState)
# ... 添加节点和边 ...
app = workflow.compile(checkpointer=memory)

# 调用时指定thread_id即可在不同会话间恢复状态
config = {"configurable": {"thread_id": "user-123-session"}}
result = app.invoke(state, config=config)

第25步:添加Human-in-the-Loop支持

对于重要决策(如发送邮件前确认),LangGraph支持人工介入:

from langgraph.checkpoint import interrupt

def email_node_with_confirm(state: AssistantState) -> AssistantState:
    # 在发送前暂停,等待用户确认
    confirm = interrupt("确认发送邮件?回复'y'继续,'n'取消")
    
    if confirm == "y":
        # 执行发送
        send_email(to=email_to, subject=subject, body=body)
        state["messages"].append({"role": "assistant", "content": "邮件已发送"})
    else:
        state["messages"].append({"role": "assistant", "content": "发送已取消"})
    
    return state

第五部分:RAG知识库增强(第26-28步)

第26步:使用LlamaIndex构建本地知识库

LlamaIndex是专为RAG(检索增强生成)场景设计的轻量级Python框架,它能够将非结构化本地数据与大语言模型高效连接。

pip install llama-index llama-index-embeddings-huggingface

第27步:加载文档并创建向量索引

from llama_index.core import (
    SimpleDirectoryReader,
    VectorStoreIndex,
    Settings
)
from llama_index.embeddings.huggingface import HuggingFaceEmbedding

# 配置嵌入模型(使用轻量级中文模型)
Settings.embed_model = HuggingFaceEmbedding(
    model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
)

# 加载知识文档(将工作资料放入./knowledge目录)
documents = SimpleDirectoryReader("./knowledge").load_data()
index = VectorStoreIndex.from_documents(documents)

# 创建查询引擎
query_engine = index.as_query_engine()

@tool
def search_knowledge_base(query: str) -> str:
    """在本地知识库中检索相关信息"""
    response = query_engine.query(query)
    return str(response)

第28步:将RAG工具集成到Agent

# 将知识库搜索工具添加到工具列表
tools_with_rag = tools + [search_knowledge_base]

agent_with_rag = create_agent(
    model=llm,
    tools=tools_with_rag,
    system_prompt="""你是一个智能工作助手,具备本地知识库检索能力。
    当用户提问涉及公司内部信息、文档资料或历史工作时,优先使用知识库搜索工具。
    """
)

第六部分:进阶增强与生产部署(第29-32步)

第29步:探索多Agent协作模式(CrewAI)

当任务复杂度进一步提升时,可以考虑引入多Agent协作架构。CrewAI提供了一个基于角色的多Agent框架:

from crewai import Agent, Task, Crew

researcher = Agent(
    role="研究员",
    goal="搜索和整理网络信息",
    backstory="擅长分析网页内容并提取关键信息",
    tools=[scrape_webpage],
    llm=llm
)

writer = Agent(
    role="报告撰写员",
    goal="将信息整理成结构化报告",
    backstory="擅长生成工作日报、周报",
    tools=[generate_daily_report],
    llm=llm
)

crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, write_task],
    verbose=True
)

第30步:部署可视化工作流(Dify平台)

如需更低代码的迭代体验,Dify是一个优秀的选择。它是一个拥有13万+GitHub Star的开源AI工作流平台,提供了可视化的工作流编辑器。配合Docker,可以在几分钟内完成自托管部署:

git clone https://github.com/langgenius/dify.git
cd dify/docker
docker-compose up -d

然后在Dify的Web界面中配置Ollama模型供应商,即可通过拖拽方式搭建Agent工作流。

第31步:性能优化与监控

对于生产级部署,建议:

  1. 使用LangSmith进行调试和观测:LangSmith提供Agent轨迹可视化、状态追踪和运行时指标采集。
  2. 实现工具调用重试机制:LangGraph内置了错误处理和重试机制,可大幅提升鲁棒性。
  3. 配置速率限制和预算控制:针对涉及API调用的工具设置使用上限。

第32步:完整项目总结与展望

至此,我们成功从零搭建了一个功能完备的本地AI助手,实现了以下核心能力:

功能模块 实现方式 验证要点
网页信息采集 ScrapeGraphAI + LangGraph工具 单页/多页信息提取准确
邮件自动收发 yagmail + IMAP协议 发送接收成功,异常处理完整
日报/月报生成 LangGraph节点 + 模板引擎 格式规范、内容充实
年终总结PPT python-pptx 多页PPT生成、内容填充
私有知识库RAG LlamaIndex 文档解析、向量检索准确
状态持久化 SqliteSaver 支持断点续传和会话恢复

最终架构全貌

# 完整的运行示例
def main():
    assistant = LocalAIAssistant()
    
    # 场景1:自动采集信息
    print(assistant.run("从 https://ollama.com 爬取模型列表和功能介绍"))
    
    # 场景2:生成日报
    print(assistant.run("我今天完成了模型部署、Agent配置、文档编写三项任务,没有遇到问题,明天计划开始写日报生成功能"))
    
    # 场景3:搜索本地知识库
    print(assistant.run("查找我们项目中关于Agent框架选型的讨论记录"))
    
    # 场景4:生成年终总结PPT
    content = {
        "title": "2026年度AI助手工作总结",
        "summary": "本年度成功实现本地化AI助手从0到1的完整建设...",
        "achievements": [
            "完成Agent框架从选型到落地的全过程",
            "实现五大核心功能(爬取/邮件/日报/月报/PPT)",
            "构建私有知识库RAG系统"
        ],
        "next_year_plan": ["引入多模态能力", "优化工具调用效率", "扩展更多自动化场景"]
    }
    print(assistant.run(f"生成年终总结PPT,内容如下:{content}"))
    
if __name__ == "__main__":
    main()

结语

从LangGraph的核心概念到具体工具实现,从单一Agent到多Agent协作,从命令行交互到可视化编排——30多个步骤,200多行核心代码,我们已经完整走通了本地AI助手的全栈开发流程。

2026年的Agent生态已经相当成熟:LangGraph提供了生产级的图编排能力,Ollama让本地模型部署触手可及,ScrapeGraphAI和LlamaIndex覆盖了数据采集与知识管理的各个环节。这套系统完全可以应用于日常办公自动化、个人知识管理、企业内部效率工具等真实场景。

当然,Agent技术的发展远未止步。微软于2026年4月发布的Agent Framework 1.0,整合了Semantic Kernel和AutoGen的生态,提供了跨.NET和Python的统一开发模型。Dify和n8n的结合也让AI自动化工作流更接近“零代码”的愿景[3†L19-L23]。今后的AI助手将不只是被动响应指令的聊天机器人,而是能够主动规划、持续学习的真正智能体。

现在,动手试试吧。你的本地AI助手,就在这几行代码之中。


相关资源

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐