用实时数据增强AI代理

随着最近关于AI代理和应用的热议,我决定做一个有趣的项目——一个实时内容摘要生成器,它从Reddit和X(前身为Twitter)抓取趋势帖子,并通过本地大型语言模型(LLM)运行,生成简洁的摘要。

这个项目的难点本应是获取数据;抓取似乎太费力且需要太多工作,尤其是之后还需要清理数据。幸运的是,我发现并使用了Bright Data提供的Reddit和X结构化数据集,这为我提供了干净、高质量且最新的内容,而无需担心常见的问题如速率限制或脆弱的抓取逻辑。

因此,在这篇文章中,我将向您展示如何使用Bright Data提供的数据集、LangChain、Ollama和Streamlit来构建此工具。

1、我们要构建什么

想法很简单:构建一个工具,抓取趋势内容并将其转换为快速易懂的摘要。

可以把它想象成一个个人摘要机器人。它抓取Reddit和X的最新帖子,通过LangChain将它们传递给本地LLM,并输出您可以实际跟上的干净、总结性的观点。目标不是重新发明轮子——而是看看通过连接正确的工具以及更重要的提供正确的数据,我能走多远。

所有内容都在Streamlit应用程序中运行,使其易于交互和迭代。加载后,即可获得新鲜的摘要,随时可用。

没什么复杂的。只是一个小型而专注的项目,展示了好的数据和几个精心挑选的工具的强大之处。

2、工具和技术栈

我保持了技术栈的最小化,只使用了从原始内容到可消化摘要所需的基本工具,没有过度工程化。

  • Bright Data 数据集:这是项目的支柱。我没有处理网络抓取的复杂性,而是使用了Bright Data提供的结构化Reddit和X数据集。它们提供了干净、最新且可靠的资料,消除了对速率限制、破损HTML和耗时维护的担忧。
  • LangChain:它处理整个LLM管道。它使构建提示、传递内容并从模型中获取干净摘要变得非常容易。
  • Ollama:我想保持一切本地化,所以使用Ollama运行LLM。它速度快、轻量级,不需要云API密钥即可开始。非常适合实时摘要。
  • Streamlit:对于UI,Streamlit几乎太容易了。几行代码,我就有了一个功能齐全、干净的仪表板来显示摘要。

每个工具都发挥了作用,但如果没有来自Bright Data的干净结构化数据,这一切都不会奏效。这就是让整个事情成功的关键所在。

3、获取数据:使用Bright Data数据集

以下是获取Reddit和X(前身为Twitter)数据的方法:

3.1 登录Bright Data

前往Bright Data并登录您的仪表板。如果您没有帐户,可以免费创建一个。

3.2 打开数据集市场

在仪表板侧边栏中,单击Web Datasets,然后选择Dataset Marketplace。

3.3 搜索Reddit数据集

在搜索栏中输入“Reddit — Posts”。点击匹配的结果,预览数据集并继续购买。

购买后,以CSV格式下载数据集。

3.4 对X(前身为Twitter)重复相同步骤

重复相同的流程——这次搜索“X(前身为Twitter)— Posts”。

同样,购买并下载该数据集。您可以在购买之前尝试他们的样本数据,看看它的样子并进行试验。

或者,您还可以通过他们的网页爬虫获取Reddit、X和其他平台的干净数据,这些爬虫有代码和无代码选项。

3.5 探索CSV文件

每个CSV为您提供了一个干净的结构,包括帖子标题、文本、时间戳、参与度指标等字段——非常适合稍后传递给LLM。

4、分步实现

现在我们已经有了数据和工具,让我们分解一下所有内容是如何结合在一起的。这部分涵盖了从头开始设置项目、安装依赖项并启动带有Ollama的本地LLM的过程。

4.1 设置项目

让我们从整理项目开始。我喜欢保持简单和模块化,尤其是在实验时。

创建项目文件夹:

mkdir real-time-content-digest  
cd real-time-content-digest

设置虚拟环境:

如果使用Python:

