当单智能体面临复杂任务时,容易陷入思维混乱和工具滥用。多智能体系统通过角色分工解决三大核心问题:
模块化:各Agent专注特定能力域(如搜索/编码/审核)
错误隔离:单个Agent故障不影响整体系统
解释性:每个决策节点可追溯


class Tool:
def __init__(self, name, func, params):
self.name = name # 工具名称
self.func = func # 底层函数
self.params = params # 参数规范
def validate_input(self, inputs):
# 类型检查与转换
if type(inputs) != self.params["type"]:
try:
return self.params["type"](inputs)
except:
raise ValueError("Invalid input type")
def execute(self, **kwargs):
validated = {k: self.validate_input(v) for k,v in kwargs.items()}
return self.func(**validated)典型工具示例:
WebSearchTool: 网络信息获取
CodeGenerator: 代码生成
DataAnalyzer: 结构化数据分析
class Agent:
def __init__(self, role, tools, llm_backend):
self.role = role # 角色定义
self.tools = {t.name:t for t in tools} # 工具集
self.llm = llm_backend
self.memory = [] # 思维链存储
def react_loop(self, task):
while not self._is_task_done():
thought = self._generate_thought(task)
if "ACTION" in thought:
tool_name, params = self._parse_action(thought)
result = self.tools[tool_name].execute(**params)
self.memory.append(f"Observation: {result}")
else:
return thought # 最终输出关键特性:
内置ReAct决策循环
动态工具选择机制
思维链持久化存储
class Crew:
def __init__(self):
self.agents = {} # 注册的智能体
self.dependencies = {} # 依赖图
def add_agent(self, name, agent, deps=[]):
self.agents[name] = agent
self.dependencies[name] = deps
def execute(self, input_data):
# 拓扑排序解决执行顺序
ordered_agents = self._topological_sort()
outputs = {}
for agent_name in ordered_agents:
agent_input = input_data if not outputs else outputs[agent_name]
result = self.agents[agent_name].react_loop(agent_input)
outputs[agent_name] = result
return outputs

这是此演示的技术栈:
CrewAI 用于多代理编排。
Cohere 的 CommandR-7B 作为 LLM。
1) 分析师Agent:
接受用户查询。
使用Serper网络搜索工具从互联网获取结果。
汇总结果。
2) 内容撰写Agent:
使用精心整理的结果来准备一篇 polished、出版准备好的文章。
pip install crewai crewai-tools
SERPER_API_KEY=your_serper_api_key COHERE_API_KEY=your_cohere_apikey
import os
import streamlit as st
from crewai import Agent, Task, Crew, LLM
from crewai_tools import SerperDevTool
from dotenv import load_dotenv
# Load environment variables
load_dotenv()
# Streamlit page config
st.set_page_config(page_title="AI News Generator", page_icon="📰", layout="wide")
# Title and description
st.title("🤖 AI News Generator, powered by CrewAI and Cohere's Command R7B")
st.markdown("Generate comprehensive blog posts about any topic using AI agents.")
# Sidebar
with st.sidebar:
st.header("Content Settings")
# Make the text input take up more space
topic = st.text_area(
"Enter your topic",
height=100,
placeholder="Enter the topic you want to generate content about..."
)
# Add more sidebar controls if needed
st.markdown("### Advanced Settings")
temperature = st.slider("Temperature", 0.0, 1.0, 0.7)
# Add some spacing
st.markdown("---")
# Make the generate button more prominent in the sidebar
generate_button = st.button("Generate Content", type="primary", use_container_width=True)
# Add some helpful information
with st.expander("ℹ️ How to use"):
st.markdown("""
1. Enter your desired topic in the text area above
2. Adjust the temperature if needed (higher = more creative)
3. Click 'Generate Content' to start
4. Wait for the AI to generate your article
5. Download the result as a markdown file
""")
def generate_content(topic):
llm = LLM(
model="command-r",
temperature=0.7
)
search_tool = SerperDevTool(n_results=10)
# First Agent: Senior Research Analyst
senior_research_analyst = Agent(
role="Senior Research Analyst",
goal=f"Research, analyze, and synthesize comprehensive information on {topic} from reliable web sources",
backstory="You're an expert research analyst with advanced web research skills. "
"You excel at finding, analyzing, and synthesizing information from "
"across the internet using search tools. You're skilled at "
"distinguishing reliable sources from unreliable ones, "
"fact-checking, cross-referencing information, and "
"identifying key patterns and insights. You provide "
"well-organized research briefs with proper citations "
"and source verification. Your analysis includes both "
"raw data and interpreted insights, making complex "
"information accessible and actionable.",
allow_delegation=False,
verbose=True,
tools=[search_tool],
llm=llm
)
# Second Agent: Content Writer
content_writer = Agent(
role="Content Writer",
goal="Transform research findings into engaging blog posts while maintaining accuracy",
backstory="You're a skilled content writer specialized in creating "
"engaging, accessible content from technical research. "
"You work closely with the Senior Research Analyst and excel at maintaining the perfect "
"balance between informative and entertaining writing, "
"while ensuring all facts and citations from the research "
"are properly incorporated. You have a talent for making "
"complex topics approachable without oversimplifying them.",
allow_delegation=False,
verbose=True,
llm=llm
)
# Research Task
research_task = Task(
description=("""
1. Conduct comprehensive research on {topic} including:
- Recent developments and news
- Key industry trends and innovations
- Expert opinions and analyses
- Statistical data and market insights
2. Evaluate source credibility and fact-check all information
3. Organize findings into a structured research brief
4. Include all relevant citations and sources
"""),
expected_output="""A detailed research report containing:
- Executive summary of key findings
- Comprehensive analysis of current trends and developments
- List of verified facts and statistics
- All citations and links to original sources
- Clear categorization of main themes and patterns
Please format with clear sections and bullet points for easy reference.""",
agent=senior_research_analyst
)
# Writing Task
writing_task = Task(
description=("""
Using the research brief provided, create an engaging blog post that:
1. Transforms technical information into accessible content
2. Maintains all factual accuracy and citations from the research
3. Includes:
- Attention-grabbing introduction
- Well-structured body sections with clear headings
- Compelling conclusion
4. Preserves all source citations in [Source: URL] format
5. Includes a References section at the end
"""),
expected_output="""A polished blog post in markdown format that:
- Engages readers while maintaining accuracy
- Contains properly structured sections
- Includes Inline citations hyperlinked to the original source url
- Presents information in an accessible yet informative way
- Follows proper markdown formatting, use H1 for the title and H3 for the sub-sections""",
agent=content_writer
)
# Create Crew
crew = Crew(
agents=[senior_research_analyst, content_writer],
tasks=[research_task, writing_task],
verbose=True
)
return crew.kickoff(inputs={"topic": topic})
# Main content area
if generate_button:
with st.spinner('Generating content... This may take a moment.'):
try:
result = generate_content(topic)
st.markdown("### Generated Content")
st.markdown(result)
# Add download button
st.download_button(
label="Download Content",
data=result.raw,
file_name=f"{topic.lower().replace(' ', '_')}_article.md",
mime="text/markdown"
)
except Exception as e:
st.error(f"An error occurred: {str(e)}")
# Footer
st.markdown("---")
st.markdown("Built with CrewAI, Streamlit and powered by Cohere's Command R7B")# 并行执行独立Agent
with concurrent.futures.ThreadPoolExecutor() as executor:
futures = {executor.submit(agent.react_loop): agent
for agent in independent_agents}与传统框架对比

适用场景:需要深度定制的复杂工作流推荐原生实现,快速原型建议使用CrewAI