Files
Agent/agentic_rag_interface.py
ki.sagidullin 0af4730b3c Second
2026-03-31 23:31:09 +05:00

136 lines
5.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import gradio as gr
import asyncio
from typing import List
class AgenticRAGInterface:
def __init__(self, agent_graph, knowledge_base):
self.agent = agent_graph
self.kb = knowledge_base
self.conversation_history = []
def process_query(self, query: str, use_rag: bool):
"""Обработка запроса пользователя"""
# Добавляем сообщение в историю
self.conversation_history.append({"role": "user", "content": query})
# Если нужен RAG, ищем в базе знаний
context = ""
if use_rag:
search_results = self.kb.search(query)
if search_results:
context = "\n".join([f"[{i+1}] {res['text'][:200]}..."
for i, res in enumerate(search_results)])
# Подготавливаем состояние
initial_state = {
"messages": [HumanMessage(content=query)],
"knowledge_base": context,
"needs_search": use_rag,
"current_step": "start",
"final_answer": None
}
# Запускаем агента
try:
result = self.agent.invoke(initial_state)
answer = result.get("final_answer", "Не удалось получить ответ")
# Добавляем ответ в историю
self.conversation_history.append({"role": "assistant", "content": answer})
# Форматируем историю для отображения
history_text = self._format_history()
return answer, history_text
except Exception as e:
error_msg = f"Ошибка: {str(e)}"
return error_msg, self._format_history()
def _format_history(self):
"""Форматирование истории разговора"""
formatted = []
for msg in self.conversation_history[-10:]: # Последние 10 сообщений
role = "👤 Пользователь" if msg["role"] == "user" else "🤖 Ассистент"
formatted.append(f"{role}: {msg['content']}")
return "\n\n".join(formatted)
def clear_history(self):
"""Очистка истории"""
self.conversation_history = []
return "История очищена", ""
# Создаем интерфейс
interface = AgenticRAGInterface(agent_graph, kb)
# Создаем Gradio интерфейс
def create_gradio_interface():
with gr.Blocks(title="Локальный Agentic RAG", theme=gr.themes.Soft()) as demo:
gr.Markdown("""
# 🤖 Локальный Agentic RAG Система
Полностью автономный AI-агент с базой знаний. Работает без интернета!
""")
with gr.Row():
with gr.Column(scale=2):
query_input = gr.Textbox(
label="Ваш запрос",
placeholder="Задайте вопрос или дайте задание...",
lines=3
)
rag_toggle = gr.Checkbox(
label="Использовать базу знаний (RAG)",
value=True
)
submit_btn = gr.Button("Отправить", variant="primary")
clear_btn = gr.Button("Очистить историю")
with gr.Column(scale=3):
answer_output = gr.Textbox(
label="Ответ агента",
lines=8,
interactive=False
)
history_output = gr.Textbox(
label="История разговора",
lines=12,
interactive=False
)
# Примеры запросов
gr.Examples(
examples=[
["Объясни концепцию machine learning простыми словами", True],
["Посчитай: (15 * 4) + (120 / 3)", False],
["Найди информацию о нейронных сетях в базе знаний", True],
["Спланируй изучение Python на месяц", False]
],
inputs=[query_input, rag_toggle],
label="Примеры запросов"
)
# Обработчики событий
submit_btn.click(
fn=interface.process_query,
inputs=[query_input, rag_toggle],
outputs=[answer_output, history_output]
)
clear_btn.click(
fn=interface.clear_history,
inputs=[],
outputs=[answer_output, history_output]
)
query_input.submit(
fn=interface.process_query,
inputs=[query_input, rag_toggle],
outputs=[answer_output, history_output]
)
return demo