
«`html
В этом руководстве мы создадим продвинутого новостного агента на основе ИИ, который сможет искать последние новости по заданной теме и подводить итоги. Этот агент будет работать по следующему алгоритму:
Для удобства мы также создадим простой интерфейс с использованием Streamlit.
Начнем с настройки переменных окружения и установки необходимых библиотек:
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
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
# Установите API ключи
os.environ['TAVILY_API_KEY'] = "ваш_tavily_ключ"
os.environ['GROQ_API_KEY'] = "ваш_groq_ключ"
# Инициализация базы данных для сохранения контрольных точек
sqlite_conn = sqlite3.connect("checkpoints.sqlite", check_same_thread=False)
memory = SqliteSaver(sqlite_conn)
# Инициализация модели и клиента Tavily
model = ChatGroq(model="Llama-3.1-8b-instant")
tavily = TavilyClient(api_key=os.environ["TAVILY_API_KEY"])
Агент будет хранить следующую информацию:
Мы определяем системные подсказки для каждого этапа работы агента:
BROWSING_PROMPT = "Вы - ИИ-исследователь новостей, задача которого - находить последние статьи по заданным темам. Сгенерируйте до 3 релевантных поисковых запросов."
WRITER_PROMPT = "Вы - ИИ-суммировщик новостей. Напишите подробное резюме (1-2 абзаца) на основе данного контента, обеспечивая фактическую точность, ясность и согласованность."
CRITIQUE_PROMPT = "Вы - преподаватель, который проверяет черновики резюме на соответствие исходному контенту. Убедитесь в фактической точности, укажите на недостающие или неверные детали и предложите улучшения."
REFINE_PROMPT = "Вы - ИИ-редактор новостей. Дайте улучшенное резюме на основе критики."
HEADING_GENERATION_PROMPT = "Вы - ИИ-суммировщик новостей. Сгенерируйте короткий, описательный заголовок для каждого новостного резюме."
Мы используем Pydantic для определения структуры запросов и новостных статей. Это важно, так как мы хотим, чтобы запросы были списком строк, а извлеченный контент состоял из нескольких новостных статей.
from pydantic import BaseModel
class Queries(BaseModel):
queries: List[str]
class News(BaseModel):
news: List[str]
Мы реализуем несколько узлов для обработки данных:
Этот узел генерирует поисковые запросы и извлекает релевантный контент из интернета.
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}
Извлекает новостные резюме из полученного контента.
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}
Проверяет сгенерированные резюме на соответствие контенту.
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}
Улучшает резюме на основе анализа.
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}
Генерирует короткий заголовок для каждого новостного резюме.
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}
# Определение приложения Streamlit
st.title("Чат-бот для суммирования новостей")
# Инициализация состояния сессии
if "messages" not in st.session_state:
st.session_state["messages"] = []
# Отображение прошлых сообщений
for message in st.session_state["messages"]:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# Поле ввода для пользователя
user_input = st.chat_input("Спросите о последних новостях...")
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("*Думаю...*")
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):
print(s)
s = graph.get_state(config).values
refined_summaries = s['refined_summaries']
headings = s['headings']
thread += 1
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})
В этом руководстве мы рассмотрели процесс создания агента для суммирования новостей на основе ИИ с простым интерфейсом Streamlit. Теперь вы можете поэкспериментировать с этим и внести улучшения, такие как:
Счастливого программирования!
Если вы хотите, чтобы ваша компания развивалась с помощью искусственного интеллекта (ИИ), грамотно используйте полученные знания.
Если вам нужны советы по внедрению ИИ, пишите нам.
Попробуйте AI Sales Bot. Это ИИ ассистент для продаж, который помогает отвечать на вопросы клиентов и генерировать контент для отдела продаж.
Узнайте, как ИИ может изменить процесс продаж в вашей компании с решениями от saile.ru. Будущее уже здесь!
«`
Оставьте заявку — мы свяжемся с вами и расскажем, как начать работу