
构建强大的ai研究代理:使用pydantic Ai Web Scraper和llama 3.3的3个关键步骤
- Rifx.Online
- Large Language Models , Generative AI , AI Applications
- 05 Mar, 2025
在这个视频中,我将快速演示如何使用 Pydantic AI、网页抓取工具和 Llama 3.3 创建一个多代理聊天机器人,为您的业务或个人使用制作一个强大的代理聊天机器人。
在检索增强生成(RAG)和大型语言模型(LLM)基础的工作流程中,结构化输出提高了准确性和清晰度,使数据更易于理解。
我们许多人都知道验证或将数据转换为正确格式是多么令人沮丧。当处理接口数据时,您会遇到复杂的数据格式。如果不小心,您可能会遇到难以发现的错误。
这就是 Pydantic 的用武之地。它是一个著名的数据验证工具,在幕后发挥着关键作用。OpenAI、Anthropic、LangChain 和 LlamaIndex 都将 Pydantic 作为核心组件,负责数据验证等重要功能。
不久前,Pydantic 团队推出了 PydanticAI,这是一个基于 Pydantic 的 AI 代理框架。它旨在简化 AI 应用开发的复杂性,并解决 AI 代理开发中的各种痛点。
在东部时间12月6日星期五,Meta 宣布推出一款新的 Llama 系列生成 AI 模型:具有 70 亿参数的 Llama 3.3,也称为 Llama 3.3 70B。首席执行官扎克伯格在他的社交媒体 Instagram 上表示,这是今年最后一次重大 AI 模型更新,下一步将是明年 Llama 4 的首次亮相。
Llama 3.3 现在可以从在线来源下载,例如 oLlama 官方网站和 AI 开发平台 Hugging Face。
Llama 3.3 在行业基准测试中表现优于本周早些时候发布的 Google 的 Gemini 1.5 Pro、OpenAI 的 GPT-4o 和 Amazon 的 Nova Pro。扎克伯格表示,这是今年最后一次重大 AI 模型更新,下一步将是明年 Llama 4 的亮相。
那么,让我给您演示一个实时聊天机器人的示例,让您了解我的意思。
让我问一个简单的问题:今年发布的最新大型语言模型是什么?如果您查看 Pydantic AI 如何生成输出,您会看到当我提问并点击搜索按钮时,研究功能检索当前日期,将查询和日期传递给 AI 代理(search_agent
),并使用 Tavily 客户端获取搜索结果。AI 代理处理这些结果并将其组织成结构化字段(ResearchResult
),并返回总结内容,包括标题、主要文章和要点。这个简化的系统将 AI 能力与用户友好的界面相结合,以提供简洁且视觉吸引的信息检索和总结。
在这个视频中,我们将讨论 Pydantic AI 是什么,Pydantic AI 的特点,Langchain、LlamaIndex 和 Pydantic AI 之间的区别,以及如何使用 Pydantic AI 创建一个超级 AI 代理。
在我们开始之前!
如果你喜欢这个主题:
Pydantic AI是什么
PydanticAI提倡类型安全操作、结构化响应验证和一种新颖的依赖注入系统,所有这些都在Python最佳实践的熟悉领域内。这使其成为开发人员在不牺牲代码质量或安全性的情况下利用生成式AI力量的宝贵工具。PydanticAI值得探索,特别是它与Logfire的集成,以增强调试和监控能力。
特性
PydanticAI 是由 Pydantic 团队开发的一个 Python 代理框架,用于构建使用生成式 AI 的生产级应用程序。它提供模型无关的支持、类型安全的验证、结构化响应处理以及与各种 LLM 提供商的无缝集成。该框架强调简洁性和可靠性,同时提供强大的功能,如依赖注入、流式响应和通过 Logfire 集成进行全面监控。
-
类型安全的响应验证: 利用 Pydantic 确保 LLM 输出符合预期的数据结构,为生产应用程序提供强有力的验证。
-
依赖注入系统: 一种新颖的类型安全系统,允许自定义代理行为,并促进测试和评估驱动的开发。
-
模型无关架构: 支持多个 LLM 提供商(OpenAI、Gemini、Groq),并为额外模型支持提供简单接口。
-
流式响应处理: 能够实时处理和验证流式响应,包括在流式传输期间的结构化数据验证。
Langchain Vs Llamaindex Vs Pydantic AI
这些框架之间的差异体现在它们的技术特性、对大型语言模型应用开发的不同理解和实际方向上。
PydanticAI 优先考虑工程实践和生产可靠性,其核心是严格的类型系统和标准化的开发模型。
LangChain 为开发者提供了一种便捷的方式,通过灵活的组件设计和丰富的生态系统快速构建应用程序。
LlamaIndex 专注于文档处理和知识检索,在数据处理和索引优化方面形成了独特的优势。
让我们开始编码
在我们深入应用程序之前,我们将为代码的运行创建一个理想的环境。为此,我们需要安装必要的Python库。首先,我们将开始安装支持模型的库。为此,我们将对下面的库进行pip安装。
pip install -r requirements.txt
安装完成后,我们导入Pydantic AI、数据类、tavily、streamlit和devtools。
import os
import asyncio
import datetime
from typing import Any
from dataclasses import dataclass
import nest_asyncio
nest_asyncio.apply()
from openai import AsyncOpenAI
from pydantic_ai.models.openai import OpenAIModel
import streamlit as st
from pydantic_ai import Agent, RunContext
from pydantic import BaseModel, Field
from tavily import AsyncTavilyClient
from dotenv import load_dotenv
为您的LLM提供商设置API令牌。Pydantic直接与OpenAI、Groq和VertexAI合作。
client = AsyncOpenAI(
base_url='http:',
api_key='your-api-key',
)
model = OpenAIModel('llama3.3:latest', openai_client=client)
我们将使用tavily来抓取浏览器、过滤和聚合数据。
TAVILY_API_KEY = os.getenv("TAVILY_API_KEY")
if not TAVILY_API_KEY:
raise ValueError("请设置TAVILY_API_KEY环境变量。")
tavily_client = AsyncTavilyClient(api_key=TAVILY_API_KEY)
我们定义三个类。第一个**SearchDataclass**
是一个数据类,旨在存储与搜索相关的信息,特别是最大结果数(max_results
)和今天的日期(todays_date
)。
第二个类**ResearchDependencies**
是另一个数据类,仅存储今天的日期。
第三个类**ResearchResult**
扩展了**BaseModel**
,表示一篇研究文章,包含文章标题(research_title
)、主体(research_main
)和一组总结关键点的要点(research_bullets
)字段。
**Field**
函数用于为每个属性添加描述,这有助于验证和文档编制。
@dataclass
class SearchDataclass:
max_results: int
todays_date: str
@dataclass
class ResearchDependencies:
todays_date: str
class ResearchResult(BaseModel):
research_title: str = Field(description='Markdown标题描述文章主题,以#为前缀')
research_main: str = Field(description='提供详细新闻文章的主要部分')
research_bullets: str = Field(description='总结关键点的一组要点')
我创建了一个**Agent**
Llama3.3用于研究任务。它使用ResearchDependencies
数据类作为输入,使用ResearchResult
类作为输出。然后我们编写一个系统提示,指示它从查询中识别关键字,执行多个搜索,然后将这些结果组合成详细的响应。
## 创建代理
search_agent = Agent(
model,
deps_type=ResearchDependencies,
result_type=ResearchResult,
system_prompt=
)
我们创建一个add_current_date
函数,指示代理从给定问题中识别强关键字,使用这些关键字执行3-5次搜索,并将结果组合成详细响应,同时确保信息准确且是最新的。
@search_agent.system_prompt
async def add_current_date(ctx: RunContext[ResearchDependencies]) -> str:
todays_date = ctx.deps.todays_date
system_prompt = (
f"你是一个有帮助的研究助手和研究专家。"
f"在给定问题时,写出强关键字以进行3-5次搜索 "
f"(每次带有query_number),然后组合结果。"
f"如果你需要今天的日期,它是{todays_date}。"
f"专注于提供准确和最新的信息。"
)
return system_prompt
我们定义两个异步函数:get_search
和do_search
。
**get_search**
是search_agent
用来执行搜索的工具。它接收搜索查询和搜索上下文(包括最大结果数),并使用tavily_client
检索搜索结果,将其作为字典返回。**do_search**
通过创建SearchDataclass
的实例(包括当前日期和最大结果数)来准备必要的依赖项。然后,它使用这些依赖项和查询运行search_agent
,等待结果。
@search_agent.tool
async def get_search(search_data: RunContext[SearchDataclass], query: str, query_number: int) -> dict[str, Any]:
"""使用Tavily客户端执行搜索。"""
max_results = search_data.deps.max_results
results = await tavily_client.get_search_context(query=query, max_results=max_results)
return results
async def do_search(query: str, max_results: int):
# 准备依赖项
current_date = datetime.date.today()
date_string = current_date.strftime("%Y-%m-%d")
deps = SearchDataclass(max_results=max_results, todays_date=date_string)
result = await search_agent.run(query, deps=deps)
让我们设置一个Streamlit应用程序,用户可以在其中输入查询并指定要检索的搜索结果数量。在我们点击按钮以启动搜索后,应用程序获取相关的研究数据(包括标题、主要文章和关键要点)并以组织良好的格式显示。
st.set_page_config(page_title="AI新闻研究员", layout="centered")
st.title("大型语言模型新闻研究员")
st.write("了解大型语言模型的最新趋势和发展。")
st.sidebar.title("搜索参数")
query = st.sidebar.text_input("输入您的查询:", value="最新大型语言模型新闻")
max_results = st.sidebar.slider("搜索结果数量:", min_value=3, max_value=10, value=5)
st.write("使用侧边栏调整搜索参数。")
if st.button("获取最新大型语言模型新闻"):
with st.spinner("正在研究,请稍候..."):
result_data = asyncio.run(do_search(query, max_results))
st.markdown(result_data.research_title)
st.markdown(f"<div style='line-height:1.6;'>{result_data.research_main}</div>", unsafe_allow_html=True)
st.markdown("### 关键要点")
st.markdown(result_data.research_bullets)
结论:
Pydantic AI 是一个很棒的库,但有很多方法可以实现相同的功能。我花了很多精力来理解和使用我在这里展示的例子。我希望你能利用这些例子更快、更轻松地熟悉 Pydantic。
无论是构建一个简单的聊天机器人还是一个复杂的系统,Pydantic AI 提供的功能使开发过程更加顺畅,最终产品更可靠。