diff --git a/solutions/69de7223f309a98be0007e09_8__Самописный_поисковый_агент_на_основе_/solution.py b/solutions/69de7223f309a98be0007e09_8__Самописный_поисковый_агент_на_основе_/solution.py new file mode 100644 index 0000000..524f0f9 --- /dev/null +++ b/solutions/69de7223f309a98be0007e09_8__Самописный_поисковый_агент_на_основе_/solution.py @@ -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() \ No newline at end of file