
«`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. Будущее уже здесь!
«`