Правки solution.py: Внеси изменения согласно инструкции: удаляем OpenAI и FastMC

This commit is contained in:
2026-05-28 06:10:32 +00:00
parent 55b0c53994
commit 1001459e56
@@ -1,80 +1,54 @@
import os import os
from typing import List
from fastmcp import App, Route # FastMCP lightweight web framework
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores.qdrant import Qdrant
from langchain.llms.openai import OpenAI
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
from rich.console import Console from rich.console import Console
# Конфигурация # Импортируем необходимые модули, которые реализованы в отдельных файлах
from vector_store import get_vector_store
from agent import RAGAgent
from init_knowledge_base import init_kb
console = Console()
# Конфигурация окружения
QDRANT_HOST = os.getenv("QDRANT_HOST", "localhost") QDRANT_HOST = os.getenv("QDRANT_HOST", "localhost")
QDRANT_PORT = int(os.getenv("QDRANT_PORT", 6333)) QDRANT_PORT = int(os.getenv("QDRANT_PORT", 6333))
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
if not OPENAI_API_KEY: if not OPENAI_API_KEY:
raise RuntimeError("Не задана переменная окружения OPENAI_API_KEY") raise RuntimeError("Не задана переменная окружения OPENAI_API_KEY")
# Инициализация консоли rich # Инициализация векторного хранилища
console = Console() vector_store = get_vector_store(
host=QDRANT_HOST,
# Векторный хранилище в Qdrant port=QDRANT_PORT,
embeddings = OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY) api_key=OPENAI_API_KEY,
qdrant_store = Qdrant(
client=None,
collection_name="rag_memory",
embeddings=embeddings,
url=f"http://{QDRANT_HOST}:{QDRANT_PORT}",
) )
# LLM и цепочка RAG # При необходимости загружаем начальные документы
llm = OpenAI(openai_api_key=OPENAI_API_KEY, temperature=0.7) init_kb(vector_store)
prompt_template = PromptTemplate(
input_variables=["context", "question"], # Создаём агента RAG, передавая ему векторное хранилище и ключ OpenAI
template="Ниже приведена информация:\n{context}\n\nВопрос: {question}\nОтвет:", agent = RAGAgent(
) vector_store=vector_store,
rag_chain = RetrievalQA.from_chain_type( openai_api_key=OPENAI_API_KEY,
llm=llm,
chain_type="stuff",
retriever=qdrant_store.as_retriever(search_kwargs={"k": 5}),
return_source_documents=True,
chain_type_kwargs={"prompt": prompt_template},
) )
app = App() def main() -> None:
@app.post("/add")
def add_document(text: str):
""" """
Добавляет новый документ в память агента. Интерактивный цикл: пользователь вводит вопрос, агент отвечает.
Ввод 'exit' или 'quit' завершает программу.
""" """
try: console.print("[bold green]Запуск интерактивного режима. Введите 'exit' для выхода.[/]")
qdrant_store.add_texts([text]) while True:
console.log(f"[green]Документ добавлен[/green]") question = input("Вопрос: ")
return {"status": "ok"} if question.lower() in ("exit", "quit"):
except Exception as e: break
console.print_exception() try:
return {"status": "error", "detail": str(e)} answer, sources = agent.ask(question)
console.print(f"[blue]Ответ:[/]\n{answer}")
console.print("[yellow]Источники:[/]")
@app.post("/ask") for src in sources:
def ask(question: str): console.print(f"- {src}")
""" except Exception as e:
Делает запрос к агенту с RAG‑памятью. console.print_exception()
"""
try:
result = rag_chain({"question": question})
answer = result["answer"]
sources = [doc.metadata.get("source", "unknown") for doc in result["source_documents"]]
console.log(f"[blue]Ответ[/blue]: {answer}")
return {"answer": answer, "sources": sources}
except Exception as e:
console.print_exception()
return {"status": "error", "detail": str(e)}
if __name__ == "__main__": if __name__ == "__main__":
# Запуск FastMCP сервера main()
app.run(host="0.0.0.0", port=8000)