python -m venv venv  
source venv/bin/activate  # 在Windows上:venv\Scripts\activate

4.2 安装所需的依赖项

我们需要以下内容:

  • streamlit — 用于UI
  • pandas — 用于处理数据集
  • langchain — 构建LLM链
  • ollama — 运行本地模型
  • openai — 如果想在本地和托管模型之间切换

一次性安装所有内容

pip install streamlit pandas langchain langchain_community openai

您还需要在机器上安装ollama。更多信息见下文。

4.3  定义项目结构

这是一个简单的文件夹结构可以使用:

real-time-content-digest/  
├── data/  
│   ├── reddit_posts.csv  
│   └── x_posts.csv  
├── main.py

5、安装并运行Ollama LLaVA-Llama3模型

为了本地推理,我使用了llava-llama3模型与Ollama。它轻量级且适用于实时摘要任务。

5.1 安装Ollama

您可以按照以下链接中的说明安装Ollama:https://ollama.com/download (适用于macOS、Windows和Linux)

5.2 拉取LLaVA-Llama3模型

安装Ollama后,运行以下命令:

ollama pull llava-llama3:latest

这会获取最新版本的llava-llama3模型。

5.3 本地运行模型

通过运行以下命令启动模型:

ollama run llava-llama3

默认情况下,它会在http://localhost:11434上启动一个API。

就是这样。有了模型运行,我们就可以开始加载数据、生成摘要并将所有内容与Streamlit连接起来。

6、构建应用程序组件

既然我们的环境已经设置好了,让我们在main.py文件中实现内容摘要机器人中的每一部分。

6.1 数据处理层

我们需要的第一个组件是数据处理层,它将处理加载和准备CSV数据:

def process_reddit_data(file):  
    try:  
        df = pd.read_csv(file)  
        required_columns = ["post_id", "title", "description", "num_comments",   
                          "date_posted", "community_name", "num_upvotes", "comments"]  
          
        # 检查是否包含所需列  
        for col in required_columns:  
            if col not in df.columns:  
                missing = [c for c in required_columns if c not in df.columns]  
                st.warning(f"警告:Reddit数据缺少列:{missing}")  
                break  
                  
        # 返回处理后的DataFrame  
        return df  
    except Exception as e:  
        st.error(f"处理Reddit数据时出错:{e}")  
        return None  
  
def process_twitter_data(file):  
    try:  
        df = pd.read_csv(file)  
        required_columns = ["id", "user_posted", "name", "description",   
                          "date_posted", "replies", "reposts", "likes"]  
          
        # 检查是否包含所需列  
        for col in required_columns:  
            if col not in df.columns:  
                missing = [c for c in required_columns if c not in df.columns]  
                st.warning(f"警告:Twitter/X数据缺少列:{missing}")  
                break  
                  
        # 返回处理后的DataFrame  
        return df  
    except Exception as e:  
        st.error(f"处理Twitter/X数据时出错:{e}")  
        return None  
  
