首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >构建 AI 智能体工作流:从零实现一个自主研究助手

构建 AI 智能体工作流:从零实现一个自主研究助手

原创
作者头像
资源大佬 jzit-top
发布2026-07-30 17:07:31
发布2026-07-30 17:07:31
1750
举报

构建 AI 智能体工作流:从零实现一个自主研究助手

作者:Ethan Zhang | 发布时间:2026-07-30 | 标签:AI Agent LangChain 工作流 工具调用 大模型


1. AI 智能体工作流概述

传统的大模型应用多采用「单轮问答」,但面对复杂任务(如市场调研、代码开发、科研综述),往往需要多步骤推理外部交互。AI 智能体(Agent)通过以下循环工作:

  1. 感知:接收用户指令和环境状态。
  2. 规划:将大任务分解为可执行子任务。
  3. 行动:调用工具(搜索、计算、数据库等)获取信息。
  4. 观察:收集结果并更新上下文。
  5. 迭代:直到达成最终目标。

这种「思考-行动-观察」的循环被称为 ReAct(Reasoning + Acting),是实现复杂自动化的核心范式。

本文将通过一个具体的科研助手案例,展示如何用 LangChain 搭建这样的工作流。


2. 系统架构与设计思路

目标功能

用户输入一个研究主题(例如 “Transformer 在计算机视觉中的应用”),智能体自动:

  • 搜索 ArXiv 获取相关论文列表
  • 获取每篇论文的摘要和链接
  • 对摘要进行关键词提取和聚类
  • 生成一份简要综述报告

技术选型

  • LangChain:提供 Agent、Tool、Chain 等抽象。
  • OpenAI API(或兼容 API):作为基础 LLM(如 GPT-3.5/4)。
  • ArXiv API:使用 arxiv 库查询论文。
  • 向量存储(可选):用于缓存和相似检索(本文简化)。

工作流设计

采用 顺序 + 条件分支 的方式:

  1. 用户输入 → 调用 Agent 执行 ReAct 循环。
  2. Agent 可用的工具:
    • search_arxiv(query):返回论文列表(id, title, summary, url)
    • summarize_text(text):生成摘要(调用 LLM)
    • cluster_keywords(papers):提取高频关键词
  3. Agent 根据任务自主决定调用哪些工具、调用顺序。
  4. 最终输出 Markdown 格式的报告。

3. 环境准备与依赖安

代码语言:javascript
复制
# 创建虚拟环境
conda create -n agent python=3.10
conda activate agent

# 安装核心库
pip install langchain langchain-openai arxiv pypdf tiktoken
pip install python-dotenv
pip install faiss-cpu   # 可选,用于向量检索

创建 .env 文件存放 API Key:

代码语言:javascript
复制
OPENAI_API_KEY=your-key-here
OPENAI_API_BASE=https://api.openai.com/v1   # 或兼容端点

4. 核心组件实现

4.1 工具定义(ArXiv搜索、摘要、存储)

我们将定义三个工具类,每个都继承自 BaseTool

代码语言:javascript
复制
import os
import arxiv
from typing import Type, List, Dict
from langchain.tools import BaseTool
from langchain.llms import OpenAI
from langchain.callbacks.manager import AsyncCallbackManagerForToolRun
from pydantic import BaseModel, Field
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate

# ---------- 工具1:ArXiv 搜索 ----------
class ArxivSearchInput(BaseModel):
    query: str = Field(description="研究主题或关键词,例如 'attention mechanism in NLP'")

class ArxivSearchTool(BaseTool):
    name = "arxiv_search"
    description = "根据关键词搜索 arXiv 论文,返回前5篇的列表(包含标题、摘要、链接)"
    args_schema: Type[BaseModel] = ArxivSearchInput

    def _run(self, query: str) -> str:
        try:
            search = arxiv.Search(
                query=query,
                max_results=5,
                sort_by=arxiv.SortCriterion.Relevance
            )
            results = []
            for paper in search.results():
                results.append({
                    "title": paper.title,
                    "summary": paper.summary[:300] + "..." if len(paper.summary) > 300 else paper.summary,
                    "url": paper.entry_id,
                    "published": paper.published.strftime("%Y-%m-%d")
                })
            if not results:
                return "未找到相关论文。"
            # 格式化输出
            output = "找到以下论文:\n"
            for i, p in enumerate(results, 1):
                output += f"{i}. **{p['title']}**\n   - 摘要: {p['summary']}\n   - 链接: {p['url']}\n   - 日期: {p['published']}\n\n"
            return output
        except Exception as e:
            return f"搜索出错: {str(e)}"

    async def _arun(self, query: str):
        raise NotImplementedError("不支持异步")

