Files
homework-solutions/solutions/6a02e23da6fe2e4ac16acf65_Агент_с_RAG-памятью/solution.py
T

21 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"files":[{"filename":"solution.py","content":"# Агент с RAG-памятью\n# Используем LangChain и OpenAI API\n# Для работы требуется установить пакет langchain и openai\n\nimport os\nfrom
typing import List\n\nfrom
langchain import OpenAI,
LLMChain\nfrom langchain.memory import ConversationBufferMemory\nfrom
langchain.chains import RetrievalQA\nfrom
langchain.vectorstores import FAISS\nfrom
langchain.embeddings import OpenAIEmbeddings\nfrom
langchain.text_splitter import RecursiveCharacterTextSplitter\n\n#
Путь к директории с документами (текстовыми файлами)\nDOCS_DIR = \"docs\"\n\n# Инициализация OpenAI LLM\nllm = OpenAI(temperature=0.7, model_name=\"gpt-3.5-turbo\")\n\n# Функция для загрузки документов из папки\n
def load_documents(path:
str) -> List[str]:\n texts = []\n for filename in os.listdir(path):\n if filename.endswith(\".txt\"):\n with open(os.path.join(path, filename), \"r\", encoding=\"utf-8\") as f:\n texts.append(f.read())\n return texts\n\n# Создание векторного хранилища FAISS\n
def create_vector_store(texts:
List[str]):\n # Разбиваем большие тексты на части\n splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)\n docs = splitter.split_text(\"\\n\".join(texts))\n embeddings = OpenAIEmbeddings()\n vector_store = FAISS.from_texts(docs, embeddings)\n return vector_store\n\n# Класс агента с RAG-памятью\n
class RagAgent:
\n
def __init__(self, vector_store):
\n self.vector_store = vector_store\n # Встроенная память для диалога\n self.memory = ConversationBufferMemory(memory_key=\"chat_history\", return_messages=True)\n # Создаём цепочку RetrievalQA\n self.qa_chain = RetrievalQA.from_chain_type(\n llm=llm,\n chain_type=\"stuff\",\n retriever=self.vector_store.as_retriever(search_kwargs={\"k\": 3}),\n memory=self.memory,\n )\n\n
def ask(self, question:
str) -> str:\n # Получаем ответ, используя RAG и память\n result = self.qa_chain(question)\n return result[\"result\"]\n\n# Точка входа\n
if __name__ == \"__main__\":\n # Проверяем наличие ключа OpenAI\n if \"OPENAI_API_KEY\" not in os.environ:\n raise EnvironmentError(\"Пожалуйста, установите переменную окружения OPENAI_API_KEY\")\n\n # Загружаем документы\n docs = load_documents(DOCS_DIR)\n if not docs:\n raise FileNotFoundError(f\"Папка {DOCS_DIR} пуста или не найдена\")\n\n # Создаём векторное хранилище\n vector_store = create_vector_store(docs)\n\n # Инициализируем агента\n agent = RagAgent(vector_store)\n\n print(\"Агент готов отвечать на вопросы. Введите 'выход' для завершения.\")\n while True:\n try:\n user_input = input(\"Вы: \")\n if user_input.lower() in (\"выход\", \"exit\", \"quit\"):\n print(\"Завершение работы.\")\n break\n answer = agent.ask(user_input)\n print(\"Агент: \", answer)\n except KeyboardInterrupt:\n print(\"\\nЗавершение работы.\")\n break\n"],"filename":"requirements.txt","content":"langchain\nopenai\nfaiss-cpu\n"},{"filename":"README.md","content":"# Агент с RAG-памятью\n\n## Описание\n\nПростой чат‑бот, использующий RetrievalAugmented Generation (RAG) и память диалога. Бот загружает текстовые файлы из папки `docs`, создаёт векторное хранилище FAISS, а затем отвечает на вопросы, комбинируя найденную информацию и историю беседы.\n\n## Установка\n\n```bash\npip install -r requirements.txt\n```\n\n## Настройка\n\n1. Создайте папку `docs` в корне проекта и поместите туда `.txt` файлы с материалами.\n2. Установите переменную окружения `OPENAI_API_KEY` с вашим ключом OpenAI.\n\n## Запуск\n\n```bash\npython solution.py\n```\n\nВведите вопросы, а бот ответит, используя RAG и память диалога. Введите `выход`, `exit` или `quit` для завершения.\n"}],"main_file":"solution.py"}