From c1f0636d26bfac6b2f502dea5c8355f4c89c687f Mon Sep 17 00:00:00 2001 From: lonpatovaadelina Date: Wed, 27 May 2026 11:11:30 +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:=20agent.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agent.py | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 solutions/69de7223f309a98be0007e09_8__Самописный_поисковый_агент_на_основе_/agent.py diff --git a/solutions/69de7223f309a98be0007e09_8__Самописный_поисковый_агент_на_основе_/agent.py b/solutions/69de7223f309a98be0007e09_8__Самописный_поисковый_агент_на_основе_/agent.py new file mode 100644 index 0000000..bb0f555 --- /dev/null +++ b/solutions/69de7223f309a98be0007e09_8__Самописный_поисковый_агент_на_основе_/agent.py @@ -0,0 +1,65 @@ +import os +from typing import List, Dict + +from langchain_ollama import OllamaEmbeddings, OllamaLLM +from langchain_qdrant import QdrantStore +from langchain_core.tools import tool +from langchain.agents import AgentExecutor, create_openai_tools_agent +from langchain.schema import Document + +# Конфигурация подключения к Qdrant +QDRANT_URL = os.getenv("QDRANT_URL", "http://localhost:6333") +QDRANT_COLLECTION = os.getenv("QDRANT_COLLECTION", "knowledge_base") + +# Инициализация эмбеддингов и LLM через Ollama +embeddings = OllamaEmbeddings(model="nomic-embed-text") +llm = OllamaLLM(model="llama3") + +# Создание или подключение к коллекции Qdrant +vector_store = QdrantStore( + url=QDRANT_URL, + collection_name=QDRANT_COLLECTION, + embeddings=embeddings, +) + +@tool("search_knowledge_base") +def search_knowledge_base(query: str) -> List[Dict[str, str]]: + """ + Поиск релевантных документов в базе знаний по запросу. + Возвращает список словарей с полями 'content' и 'metadata'. + """ + results = vector_store.similarity_search_with_score(query, k=3) + output = [] + for doc, score in results: + output.append({"content": doc.page_content, "score": str(score), **doc.metadata}) + return output + +@tool("add_to_knowledge_base") +def add_to_knowledge_base(text: str) -> str: + """ + Добавляет новый текст в базу знаний. + Возвращает подтверждение добавления. + """ + # Создаём документ с метаданными (можно расширить) + doc = Document(page_content=text, metadata={"source": "user_input"}) + vector_store.add_documents([doc]) + return f"Текст успешно добавлен в базу знаний. {len(text.split())} слов." + +# Определяем список инструментов +tools = [search_knowledge_base, add_to_knowledge_base] + +# Создаём агента с использованием LLM и инструментов +agent = create_openai_tools_agent(llm=llm, tools=tools) + +# Экземпляр исполнителя агента +executor = AgentExecutor(agent=agent, tools=tools, verbose=True) + +if __name__ == "__main__": + # Пример взаимодействия: пользователь задаёт вопрос, агент решает использовать инструменты + while True: + user_input = input("\nВведите запрос (или 'exit' для выхода): ") + if user_input.lower() in {"exit", "quit"}: + break + response = executor.invoke({"input": user_input}) + print("\nОтвет агента:") + print(response["output"]) \ No newline at end of file