8. Самописный поисковый агент на основе deep agents from scratch: client.py

This commit is contained in:
2026-05-27 15:38:05 +00:00
parent a0f8725d7f
commit f504eeb9a1
@@ -9,6 +9,12 @@ from langchain_core.documents import Document
from langchain_core.prompts import PromptTemplate from langchain_core.prompts import PromptTemplate
from langchain.chains import RetrievalQA from langchain.chains import RetrievalQA
# Импортируем rich для красивого вывода
from rich.console import Console
from rich.markdown import Markdown
console = Console()
# Конфигурация подключения к Qdrant (используем локальный сервер по умолчанию) # Конфигурация подключения к Qdrant (используем локальный сервер по умолчанию)
QDRANT_URL = os.getenv("QDRANT_URL", "http://localhost:6333") QDRANT_URL = os.getenv("QDRANT_URL", "http://localhost:6333")
COLLECTION_NAME = "documents" COLLECTION_NAME = "documents"
@@ -53,7 +59,7 @@ def add_document(text: str) -> None:
""" """
doc = Document(page_content=text) doc = Document(page_content=text)
vector_store.add_documents([doc]) vector_store.add_documents([doc])
print("Документ добавлен.") console.print("[green]Документ добавлен.[/green]")
def search(query: str) -> None: def search(query: str) -> None:
@@ -63,11 +69,13 @@ def search(query: str) -> None:
result = qa_chain({"question": query}) result = qa_chain({"question": query})
answer = result["answer"] answer = result["answer"]
sources = result.get("source_documents", []) sources = result.get("source_documents", [])
print("\nОтвет:\n" + answer) console.print("\n[bold]Ответ:[/bold]\n")
console.print(Markdown(answer))
if sources: if sources:
print("\nИсточники:") console.print("\n[bold]Источники:[/bold]")
for i, src in enumerate(sources, 1): for i, src in enumerate(sources, 1):
print(f"{i}. {src.page_content[:200]}...") snippet = src.page_content[:200]
console.print(f"{i}. {snippet}...")
def print_help() -> None: def print_help() -> None:
@@ -81,20 +89,20 @@ def print_help() -> None:
/quit - Выйти из программы /quit - Выйти из программы
/help - Показать эту справку /help - Показать эту справку
""" """
print(help_text) console.print(Markdown(help_text))
def main() -> None: def main() -> None:
""" """
Основной цикл CLI. Основной цикл CLI.
""" """
print("=== Самописный поисковый агент ===") console.print("[bold cyan]=== Самописный поисковый агент ===[/bold cyan]")
print_help() print_help()
while True: while True:
try: try:
user_input = input("\n> ").strip() user_input = input("\n> ").strip()
except (EOFError, KeyboardInterrupt): except (EOFError, KeyboardInterrupt):
print("\nВыход.") console.print("\n[red]Выход.[/red]")
break break
if not user_input: if not user_input:
@@ -107,28 +115,28 @@ def main() -> None:
if cmd == "/add": if cmd == "/add":
if not arg: if not arg:
print("Ошибка: необходимо указать текст для добавления.") console.print("[red]Ошибка: необходимо указать текст для добавления.[/red]")
else: else:
add_document(arg) add_document(arg)
elif cmd == "/search": elif cmd == "/search":
if not arg: if not arg:
print("Ошибка: необходимо указать поисковый запрос.") console.print("[red]Ошибка: необходимо указать поисковый запрос.[/red]")
else: else:
search(arg) search(arg)
elif cmd == "/quit": elif cmd == "/quit":
print("Выход.") console.print("Выход.")
break break
elif cmd == "/help": elif cmd == "/help":
print_help() print_help()
else: else:
print(f"Неизвестная команда '{cmd}'. Введите /help для справки.") console.print(f"[yellow]Неизвестная команда '{cmd}'. Введите /help для справки.[/yellow]")
else: else:
print("Команды начинаются с '/'. Введите /help для списка команд.") console.print("[yellow]Команды начинаются с '/'. Введите /help для списка команд.[/yellow]")
if __name__ == "__main__": if __name__ == "__main__":