潍坊市网站建设_网站建设公司_测试工程师_seo优化
2025/12/23 20:55:46 网站建设 项目流程

目录

🧠 第一部分:思维篇——如何设计智能体?

1.1 什么是“任务分解”?

1.2 本项目的架构设计

🕵️ 角色 A:Planner(主编/研究员)

✍️ 角色 B:Writer(笔者)

⚖️ 角色 C:Reviewer(审稿人)

1.3 灵魂注入:提示词(Prompts)设计

🛠️ 第二部分:准备篇——获取 Tavily Search API

获取步骤:

💻 第三部分:实战篇——代码落地

3.1 目录结构

3.2 步骤一:配置环境 (.env)

3.3 步骤二:连接大脑 (src/config.py)

3.4 步骤三:定义“接力棒” (src/state.py)

3.5 步骤四:定义工种 (src/nodes.py)

3.6 步骤五:组装流水线 (main.py)

🎯 运行效果

一觉醒来你回到2015,配备deepseek超级科研Agent系统。当你抛出一个课题,比如“分析 2025 年 AI Agent 的技术趋势”:

  • 有人立马去 Google Scholar 狂搜资料;

  • 有人根据资料快速起草长文;

  • 还有个严厉的导师帮你审稿,不合格就打回重写。

今天,我们将不再是简单的“写论文”,而是要扮演CTO(首席技术官)的角色,利用国产最强模型DeepSeek-V3LangGraph,把这个梦幻团队造出来。

完整代码已上传,点击作者主页资源即可下载完整代码!顺便点个关注吧~~


🧠 第一部分:思维篇——如何设计智能体?

在写代码之前,最重要的其实是设计。很多新手做 Agent 效果不好,不是代码写得烂,而是SOP(标准作业程序)没理顺。

1.1 什么是“任务分解”?

如果你直接告诉 AI:“给我写篇完美的论文”,它大概率会给你生成一篇泛泛而谈的废话。

Agent 设计的核心秘诀就一句话:把大任务切碎,直到每个小任务都能由一个刚毕业的实习生独立完成。

我们要把“写论文”这个大黑盒,拆解成三个具体的工序:

  1. 信息获取(Input):不管写什么,得先有素材。

    • 角色:规划师/研究员。

    • 技能:必须能上网(Google/Bing)。

  2. 内容生成(Processing):有了素材,进行整合与创作。

    • 角色:作家。

    • 技能:擅长长文本写作,逻辑严密。

  3. 质量控制(Quality Control):这一步最关键,也是 Agent 和 Chatbot 的区别。

    • 角色:审稿人。

    • 技能:批判性思维,能挑刺。

1.2 本项目的架构设计

基于上面的逻辑,我们定义了三个具体的智能体(Agent):

🕵️ 角色 A:Planner(主编/研究员)
  • 任务:理解用户题目,去搜索引擎抓取最新的几篇技术文章,然后汇总成一份大纲。

  • 为什么需要它?:防止 Writer 瞎编(幻觉),必须基于真实搜索结果来写。

✍️ 角色 B:Writer(笔者)
  • 任务:拿着 Planner 给的大纲和资料,写正文。如果被 Reviewer 骂了,要负责根据意见修改。

  • 输入:大纲 + 资料 + (可选的)审稿意见。

  • 输出:Markdown 格式的草稿。

⚖️ 角色 C:Reviewer(审稿人)
  • 任务:模拟苛刻的甲方。只做判断题:通过,还是不通过?如果不通过,哪里不好?

  • 核心逻辑:如果它说“不通过”,流程会倒流回 Writer 那里,形成一个循环(Loop)。

1.3 灵魂注入:提示词(Prompts)设计

代码只是骨架,提示词(Prompt)才是灵魂。为了让 DeepSeek 扮演好这些角色,我们需要精准定义它们的人设。

我们将使用 YAML 文件来管理提示词,这样修改起来非常方便:

