暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

解放双手!用crewAI和Neo4j实现自动化数据报告

活水智能 2025-03-01
104

点击上方↗️活水智能关注 + 星标🌟

作者:Tomaz Bratanic

编译:活水智能


 

本文将介绍如何利用 crewAI 和 Neo4j 自动生成基于动态数据的报告。

我个人非常喜欢使用 LLM(大型语言模型)构建基于 Agent 的流程。它们不仅能实现更高级的 Text2Cypher 应用(将自然语言文本转换为 Cypher 查询语言),还能为各种语义层应用(构建在数据之上的抽象层,用于提供更高级别的数据访问和理解)打开大门。这是一种极其强大且通用的方法。

在这篇博文中,我将尝试实现一种不同的 Agent(具备特定功能的智能代理)。与常见的问答场景不同,这个 Agent 的目标是生成针对特定地点中特定行业的详细报告。该实现利用了 crewAI,一个使开发人员能够轻松编排 AI Agent 的平台。

由三个 Agent 组成的 Crew

该系统通过三个 Agent 的协作,生成一份详尽的商业分析报告:

  1. 1. 数据研究 Agent:专门收集和分析特定行业在给定城市的数据,提供对公司数量、上市公司、总收入和表现最佳的组织的洞察。

  2. 2. 新闻分析 Agent:专注于提取和总结有关相关公司的最新消息,提供趋势、市场动向和情绪分析的快照。

  3. 3. 报告撰写 Agent:将研究和新闻洞察合成为结构良好、可操作的 Markdown 报告,确保报告内容清晰、精准且仅基于所提供的信息。

这些 Agent 共同形成一个流程,用于生成针对特定地点的有见地的行业报告。

代码可在 GitHub:https://github.com/tomasonjo/blogs/blob/master/llm/crewai_industry_report.ipynb 上找到。

数据集

我们将使用 Neo4j 演示服务器上的 companies 数据库,其中包含组织、个人以及部分组织的最新动态等详细信息。此数据是通过 Diffbot API 获取的。

图数据库模式

该数据集侧重于投资者、董事会成员和相关方面等详细信息,使其成为演示行业报告生成的绝佳资源。

# Neo4j 连接设置
URI = "neo4j+s://demo.neo4jlabs.com"
AUTH = ("companies", "companies")
driver = GraphDatabase.driver(URI, auth=AUTH)

以下代码展示了如何建立与 Neo4j 数据库的连接,这是后续数据获取的基础。

接下来,我们需要定义 OpenAI 密钥,因为我们将在整篇博文中都使用 GPT-4o:

# 设置你的 OpenAI API 密钥
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI key: ")
llm = LLM(model='gpt-4o', temperature=0)

基于知识图谱的工具

我们将首先实现一些工具,使 Agent/LLM 能够从数据库中检索相关信息。第一个工具将侧重于获取特定城市中特定行业内公司的关键统计数据:

industry_options = ["Software Companies", "Professional Service Companies", "Enterprise Software Companies", "Manufacturing Companies", "Software As A Service Companies", "Computer Hardware Companies", "Media And Information Companies", "Financial Services Companies", "Artificial Intelligence Companies", "Advertising Companies"]class GetCityInfoInput(BaseModel):
    """MyCustomTool 的输入模式。"""
    city: str = Field(..., description="城市名称")
    industry: str = Field(..., description=f"行业名称,可选值包括:{industry_options}")class GetCityInfo(BaseTool):
    name: str = "获取有关特定城市的信息"
    description: str = "当你想查找特定城市内特定行业的信息时,可以使用此工具。"
    args_schema: Type[BaseModel] = GetCityInfoInput    def _run(self, city: str, industry: str) -> str:
        data, _, _ = driver.execute_query("""MATCH (c:City)<-[:IN_CITY]-(o:Organization)-[:HAS_CATEGORY]->(i:IndustryCategory)
WHERE c.name = $city AND i.name = $industry
WITH o
ORDER BY o.nbrEmployees DESC
RETURN count(o) AS organizationCount,
     sum(CASE WHEN o.isPublic THEN 1 ELSE 0 END) AS publicCompanies,
     sum(o.revenue) AS combinedRevenue,
     collect(CASE WHEN o.nbrEmployees IS NOT NULL THEN o END)[..5] AS topFiveOrganizations""", city=city, industry=industry)
        return [el.data() for el in data]

