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

This commit is contained in:
2026-05-27 11:13:30 +00:00
parent 88f84d500c
commit 63682ff4f3
@@ -1,65 +1,53 @@
import os import os
from typing import List, Dict from typing import List
from langchain_ollama import OllamaEmbeddings, OllamaLLM from langchain_ollama import OllamaEmbeddings, OllamaLLM
from langchain_qdrant import QdrantStore from langchain_qdrant import QdrantVectorStore
from langchain_core.tools import tool
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain.schema import Document from langchain.schema import Document
from langchain.tools import tool
# Конфигурация подключения к Qdrant # Конфигурация подключения к Qdrant
QDRANT_URL = os.getenv("QDRANT_URL", "http://localhost:6333") QDRANT_URL = os.getenv("QDRANT_URL", "http://localhost:6333")
QDRANT_COLLECTION = os.getenv("QDRANT_COLLECTION", "knowledge_base") COLLECTION_NAME = "knowledge_base"
# Инициализация эмбеддингов и LLM через Ollama # Инициализируем Ollama LLM и эмбеддеры
embeddings = OllamaEmbeddings(model="nomic-embed-text") llm = OllamaLLM(model="llama3") # модель для генерации ответов
llm = OllamaLLM(model="llama3") embeddings = OllamaEmbeddings(model="nomic-embed-text") # модель для векторизации
# Создание или подключение к коллекции Qdrant # Создаём или подключаемся к коллекции Qdrant
vector_store = QdrantStore( vector_store = QdrantVectorStore(
url=QDRANT_URL, url=QDRANT_URL,
collection_name=QDRANT_COLLECTION, collection_name=COLLECTION_NAME,
embeddings=embeddings, embeddings=embeddings,
) )
@tool("search_knowledge_base") @tool("search_knowledge_base")
def search_knowledge_base(query: str) -> List[Dict[str, str]]: def search_knowledge_base(query: str) -> List[Document]:
""" """
Поиск релевантных документов в базе знаний по запросу. Поиск в базе знаний по запросу.
Возвращает список словарей с полями 'content' и 'metadata'. Возвращает список документов, отсортированных по релевантности.
""" """
results = vector_store.similarity_search_with_score(query, k=3) # Получаем топ‑5 похожих документов
output = [] results = vector_store.similarity_search_with_score(query, k=5)
for doc, score in results: # Функция возвращает только объекты Document (без scores)
output.append({"content": doc.page_content, "score": str(score), **doc.metadata}) return [doc for doc, _ in results]
return output
@tool("add_to_knowledge_base") @tool("add_to_knowledge_base")
def add_to_knowledge_base(text: str) -> str: def add_to_knowledge_base(doc: str) -> str:
""" """
Добавляет новый текст в базу знаний. Добавляет новый документ в базу знаний.
Принимает строку с текстом и сохраняет её как один Document.
Возвращает подтверждение добавления. Возвращает подтверждение добавления.
""" """
# Создаём документ с метаданными (можно расширить) document = Document(page_content=doc)
doc = Document(page_content=text, metadata={"source": "user_input"}) vector_store.add_documents([document])
vector_store.add_documents([doc]) return "Документ успешно добавлен в базу знаний."
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__": if __name__ == "__main__":
# Пример взаимодействия: пользователь задаёт вопрос, агент решает использовать инструменты # Пример добавления документа
while True: print(add_to_knowledge_base("Python – это язык программирования, созданный Гвидо ван Россумом."))
user_input = input("\nВведите запрос (или 'exit' для выхода): ") # Пример поиска
if user_input.lower() in {"exit", "quit"}: results = search_knowledge_base("что такое Python?")
break for i, doc in enumerate(results, 1):
response = executor.invoke({"input": user_input}) print(f"Результат {i}: {doc.page_content[:200]}...")
print("\nОтвет агента:")
print(response["output"])