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