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