# ---------- 工具2:文本摘要(利用 LLM) ----------
class SummarizeInput(BaseModel):
    text: str = Field(description="需要摘要的长文本,通常是一篇论文摘要或段落")

class SummarizeTool(BaseTool):
    name = "summarize"
    description = "对输入的长文本生成简洁摘要(约50字)"
    args_schema: Type[BaseModel] = SummarizeInput

    def __init__(self, llm=None):
        super().__init__()
        self.llm = llm or OpenAI(temperature=0)

    def _run(self, text: str) -> str:
        prompt = PromptTemplate(
            input_variables=["text"],
            template="请用中文将以下内容精简为50字以内的摘要:\n\n{text}\n\n摘要:"
        )
        chain = LLMChain(llm=self.llm, prompt=prompt)
        result = chain.run(text=text)
        return result.strip()

    async def _arun(self, text: str):
        raise NotImplementedError

# ---------- 工具3:关键词聚类(简单实现) ----------
class ClusterInput(BaseModel):
    papers_info: str = Field(description="包含多篇论文摘要的文本(由 arxiv_search 返回的内容)")

class KeywordClusterTool(BaseTool):
    name = "keyword_cluster"
    description = "从多篇论文摘要中提取出现频率最高的5个关键词(用逗号分隔)"
    args_schema: Type[BaseModel] = ClusterInput

    def __init__(self, llm=None):
        super().__init__()
        self.llm = llm or OpenAI(temperature=0)

    def _run(self, papers_info: str) -> str:
        # 让 LLM 提取关键词
        prompt = PromptTemplate(
            input_variables=["info"],
            template="从以下论文摘要信息中提取出现频率最高的5个关键词(中文),用逗号分隔。只返回关键词列表,不要其他说明。\n\n{info}\n\n关键词:"
        )
        chain = LLMChain(llm=self.llm, prompt=prompt)
        keywords = chain.run(info=papers_info)
        return keywords.strip()

    async def _arun(self, papers_info: str):
        raise NotImplementedError

4.2 智能体创建(ReAct 模式)

使用 LangChain 的 create_react_agentAgentExecutor

代码语言:javascript
复制
from langchain.agents import create_react_agent, AgentExecutor
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI

# 初始化 LLM
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

# 实例化工具
tools = [
    ArxivSearchTool(),
    SummarizeTool(llm=llm),
    KeywordClusterTool(llm=llm)
]

# 定义 ReAct 风格的提示模板(LangChain 提供了标准模板,也可自定义)
from langchain.agents import AgentType
from langchain.agents import initialize_agent

# 使用默认的零样本 ReAct 代理
agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True,
    handle_parsing_errors=True,
    max_iterations=8,
    early_stopping_method="generate"
)

4.3 工作流编排(顺序与并行)

虽然 Agent 本身具备自主规划能力,但我们也可以显式地构建一个「工作流」来固定流程,增强稳定性。这里我们采用两种模式:

  • 模式 A:直接使用 Agent,让 LLM 自主决定调用顺序。
  • 模式 B:构建一个 SequentialChain 或自定义 Runnable 来强制流程。

本文重点展示模式 A(更灵活),同时给出模式 B 的骨架。

代码语言:javascript
复制
# 模式 A:直接调用 agent
def research_assistant(query: str):
    result = agent.invoke({"input": query})
    return result["output"]

# 模式 B:固定工作流(可选)
# 使用 LangChain Expression Language (LCEL)
from langchain_core.runnables import RunnablePassthrough, RunnableLambda
# ... 略,我们将在完整代码中展示

5. 完整代码整合与运行

将以上所有代码合并为一个文件 agent_workflow.py,并添加主入口。

