Itinai.com it company office background blured chaos 50 v 9b8ecd9e 98cd 4a82 a026 ad27aa55c6b9 1
Itinai.com it company office background blured chaos 50 v 9b8ecd9e 98cd 4a82 a026 ad27aa55c6b9 1

Пошаговое руководство по созданию AI-сумматора новостей с использованием Streamlit, Groq и Tavily

 Step by Step Guide on How to Build an AI News Summarizer Using Streamlit, Groq and Tavily

«`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

Импорт библиотек и установка API ключей

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]

Реализация ИИ-агентов

Мы реализуем несколько узлов для обработки данных:

1. Узел поиска

Этот узел генерирует поисковые запросы и извлекает релевантный контент из интернета.

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. Узел написания

Извлекает новостные резюме из полученного контента.

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. Узел анализа

Проверяет сгенерированные резюме на соответствие контенту.

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. Узел улучшения

Улучшает резюме на основе анализа.

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. Узел генерации заголовков

Генерирует короткий заголовок для каждого новостного резюме.

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

# Определение приложения 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. Теперь вы можете поэкспериментировать с этим и внести улучшения, такие как:

  • Улучшенный интерфейс для повышения взаимодействия с пользователем.
  • Внедрение итеративного улучшения для обеспечения точности резюме.
  • Поддержание контекста для продолжения разговора о конкретных новостях.

Счастливого программирования!

Как использовать ИИ для развития бизнеса

Если вы хотите, чтобы ваша компания развивалась с помощью искусственного интеллекта (ИИ), грамотно используйте полученные знания.

  • Проанализируйте, как ИИ может изменить вашу работу.
  • Определите, где возможно применение автоматизации.
  • Определите ключевые показатели эффективности (KPI), которые хотите улучшить с помощью ИИ.
  • Подберите подходящее решение, начиная с малого проекта.
  • Расширяйте автоматизацию на основе полученных данных и опыта.

Если вам нужны советы по внедрению ИИ, пишите нам.

Попробуйте AI Sales Bot. Это ИИ ассистент для продаж, который помогает отвечать на вопросы клиентов и генерировать контент для отдела продаж.

Узнайте, как ИИ может изменить процесс продаж в вашей компании с решениями от saile.ru. Будущее уже здесь!

«`

Бесплатный ИИ: для автоматизации продаж