作者:Ethan Zhang | 发布时间:2026-07-30 | 标签:
AI AgentLangChain工作流工具调用大模型
传统的大模型应用多采用「单轮问答」,但面对复杂任务(如市场调研、代码开发、科研综述),往往需要多步骤推理和外部交互。AI 智能体(Agent)通过以下循环工作:
这种「思考-行动-观察」的循环被称为 ReAct(Reasoning + Acting),是实现复杂自动化的核心范式。
本文将通过一个具体的科研助手案例,展示如何用 LangChain 搭建这样的工作流。
用户输入一个研究主题(例如 “Transformer 在计算机视觉中的应用”),智能体自动:
arxiv 库查询论文。采用 顺序 + 条件分支 的方式:
search_arxiv(query):返回论文列表(id, title, summary, url)summarize_text(text):生成摘要(调用 LLM)cluster_keywords(papers):提取高频关键词# 创建虚拟环境
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:
OPENAI_API_KEY=your-key-here
OPENAI_API_BASE=https://api.openai.com/v1 # 或兼容端点我们将定义三个工具类,每个都继承自 BaseTool。
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使用 LangChain 的 create_react_agent 和 AgentExecutor。
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"
)虽然 Agent 本身具备自主规划能力,但我们也可以显式地构建一个「工作流」来固定流程,增强稳定性。这里我们采用两种模式:
SequentialChain 或自定义 Runnable 来强制流程。本文重点展示模式 A(更灵活),同时给出模式 B 的骨架。
# 模式 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
# ... 略,我们将在完整代码中展示将以上所有代码合并为一个文件 agent_workflow.py,并添加主入口。
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()运行方式:
python agent_workflow.py输入主题后,Agent 会输出详细的思考过程(verbose 模式),最终生成报告。
> 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在计算机视觉中的应用
...save_to_file、web_search 等,并加入记忆模块。StreamingResponse 在 Web 应用中实时展示思考过程。本文从零构建了一个基于 ReAct 模式的 AI 智能体工作流,通过三个自定义工具实现了科研文献的自动检索、摘要和综述生成。读者可以以此为模板,快速搭建适用于自身领域的自动化助手。
AI 智能体工作流是迈向「通用人工智能」的重要一步,其核心在于将大模型的推理能力与外部工具相结合。未来,随着工具生态的丰富和规划能力的提升,智能体将能够处理更复杂的现实任务,如自动化数据分析、软件工程、科学发现等。
欢迎在评论区分享你的实践经历和创意!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。