# prompts.yaml planner: system: | 你是一个思维缜密的科研主编。 目标:根据用户的主题 '{task}' 和搜索到的资料,制定一份逻辑严密的博文大纲。 要求: 1. 必须基于搜索结果,不要凭空捏造。 2. 大纲包含:引言、核心概念、技术实现、总结。 3. 输出要条理清晰。 writer: system: | 你是一名资深技术专家。请基于以下信息撰写文章: 【任务】: {task} 【大纲】: {plan} 【参考资料】: {content} 【审稿意见】: {critique} (如果是初稿则为"无") 要求: 1. 如果有审稿意见,请务必根据意见修改文章,不要忽略! 2. 使用标准的 Markdown 格式。 3. 代码块请用 Python 格式标记。 reviewer: system: | 你是严厉的 Nature 期刊审稿人。请评审以下草稿: {draft} 你的任务是判断文章是否合格。 - 如果文章逻辑严密、内容充实,请仅回复: "APPROVE" - 如果需要修改,请列出 3 条具体的修改建议。

🛠️ 第二部分:准备篇——获取 Tavily Search API

既然要写科研论文,联网搜索是必不可少的。

为什么不用 Google Search API?因为它配置极其麻烦,且返回的是一大堆 HTML 乱码,AI 看不懂。

Tavily是专门为 AI Agent 设计的搜索引擎,它会帮你把网页内容清洗、提取、摘要,直接喂给大模型。

获取步骤:

  1. 访问官网:打开 https://tavily.com/。

  2. 注册账号:点击 "Start for free",支持 Google 或 GitHub 一键登录。

  3. 复制 Key:登录后,在overview 页就能看到Your API Key(通常以tvly-开头)。

  4. 额度:免费版每月有 1000 次搜索额度,做开发测试绰绰有余。

拿到 Key 后,请保存在记事本里,稍后我们要填入配置文件。


💻 第三部分:实战篇——代码落地

现在我们开始写代码。为了保持优雅,我们将采用模块化的结构。

3.1 目录结构

请在你的 IDE(VS Code / PyCharm)中创建如下文件夹:

ai_paper_team/ ├── .env # [重要] 存放 API Key ├── prompts.yaml # [核心] 上面设计的提示词文件 ├── main.py # [入口] 启动程序 └── src/ ├── __init__.py ├── config.py # [配置] DeepSeek 和 Tavily 的配置 ├── state.py # [状态] 定义数据在 Agent 间怎么传 ├── nodes.py # [逻辑] 具体干活的函数 └── utils.py # [UI] 控制台美化工具

Linux/macOS端运行下面的代码,快速创建项目。

# Linux/macOS(bash/zsh 终端)指令 # 通过 mkdir -p 创建多级目录,touch 批量创建空文件,一行即可完成结构搭建: # 创建根目录+src子目录,再创建所有文件 mkdir -p ai_paper_team/src && \ touch ai_paper_team/.env && \ touch ai_paper_team/requirements.txt && \ touch ai_paper_team/prompts.yaml && \ touch ai_paper_team/main.py && \ touch ai_paper_team/src/__init__.py && \ touch ai_paper_team/src/config.py && \ touch ai_paper_team/src/state.py && \ touch ai_paper_team/src/nodes.py && \ touch ai_paper_team/src/utils.py

3.2 步骤一:配置环境 (.env)

.env文件中填入你的密钥:

# DeepSeek API Key (从 deepseek 开放平台获取) DEEPSEEK_API_KEY=sk-xxxxxxxxxxxx # Tavily Search API Key (刚刚获取的) TAVILY_API_KEY=tvly-xxxxxxxxxxxx

3.3 步骤二:连接大脑 (src/config.py)

DeepSeek V3 完美兼容 OpenAI 的 SDK,所以配置起来非常简单。

import os import yaml from dotenv import load_dotenv from langchain_openai import ChatOpenAI # 加载 .env 环境变量 load_dotenv() # 读取 prompts.yaml def load_prompts(): with open("prompts.yaml", "r", encoding="utf-8") as f: return yaml.safe_load(f) PROMPTS = load_prompts() # 初始化 DeepSeek 模型 llm = ChatOpenAI( model="deepseek-chat", api_key=os.getenv("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com", # 🌟 关键:一定要指向 DeepSeek 的地址 temperature=0.6 # 稍微有点创造力,但别太发散 )

3.4 步骤三:定义“接力棒” (src/state.py)

LangGraph 的核心是状态(State)。你可以把它想象成一个共享文件夹,每个 Agent 拿到文件夹后,读取里面的文件,处理完再把新文件放进去,传给下一个人。

