From 710dc68f5b35f98108af0c522965e86573fed5b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=B8=D1=8F=20=D0=91=D0=B5=D1=80=D0=B4?= =?UTF-8?q?=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2=D0=B0?= Date: Wed, 27 May 2026 13:19:31 +0000 Subject: [PATCH] =?UTF-8?q?8.=20=D0=A1=D0=B0=D0=BC=D0=BE=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=BE=D0=B2?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=B5=20deep=20agents=20from=20s?= =?UTF-8?q?cratch:=20solution.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solution.py | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 solutions/69de7223f309a98be0007e09_8__Самописный_поисковый_агент_на_основе_/solution.py diff --git a/solutions/69de7223f309a98be0007e09_8__Самописный_поисковый_агент_на_основе_/solution.py b/solutions/69de7223f309a98be0007e09_8__Самописный_поисковый_агент_на_основе_/solution.py new file mode 100644 index 0000000..524f0f9 --- /dev/null +++ b/solutions/69de7223f309a98be0007e09_8__Самописный_поисковый_агент_на_основе_/solution.py @@ -0,0 +1,100 @@ +<|channel|>final solution.py<|message|>import os +from typing import List + +# Библиотеки для работы с языковой моделью и векторным хранилищем +from langchain.embeddings.openai import OpenAIEmbeddings +from langchain.vectorstores.qdrant import Qdrant +from langchain.llms import OpenAI +from langchain.chains import RetrievalQA + +# Библиотека для вывода красивых сообщений в консоль +from rich.console import Console +from rich.table import Table + +console = Console() + +def init_vector_store(qdrant_url: str, collection_name: str): + """ + Инициализирует подключение к Qdrant и возвращает объект vectorstore. + Если коллекция не существует – создаётся новая с использованием OpenAIEmbeddings. + """ + embeddings = OpenAIEmbeddings() + try: + # Попытка получить существующую коллекцию + vector_store = Qdrant( + client=None, + collection_name=collection_name, + embedding_function=embeddings.embed_query, + url=qdrant_url, + ) + except Exception: + # Если коллекция отсутствует – создаём её + vector_store = Qdrant.from_texts( + texts=[], + embeddings=embeddings, + client=None, + collection_name=collection_name, + url=qdrant_url, + ) + return vector_store + +def build_agent(vector_store): + """ + Создаёт цепочку RetrievalQA, которая использует заданный векторный store + и модель OpenAI для генерации ответов. + """ + llm = OpenAI(temperature=0.2) + qa_chain = RetrievalQA.from_chain_type( + llm=llm, + chain_type="stuff", + retriever=vector_store.as_retriever(search_kwargs={"k": 5}), + ) + return qa_chain + +def add_documents(vector_store, documents: List[str]): + """ + Добавляет новые документы в коллекцию Qdrant. + """ + vector_store.add_texts(documents) + +def query_agent(agent, question: str): + """ + Выполняет запрос к агенту и выводит результат в красивом формате. + """ + answer = agent.run(question) + table = Table(title="Ответ агента") + table.add_column("Вопрос", style="cyan") + table.add_column("Ответ", style="magenta") + table.add_row(question, answer) + console.print(table) + +def main(): + # Конфигурация + QDRANT_URL = os.getenv("QDRANT_URL", "http://localhost:6333") + COLLECTION_NAME = os.getenv("COLLECTION_NAME", "deep_agent_collection") + + # Инициализация хранилища и агента + vector_store = init_vector_store(QDRANT_URL, COLLECTION_NAME) + agent = build_agent(vector_store) + + # Пример добавления документов (можно заменить на чтение из файлов) + sample_docs = [ + "Python – это язык программирования высокого уровня.", + "FastAPI позволяет быстро создавать веб‑приложения.", + "LangChain упрощает работу с LLM и векторными хранилищами." + ] + add_documents(vector_store, sample_docs) + + # Пример взаимодействия + console.print("[bold green]Deep Agent готов к работе![/]") + while True: + try: + question = console.input("\nВведите ваш вопрос (или 'выход' для завершения): ") + if question.lower() in ("выход", "exit", "quit"): + break + query_agent(agent, question) + except KeyboardInterrupt: + break + +if __name__ == "__main__": + main() \ No newline at end of file