def clean_text(text):  
    if pd.isna(text):  
        return ""  
    # 删除URL  
    text = re.sub(r'http\S+', '', text)  
    # 删除特殊字符和多余空格  
    text = re.s```python
b(r'\s+', ' ', text).strip()  
    return text

这些函数负责加载CSV文件,验证其是否包含必要的列,并清理文本内容。clean_text 函数移除URL并规范化文本以提高处理质量。

6.2 LLM 集成

接下来我们将实现与Ollama模型的内容生成集成:

@st.cache_resource  
def get_llm():  
    try:  
        return Ollama(model="llama3")  
    except Exception as e:  
        st.error(f"错误初始化Ollama模型: {e}")  
        return None  
  
llm = get_llm()

我们使用Streamlit的cache_resource装饰器来确保只初始化一次Ollama模型,这提高了性能。

6.3 内容摘要功能

现在我们实现从两个平台总结内容的核心功能:

def summarize_reddit_post(post_data):  
    prompt_template = PromptTemplate(  
        input_variables=["title", "description", "community", "comments", "upvotes"],  
        template="""  
        总结以下Reddit帖子:  
          
        标题: {title}  
        社区: {community}  
        点赞数: {upvotes}  
        内容: {description}  
          
        关键评论(如果有): {comments}  
          
        请提供:  
        1. 一个简洁的TL;DR(2-3句话)  
        2. 3-5个关键要点  
        3. 帖子中最深刻的引用  
        4. 情感分析(正面、负面、中性)  
        """  
    )  
      
    # 从帖子数据中提取相关信息  
    title = post_data.get('title', '无标题')  
    description = post_data.get('description', '无描述')  
    community = post_data.get('community_name', '未知社区')  
      
    # 处理评论  
    comments_list = post_data.get('comments', '')  
    if isinstance(comments_list, str) and comments_list:  
        comments = comments_list[:500] + "..." if len(comments_list) > 500 else comments_list  
    else:  
        comments = "无评论"  
      
    upvotes = post_data.get('num_upvotes', '0')  
      
    chain = LLMChain(llm=llm, prompt=prompt_template)  
    return chain.run(title=title, description=description, community=community, comments=comments, upvotes=upvotes)

Twitter(X)内容的函数遵循类似的模式,但根据不同的数据结构进行了调整。

6.4 格式转换功能

接下来我们实现将摘要转换为不同输出格式的功能:

def convert_to_newsletter(summary, source_type, source_data):  
    if source_type == "Reddit":  
        title = source_data.get('title', '未命名帖子')  
        community = source_data.get('community_name', '未知社区')  
        url = source_data.get('url', '#')  
          
        prompt_template = PromptTemplate(  
            input_variables=["summary", "title", "community", "url"],  
            template="""  
            将此Reddit帖子摘要转换为新闻通讯段落:  
              
            原始帖子标题: {title}  
            来自r/{community}  
            URL: {url}  
              
            摘要: {summary}  
              
            编写一个吸引人的新闻通讯段落,包括:  
            1. 一个引人注目的标题  
            2. 一个简短的介绍(1-2句话)  
            3. 用项目符号格式的主要见解  
            4. 一个鼓励读者查看原始帖子的结尾想法  
              
            以Markdown格式输出。  
            """  
        )  
          
        chain = LLMChain(llm=llm, prompt=prompt_template)  
        return chain.run(summary=summary, title=title, community=community, url=url)

对于社交媒体帖子创建也有类似的函数,根据字符限制和平台特定约定进行调整。

6.5 用户界面实现

最后,我们实现Streamlit应用程序的用户界面:

# 设置页面配置  
st.set_page_config(  
    page_title="内容摘要机器人",  
    page_icon="📝",  
    layout="wide"  
)  
  
# 标题和描述  
st.title("实时内容摘要/摘要机器人")  
st.markdown("""  
这个应用程序从Reddit和Twitter/X获取趋势内容,总结关键点,  
并可以将其转换为新闻通讯或社交媒体帖子格式。  
""")  
  
# 主界面  
tab1, tab2 = st.tabs(["数据处理", "内容生成"])  
  
with tab1:  
    st.header("上传数据")  
    # 数据上传UI代码...  
  
with tab2:  
    st.header("生成内容摘要")  
    # 内容生成UI代码...

完整的UI实现包括用于数据处理和内容生成的选项卡,以及选择帖子、生成摘要和转换为不同格式的控件。

运行应用程序

运行Streamlit应用程序:

streamlit run main.py

您的实时内容摘要和摘要机器人现已上线!🎉

7、结束语

从Reddit和Twitter(X)获取干净、相关且及时的数据集起到了关键作用。

通过结合结构化数据集与开源工具如LangChainOllamaStreamlit,我能够创建一个机器人,它能总结噪声,并且这只有在数据质量高、范围明确且准备好转换时才可能实现。

对于任何使用LLM的人,重要的是不要只专注于模型本身,而要记住模型只是方程式的一部分。选择正确的数据集通常可以解决一半的问题。


原文链接:How I Use Real-Time Web Data to Build AI Agents That Are 10x Smarter

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