本地AI驱动的文章生成器

在这份指南中,我们将引导你使用CrewAIOllama创建一个强大的AI驱动文章生成器。目标是构建一个Streamlit网络应用程序,利用两个专门的AI代理——一个是用于研究,另一个是用于写作——来生成任何主题的全面文章。而且最好的是?这个解决方案使用开源模型在本地运行,省去了昂贵API服务的成本!

完整代码从这里下载。

我们将构建的内容:

  • 一个生成任何给定主题详细文章的网络应用程序。
  • 一个多代理系统,包括专门的代理:一个用于研究,另一个用于写作。
  • 使用Ollama的本地设置,而不是依赖付费云API。

1、先决条件

开始之前,请确保你已安装以下内容:

  • Python 3.8+
  • Ollama(用于运行本地AI模型)
  • 所需的Python包:
pip install crewai langchain-community langchain-openai streamlit pydantic

设置Ollama:

  1. 从ollama.ai安装Ollama。
  2. 拉取mistral模型:
ollama pull mistral

2、代码分解

让我们将应用程序分解为逻辑组件:

2.1 初始设置和导入

import os  
from crewai import Agent, Task, Crew, Process  
from langchain_community.tools import DuckDuckGoSearchRun  
from langchain_openai import ChatOpenAI  
import streamlit as st  
from pydantic import BaseModel
# DuckDuckGo工具用于收集搜索结果  
tool = DuckDuckGoSearchRun()  
# 配置LLM以使用Ollama(mistral模型)  
llm = ChatOpenAI(  
    model="ollama/mistral",  
    base_url="http://localhost:11434",  # 本地Ollama实例  
    temperature=0.1  # 低温度以保持输出一致性  
)

2.2 创建专用代理

我们的系统使用两个代理:一个用于研究,另一个用于写作。以下是它们的定义以及背景故事:

# 研究代理  
News_Researcher = Agent(  
    role="高级研究分析师",  
    goal="对{topic}中的新兴趋势和技术进行全面分析",  
    verbose=True,  
    memory=True,  
    backstory="""你是一位杰出的研究分析师,在新兴技术和市场趋势方面拥有专业知识。凭借技术预见博士学位和在领先智库多年的工作经验,你在识别突破性创新及其对行业和社会的潜在影响方面表现出色。你的分析能力使你能发现他人可能忽略的模式和联系。""",  
    tools=[tool],  
    llm=llm,  
    allow_delegation=True  
)  
  
# 写作代理  
News_Writer = Agent(  
    role='科技记者',  
    goal='为普通读者撰写关于{topic}的引人入胜且信息丰富的文章',  
    verbose=True,  
    memory=True,  
    backstory="""你是获奖的科技记者,擅长将复杂主题变得易于理解。凭借科学传播和创意写作的背景,你已经掌握了将技术见解转化为引人入胜叙述的艺术。你的文章曾刊登在领先的科技出版物上,并且你善于在每个故事中找到人性的角度。""",  
    tools=[tool],  
    llm=llm,  
    allow_delegations=False  
)

2.3 定义研究和写作任务

我们将为两个代理创建专注的任务。研究任务侧重于收集关键信息,而写作任务则涉及将这些信息转化为文章。

# 研究任务  
Research_task = Task(  
    description="""  
    对{topic}进行深入分析,解决以下关键领域:  
    1. 当前格局和最近突破的概述  
    2. 识别推动进步的关键参与者和创新  
    3. 市场影响和新兴机会的分析  
    4. 主要技术挑战和潜在解决方案的探索  
    5. 未来预测和预期发展确保研究包括详细的例子、相关的统计数据(如适用)、以及来自可信来源的见解。  
    """,  
    expected_output="涵盖主题所有主要方面的详细研究报告,包含具体示例和数据点",  
    tools=[tool],  
    agent=News_Researcher,  
    llm=llm  
)  
# 写作任务  
Write_task = Task(  
    description="""  
    使用研究结果,撰写一篇吸引人的文章,内容包括:  
    1. 引人注目的介绍  
    2. 使用类比简化复杂概念  
    3. 包含实用示例和现实世界用例  
    4. 探索对各个行业的潜在影响  
    5. 结尾展望未来  
    文章应具有平衡的语气,既乐观又现实地对待挑战。内容应以清晰、有条理的markdown格式呈现,带有适当的标题和部分,便于阅读。  
    """,  
    expected_output="结构良好的markdown文章,12-14段,内容清晰且有吸引力",  
    tools=[tool],  
    agent=News_Writer,  
    async_execution=False,  
    output_file='blog.md',  
    llm=llm  
)  

