用实时数据增强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)获取干净、相关且及时的数据集起到了关键作用。
通过结合结构化数据集与开源工具如LangChain、Ollama和Streamlit,我能够创建一个机器人,它能总结噪声,并且这只有在数据质量高、范围明确且准备好转换时才可能实现。
对于任何使用LLM的人,重要的是不要只专注于模型本身,而要记住模型只是方程式的一部分。选择正确的数据集通常可以解决一半的问题。
原文链接:How I Use Real-Time Web Data to Build AI Agents That Are 10x Smarter
汇智网翻译整理,转载请标明出处