GetCityInfo 工具检索特定城市中特定行业内公司的关键统计数据。它提供诸如组织总数、上市公司数量、总收入以及按员工人数排名的前五名组织的详细信息。为了本文的目的,我们对其进行了简化。

第二个工具可用于获取有关给定公司的最新信息:

class GetNews(BaseTool):
    name: str = "获取有关特定公司的最新消息"
    description: str = "当你想查找有关特定公司的最新消息时,可以使用此工具"    def _run(self, company: str) -> str:
        data, _, _ = driver.execute_query("""MATCH (c:Chunk)<-[:HAS_CHUNK]-(a:Article)-[:MENTIONS]->(o:Organization)
WHERE o.name = $company AND a.date IS NOT NULL
WITH c, a
ORDER BY a.date DESC
LIMIT 5
RETURN a.title AS title, a.date AS date, a.sentiment AS sentiment, collect(c.text) AS chunks""", company=company)
        return [el.data() for el in data]

GetNews 工具检索有关特定公司的最新消息。它提供诸如文章标题、发布日期、情绪分析以及文章中的关键摘录(即文章中的关键信息片段)等详细信息。此工具非常适合随时了解与特定组织相关的最新发展和市场趋势,从而使我们能够生成更详细的摘要。

Agent

如前所述,我们将实现三个 Agent。使用 crewAI,开发者只需要进行最少的提示工程(即设计引导 LLM 生成期望结果的指令),因为该平台能够自动处理 Agent 之间的协作和任务分配。

Agent 的实现方式如下:

# 定义 Agent
class ReportAgents:
    def __init__(self):
        self.researcher = Agent(
            role='数据研究员',
            goal='收集有关相关城市和行业中特定公司的全面信息',
            backstory="""你是一位专业的数据研究员,熟悉商业生态和城市人口分布,擅长分析复杂的数据关系。""",
            verbose=True,
            allow_delegation=False,
            tools=[GetCityInfo()],
            llm=llm
        )        self.news_analyst = Agent(
            role='新闻分析师',
            goal='查找和分析有关指定行业和城市中相关公司的最新消息',
            backstory="""你是一位资深的新闻分析师,精通商业新闻和市场研究,能够快速捕捉新闻中的关键趋势和动态。""",
            verbose=True,
            allow_delegation=False,
            tools=[GetNews()],
            llm=llm
        )        self.report_writer = Agent(
            role='报告撰写人',
            goal='创建全面的、结构良好的报告,结合提供的研究和新闻分析。不要包含任何未明确提供的信息。',
            backstory="""你是一位专业的报告撰写人,在商业情报和市场分析方面拥有经验。你擅长将信息综合成清晰、可操作的见解。不要包含任何未明确提供的信息。""",
            verbose=True,
            allow_delegation=False,
            llm=llm
        )

在 crewAI 中,通过指定 Agent 的角色、目标和背景故事来定义 Agent(相当于具备特定功能的智能代理),并提供可选工具来增强其功能。在此设置中,实现了三个 Agent:一个数据研究员,负责使用 GetCityInfo
 工具收集有关特定城市和行业中公司的详细信息;一个新闻分析师,负责使用 GetNews
 工具分析有关相关公司的最新消息;以及一个报告撰写人,负责将收集的信息和新闻综合成结构化的、可操作的报告,而不依赖于外部工具。这种对角色和目标的清晰定义确保了 Agent 之间的有效协作。

任务

除了定义 Agent 之外,我们还需要概述他们将要处理的任务。在这种情况下,我们将定义三个不同的任务:

# 定义任务
city_research_task = Task(
    description=f"""研究并分析 {city_name} 在 {industry_name} 行业中的商业生态:
    1. 收集城市的概况和关键数据
    2. 找出该行业的相关企业
    3. 分析组织间的合作关系、营收情况等经济指标""",
    agent=agents.researcher,
    expected_output="有关给定城市和行业中公司的基本统计信息以及表现最佳的组织"
)news_analysis_task = Task(
    description=f"""分析城市研究员提供的有关公司的最新消息""",
    agent=agents.news_analyst,
    expected_output="公司最新消息的摘要以及它可能如何影响市场",
    context=[city_research_task])report_writing_task = Task(
    description=f"""创建有关你从城市研究和新闻分析任务中获得的结果的详细 Markdown 报告。
    不要包含任何未提供的信息""",
    agent=agents.report_writer,
    expected_output="Markdown 摘要",
    context=[city_research_task, news_analysis_task])