代码语言:javascript
复制
import os
import arxiv
from dotenv import load_dotenv
from typing import Type
from pydantic import BaseModel, Field
from langchain.tools import BaseTool
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate

load_dotenv()

# ------------------ 工具定义(略,见上文) ------------------
# 此处粘贴 ArxivSearchTool, SummarizeTool, KeywordClusterTool 的完整类定义
# ...

def main():
    # 初始化 LLM
    llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
    
    # 工具实例化(注意将 llm 传入需要它的工具)
    tools = [
        ArxivSearchTool(),
        SummarizeTool(llm=llm),
        KeywordClusterTool(llm=llm)
    ]
    
    # 创建 Agent
    agent = initialize_agent(
        tools,
        llm,
        agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
        verbose=True,
        handle_parsing_errors=True,
        max_iterations=10,
        early_stopping_method="generate"
    )
    
    # 用户输入
    query = input("请输入你的研究主题: ")
    if not query:
        query = "Transformer 在计算机视觉中的应用"
    
    print("\n🚀 开始执行研究任务...\n")
    response = agent.invoke({"input": query})
    print("\n📄 最终报告:\n")
    print(response["output"])

if __name__ == "__main__":
    main()

运行方式

代码语言:javascript
复制
python agent_workflow.py

输入主题后,Agent 会输出详细的思考过程(verbose 模式),最终生成报告。


6. 结果展示与效果分析

示例输出(简化)

代码语言:javascript
复制
> Entering new AgentExecutor chain...
Thought: 我需要先搜索相关论文。
Action: arxiv_search
Action Input: "Transformer computer vision"
Observation: 找到以下论文:
1. **An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale**
   - 摘要:  ... 
   - 链接: https://arxiv.org/abs/2010.11929
...
Thought: 我已经获取了论文列表,接下来需要提取关键词。
Action: keyword_cluster
Action Input: 找到以下论文:...
Observation: 关键词:Transformer, 图像识别, 自注意力, ViT, 大规模预训练
Thought: 现在我可以生成报告了。
Final Answer: 
# 研究综述:Transformer在计算机视觉中的应用
...

效果分析

  • 优点:Agent 自主规划流程,无需硬编码步骤,适应性强。
  • 不足:LLM 可能产生幻觉或工具调用失败,需增加错误处理。
  • 改进方向:增加工具如 save_to_fileweb_search 等,并加入记忆模块。

7. 部署与扩展建议

  • API 限流:可添加缓存机制,对相同查询结果存储到本地(如 SQLite)。
  • 流式输出:使用 StreamingResponse 在 Web 应用中实时展示思考过程。
  • 工具扩展:集成浏览器、Python 执行器、数据库查询等,实现更强大的自动化。
  • 多模态:结合图片、语音输入,拓宽应用场景。
  • 生产级框架:可考虑使用 AutoGenCrewAILangGraph 构建多智能体协作系统。

8. 总结与展望

本文从零构建了一个基于 ReAct 模式的 AI 智能体工作流,通过三个自定义工具实现了科研文献的自动检索、摘要和综述生成。读者可以以此为模板,快速搭建适用于自身领域的自动化助手。

AI 智能体工作流是迈向「通用人工智能」的重要一步,其核心在于将大模型的推理能力与外部工具相结合。未来,随着工具生态的丰富和规划能力的提升,智能体将能够处理更复杂的现实任务,如自动化数据分析、软件工程、科学发现等。

欢迎在评论区分享你的实践经历和创意!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 构建 AI 智能体工作流:从零实现一个自主研究助手
    • 1. AI 智能体工作流概述
    • 2. 系统架构与设计思路
      • 目标功能
      • 技术选型
      • 工作流设计
    • 3. 环境准备与依赖安
    • 4. 核心组件实现
      • 4.1 工具定义(ArXiv搜索、摘要、存储)
      • 4.2 智能体创建(ReAct 模式)
      • 4.3 工作流编排(顺序与并行)
    • 5. 完整代码整合与运行
    • 6. 结果展示与效果分析
      • 示例输出(简化)
      • 效果分析
    • 7. 部署与扩展建议
    • 8. 总结与展望
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档