8. Самописный поисковый агент на основе deep agents from scratch: agent.py
This commit is contained in:
+30
-42
@@ -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"])
|
|
||||||
Reference in New Issue
Block a user