From 2d2adcbc5dec1b1cdac373e7940ae2f93c4e837a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=B8=D1=8F=20=D0=91=D0=B5=D1=80=D0=B4?= =?UTF-8?q?=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2=D0=B0?= Date: Thu, 28 May 2026 09:21:45 +0000 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=B3=D0=B5=D0=BD=D1=82=20=D1=81=20RAG-?= =?UTF-8?q?=D0=BF=D0=B0=D0=BC=D1=8F=D1=82=D1=8C=D1=8E:=20solution.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- solution.py | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 solution.py diff --git a/solution.py b/solution.py new file mode 100644 index 0000000..ea5f769 --- /dev/null +++ b/solution.py @@ -0,0 +1,71 @@ +import os +from typing import List + +from fastapi import FastAPI, HTTPException +from pydantic import BaseModel +from langchain.embeddings.openai import OpenAIEmbeddings +from langchain.vectorstores.qdrant import Qdrant +from langchain.chains.question_answering import load_qa_chain +from langchain.llms.openai import ChatOpenAI +from rich.console import Console + +# Конфигурация +QDRANT_URL = os.getenv("QDRANT_URL", "http://localhost:6333") +QDRANT_COLLECTION = os.getenv("QDRANT_COLLECTION", "rag_memory") +OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") +if not OPENAI_API_KEY: + raise RuntimeError("Не задана переменная окружения OPENAI_API_KEY") + +console = Console() + +# Инициализация компонентов +embeddings = OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY) +llm = ChatOpenAI(temperature=0, openai_api_key=OPENAI_API_KEY) + +# Создание или подключение к коллекции Qdrant +vectorstore = Qdrant( + client=None, + collection_name=QDRANT_COLLECTION, + embeddings=embeddings, + url=QDRANT_URL, +) + +app = FastAPI(title="RAG Agent") + +class Document(BaseModel): + content: str + +class QueryRequest(BaseModel): + question: str + top_k: int = 5 + +@app.post("/add_document") +def add_document(doc: Document): + """ + Добавляет документ в память агента. + """ + try: + vectorstore.add_texts([doc.content]) + console.log(f"[green]Документ добавлен:[/green] {doc.content[:50]}...") + return {"status": "ok"} + except Exception as e: + console.print_exception() + raise HTTPException(status_code=500, detail=str(e)) + +@app.post("/ask") +def ask(request: QueryRequest): + """ + Отвечает на вопрос, используя RAG. + """ + try: + # Получаем похожие документы + docs = vectorstore.similarity_search_with_score(request.question, k=request.top_k) + contexts = [doc.page_content for doc, _ in docs] + console.log(f"[blue]Найдено контекстов:[/blue] {len(contexts)}") + + chain = load_qa_chain(llm=llm, chain_type="stuff") + answer = chain.run(input_documents=[{"content": c} for c in contexts], question=request.question) + return {"answer": answer} + except Exception as e: + console.print_exception() + raise HTTPException(status_code=500, detail=str(e)) \ No newline at end of file