2.4 Streamlit界面

在这里我们配置了Streamlit界面,以便轻松交互和文章生成。

st.set_page_config(page_title="CrewAI文章生成器", page_icon="📝", layout="wide")  
# 自定义CSS以获得更好的样式  
st.markdown("""  
<style>  
    .reportview-container {  
        background: #f0f2f6  
    }  
    .main {  
        background: #ffffff;  
        padding: 3rem;  
        border-radius: 10px;  
        box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);  
    }  
    .stButton>button {  
        background-color: #0066cc;  
        color: white;  
        border-radius: 5px;  
    }  
    .stTextInput>div>div>input {  
        border-radius: 5px;  
    }  
</style>  
""", unsafe_allow_html=True)  
st.title("📝 AI文章生成器")  
st.markdown("""  
此应用程序使用CrewAI与Ollama生成任何主题的综合文章。  
系统采用两个AI代理:  
- 一个研究分析师负责收集和分析信息  
- 一个科技记者负责最终文章的撰写  
""")  
# 动态文章生成的主题输入  
topic = st.text_input("输入主题:", placeholder="例如:量子计算、绿色能源、Web3")  
if st.button("生成文章"):  
    if not topic:  
        st.warning("请在生成文章前输入主题。")  
    else:  
        progress_bar = st.progress(0)  
          
        # 初始化团队  
        crew = Crew(  
            agents=[News_Researcher, News_Writer],  
            tasks=[Research_task, Write_task],  
            process=Process.sequential,  
        )  
        with st.spinner(f"正在研究并撰写关于‘{topic}’的文章..."):  
            progress_bar.progress(50)  
            result = crew.kickoff(inputs={'topic': topic})  
          
        progress_bar.progress(100)  
          
        st.subheader("生成的文章:")  
        st.markdown(result)  
        # 添加下载按钮  
        st.download_button(  
            label="下载文章",  
            data=result,  
            file_name=f"{topic.replace(' ', '_').lower()}_article.md",  
            mime="text/markdown"  
        )

2.5 运行应用程序

  1. 保存代码到文件(例如article_generator.py)。
  2. 确保Ollama正在运行并加载了mistral模型。
  3. 运行应用程序
streamlit run article_generator.py

3、工作原理

1. Ollama集成:我们使用Ollama在本地运行mixtral模型,而不是依赖OpenAI的云API。通过ChatOpenAI类完成设置,使用指向Ollama服务器的自定义base URL。

2. 代理系统:应用程序使用两个代理:

  • 研究分析师收集并分析详细信息。
  • 科技记者将研究转化为引人入胜、可读的文章。

3. 任务管道:任务按顺序执行:

  • 进行全面研究。
  • 将研究转化为文章。

4. 网络界面:Streamlit应用提供用户友好的界面,用户可以:

  • 输入文章主题。
  • 监控进度# 使用Ollama的好处
  • 成本效益高:无需昂贵的API调用,所有操作都在本地进行。
  • 隐私保护:所有处理都在您的机器上进行,确保数据隐私。
  • 可定制性:轻松切换Ollama中可用的不同模型。
  • 无速率限制:可以随意生成文章,不会遇到任何限制。

4、最佳实践和技巧

  • 模型选择:虽然mistral表现良好,但您可以尝试Ollama中的其他模型。
  • 内存使用:设置memory=True可以让代理在任务期间保持上下文。
  • 温度设置:使用较低的温度(0.1)以获得更集中和一致的输出。
  • 错误处理:验证输入并优雅地处理潜在错误,以确保平稳运行。

5、结束语

本文演示了如何使用CrewAIOllama构建一个基于AI的文章生成器。通过结合本地AI模型和多代理协作,该系统为内容生成提供了一个强大的解决方案。

完整的源代码可在上方获取,您可以通过添加以下功能进一步扩展它:

  • 支持不同的内容类型。
  • 多语言支持。
  • 自定义格式选项。
  • 额外的研究工具。

尝试不同的配置,找到最适合您需求的设置!


原文链接:Local AI Agent — Building an AI-Powered Article Generator with CrewAI and Ollama

汇智网翻译整理,转载请标明出处