这样的任务设计能够充分发挥每个Agent的优势。城市研究任务侧重于分析指定城市和行业的商业生态系统,收集关键统计数据并识别表现最佳的组织,由数据研究员处理。新闻分析任务检查与这些公司相关的最新发展,总结关键趋势和市场影响,使用城市研究的输出并由新闻分析师执行。最后,报告撰写任务将先前任务的发现综合成一份结构清晰的 Markdown 格式报告,由报告撰写人负责完成。

最后,我们只需要将所有内容放在一起:

# 创建并运行 Crew
crew = Crew(
    agents=[agents.researcher, agents.news_analyst, agents.report_writer],
    tasks=[city_research_task, news_analysis_task, report_writing_task],
    verbose=True,
    process=Process.sequential,)

让我们测试一下!

city = "Seattle"
industry = "Hardware Companies"
report = generate_report(city, industry)
print(report)

Agent 的中间步骤过于详细,无法在此处包含,但该过程本质上首先收集指定行业的关键统计数据并识别相关公司,然后检索有关这些公司的最新消息。

结果:

# 西雅图计算机硬件行业深度分析报告

## 概述

西雅图的计算机硬件公司行业包括 24 个组织,其中包括 4 家上市公司。这些公司的总收入约为 2291.4 亿美元(即229.14十亿美元)。本报告重点介绍了该行业的佼佼者以及影响他们的最新新闻发展。

## 顶级公司

1. **微软公司**
   - **收入**:1982.7 亿美元
   - **员工**:221,000
   - **状态**:上市公司
   - **使命**:使地球上的每个人和组织都能成就更多。
   
2. **英伟达公司**
   - **收入**:269.7 亿美元
   - **员工**:26,196
   - **状态**:上市公司
   - **曾用名**:Mellanox Technologies 和 Cumulus Networks

3. **F5 网络**
   - **收入**:26.95 亿美元
   - **员工**:7,089
   - **状态**:上市公司
   - **重点**:多云网络安全和应用程序交付
   
4. **Quest 软件**
   - **收入**:8.57415 亿美元
   - **员工**:4,055
   - **状态**:上市公司
   - **基地**:加利福尼亚
   
5. **SonicWall**
   - **收入**:3.1 亿美元
   - **员工**:1,600
   - **状态**:私营公司
   - **重点**:网络安全这些公司为西雅图的经济格局做出了重大贡献,推动了硬件行业的增长和创新。
   
## 最近的新闻和发展

- **微软公司**:其收购动视暴雪面临法律挑战,这可能会影响其游戏市场战略。
- **英伟达公司**:对中国 GPU 的需求强劲,突显了其在人工智能进步中的关键作用,并可能提升其市场地位。
- **F5 网络**:因其网络安全解决方案而获得认可,从而提高了其行业声誉。
- **Quest 软件**:推出新的数据智能平台,旨在改善数据可访问性和人工智能模型开发。
- **SonicWall**:进行领导层变更并发布威胁报告,强调其对网络安全增长和挑战的关注。这些发展有望影响市场动态、投资者认知和行业内的竞争策略。

请注意,演示数据集已过时;我们不会定期导入新闻。

总结

通过基于 Agent 的流程结合 Neo4j 和 crewAI,我们可以搭建一个自动化报告生成系统,从而探索 LLM 如何突破传统的问答模式。

通过这种方法,Agent 可以协作以发现给定城市中某个行业的关键统计数据,收集最新消息,并将所有内容综合成一份精美的 Markdown 报告。这表明,LLM 可以应用于创意性的多步骤流程,支持更复杂的场景,如自动化商业分析、数据驱动内容创作等。

代码可在GitHub(https://github.com/tomasonjo/blogs/blob/master/llm/crewai_industry_report.ipynb) 上找到。

 




学习资源


若要了解更多知识图谱或图数据库相关教学,你可以查看公众号的其他文章:




活水智能成立于北京,致力于通过AI教育、AI软件和社群提高知识工作者生产力。中国AIGC产业联盟理事。

活水现有AI线下工作坊等10+门课程,15+AI软件上线,多款产品在研。知识星球中拥有2600+成员,涵盖大厂程序员、公司高管、律师等各类知识工作者。在北、上、广、深、杭、重庆等地均有线下组织。

欢迎加入我们的福利群,每周都有一手信息、优惠券发放、优秀同学心得分享,还有赠书活动~

👇🏻👇🏻👇🏻

 点击阅读原文,立即入群

文章转载自活水智能,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论