Introdução
Nesta lição, criaremos um programa de IA aprimorado que possa pesquisar na Web sobre as últimas notícias sobre o tópico fornecido e resumir os resultados. Este mentido seguiu o movimento formal do trabalho:
- Navegando: Execute consultas de pesquisa apropriadas e colete informações da web.
- Mão: Lançamento e incluindo resumos de notícias de informações coletadas.
- Reflexão: Ocultação em conflito em vista da verdadeira precisão e atualização da elevação.
- Imersão: Melhorar os resumos com base em críticas.
- Uma boa geração: Crie tópicos apropriados para cada contêiner.
Para melhorar o uso, também criaremos uma GUI simples usando a transmissão. Como tutoriais anteriores, usaremos É muito crescido Desempenho baseado em LLM e Para Monya da web de navegação. Você pode produzir teclas de API gratuitas em seus sites.
Configurando o ambiente
Começamos com variáveis naturais, incluindo as bibliotecas necessárias, e a dependência de importação:
Aplique as bibliotecas necessárias
pip install langgraph==0.2.53 langgraph-checkpoint==2.0.6 langgraph-sdk==0.1.36 langchain-groq langchain-community langgraph-checkpoint-sqlite==2.0.1 tavily-python streamlit
Ingregação de bibliotecas e configurações de API Keys
import os
import sqlite3
from langgraph.graph import StateGraph
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_groq import ChatGroq
from tavily import TavilyClient
from langgraph.checkpoint.sqlite import SqliteSaver
from typing import TypedDict, List
from pydantic import BaseModel
import streamlit as st
# Set API Keys
os.environ['TAVILY_API_KEY'] = "your_tavily_key"
os.environ['GROQ_API_KEY'] = "your_groq_key"
# Initialize Database for Checkpointing
sqlite_conn = sqlite3.connect("checkpoints.sqlite", check_same_thread=False)
memory = SqliteSaver(sqlite_conn)
# Initialize Model and Tavily Client
model = ChatGroq(model="Llama-3.1-8b-instant")
tavily = TavilyClient(api_key=os.environ["TAVILY_API_KEY"])
Definindo a condição do agente
O agente mantém os detalhes do estado durante todo o movimento do trabalho:
- Tópico: O título em que o usuário deseja o rascunho mais recente: o primeiro rascunho de notícias das notícias
- Contente: O conteúdo da pesquisa é emitido a partir de resultados de pesquisa de Tavily
- Institucionalmente: Prosperidade e recomendações produzidas no sistema de reflexão.
- Resumos de visão: Atualizações de notícias após adicionar açúcar de crítica
Títulos: Artigos produzidos por categoria de notícias
class AgentState(TypedDict):
topic: str
drafts: List[str]
content: List[str]
critiques: List[str]
refined_summaries: List[str]
headings: List[str]
Descrição da informação
Ele descreve um programa promocional para cada parágrafo do agente:
BROWSING_PROMPT = """You are an AI news researcher tasked with finding the latest news articles on given topics. Generate up to 3 relevant search queries."""
WRITER_PROMPT = """You are an AI news summarizer. Write a detailed summary (1 to 2 paragraphs) based on the given content, ensuring factual correctness, clarity, and coherence."""
CRITIQUE_PROMPT = """You are a teacher reviewing draft summaries against the source content. Ensure factual correctness, identify missing or incorrect details, and suggest improvements.
----------
Content: {content}
----------"""
REFINE_PROMPT = """You are an AI news editor. Given a summary and critique, refine the summary accordingly.
-----------
Summary: {summary}"""
HEADING_GENERATION_PROMPT = """You are an AI news summarizer. Generate a short, descriptive headline for each news summary."""
Perguntas e histórias de fumantes
Usamos o Pydantic para descrever a formação das perguntas e artigos de notícias. O Pydantic nos permite explicar a formação da liberação do LLM. Isso é importante porque queremos que as perguntas sejam uma linha de string e conteúdo emitido para o site terá muitas histórias, e é por isso que a lista de anéis.
from pydantic import BaseModel
class Queries(BaseModel):
queries: List[str]
class News(BaseModel):
news: List[str]
Implementação da IA
1. Navegando e dade
Este nó forma as consultas de pesquisa e retorna o conteúdo correto da web.
def browsing_node(state: AgentState):
queries = model.with_structured_output(Queries).invoke([
SystemMessage(content=BROWSING_PROMPT),
HumanMessage(content=state['topic'])
])
content = state.get('content', [])
for q in queries.queries:
response = tavily.search(query=q, max_results=2)
for r in response['results']:
content.append(r['content'])
return {"content": content}
2. Escrevendo e de
Desinstale os resumos de notícias do conteúdo recebido.
def writing_node(state: AgentState):
content = "nn".join(state['content'])
news = model.with_structured_output(News).invoke([
SystemMessage(content=WRITER_PROMPT),
HumanMessage(content=content)
])
return {"drafts": news.news}
3. Nó de reflexão
Os resumos críticos são produzidos em conteúdo.
def reflection_node(state: AgentState):
content = "nn".join(state['content'])
critiques = []
for draft in state['drafts']:
response = model.invoke([
SystemMessage(content=CRITIQUE_PROMPT.format(content=content)),
HumanMessage(content="draft: " + draft)
])
critiques.append(response.content)
return {"critiques": critiques}
4. Muita consideração
Promove resumos baseados em resumos.
def refine_node(state: AgentState):
refined_summaries = []
for summary, critique in zip(state['drafts'], state['critiques']):
response = model.invoke([
SystemMessage(content=REFINE_PROMPT.format(summary=summary)),
HumanMessage(content="Critique: " + critique)
])
refined_summaries.append(response.content)
return {"refined_summaries": refined_summaries}
5. Nó de geração de linhas hoad
Produz um breve título para cada um dos resumos da história.
def heading_node(state: AgentState):
headings = []
for summary in state['refined_summaries']:
response = model.invoke([
SystemMessage(content=HEADING_GENERATION_PROMPT),
HumanMessage(content=summary)
])
headings.append(response.content)
return {"headings": headings}
Para construir a interface do usuário com o Streamlit
# Define Streamlit app
st.title("News Summarization Chatbot")
# Initialize session state
if "messages" not in st.session_state:
st.session_state["messages"] = []
# Display past messages
for message in st.session_state["messages"]:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# Input field for user
user_input = st.chat_input("Ask about the latest news...")
thread = 1
if user_input:
st.session_state["messages"].append({"role": "user", "content": user_input})
with st.chat_message("assistant"):
loading_text = st.empty()
loading_text.markdown("*Thinking...*")
builder = StateGraph(AgentState)
builder.add_node("browser", browsing_node)
builder.add_node("writer", writing_node)
builder.add_node("reflect", reflection_node)
builder.add_node("refine", refine_node)
builder.add_node("heading", heading_node)
builder.set_entry_point("browser")
builder.add_edge("browser", "writer")
builder.add_edge("writer", "reflect")
builder.add_edge("reflect", "refine")
builder.add_edge("refine", "heading")
graph = builder.compile(checkpointer=memory)
config = {"configurable": {"thread_id": f"{thread}"}}
for s in graph.stream({"topic": user_input}, config):
# loading_text.markdown(f"*{st.session_state['loading_message']}*")
print(s)
s = graph.get_state(config).values
refined_summaries = s['refined_summaries']
headings = s['headings']
thread+=1
# Display final response
loading_text.empty()
response_text = "nn".join([f"{h}n{s}" for h, s in zip(headings, refined_summaries)])
st.markdown(response_text)
st.session_state["messages"].append({"role": "assistant", "content": response_text})
Loja
O estudo abrangeu todo o processo de construção do agente de notícias de IA com interface do usuário da SimpleLin. Agora você pode brincar com isso e fazer outros progressos como:
- UM Melhor GUI Interação avançada do usuário.
- Incluindo Refinamento existente Para garantir que os resumos sejam precisos e apropriados.
- Mantendo o contexto para continuar a discussão sobre questões específicas.
Códigos?
Além disso, fique à vontade para segui -lo Sane E não se esqueça de se juntar ao nosso 75k + ml subreddit.
🚨 Recomendado para um código aberto de IA' (Atualizado)
Weneet Kumar é estudante de um consultor em Marktechpost. Atualmente, ele perseguiu seu BS do Instituto Indiano de Tecnologia (IIT), Kanpur. Ele é um entusiasmo de aprendizado de máquina. Ela é apaixonada pela pesquisa recente e raiva na aprendizagem mais profunda, na ideia de computador e nos campos relacionados.
✅ [Recommended] Junte -se ao nosso canal de telégrafo