from typing import TypedDict class AgentState(TypedDict): task: str # 原始的任务主题 plan: str # Planner 生成的大纲 content: str # Tavily 搜到的资料 draft: str # Writer 写的草稿 critique: str # Reviewer 给的修改意见 revision_number: int # 当前修改了第几次(防止死循环) max_revisions: int # 最多允许修改几次

3.5 步骤四:定义工种 (src/nodes.py)

这里是真正的业务逻辑。我们让 DeepSeek 扮演不同的角色。

from langchain_community.tools.tavily_search import TavilySearchResults from langchain_core.prompts import ChatPromptTemplate from src.state import AgentState from src.config import llm, PROMPTS # 初始化搜索工具 search_tool = TavilySearchResults(max_results=3) def planner_node(state: AgentState): """规划师:负责搜索和定大纲""" print("--- [PLANNER] 正在思考并搜索资料 ---") # 1. 联网搜索 search_results = search_tool.invoke(state["task"]) # 把搜索结果拼接成字符串 content_str = "\n".join([r["content"] for r in search_results]) # 2. 调用 DeepSeek 生成大纲 prompt = ChatPromptTemplate.from_template(PROMPTS["planner"]["system"]) chain = prompt | llm result = chain.invoke({"task": state["task"], "content": content_str}) # 更新状态,传给下一个人 return {"plan": result.content, "content": content_str, "revision_number": 0} def writer_node(state: AgentState): """笔者:负责写和改""" print("--- [WRITER] 正在撰写/修改文章 ---") prompt = ChatPromptTemplate.from_template(PROMPTS["writer"]["system"]) chain = prompt | llm result = chain.invoke({ "task": state["task"], "plan": state["plan"], "content": state["content"], "critique": state.get("critique", "无") # 如果是第一次写,就没有意见 }) # 修改次数 +1 revision_num = state.get("revision_number", 0) + 1 return {"draft": result.content, "revision_number": revision_num} def reviewer_node(state: AgentState): """审稿人:负责挑刺""" print("--- [REVIEWER] 正在严格审阅 ---") prompt = ChatPromptTemplate.from_template(PROMPTS["reviewer"]["system"]) chain = prompt | llm result = chain.invoke({"draft": state["draft"]}) return {"critique": result.content} def router_node(state: AgentState): """路由:决定下一步怎么走""" critique = state["critique"] rev_num = state["revision_number"] max_rev = state["max_revisions"] # 逻辑判断 if "APPROVE" in critique: print("--- [系统] 审稿通过,流程结束 ---") return "end" elif rev_num > max_rev: print("--- [系统] 修改次数超限,强制结束 ---") return "end" else: print("--- [系统] 意见驳回,退回 Writer 修改 ---") return "continue"

3.6 步骤五:组装流水线 (main.py)

最后,我们像搭积木一样,把这些 Node 用 Edge(边)连起来。

from langgraph.graph import StateGraph, END from src.state import AgentState from src.nodes import planner_node, writer_node, reviewer_node, router_node def build_graph(): # 1. 创建图 workflow = StateGraph(AgentState) # 2. 添加节点 (招聘员工) workflow.add_node("planner", planner_node) workflow.add_node("writer", writer_node) workflow.add_node("reviewer", reviewer_node) # 3. 设置入口 workflow.set_entry_point("planner") # 4. 连接节点 (定义工序) # Planner 做完 -> 给 Writer workflow.add_edge("planner", "writer") # Writer 做完 -> 给 Reviewer workflow.add_edge("writer", "reviewer") # 5. 条件边 (Conditional Edge) # Reviewer 做完 -> 根据情况,要么回 Writer,要么结束 workflow.add_conditional_edges( "reviewer", router_node, { "continue": "writer", "end": END } ) return workflow.compile() if __name__ == "__main__": app = build_graph() print("🚀 多智能体写作团队已就位...") user_task = "分析 AI Agent 在金融领域的应用前景" # 启动! final_state = app.invoke( {"task": user_task, "max_revisions": 2}, # 最多改2次 config={"recursion_limit": 10} ) print("\n\n========== 最终产出 ==========\n") print(final_state["draft"])

🎯 运行效果

当你运行python main.py时,你会看到控制台打印出这样的流程:

这就是多智能体协作的魅力!它不是一步到位的,而是像人类团队一样,通过沟通、反馈、迭代,产出高质量的内容。

快去申请 Key,复制上面的代码,从零开始搭建你的第一支 AI 团队吧!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询