diff --git a/translations/ar/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/ar/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..a3747e438 --- /dev/null +++ b/translations/ar/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# بناء وكلاء ذكاء اصطناعي بذاكرة مستدامة باستخدام Cognee\n", + "\n", + "يوضح هذا الدفتر كيفية بناء وكلاء ذكاء اصطناعي ذكيين بقدرات ذاكرة متقدمة باستخدام [**cognee**](https://www.cognee.ai/) - ذاكرة ذكاء اصطناعي مفتوحة المصدر تجمع بين الرسوم البيانية للمعرفة، البحث الدلالي، وإدارة الجلسات لإنشاء أنظمة ذكاء اصطناعي مدركة للسياق.\n", + "\n", + "## 🎯 أهداف التعلم\n", + "\n", + "بنهاية هذا الدرس، ستفهم كيفية:\n", + "- **بناء رسوم بيانية للمعرفة مدعومة بالتضمينات**: تحويل النصوص غير المنظمة إلى معرفة منظمة وقابلة للاستعلام\n", + "- **تنفيذ ذاكرة الجلسة**: إنشاء محادثات متعددة الأدوار مع الاحتفاظ بالسياق تلقائيًا\n", + "- **تخزين المحادثات**: حفظ التفاعلات المهمة اختياريًا في ذاكرة طويلة الأمد للرجوع إليها في المستقبل\n", + "- **الاستعلام باستخدام اللغة الطبيعية**: الوصول إلى السياق التاريخي والاستفادة منه في المحادثات الجديدة\n", + "- **تصور الذاكرة**: استكشاف العلاقات في الرسم البياني للمعرفة الخاص بالوكيل\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ ما الذي ستقوم ببنائه\n", + "\n", + "في هذا الدليل، سنقوم بإنشاء **مساعد برمجي** بذاكرة مستدامة يقوم بما يلي:\n", + "\n", + "### 1. **بناء قاعدة المعرفة**\n", + " - يستوعب معلومات الملف الشخصي للمطور وخبراته\n", + " - يعالج مبادئ البرمجة بلغة Python وأفضل الممارسات\n", + " - يخزن المحادثات السابقة بين المطورين والمساعدات الذكية\n", + "\n", + "### 2. **محادثات مدركة للجلسة**\n", + " - يحافظ على السياق عبر أسئلة متعددة في نفس الجلسة\n", + " - يقوم تلقائيًا بتخزين كل زوج من الأسئلة/الإجابات لاسترجاعها بكفاءة\n", + " - يقدم ردودًا متماسكة وسياقية بناءً على تاريخ المحادثة\n", + "\n", + "### 3. **ذاكرة طويلة الأمد**\n", + " - يحتفظ بالمحادثات المهمة في ذاكرة طويلة الأمد\n", + " - يسترجع الذكريات ذات الصلة من قاعدة المعرفة والجلسات السابقة لتوجيه التفاعلات الجديدة\n", + " - يبني قاعدة معرفة متنامية تتحسن مع مرور الوقت\n", + "\n", + "### 4. **استرجاع ذكي للذاكرة**\n", + " - يستخدم البحث الدلالي المدرك للرسوم البيانية للعثور على المعلومات ذات الصلة عبر جميع المعرفة المخزنة\n", + " - يقوم بتصفية عمليات البحث حسب مجموعات البيانات الفرعية (معلومات المطور مقابل المبادئ)\n", + " - يجمع بين مصادر بيانات متعددة لتقديم إجابات شاملة\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 المتطلبات والإعداد\n", + "\n", + "### متطلبات النظام\n", + "\n", + "قبل البدء، تأكد من توفر ما يلي:\n", + "\n", + "1. **بيئة Python**\n", + " - Python 3.9 أو أعلى\n", + " - بيئة افتراضية (موصى بها)\n", + "\n", + "2. **ذاكرة Redis** (مطلوبة لإدارة الجلسات)\n", + " - Redis محلي: `docker run -d -p 6379:6379 redis`\n", + " - أو استخدم خدمة Redis مُدارة\n", + "\n", + "3. **وصول إلى واجهة برمجة التطبيقات LLM**\n", + " - مفتاح API لـ OpenAI أو مقدمي خدمات آخرين (راجع [التوثيق](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **إعداد قاعدة البيانات**\n", + " - لا توجد إعدادات مطلوبة افتراضيًا. يستخدم Cognee قواعد بيانات تعتمد على الملفات (LanceDB و Kuzu)\n", + " - اختياريًا، يمكنك إعداد Azure AI Search كمخزن متجه (راجع [التوثيق](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### إعداد البيئة\n", + "\n", + "قم بإنشاء ملف `.env` في دليل المشروع الخاص بك يحتوي على المتغيرات التالية:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ فهم بنية ذاكرة Cognee\n", + "\n", + "### كيفية عمل Cognee\n", + "\n", + "توفر Cognee نظام ذاكرة متقدم يتجاوز التخزين البسيط للقيم والمفاتيح:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### المكونات الرئيسية:\n", + "\n", + "1. **رسم المعرفة**: يخزن الكيانات والعلاقات والروابط الدلالية\n", + "2. **التضمينات الشعاعية**: يتيح البحث الدلالي عبر جميع المعلومات المخزنة\n", + "3. **ذاكرة الجلسة المؤقتة**: يحافظ على سياق المحادثة داخل الجلسات وعبرها\n", + "4. **مجموعات العقد**: تنظم البيانات في فئات منطقية لاسترجاعها بشكل مستهدف\n", + "\n", + "### أنواع الذاكرة في هذا الدرس:\n", + "\n", + "- **الذاكرة الدائمة**: تخزين طويل الأمد في رسم المعرفة\n", + "- **ذاكرة الجلسة**: سياق المحادثة المؤقت في ذاكرة Redis المؤقتة\n", + "- **الذاكرة الدلالية**: البحث القائم على التشابه الشعاعي عبر جميع البيانات\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 تثبيت الحزم المطلوبة\n", + "\n", + "قم بتثبيت Cognee مع دعم Redis لإدارة الجلسات:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 تهيئة البيئة وتحميل المكتبات\n", + "\n", + "تأكد من:\n", + "1. تشغيل Redis (على سبيل المثال، عبر Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. ضبط متغيرات البيئة قبل استيراد وحدات التخزين المؤقت\n", + "3. إذا لزم الأمر، أعد تشغيل النواة وقم بتشغيل الخلايا بالترتيب\n", + "\n", + "ستقوم الخلية التالية بـ:\n", + "1. تحميل متغيرات البيئة من `.env`\n", + "2. إعداد Cognee باستخدام إعدادات LLM الخاصة بك\n", + "3. تمكين التخزين المؤقت لإدارة الجلسات\n", + "4. التحقق من اتصال جميع المكونات بشكل صحيح\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 إعداد أدلة التخزين\n", + "\n", + "تستخدم Cognee دليلين منفصلين لعملياتها:\n", + "- **الجذر البيانات**: يخزن المستندات المُدخلة والبيانات المعالجة\n", + "- **الجذر النظام**: يحتوي على قاعدة بيانات الرسم البياني المعرفي وبيانات النظام الوصفية\n", + "\n", + "سنقوم بإنشاء أدلة معزولة لهذا الدليل كما يلي:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 إعادة تعيين حالة الذاكرة\n", + "\n", + "قبل أن نبدأ في بناء نظام الذاكرة الخاص بنا، دعونا نتأكد من أننا نبدأ من جديد.\n", + "\n", + "> 💡 **نصيحة**: يمكنك تخطي هذه الخطوة إذا كنت ترغب في الاحتفاظ بالذكريات الحالية من تشغيلاتك السابقة عند استخدامك لهذا الدفتر لاحقًا.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 الجزء 1: بناء قاعدة المعرفة\n", + "\n", + "### مصادر البيانات لمساعد المطور\n", + "\n", + "سنقوم بجمع ثلاثة أنواع من البيانات لإنشاء قاعدة معرفة شاملة:\n", + "\n", + "1. **ملف تعريف المطور**: الخبرة الشخصية والخلفية التقنية\n", + "2. **أفضل ممارسات Python**: فلسفة Python مع إرشادات عملية\n", + "3. **المحادثات التاريخية**: جلسات الأسئلة والأجوبة السابقة بين المطورين ومساعدي الذكاء الاصطناعي\n", + "\n", + "تتيح هذه البيانات المتنوعة لوكيلنا أن:\n", + "- يفهم السياق التقني للمستخدم\n", + "- يطبق أفضل الممارسات في التوصيات\n", + "- يتعلم من التفاعلات الناجحة السابقة\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 تحويل البيانات إلى رسم بياني للمعرفة\n", + "\n", + "سنقوم الآن بتحويل النص الخام إلى ذاكرة منظمة. تتضمن هذه العملية:\n", + "\n", + "1. **إضافة البيانات إلى NodeSets**: تنظيم المعلومات في فئات منطقية\n", + " - `developer_data`: ملف تعريف المطور والمحادثات\n", + " - `principles_data`: أفضل ممارسات وإرشادات Python\n", + "\n", + "2. **تشغيل خط أنابيب Cognify**: استخراج الكيانات والعلاقات وإنشاء التضمينات\n", + " - تحديد المفاهيم الرئيسية\n", + " - إنشاء روابط دلالية بين المعلومات ذات الصلة\n", + " - توليد تضمينات متجهة\n", + "\n", + "قد يستغرق هذا بعض الوقت بينما يقوم نموذج اللغة الكبير بمعالجة النص وبناء هيكل الرسم البياني:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 تصور الرسم البياني للمعرفة\n", + "\n", + "لنستكشف هيكل الرسم البياني للمعرفة الخاص بنا. تعرض التصور ما يلي:\n", + "- **العُقد**: الكيانات المستخرجة من النص (المفاهيم، التقنيات، الأشخاص)\n", + "- **الحواف**: العلاقات والروابط بين الكيانات\n", + "- **المجموعات**: المفاهيم ذات الصلة المجمعة بناءً على التشابه الدلالي\n", + "\n", + "افتح ملف HTML المُنشأ في متصفحك لاستكشاف الرسم البياني بشكل تفاعلي:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 إثراء الذاكرة باستخدام Memify\n", + "\n", + "وظيفة `memify()` تقوم بتحليل مخطط المعرفة وتوليد قواعد ذكية حول البيانات. هذه العملية:\n", + "- تحدد الأنماط وأفضل الممارسات\n", + "- تنشئ إرشادات قابلة للتنفيذ بناءً على المحتوى\n", + "- تقيم العلاقات بين مجالات المعرفة المختلفة\n", + "\n", + "تساعد هذه القواعد الوكيل على اتخاذ قرارات أكثر وعيًا عند الإجابة على الأسئلة. التقاط تصور ثانٍ يساعدك على مقارنة كيفية تكثيف المخطط بمجرد إثرائه.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 الجزء 2: استرجاع الذاكرة الذكي\n", + "\n", + "### العرض التوضيحي 1: دمج المعرفة عبر المستندات\n", + "\n", + "الآن بعد أن تم بناء الرسم البياني المعرفي، دعونا نختبر كيف يقوم Cognee بدمج المعلومات من مصادر متعددة للإجابة على الأسئلة المعقدة.\n", + "\n", + "الاستعلام الأول يوضح:\n", + "- **الفهم الدلالي**: العثور على المفاهيم ذات الصلة حتى عندما لا يتم ذكرها صراحة\n", + "- **الربط المتقاطع**: دمج ملف تعريف المطور مع مبادئ Python\n", + "- **الاستدلال السياقي**: تطبيق أفضل الممارسات على تنفيذات محددة\n", + "\n", + "### العرض التوضيحي 2: البحث المصفى باستخدام NodeSets\n", + "\n", + "الاستعلام الثاني يوضح كيفية استهداف مجموعات فرعية محددة من الرسم البياني المعرفي:\n", + "- يستخدم معلمة `node_name` للبحث فقط داخل `principles_data`\n", + "- يقدم إجابات مركزة من مجال معرفي محدد\n", + "- مفيد عندما تحتاج إلى معلومات خاصة بمجال معين\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 الجزء 3: إعداد إدارة الجلسات\n", + "\n", + "### تفعيل ذاكرة المحادثة\n", + "\n", + "إدارة الجلسات أمر ضروري للحفاظ على السياق عبر عدة تفاعلات. هنا سنقوم بـ:\n", + "\n", + "1. **تهيئة سياق المستخدم**: إنشاء أو استرجاع ملف تعريف المستخدم لتتبع الجلسة\n", + "2. **تكوين محرك التخزين المؤقت**: الاتصال بـ Redis لتخزين سجل المحادثات\n", + "3. **تفعيل متغيرات الجلسة**: إعداد متغيرات السياق التي تستمر عبر الاستفسارات\n", + "\n", + "> ⚠️ **هام**: يتطلب هذا تشغيل Redis ووجود `CACHING=true` في بيئتك\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ وظيفة مساعدة: عرض سجل الجلسة\n", + "\n", + "تتيح لنا هذه الوظيفة المساعدة فحص سجل المحادثات المخزن في Redis. وهي مفيدة لـ:\n", + "- تصحيح أخطاء إدارة الجلسات\n", + "- التحقق من أن المحادثات يتم تخزينها مؤقتًا\n", + "- فهم السياق المتاح للوكيل\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## الجلسة 1: مختبر دعم Async — السؤال الأول\n", + "\n", + "ابدأ جلسة `async-support-lab` بسؤال عن أنماط asyncio المناسبة للتعامل مع التتبع التلقائي الضخم بطريقة تدعم التتبع عن بُعد (telemetry). الرسم البياني لديه بالفعل معرفة بـ asyncio، و aiohttp، وممارسات المراقبة، لذا يجب أن تعكس الإجابة المحادثات السابقة مع تخصيصها للسؤال الجديد.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## فحص ذاكرة الجلسة 1 بعد التبادل الأول\n", + "\n", + "تشغيل `show_history(session_1)` مباشرة بعد السؤال الأول يؤكد أن Cognee قامت بكتابة كل من الطلب والإكمال في Redis. يجب أن ترى إدخالًا واحدًا مع إرشادات التزامن.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## الجلسة 1: متابعة حول نماذج البيانات\n", + "\n", + "بعد ذلك نسأل، \"متى يجب أن أختار dataclasses بدلاً من Pydantic؟\" باستخدام نفس معرف الجلسة. يجب على Cognee أن تجمع بين مبادئ Python والمحادثات السابقة حول FastAPI لتقديم نصيحة دقيقة—مظهرة أن السياق يستمر داخل جلسة مسماة.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## تأكيد أن سجل الجلسة 1 يحتوي على كلا الجانبين\n", + "\n", + "يجب أن يكشف استدعاء آخر لـ `show_history(session_1)` عن وجود مدخلين للأسئلة والأجوبة. يتطابق هذا مع خطوة \"إعادة تشغيل الذاكرة\" في مختبر Mem0 ويثبت أن الأدوار الإضافية تُضاف إلى نفس النص.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## الجلسة 2: سلسلة مراجعة التصميم — جلسة جديدة\n", + "\n", + "لإظهار العزل بين السلاسل، نقوم بتشغيل `design-review-session` ونطلب إرشادات تسجيل لمراجعات الحوادث. على الرغم من أن قاعدة المعرفة الأساسية هي نفسها، إلا أن معرف الجلسة الجديد يحافظ على فصل النصوص.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## مراجعة الجلسة 2 التاريخ\n", + "\n", + "`show_history(session_2)` يجب أن يعرض فقط زوج الطلب/الاستجابة الخاص بمراجعة التصميم. قارن ذلك مع الجلسة 1 لتوضيح كيف يحافظ Cognee على نصوص مستقلة بينما يعيد استخدام الرسم البياني للمعرفة المشتركة.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## الملخص\n", + "\n", + "تهانينا! لقد قمت للتو بإضافة طبقة ذاكرة طويلة المدى لمساعدك البرمجي مدعومة بواسطة Cognee.\n", + "\n", + "في هذا الدليل، قمت بتحويل محتوى المطور الخام (كود، مستندات، محادثات) إلى ذاكرة تعتمد على الرسم البياني + المتجهات يمكن لوكيلك البحث فيها، التفكير من خلالها، وتحسينها باستمرار.\n", + "\n", + "ما الذي تعلمته\n", + "\n", + "1. **من النص الخام إلى ذاكرة الذكاء الاصطناعي**: كيفية قيام Cognee باستيعاب البيانات غير المهيكلة وتحويلها إلى ذاكرة ذكية وقابلة للبحث باستخدام بنية تجمع بين المتجهات + الرسم البياني المعرفي.\n", + "\n", + "2. **إثراء الرسم البياني باستخدام memify**: كيفية تجاوز إنشاء الرسم البياني الأساسي واستخدام memify لإضافة حقائق مستنتجة وعلاقات أكثر ثراءً فوق الرسم البياني الحالي.\n", + "\n", + "3. **استراتيجيات بحث متعددة**: كيفية استعلام الذاكرة باستخدام أنواع بحث مختلفة (أسئلة وأجوبة مدركة للرسم البياني، إكمال بأسلوب RAG، رؤى، أجزاء خام، بحث في الكود، إلخ) بناءً على احتياجات وكيلك.\n", + "\n", + "4. **استكشاف بصري**: كيفية فحص وتصحيح ما أنشأته Cognee باستخدام تصورات الرسم البياني وواجهة Cognee، بحيث يمكنك رؤية كيفية هيكلة المعرفة فعليًا.\n", + "\n", + "5. **ذاكرة مدركة للجلسة**: كيفية دمج سياق كل جلسة مع ذاكرة دلالية مستمرة بحيث يمكن للوكلاء التذكر عبر الجلسات دون تسريب المعلومات بين المستخدمين.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## النقاط الرئيسية\n", + "1. الذاكرة كرسوم بيانية معرفية مدعومة بالتضمينات\n", + "\n", + " - **فهم منظم**: تجمع Cognee بين مخزن متجهات ومخزن رسوم بيانية، مما يجعل بياناتك قابلة للبحث من حيث المعنى ومتصلة بالعلاقات. تستخدم Cognee قواعد بيانات تعتمد على الملفات بشكل افتراضي (LanceDB لمخزن المتجهات، وKuzu لمخزن الرسوم البيانية).\n", + "\n", + " - **استرجاع مدرك للعلاقات**: يمكن أن تكون الإجابات مستندة ليس فقط إلى \"النصوص المشابهة\"، ولكن أيضًا إلى كيفية ارتباط الكيانات ببعضها البعض.\n", + "\n", + " - **ذاكرة حية**: تتطور طبقة الذاكرة وتنمو وتظل قابلة للاستعلام كرسوم بيانية متصلة واحدة.\n", + "\n", + "2. أوضاع البحث والاستدلال\n", + " - **استرجاع هجين**: يمزج البحث بين تشابه المتجهات، وهيكل الرسوم البيانية، واستدلال LLM، بدءًا من البحث عن أجزاء خام وصولاً إلى الإجابة على الأسئلة المدركة للرسوم البيانية.\n", + "\n", + " - **تكييف الوضع مع المهمة**: استخدم أوضاعًا بأسلوب الإكمال عندما تحتاج إلى إجابات بلغة طبيعية، وأوضاع الأجزاء/الملخص/الرسوم البيانية عندما يحتاج وكيلك إلى سياق خام أو لتحفيز استدلاله الخاص.\n", + "\n", + "3. وكلاء مخصصون ومدركون للجلسة\n", + " - **سياق الجلسة + ذاكرة طويلة الأمد**: تحتفظ Cognee بسياق \"الخيط\" قصير الأمد منفصلًا عن الذاكرة طويلة الأمد على مستوى المستخدم أو المؤسسة.\n", + "\n", + "## التطبيقات الواقعية\n", + "\n", + "1. **وكلاء الذكاء الاصطناعي العمودية**\n", + "\n", + " استخدم النمط من هذا الدفتر لتشغيل مساعدات ذكية في مجالات محددة تعتمد على Cognee كنواة للاسترجاع والاستدلال:\n", + "\n", + "- **مساعدات المطورين**: مراجعة الكود، تحليل الحوادث، ومساعدات التصميم التي تتنقل عبر الكود، واجهات برمجة التطبيقات، وثائق التصميم، والتذاكر كرسوم بيانية ذاكرية واحدة.\n", + "\n", + "- **مساعدات موجهة للعملاء**: وكلاء دعم أو نجاح يستخرجون من وثائق المنتجات، الأسئلة الشائعة، ملاحظات إدارة علاقات العملاء، والتذاكر السابقة مع استرجاع مدرك للرسوم البيانية وإجابات مستشهد بها.\n", + "\n", + "- **مساعدات الخبراء الداخلية**: مساعدات في السياسات، القانونية، أو الأمنية تستدل على القواعد المترابطة، الإرشادات، والقرارات التاريخية بدلاً من ملفات PDF المعزولة.\n", + "\n", + " تم تصميم Cognee بشكل صريح كذاكرة دقيقة ودائمة لوكلاء الذكاء الاصطناعي، مما يوفر رسمًا بيانيًا معرفيًا حيًا يمكن إدراجه خلف وكيلك ليحل محل التوليفات العشوائية من مخازن المتجهات وكود الرسوم البيانية المخصص.\n", + "\n", + "2. **توحيد صوامع البيانات في ذاكرة واحدة**\n", + "\n", + " يساعد نفس النهج أيضًا في بناء طبقة ذاكرة موحدة عبر مصادر متفرقة:\n", + "\n", + "- **من الصوامع إلى رسم بياني واحد**: استوعب البيانات المنظمة (مثل قواعد البيانات) وغير المنظمة (مثل المستندات، المحادثات) في رسم بياني واحد مدعوم بالتضمينات، بدلاً من فهارس منفصلة لكل نظام.\n", + "\n", + "- **الاستدلال عبر المصادر مع الاستشهادات**: قم بتشغيل استدلال متعدد الخطوات على كل شيء—\"اربط\" السجلات، المقاييس، والمستندات عبر الرسم البياني—ولا تزال تقدم إجابات مستندة مع مصدرها.\n", + "\n", + "- **مراكز المعرفة**: في مجالات مثل البنوك أو التعليم، تُستخدم Cognee بالفعل لتوحيد ملفات PDF، الأنظمة الداخلية، وبيانات التطبيقات في رسم بياني معرفي واحد مع متجهات بحيث يمكن للوكلاء الإجابة على الأسئلة بسياق دقيق ومستشهد به.\n", + "\n", + "## الخطوات التالية\n", + "\n", + "لقد قمت بتنفيذ الحلقة الأساسية للذاكرة. إليك بعض التوسعات الطبيعية التي يمكنك تجربتها بنفسك (راجع [وثائق Cognee](https://docs.cognee.ai/) للحصول على التفاصيل):\n", + "\n", + "1. **التجربة مع الوعي الزمني**: قم بتفعيل \"الوعي الزمني\" لاستخراج الأحداث والطوابع الزمنية من النصوص.\n", + "\n", + "2. **إدخال الاستدلال المدفوع بالأونتولوجيا**: قم بتعريف أونتولوجيا OWL لمجالك. استخدم دعم الأونتولوجيا في Cognee بحيث تكون الكيانات والعلاقات المستخرجة مستندة إلى هذا المخطط، مما يحسن جودة الرسم البياني والإجابات الخاصة بالمجال.\n", + "\n", + "3. **إضافة حلقة تغذية راجعة**: دع Cognee تعدل أوزان حواف الرسم البياني بناءً على تعليقات المستخدمين الحقيقية، بحيث يتحسن الاسترجاع بمرور الوقت بدلاً من أن يظل ثابتًا.\n", + "\n", + "4. **التخصيص وضبط سلوك الجلسة**: استخدم معرفات المستخدمين، المستأجرين، ومجموعات البيانات لتوفير رؤية مخصصة لكل شخص أو فريق على محرك الذاكرة المشترك.\n", + "\n", + "5. **التوسع إلى وكلاء أكثر تعقيدًا**: قم بتوصيل Cognee بأطر عمل الوكلاء لبناء أنظمة متعددة الوكلاء تشترك جميعها في نفس طبقة الذاكرة. *إطار عمل Microsoft Agent x مكون إضافي لـ Cognee قادم قريبًا.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**إخلاء المسؤولية**: \nتم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي. للحصول على معلومات حاسمة، يُوصى بالترجمة البشرية الاحترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:20:32+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "ar" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/ar/13-agent-memory/README.md b/translations/ar/13-agent-memory/README.md index c9005bc61..72d4ab35d 100644 --- a/translations/ar/13-agent-memory/README.md +++ b/translations/ar/13-agent-memory/README.md @@ -1,159 +1,162 @@ -# الذاكرة لوكلاء الذكاء الاصطناعي -[![ذاكرة الوكلاء](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.ar.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) +# الذاكرة لوكلاء الذكاء الاصطناعي +[![ذاكرة الوكيل](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.ar.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -عند مناقشة الفوائد الفريدة لإنشاء وكلاء الذكاء الاصطناعي، يتم التركيز بشكل أساسي على أمرين: القدرة على استدعاء الأدوات لإتمام المهام والقدرة على التحسن بمرور الوقت. الذاكرة هي الأساس لإنشاء وكيل ذاتي التحسين يمكنه تقديم تجارب أفضل لمستخدمينا. +عند مناقشة الفوائد الفريدة لإنشاء وكلاء الذكاء الاصطناعي، يتم التركيز بشكل أساسي على أمرين: القدرة على استخدام الأدوات لإتمام المهام والقدرة على التحسن مع مرور الوقت. الذاكرة هي الأساس لإنشاء وكيل ذاتي التحسين يمكنه تقديم تجارب أفضل لمستخدمينا. -في هذا الدرس، سنستعرض مفهوم الذاكرة لوكلاء الذكاء الاصطناعي وكيفية إدارتها واستخدامها لصالح تطبيقاتنا. +في هذا الدرس، سنلقي نظرة على ماهية الذاكرة لوكلاء الذكاء الاصطناعي وكيف يمكننا إدارتها واستخدامها لصالح تطبيقاتنا. -## المقدمة +## المقدمة -سيتناول هذا الدرس: +سيغطي هذا الدرس: -• **فهم ذاكرة وكلاء الذكاء الاصطناعي**: ما هي الذاكرة ولماذا هي ضرورية للوكلاء. +• **فهم ذاكرة وكلاء الذكاء الاصطناعي**: ما هي الذاكرة ولماذا هي ضرورية للوكلاء. -• **تنفيذ وتخزين الذاكرة**: طرق عملية لإضافة قدرات الذاكرة إلى وكلاء الذكاء الاصطناعي، مع التركيز على الذاكرة قصيرة وطويلة المدى. +• **تنفيذ وتخزين الذاكرة**: طرق عملية لإضافة قدرات الذاكرة إلى وكلاء الذكاء الاصطناعي، مع التركيز على الذاكرة قصيرة وطويلة المدى. -• **جعل وكلاء الذكاء الاصطناعي ذاتية التحسين**: كيف تمكّن الذاكرة الوكلاء من التعلم من التفاعلات السابقة والتحسن بمرور الوقت. +• **جعل وكلاء الذكاء الاصطناعي ذاتية التحسين**: كيف تمكّن الذاكرة الوكلاء من التعلم من التفاعلات السابقة والتحسن مع مرور الوقت. -## أهداف التعلم +## التطبيقات المتاحة -بعد إكمال هذا الدرس، ستتمكن من: +يتضمن هذا الدرس درسين شاملين في دفاتر الملاحظات: -• **التمييز بين أنواع مختلفة من ذاكرة وكلاء الذكاء الاصطناعي**، بما في ذلك الذاكرة العاملة، قصيرة المدى، طويلة المدى، وأشكال متخصصة مثل ذاكرة الشخصية والذاكرة الحلقية. +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: ينفذ الذاكرة باستخدام Mem0 وAzure AI Search مع إطار عمل Semantic Kernel. -• **تنفيذ وإدارة الذاكرة قصيرة وطويلة المدى لوكلاء الذكاء الاصطناعي** باستخدام إطار عمل Semantic Kernel، والاستفادة من أدوات مثل Mem0 وWhiteboard memory، والتكامل مع Azure AI Search. +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: ينفذ ذاكرة منظمة باستخدام Cognee، حيث يتم بناء رسم بياني للمعرفة مدعوم بالتضمينات، مع تصور الرسم البياني واسترجاع ذكي. -• **فهم المبادئ وراء وكلاء الذكاء الاصطناعي ذاتية التحسين** وكيف تساهم أنظمة إدارة الذاكرة القوية في التعلم المستمر والتكيف. +## أهداف التعلم -## فهم ذاكرة وكلاء الذكاء الاصطناعي +بعد إكمال هذا الدرس، ستتمكن من: -في جوهرها، **تشير ذاكرة وكلاء الذكاء الاصطناعي إلى الآليات التي تسمح لهم بالاحتفاظ بالمعلومات واسترجاعها**. يمكن أن تكون هذه المعلومات تفاصيل محددة عن محادثة، تفضيلات المستخدم، إجراءات سابقة، أو حتى أنماط تعلم. +• **التمييز بين أنواع مختلفة من ذاكرة وكلاء الذكاء الاصطناعي**، بما في ذلك الذاكرة العاملة، قصيرة المدى، طويلة المدى، وأشكال متخصصة مثل ذاكرة الشخصية والذاكرة الحلقية. -بدون ذاكرة، تكون تطبيقات الذكاء الاصطناعي غالبًا بلا حالة، مما يعني أن كل تفاعل يبدأ من الصفر. يؤدي ذلك إلى تجربة مستخدم متكررة ومحبطة حيث "ينسى" الوكيل السياق أو التفضيلات السابقة. +• **تنفيذ وإدارة الذاكرة قصيرة وطويلة المدى لوكلاء الذكاء الاصطناعي** باستخدام إطار عمل Semantic Kernel، والاستفادة من أدوات مثل Mem0 وCognee وWhiteboard memory، والتكامل مع Azure AI Search. -### لماذا الذاكرة مهمة؟ +• **فهم المبادئ وراء وكلاء الذكاء الاصطناعي ذاتية التحسين** وكيف تساهم أنظمة إدارة الذاكرة القوية في التعلم المستمر والتكيف. -ترتبط ذكاء الوكيل بشكل عميق بقدرته على استرجاع واستخدام المعلومات السابقة. تتيح الذاكرة للوكلاء أن يكونوا: +## فهم ذاكرة وكلاء الذكاء الاصطناعي -• **تأمليين**: التعلم من الإجراءات والنتائج السابقة. +في جوهرها، **تشير الذاكرة لوكلاء الذكاء الاصطناعي إلى الآليات التي تسمح لهم بالاحتفاظ بالمعلومات واسترجاعها**. يمكن أن تكون هذه المعلومات تفاصيل محددة عن محادثة، تفضيلات المستخدم، إجراءات سابقة، أو حتى أنماط مكتسبة. -• **تفاعليين**: الحفاظ على السياق خلال محادثة مستمرة. +بدون ذاكرة، تكون تطبيقات الذكاء الاصطناعي غالبًا بلا حالة، مما يعني أن كل تفاعل يبدأ من الصفر. يؤدي ذلك إلى تجربة مستخدم متكررة ومحبطة حيث "ينسى" الوكيل السياق أو التفضيلات السابقة. -• **استباقيين وتفاعليين**: توقع الاحتياجات أو الاستجابة بشكل مناسب بناءً على البيانات التاريخية. +### لماذا الذاكرة مهمة؟ -• **مستقلين**: العمل بشكل أكثر استقلالية من خلال الاعتماد على المعرفة المخزنة. +ترتبط ذكاء الوكيل بقدرته على استرجاع واستخدام المعلومات السابقة. تتيح الذاكرة للوكلاء أن يكونوا: -الهدف من تنفيذ الذاكرة هو جعل الوكلاء أكثر **موثوقية وقدرة**. +• **تأمليين**: التعلم من الإجراءات والنتائج السابقة. -### أنواع الذاكرة +• **تفاعليين**: الحفاظ على السياق خلال محادثة مستمرة. -#### الذاكرة العاملة +• **استباقيين وتفاعليين**: توقع الاحتياجات أو الاستجابة بشكل مناسب بناءً على البيانات التاريخية. -فكر في هذه الذاكرة كقطعة من الورق يستخدمها الوكيل أثناء مهمة واحدة أو عملية تفكير مستمرة. تحتفظ بالمعلومات الفورية اللازمة لحساب الخطوة التالية. +• **مستقلين**: العمل بشكل أكثر استقلالية من خلال الاعتماد على المعرفة المخزنة. -بالنسبة لوكلاء الذكاء الاصطناعي، غالبًا ما تلتقط الذاكرة العاملة المعلومات الأكثر صلة من محادثة، حتى لو كان تاريخ الدردشة طويلًا أو مختصرًا. تركز على استخراج العناصر الرئيسية مثل المتطلبات، الاقتراحات، القرارات، والإجراءات. +الهدف من تنفيذ الذاكرة هو جعل الوكلاء أكثر **موثوقية وقدرة**. -**مثال على الذاكرة العاملة** +### أنواع الذاكرة -في وكيل حجز السفر، قد تلتقط الذاكرة العاملة طلب المستخدم الحالي، مثل "أريد حجز رحلة إلى باريس". يتم الاحتفاظ بهذا المتطلب المحدد في سياق الوكيل الفوري لتوجيه التفاعل الحالي. +#### الذاكرة العاملة -#### الذاكرة قصيرة المدى +فكر في هذه الذاكرة كقطعة من الورق يستخدمها الوكيل أثناء مهمة واحدة أو عملية تفكير مستمرة. تحتفظ بالمعلومات الفورية اللازمة لحساب الخطوة التالية. -هذا النوع من الذاكرة يحتفظ بالمعلومات طوال مدة محادثة واحدة أو جلسة واحدة. إنها سياق الدردشة الحالية، مما يسمح للوكيل بالإشارة إلى الأدوار السابقة في الحوار. +بالنسبة لوكلاء الذكاء الاصطناعي، غالبًا ما تلتقط الذاكرة العاملة المعلومات الأكثر صلة من محادثة، حتى لو كان تاريخ الدردشة طويلًا أو مختصرًا. تركز على استخراج العناصر الرئيسية مثل المتطلبات، الاقتراحات، القرارات، والإجراءات. -**مثال على الذاكرة قصيرة المدى** +**مثال على الذاكرة العاملة** -إذا سأل المستخدم، "كم تكلفة رحلة إلى باريس؟" ثم تابع بسؤال "ماذا عن الإقامة هناك؟"، تضمن الذاكرة قصيرة المدى أن الوكيل يعرف أن "هناك" تشير إلى "باريس" ضمن نفس المحادثة. +في وكيل حجز السفر، قد تلتقط الذاكرة العاملة طلب المستخدم الحالي، مثل "أريد حجز رحلة إلى باريس". يتم الاحتفاظ بهذا المتطلب المحدد في سياق الوكيل الفوري لتوجيه التفاعل الحالي. -#### الذاكرة طويلة المدى +#### الذاكرة قصيرة المدى -هذه هي المعلومات التي تستمر عبر محادثات أو جلسات متعددة. تتيح للوكلاء تذكر تفضيلات المستخدم، التفاعلات التاريخية، أو المعرفة العامة على مدى فترات طويلة. هذا مهم للتخصيص. +هذا النوع من الذاكرة يحتفظ بالمعلومات طوال مدة محادثة واحدة أو جلسة واحدة. إنها سياق الدردشة الحالية، مما يسمح للوكيل بالإشارة إلى الأدوار السابقة في الحوار. -**مثال على الذاكرة طويلة المدى** +**مثال على الذاكرة قصيرة المدى** -قد تخزن الذاكرة طويلة المدى أن "بن يحب التزلج والأنشطة الخارجية، يفضل القهوة مع إطلالة على الجبال، ويريد تجنب منحدرات التزلج المتقدمة بسبب إصابة سابقة". تؤثر هذه المعلومات، التي تم تعلمها من التفاعلات السابقة، على التوصيات في جلسات تخطيط السفر المستقبلية، مما يجعلها مخصصة للغاية. +إذا سأل المستخدم، "كم تكلفة رحلة إلى باريس؟" ثم تابع بـ "ماذا عن الإقامة هناك؟"، تضمن الذاكرة قصيرة المدى أن الوكيل يعرف أن "هناك" تشير إلى "باريس" في نفس المحادثة. -#### ذاكرة الشخصية +#### الذاكرة طويلة المدى -هذا النوع المتخصص من الذاكرة يساعد الوكيل على تطوير "شخصية" أو "هوية" متسقة. تتيح للوكيل تذكر التفاصيل عن نفسه أو دوره المقصود، مما يجعل التفاعلات أكثر سلاسة وتركيزًا. +هذه هي المعلومات التي تستمر عبر محادثات أو جلسات متعددة. تتيح للوكلاء تذكر تفضيلات المستخدم، التفاعلات التاريخية، أو المعرفة العامة على مدى فترات طويلة. هذا مهم للتخصيص. -**مثال على ذاكرة الشخصية** -إذا تم تصميم وكيل السفر ليكون "خبيرًا في تخطيط التزلج"، فقد تعزز ذاكرة الشخصية هذا الدور، مما يؤثر على ردوده لتتماشى مع نبرة ومعرفة الخبير. +**مثال على الذاكرة طويلة المدى** -#### ذاكرة الحلقات/سير العمل +قد تخزن الذاكرة طويلة المدى أن "بن يحب التزلج والأنشطة الخارجية، يفضل القهوة مع إطلالة على الجبال، ويريد تجنب منحدرات التزلج المتقدمة بسبب إصابة سابقة". تؤثر هذه المعلومات، التي تم تعلمها من التفاعلات السابقة، على التوصيات في جلسات تخطيط السفر المستقبلية، مما يجعلها مخصصة للغاية. -تخزن هذه الذاكرة تسلسل الخطوات التي يتخذها الوكيل أثناء مهمة معقدة، بما في ذلك النجاحات والإخفاقات. إنها مثل تذكر "حلقات" أو تجارب سابقة للتعلم منها. +#### ذاكرة الشخصية -**مثال على ذاكرة الحلقات** +هذا النوع المتخصص من الذاكرة يساعد الوكيل على تطوير "شخصية" أو "هوية" متسقة. يسمح للوكيل بتذكر التفاصيل عن نفسه أو دوره المقصود، مما يجعل التفاعلات أكثر سلاسة وتركيزًا. -إذا حاول الوكيل حجز رحلة معينة ولكنه فشل بسبب عدم التوفر، يمكن لذاكرة الحلقات تسجيل هذا الفشل، مما يسمح للوكيل بمحاولة رحلات بديلة أو إبلاغ المستخدم بالمشكلة بطريقة أكثر وعيًا خلال محاولة لاحقة. +**مثال على ذاكرة الشخصية** -#### ذاكرة الكيانات +إذا تم تصميم وكيل السفر ليكون "خبيرًا في تخطيط التزلج"، فقد تعزز ذاكرة الشخصية هذا الدور، مما يؤثر على ردوده لتتماشى مع نبرة ومعرفة الخبير. -تشمل هذه الذاكرة استخراج وتذكر كيانات محددة (مثل الأشخاص، الأماكن، أو الأشياء) والأحداث من المحادثات. تتيح للوكيل بناء فهم منظم للعناصر الرئيسية التي تمت مناقشتها. +#### ذاكرة الحلقات/العمليات -**مثال على ذاكرة الكيانات** +تخزن هذه الذاكرة تسلسل الخطوات التي يتخذها الوكيل أثناء مهمة معقدة، بما في ذلك النجاحات والإخفاقات. إنها مثل تذكر "الحلقات" أو التجارب السابقة للتعلم منها. -من محادثة حول رحلة سابقة، قد يستخرج الوكيل "باريس"، "برج إيفل"، و"عشاء في مطعم لو شات نوار" ككيانات. في تفاعل مستقبلي، يمكن للوكيل تذكر "لو شات نوار" وعرض حجز جديد هناك. +**مثال على ذاكرة الحلقات** -#### RAG المنظم (توليد معزز بالاسترجاع) +إذا حاول الوكيل حجز رحلة معينة ولكنها فشلت بسبب عدم التوفر، يمكن لذاكرة الحلقات تسجيل هذا الفشل، مما يسمح للوكيل بمحاولة رحلات بديلة أو إبلاغ المستخدم بالمشكلة بطريقة أكثر وعيًا خلال محاولة لاحقة. -بينما يعد RAG تقنية أوسع، يتم تسليط الضوء على "RAG المنظم" كتقنية ذاكرة قوية. يستخرج معلومات كثيفة ومنظمة من مصادر متنوعة (محادثات، رسائل بريد إلكتروني، صور) ويستخدمها لتعزيز الدقة، الاسترجاع، والسرعة في الردود. على عكس RAG الكلاسيكي الذي يعتمد فقط على التشابه الدلالي، يعمل RAG المنظم مع البنية المتأصلة للمعلومات. +#### ذاكرة الكيانات -**مثال على RAG المنظم** +تشمل هذه الذاكرة استخراج وتذكر كيانات محددة (مثل الأشخاص، الأماكن، أو الأشياء) والأحداث من المحادثات. تتيح للوكيل بناء فهم منظم للعناصر الرئيسية التي تمت مناقشتها. -بدلاً من مجرد مطابقة الكلمات المفتاحية، يمكن لـ RAG المنظم تحليل تفاصيل الرحلة (الوجهة، التاريخ، الوقت، شركة الطيران) من بريد إلكتروني وتخزينها بطريقة منظمة. يتيح ذلك استفسارات دقيقة مثل "ما الرحلة التي حجزتها إلى باريس يوم الثلاثاء؟" +**مثال على ذاكرة الكيانات** -## تنفيذ وتخزين الذاكرة +من محادثة حول رحلة سابقة، قد يستخرج الوكيل "باريس"، "برج إيفل"، و"عشاء في مطعم لو شات نوار" ككيانات. في تفاعل مستقبلي، يمكن للوكيل تذكر "لو شات نوار" وعرض حجز جديد هناك. -يتضمن تنفيذ الذاكرة لوكلاء الذكاء الاصطناعي عملية منهجية لإدارة الذاكرة، والتي تشمل إنشاء، تخزين، استرجاع، دمج، تحديث، وحتى "نسيان" (أو حذف) المعلومات. الاسترجاع هو جانب حاسم بشكل خاص. +#### RAG المنظم (توليد معزز بالاسترجاع) -### أدوات ذاكرة متخصصة +بينما يعد RAG تقنية أوسع، يتم تسليط الضوء على "RAG المنظم" كتقنية ذاكرة قوية. يستخرج معلومات كثيفة ومنظمة من مصادر متنوعة (المحادثات، الرسائل الإلكترونية، الصور) ويستخدمها لتعزيز الدقة، الاسترجاع، والسرعة في الردود. على عكس RAG الكلاسيكي الذي يعتمد فقط على التشابه الدلالي، يعمل RAG المنظم مع البنية المتأصلة للمعلومات. -إحدى الطرق لتخزين وإدارة ذاكرة الوكلاء هي استخدام أدوات متخصصة مثل Mem0. يعمل Mem0 كطبقة ذاكرة دائمة، مما يسمح للوكلاء باسترجاع التفاعلات ذات الصلة، تخزين تفضيلات المستخدم والسياق الواقعي، والتعلم من النجاحات والإخفاقات بمرور الوقت. الفكرة هنا هي أن الوكلاء الذين لا يحتفظون بحالة يصبحون وكلاء يحتفظون بحالة. +**مثال على RAG المنظم** -يعمل ذلك من خلال **أنبوب ذاكرة من مرحلتين: الاستخراج والتحديث**. أولاً، يتم إرسال الرسائل المضافة إلى سلسلة الوكيل إلى خدمة Mem0، التي تستخدم نموذج لغة كبير (LLM) لتلخيص تاريخ المحادثة واستخراج ذكريات جديدة. بعد ذلك، تحدد مرحلة التحديث المدفوعة بـ LLM ما إذا كان يجب إضافة هذه الذكريات أو تعديلها أو حذفها، وتخزينها في قاعدة بيانات هجينة يمكن أن تشمل قواعد بيانات متجهة، بيانية، وقيم-مفتاح. يدعم هذا النظام أيضًا أنواعًا مختلفة من الذاكرة ويمكن أن يدمج ذاكرة بيانية لإدارة العلاقات بين الكيانات. +بدلاً من مجرد مطابقة الكلمات المفتاحية، يمكن لـ RAG المنظم تحليل تفاصيل الرحلة (الوجهة، التاريخ، الوقت، شركة الطيران) من رسالة إلكترونية وتخزينها بطريقة منظمة. يتيح ذلك استفسارات دقيقة مثل "ما الرحلة التي حجزتها إلى باريس يوم الثلاثاء؟" -### تخزين الذاكرة باستخدام RAG +## تنفيذ وتخزين الذاكرة -إلى جانب أدوات الذاكرة المتخصصة مثل Mem0، يمكنك الاستفادة من خدمات البحث القوية مثل **Azure AI Search كخلفية لتخزين واسترجاع الذكريات**، خاصة لـ RAG المنظم. +يتضمن تنفيذ الذاكرة لوكلاء الذكاء الاصطناعي عملية منهجية لإدارة الذاكرة، والتي تشمل إنشاء، تخزين، استرجاع، دمج، تحديث، وحتى "نسيان" (أو حذف) المعلومات. الاسترجاع هو جانب حاسم بشكل خاص. -يتيح لك ذلك تأصيل ردود الوكيل ببياناتك الخاصة، مما يضمن إجابات أكثر صلة ودقة. يمكن استخدام Azure AI Search لتخزين ذكريات السفر الخاصة بالمستخدم، كتالوجات المنتجات، أو أي معرفة خاصة بمجال معين. +### أدوات ذاكرة متخصصة -يدعم Azure AI Search ميزات مثل **RAG المنظم**، الذي يتفوق في استخراج واسترجاع المعلومات الكثيفة والمنظمة من مجموعات بيانات كبيرة مثل تواريخ المحادثات، رسائل البريد الإلكتروني، أو حتى الصور. يوفر ذلك "دقة واسترجاع فائقة" مقارنةً بالنهج التقليدية لتقسيم النصوص وإنشاء التضمينات. +#### Mem0 -## جعل وكلاء الذكاء الاصطناعي ذاتية التحسين +إحدى الطرق لتخزين وإدارة ذاكرة الوكيل هي استخدام أدوات متخصصة مثل Mem0. يعمل Mem0 كطبقة ذاكرة دائمة، مما يسمح للوكلاء باسترجاع التفاعلات ذات الصلة، تخزين تفضيلات المستخدم والسياق الواقعي، والتعلم من النجاحات والإخفاقات مع مرور الوقت. الفكرة هنا هي أن الوكلاء بدون حالة يتحولون إلى وكلاء بحالة. -نمط شائع للوكلاء ذاتية التحسين يتضمن تقديم **"وكيل معرفة"**. هذا الوكيل المنفصل يراقب المحادثة الرئيسية بين المستخدم والوكيل الأساسي. دوره هو: +#### Cognee -1. **تحديد المعلومات القيمة**: تحديد ما إذا كان أي جزء من المحادثة يستحق الحفظ كمعرفة عامة أو تفضيل مستخدم محدد. +نهج قوي آخر هو استخدام **Cognee**، ذاكرة دلالية مفتوحة المصدر لوكلاء الذكاء الاصطناعي التي تحول البيانات المنظمة وغير المنظمة إلى رسوم بيانية للمعرفة قابلة للاستعلام مدعومة بالتضمينات. -2. **الاستخراج والتلخيص**: استخلاص التعلم أو التفضيل الأساسي من المحادثة. +### تخزين الذاكرة باستخدام RAG -3. **التخزين في قاعدة معرفة**: الاحتفاظ بهذه المعلومات المستخرجة، غالبًا في قاعدة بيانات متجهة، بحيث يمكن استرجاعها لاحقًا. +يمكنك الاستفادة من خدمات البحث القوية مثل **Azure AI Search** كخلفية لتخزين واسترجاع الذكريات، خاصة لـ RAG المنظم. -4. **تعزيز الاستفسارات المستقبلية**: عندما يبدأ المستخدم استفسارًا جديدًا، يسترجع وكيل المعرفة المعلومات المخزنة ذات الصلة ويضيفها إلى طلب المستخدم، مما يوفر سياقًا حاسمًا للوكيل الأساسي (مشابه لـ RAG). +## جعل وكلاء الذكاء الاصطناعي ذاتية التحسين -### تحسينات للذاكرة +نمط شائع للوكلاء ذاتية التحسين يتضمن تقديم **"وكيل المعرفة"**. هذا الوكيل المنفصل يراقب المحادثة الرئيسية بين المستخدم والوكيل الأساسي. -• **إدارة زمن الاستجابة**: لتجنب إبطاء تفاعلات المستخدم، يمكن استخدام نموذج أرخص وأسرع مبدئيًا للتحقق بسرعة مما إذا كانت المعلومات ذات قيمة للتخزين أو الاسترجاع، مع استدعاء عملية الاستخراج/الاسترجاع الأكثر تعقيدًا عند الضرورة فقط. +### تحسينات للذاكرة -• **صيانة قاعدة المعرفة**: بالنسبة لقاعدة معرفة متزايدة، يمكن نقل المعلومات الأقل استخدامًا إلى "تخزين بارد" لإدارة التكاليف. +• **إدارة التأخير**: لتجنب إبطاء التفاعلات، يمكن استخدام نموذج أرخص وأسرع في البداية للتحقق بسرعة مما إذا كانت المعلومات تستحق التخزين أو الاسترجاع. -## هل لديك المزيد من الأسئلة حول ذاكرة الوكلاء؟ +• **صيانة قاعدة المعرفة**: بالنسبة لقاعدة معرفة متزايدة، يمكن نقل المعلومات الأقل استخدامًا إلى "التخزين البارد" لإدارة التكاليف. -انضم إلى [خادم Discord الخاص بـ Azure AI Foundry](https://aka.ms/ai-agents/discord) للتواصل مع متعلمين آخرين، حضور ساعات المكتب، والحصول على إجابات لأسئلتك حول وكلاء الذكاء الاصطناعي. +## هل لديك المزيد من الأسئلة حول ذاكرة الوكلاء؟ + +انضم إلى [خادم Discord الخاص بـ Azure AI Foundry](https://aka.ms/ai-agents/discord) للتواصل مع متعلمين آخرين، حضور ساعات المكتب، والحصول على إجابات لأسئلتك حول وكلاء الذكاء الاصطناعي. --- + **إخلاء المسؤولية**: -تم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الموثوق. للحصول على معلومات حاسمة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة. \ No newline at end of file +تم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي. للحصول على معلومات حاسمة، يُوصى بالترجمة البشرية الاحترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة. + \ No newline at end of file diff --git a/translations/bg/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/bg/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..56e82570a --- /dev/null +++ b/translations/bg/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Създаване на AI агенти с постоянна памет чрез Cognee\n", + "\n", + "Този тетрадка демонстрира как да изградите интелигентни AI агенти със сложни възможности за памет, използвайки [**cognee**](https://www.cognee.ai/) - отворен код за AI памет, който комбинира графи на знания, семантично търсене и управление на сесии за създаване на контекстуално осведомени AI системи.\n", + "\n", + "## 🎯 Цели на обучението\n", + "\n", + "До края на този урок ще разберете как да:\n", + "- **Създавате графи на знания, подкрепени от вграждания**: Превръщате неструктуриран текст в структуриран, запитваем знание\n", + "- **Прилагате памет за сесии**: Създавате разговори с множество завои с автоматично запазване на контекста\n", + "- **Запазвате разговори**: По желание съхранявате важни взаимодействия в дългосрочна памет за бъдещи справки\n", + "- **Запитвате чрез естествен език**: Достъпвате и използвате исторически контекст в нови разговори\n", + "- **Визуализирате паметта**: Изследвате връзките в графа на знанията на вашия агент\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Какво ще създадете\n", + "\n", + "В този урок ще създадем **Асистент за програмиране** с постоянна памет, който:\n", + "\n", + "### 1. **Създаване на база знания**\n", + " - Въвежда информация за профила и експертизата на разработчика\n", + " - Обработва принципи и добри практики за програмиране на Python\n", + " - Съхранява исторически разговори между разработчици и AI асистенти\n", + "\n", + "### 2. **Разговори с осъзнаване на сесията**\n", + " - Поддържа контекст през множество въпроси в една и съща сесия\n", + " - Автоматично кешира всяка двойка въпрос/отговор за ефективно извличане\n", + " - Осигурява последователни и контекстуални отговори въз основа на историята на разговора\n", + "\n", + "### 3. **Дългосрочна памет**\n", + " - Запазва важни разговори в дългосрочна памет\n", + " - Извлича релевантни спомени от базата знания и минали сесии, за да информира нови взаимодействия\n", + " - Изгражда растяща база знания, която се подобрява с времето\n", + "\n", + "### 4. **Интелигентно извличане на памет**\n", + " - Използва семантично търсене, базирано на графи, за намиране на релевантна информация в цялата съхранена база знания\n", + " - Филтрира търсенията по подгрупи данни (информация за разработчици срещу принципи)\n", + " - Комбинира множество източници на данни, за да предостави изчерпателни отговори\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Предварителни изисквания и настройка\n", + "\n", + "### Системни изисквания\n", + "\n", + "Преди да започнете, уверете се, че разполагате с:\n", + "\n", + "1. **Python среда**\n", + " - Python 3.9 или по-нова версия\n", + " - Виртуална среда (препоръчително)\n", + " \n", + "2. **Redis кеш** (Необходим за управление на сесиите)\n", + " - Локален Redis: `docker run -d -p 6379:6379 redis`\n", + " - Или използвайте управлявана услуга за Redis\n", + " \n", + "3. **Достъп до LLM API**\n", + " - OpenAI API ключ или други доставчици (вижте [документацията](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Конфигурация на база данни**\n", + " - По подразбиране не се изисква конфигурация. Cognee използва бази данни, базирани на файлове (LanceDB и Kuzu)\n", + " - По желание можете да настроите Azure AI Search като векторно хранилище (вижте [документацията](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Конфигурация на средата\n", + "\n", + "Създайте файл `.env` в директорията на вашия проект със следните променливи:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Разбиране на архитектурата на паметта на Cognee\n", + "\n", + "### Как работи Cognee\n", + "\n", + "Cognee предоставя усъвършенствана система за памет, която надхвърля простото съхранение на ключ-стойност:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Основни компоненти:\n", + "\n", + "1. **Граф на знанията**: Съхранява обекти, връзки и семантични връзки\n", + "2. **Векторни вграждания**: Позволява семантично търсене във всички съхранени данни\n", + "3. **Кеш на сесията**: Поддържа контекста на разговора в рамките на и между сесиите\n", + "4. **NodeSets**: Организират данните в логически категории за целенасочено извличане\n", + "\n", + "### Видове памет в този урок:\n", + "\n", + "- **Постоянна памет**: Дългосрочно съхранение в графа на знанията\n", + "- **Памет на сесията**: Временен контекст на разговора в Redis кеш\n", + "- **Семантична памет**: Търсене на сходство на база вектори във всички данни\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Инсталиране на необходимите пакети\n", + "\n", + "Инсталирайте Cognee с поддръжка на Redis за управление на сесиите:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Инициализиране на среда и зареждане на библиотеки\n", + "\n", + "Уверете се, че:\n", + "1. Redis работи (например чрез Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Променливите на средата са зададени преди импортиране на модулите за кеширане\n", + "3. Ако е необходимо, рестартирайте ядрото и изпълнете клетките по ред\n", + "\n", + "Следващата клетка ще:\n", + "1. Зареди променливите на средата от `.env`\n", + "2. Конфигурира Cognee с вашите настройки за LLM\n", + "3. Активира кеширане за управление на сесии\n", + "4. Провери дали всички компоненти са правилно свързани\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Конфигуриране на директории за съхранение\n", + "\n", + "Cognee използва две отделни директории за своите операции:\n", + "- **Корен на данните**: Съхранява въведените документи и обработените данни\n", + "- **Системен корен**: Съдържа базата данни на графа на знанието и системните метаданни\n", + "\n", + "Ще създадем изолирани директории за този урок, както следва:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Нулиране на състоянието на паметта\n", + "\n", + "Преди да започнем да изграждаме нашата система за памет, нека се уверим, че започваме на чисто.\n", + "\n", + "> 💡 **Съвет**: Можете да пропуснете тази стъпка, ако искате да запазите съществуващите спомени от предишните си изпълнения, когато използвате този тефтер по-късно.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Част 1: Създаване на база знания\n", + "\n", + "### Източници на данни за нашия асистент за разработчици\n", + "\n", + "Ще използваме три типа данни, за да създадем изчерпателна база знания:\n", + "\n", + "1. **Профил на разработчика**: Лична експертиза и технически опит\n", + "2. **Най-добри практики в Python**: Принципите на Python с практически насоки\n", + "3. **Исторически разговори**: Минали сесии въпроси и отговори между разработчици и AI асистенти\n", + "\n", + "Тези разнообразни данни позволяват на нашия агент да:\n", + "- Разбира техническия контекст на потребителя\n", + "- Прилага най-добрите практики в препоръките\n", + "- Учи от предишни успешни взаимодействия\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Преобразуване на данни в граф на знания\n", + "\n", + "Сега ще преобразуваме нашия необработен текст в структурирана памет. Този процес:\n", + "\n", + "1. **Добавя данни към NodeSets**: Организира информацията в логически категории\n", + " - `developer_data`: Профил на разработчика и разговори\n", + " - `principles_data`: Най-добри практики и насоки за Python\n", + "\n", + "2. **Изпълнява Cognify Pipeline**: Извлича обекти, взаимоотношения и създава вграждания\n", + " - Идентифицира ключови концепции\n", + " - Създава семантични връзки между свързана информация\n", + " - Генерира векторни вграждания\n", + "\n", + "Това може да отнеме няколко момента, докато LLM обработва текста и изгражда структурата на графа:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Визуализирайте графа на знанията\n", + "\n", + "Нека разгледаме структурата на нашия граф на знанията. Визуализацията показва:\n", + "- **Възли**: Елементи, извлечени от текста (концепции, технологии, хора)\n", + "- **Ръбове**: Връзки и свързаности между елементите\n", + "- **Клъстери**: Свързани концепции, групирани по семантична прилика\n", + "\n", + "Отворете генерирания HTML файл в браузъра си, за да изследвате графа интерактивно:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Обогатете паметта с Memify\n", + "\n", + "Функцията `memify()` анализира графа на знанията и генерира интелигентни правила за данните. Този процес:\n", + "- Идентифицира модели и добри практики\n", + "- Създава приложими насоки въз основа на съдържанието\n", + "- Установява връзки между различни области на знания\n", + "\n", + "Тези правила помагат на агента да взема по-информирани решения при отговаряне на въпроси. Заснемането на вторична визуализация ви позволява да сравните как графът се уплътнява след обогатяването.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Част 2: Интелигентно извличане на памет\n", + "\n", + "### Демонстрация 1: Интеграция на знания от различни документи\n", + "\n", + "Сега, когато нашият граф на знания е изграден, нека тестваме как Cognee комбинира информация от множество източници, за да отговаря на сложни въпроси.\n", + "\n", + "Първото запитване демонстрира:\n", + "- **Семантично разбиране**: Намиране на релевантни концепции, дори когато не са изрично споменати\n", + "- **Кръстосано препращане**: Комбиниране на профил на разработчик с принципи на Python\n", + "- **Контекстуално разсъждение**: Прилагане на добри практики към конкретни реализации\n", + "\n", + "### Демонстрация 2: Филтрирано търсене с NodeSets\n", + "\n", + "Второто запитване показва как да се насочите към специфични подмножества на графа на знания:\n", + "- Използва параметъра `node_name`, за да търси само в `principles_data`\n", + "- Осигурява фокусирани отговори от конкретна област на знания\n", + "- Полезно, когато ви е необходима информация, специфична за дадена област\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Част 3: Настройка на управление на сесията\n", + "\n", + "### Активиране на памет за разговори\n", + "\n", + "Управлението на сесията е от съществено значение за поддържане на контекста през множество взаимодействия. Тук ще:\n", + "\n", + "1. **Инициализираме потребителски контекст**: Създадем или извлечем потребителски профил за проследяване на сесията\n", + "2. **Конфигурираме кеширащ механизъм**: Свържем се с Redis за съхранение на историята на разговорите\n", + "3. **Активираме сесийни променливи**: Настроим контекстуални променливи, които се запазват между заявките\n", + "\n", + "> ⚠️ **Важно**: Това изисква Redis да бъде стартиран и `CACHING=true` в средата ви\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Помощна функция: Преглед на историята на сесията\n", + "\n", + "Тази помощна функция ни позволява да разгледаме историята на разговорите, съхранена в Redis. Полезна е за:\n", + "- Отстраняване на проблеми с управлението на сесии\n", + "- Проверка дали разговорите се кешират\n", + "- Разбиране какъв контекст е достъпен за агента\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Сесия 1: Лаборатория за асинхронна поддръжка — Първи въпрос\n", + "\n", + "Започнете сесията `async-support-lab`, като попитате за подходящи за телеметрия asyncio модели за масивен уеб скрейпър. Графът вече има информация за asyncio, aiohttp и практики за мониторинг, така че отговорът трябва да отразява предишни разговори, като същевременно се адаптира към новия въпрос.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Проверка на паметта на сесия 1 след първия обмен\n", + "\n", + "Изпълнението на `show_history(session_1)` веднага след първоначалния въпрос потвърждава, че Cognee е записал както въпроса, така и отговора в Redis. Трябва да видите един запис с насоки за едновременност.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Сесия 1: Последващи действия относно моделите данни\n", + "\n", + "След това питаме: \"Кога трябва да избера dataclasses вместо Pydantic?\" използвайки същия идентификатор на сесията. Cognee трябва да обедини принципите на Python с предишните разговори за FastAPI, за да предостави детайлен съвет—демонстрирайки, че контекстът се пренася в рамките на именувана сесия.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Потвърдете, че историята на Сесия 1 съдържа и двата хода\n", + "\n", + "Още едно извикване на `show_history(session_1)` трябва да покаже две записи за въпроси и отговори. Това съответства на стъпката \"възпроизвеждане на паметта\" от лабораторията Mem0 и доказва, че допълнителните ходове разширяват същия транскрипт.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Сесия 2: Дискусия за преглед на дизайна — Нова сесия\n", + "\n", + "За да покажем изолация между дискусиите, стартираме `design-review-session` и молим за насоки за записване на прегледи на инциденти. Въпреки че основната база знания е същата, новият идентификатор на сесията поддържа стенограмите отделни.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Преглед на Сесия 2 История\n", + "\n", + "`show_history(session_2)` трябва да показва само двойката подкана/отговор за преглед на дизайна. Сравнете го със Сесия 1, за да подчертаете как Cognee поддържа независими преписи, докато използва споделената графика на знания.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Обобщение\n", + "\n", + "Поздравления! Току-що добавихте на вашия асистент за кодиране истински слой за дългосрочна памет, задвижван от Cognee.\n", + "\n", + "В този урок взехте сурово съдържание за разработчици (код, документация, чатове) и го превърнахте в граф + векторна памет, която вашият агент може да търси, анализира и непрекъснато подобрява.\n", + "\n", + "Какво научихте:\n", + "\n", + "1. **От суров текст до AI памет**: Как Cognee обработва неструктурирани данни и ги превръща в интелигентна, търсима памет, използвайки комбинирана архитектура от вектор + граф на знания.\n", + "\n", + "2. **Обогатяване на графа с memify**: Как да надхвърлите основното създаване на граф и да използвате memify, за да добавите извлечени факти и по-богати връзки върху съществуващия си граф.\n", + "\n", + "3. **Множество стратегии за търсене**: Как да извършвате заявки към паметта с различни видове търсене (въпроси и отговори, осъзнати за графа, завършване в стил RAG, прозрения, сурови фрагменти, търсене на код и др.) в зависимост от нуждите на вашия агент.\n", + "\n", + "4. **Визуално изследване**: Как да инспектирате и отстранявате грешки в това, което Cognee е създала, използвайки визуализации на графа и интерфейса на Cognee, за да видите как е структурирано знанието.\n", + "\n", + "5. **Памет, осъзната за сесията**: Как да комбинирате контекста на всяка сесия с постоянна семантична памет, така че агентите да могат да запомнят между различни изпълнения, без да изтича информация между потребителите.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Основни изводи\n", + "1. Памет като граф на знания, подкрепен от вграждания\n", + "\n", + " - **Структурирано разбиране**: Cognee комбинира хранилище за вектори и графово хранилище, така че вашите данни да са както търсими по смисъл, така и свързани чрез взаимоотношения. По подразбиране Cognee използва бази данни, базирани на файлове (LanceDB за вектори, Kuzu за графова база данни).\n", + "\n", + " - **Търсене, осъзнато за взаимоотношения**: Отговорите могат да бъдат основани не само на „подобен текст“, но и на това как се свързват обектите.\n", + "\n", + " - **Жива памет**: Слоят памет се развива, расте и остава достъпен за заявки като един свързан граф. \n", + "\n", + "2. Режими на търсене и разсъждение\n", + " - **Хибридно извличане**: Търсенето комбинира векторна прилика, графова структура и разсъждения на LLM, от директно извличане на части до въпроси, осъзнати за графа.\n", + "\n", + " - **Приспособяване на режима към задачата**: Използвайте режими в стил завършване, когато искате отговори на естествен език, и режими за части/резюме/граф, когато вашият агент се нуждае от суров контекст или за да управлява собствените си разсъждения.\n", + "\n", + "3. Персонализирани, осъзнати за сесия агенти\n", + " - **Контекст на сесията + дългосрочна памет**: Cognee държи краткосрочния контекст на „нишката“ отделно от дългосрочната памет на потребителя или организацията. \n", + "\n", + "## Приложения в реалния свят\n", + "\n", + "1. **Вертикални AI агенти**\n", + "\n", + " Използвайте модела от този бележник, за да захраните интелигентни за домейна копилоти, които се базират на Cognee като основа за извличане и разсъждение:\n", + "\n", + "- **Копилоти за разработчици**: Асистенти за преглед на код, анализ на инциденти и архитектура, които преминават през код, API, проектна документация и билети като единен граф на паметта.\n", + "\n", + "- **Копилоти за клиенти**: Асистенти за поддръжка или успех, които извличат информация от продуктова документация, често задавани въпроси, бележки от CRM и минали билети с осъзнато за графа извличане и цитирани отговори.\n", + "\n", + "- **Вътрешни експертни копилоти**: Асистенти за политика, правни или сигурност, които разсъждават върху взаимосвързани правила, насоки и исторически решения, вместо върху изолирани PDF файлове.\n", + "\n", + " Cognee е изрично позициониран като постоянна, точна памет за AI агенти, предоставяйки жив граф на знания, който се интегрира зад вашия агент и заменя случайни комбинации от хранилища за вектори и персонализиран графов код. \n", + "\n", + "2. **Обединяване на изолирани данни в една памет**\n", + "\n", + " Същият подход също така ви помага да изградите единен слой памет от разпръснати източници:\n", + "\n", + "- **От изолирани данни към един граф**: Въвеждайте структурирани (напр. бази данни) и неструктурирани данни (напр. документи, чатове) в един граф, подкрепен от вграждания, вместо отделни индекси за всяка система. \n", + "\n", + "- **Разсъждение между източници с цитати**: Изпълнявайте многоетапно разсъждение върху всичко – „свързвайте“ логове, метрики и документи чрез графа – и все пак връщайте обосновани отговори с произход. \n", + "\n", + "- **Центрове за знания**: За домейни като банкиране или образование, Cognee вече се използва за обединяване на PDF файлове, вътрешни системи и данни от приложения в един граф на знания с вектори, така че агентите да могат да отговарят на въпроси с прецизен, цитиран контекст. \n", + "\n", + "## Следващи стъпки\n", + "\n", + "Вие сте внедрили основния цикъл на паметта. Ето естествени разширения, които можете да опитате сами (вижте [документацията на Cognee](https://docs.cognee.ai/) за подробности):\n", + "\n", + "1. **Експериментирайте с времева осъзнатост**: Включете времевата функция на Cognee, за да извличате събития и времеви отпечатъци от текст.\n", + "\n", + "2. **Въведете разсъждение, базирано на онтология**: Дефинирайте OWL онтология за вашия домейн. Използвайте поддръжката на онтология на Cognee, за да се основават извлечените обекти и взаимоотношения на тази схема, подобрявайки качеството на графа и отговорите, специфични за домейна. \n", + "\n", + "3. **Добавете обратна връзка**: Позволете на Cognee да коригира теглата на ръбовете на графа въз основа на реална обратна връзка от потребителите, така че извличането да се подобрява с времето, вместо да остава статично. \n", + "\n", + "4. **Оптимизирайте за персонализация и поведение на сесията**: Използвайте потребителски идентификатори, наематели и набори от данни, за да предоставите на всеки човек или екип собствен изглед върху споделения двигател на паметта. \n", + "\n", + "5. **Разширете към по-сложни агенти**: Интегрирайте Cognee в рамки за агенти, за да изградите системи с множество агенти, които всички споделят един и същ слой памет. *Microsoft Agent Framework x Cognee plugin скоро ще бъде наличен.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Отказ от отговорност**: \nТози документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или погрешни интерпретации, произтичащи от използването на този превод.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:31:55+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "bg" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/bg/13-agent-memory/README.md b/translations/bg/13-agent-memory/README.md index 0bec76293..a4433d1d7 100644 --- a/translations/bg/13-agent-memory/README.md +++ b/translations/bg/13-agent-memory/README.md @@ -1,38 +1,46 @@ -# Памет за AI агенти +# Памет за AI агенти [![Памет на агенти](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.bg.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Когато обсъждаме уникалните предимства на създаването на AI агенти, основно се разглеждат две неща: способността да използват инструменти за изпълнение на задачи и способността да се подобряват с времето. Паметта е в основата на създаването на самоусъвършенстващи се агенти, които могат да предоставят по-добри преживявания за нашите потребители. +Когато обсъждаме уникалните предимства на създаването на AI агенти, основно се говори за две неща: способността да използват инструменти за изпълнение на задачи и способността да се подобряват с времето. Паметта е в основата на създаването на самоусъвършенстващи се агенти, които могат да предоставят по-добри преживявания за нашите потребители. -В този урок ще разгледаме какво представлява паметта за AI агенти, как можем да я управляваме и използваме за полза на нашите приложения. +В този урок ще разгледаме какво представлява паметта за AI агенти и как можем да я управляваме и използваме за полза на нашите приложения. ## Въведение Този урок ще обхване: -• **Разбиране на паметта на AI агенти**: Какво представлява паметта и защо е важна за агентите. +• **Разбиране на паметта на AI агенти**: Какво представлява паметта и защо е от съществено значение за агентите. -• **Имплементиране и съхранение на памет**: Практически методи за добавяне на памет към вашите AI агенти, с акцент върху краткосрочна и дългосрочна памет. +• **Имплементиране и съхраняване на памет**: Практически методи за добавяне на памет към вашите AI агенти, с фокус върху краткосрочна и дългосрочна памет. • **Създаване на самоусъвършенстващи се AI агенти**: Как паметта позволява на агентите да се учат от минали взаимодействия и да се подобряват с времето. +## Налични имплементации + +Този урок включва два подробни тетрадкови урока: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Имплементира памет с Mem0 и Azure AI Search с рамката Semantic Kernel. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Имплементира структурирана памет с Cognee, автоматично изграждаща граф на знания, подкрепен от ембединг, визуализираща графа и интелигентно извличане. + ## Цели на обучението След завършване на този урок ще знаете как да: -• **Разграничавате различните видове памет на AI агенти**, включително работна, краткосрочна и дългосрочна памет, както и специализирани форми като памет за персона и епизодична памет. +• **Разграничавате различните видове памет на AI агенти**, включително работна, краткосрочна и дългосрочна памет, както и специализирани форми като персонална и епизодична памет. -• **Имплементирате и управлявате краткосрочна и дългосрочна памет за AI агенти** с помощта на рамката Semantic Kernel, използвайки инструменти като Mem0 и Whiteboard memory, и интегрирайки Azure AI Search. +• **Имплементирате и управлявате краткосрочна и дългосрочна памет за AI агенти** с помощта на рамката Semantic Kernel, използвайки инструменти като Mem0, Cognee, Whiteboard memory и интеграция с Azure AI Search. -• **Разбирате принципите зад самоусъвършенстващите се AI агенти** и как системите за управление на паметта допринасят за непрекъснато обучение и адаптация. +• **Разбирате принципите зад самоусъвършенстващите се AI агенти** и как стабилните системи за управление на паметта допринасят за непрекъснато учене и адаптация. ## Разбиране на паметта на AI агенти @@ -42,15 +50,15 @@ CO_OP_TRANSLATOR_METADATA: ### Защо паметта е важна? -Интелигентността на агента е дълбоко свързана със способността му да запомня и използва минала информация. Паметта позволява на агентите да бъдат: +Интелигентността на агента е дълбоко свързана със способността му да извиква и използва минала информация. Паметта позволява на агентите да бъдат: • **Рефлективни**: Да се учат от минали действия и резултати. • **Интерактивни**: Да поддържат контекст в рамките на текущ разговор. -• **Проактивни и реактивни**: Да предвиждат нужди или да реагират подходящо въз основа на исторически данни. +• **Проактивни и реактивни**: Да предвиждат нужди или да реагират адекватно въз основа на исторически данни. -• **Автономни**: Да действат по-независимо, използвайки запазени знания. +• **Автономни**: Да работят по-независимо, използвайки съхранени знания. Целта на имплементирането на памет е да направи агентите по-**надеждни и способни**. @@ -58,17 +66,17 @@ CO_OP_TRANSLATOR_METADATA: #### Работна памет -Мислете за това като за лист хартия, който агентът използва по време на една задача или мисловен процес. Тя съдържа непосредствена информация, необходима за следващата стъпка. +Мислете за това като за лист хартия, който агентът използва по време на една задача или мисловен процес. Тя съдържа непосредствената информация, необходима за изчисляване на следващата стъпка. За AI агенти работната памет често улавя най-важната информация от разговор, дори ако пълната история на чата е дълга или съкратена. Тя се фокусира върху извличането на ключови елементи като изисквания, предложения, решения и действия. **Пример за работна памет** -В агент за резервации на пътувания работната памет може да запази текущото искане на потребителя, например "Искам да резервирам пътуване до Париж". Това конкретно изискване се държи в непосредствения контекст на агента, за да насочи текущото взаимодействие. +В агент за резервации на пътувания работната памет може да улови текущото искане на потребителя, като например "Искам да резервирам пътуване до Париж". Това конкретно изискване се задържа в непосредствения контекст на агента, за да насочи текущото взаимодействие. #### Краткосрочна памет -Този тип памет запазва информация за продължителността на един разговор или сесия. Това е контекстът на текущия чат, който позволява на агента да се позовава на предишни реплики в диалога. +Този тип памет задържа информация за продължителността на един разговор или сесия. Това е контекстът на текущия чат, който позволява на агента да се позовава на предишни обръщения в диалога. **Пример за краткосрочна памет** @@ -76,31 +84,31 @@ CO_OP_TRANSLATOR_METADATA: #### Дългосрочна памет -Това е информация, която се запазва през множество разговори или сесии. Тя позволява на агентите да запомнят предпочитанията на потребителя, исторически взаимодействия или общи знания за продължителни периоди. Това е важно за персонализацията. +Това е информация, която се запазва през множество разговори или сесии. Тя позволява на агентите да запомнят предпочитания на потребителя, исторически взаимодействия или общи знания за дълги периоди. Това е важно за персонализацията. **Пример за дългосрочна памет** -Дългосрочната памет може да запази, че "Бен обича ски и дейности на открито, харесва кафе с изглед към планината и иска да избягва сложни ски писти поради предишна травма". Тази информация, научена от предишни взаимодействия, влияе върху препоръките в бъдещи сесии за планиране на пътувания, правейки ги силно персонализирани. +Дългосрочната памет може да съхранява, че "Бен обича ски и дейности на открито, харесва кафе с изглед към планината и иска да избягва напреднали ски писти поради предишна травма". Тази информация, научена от предишни взаимодействия, влияе върху препоръките в бъдещи сесии за планиране на пътувания, правейки ги силно персонализирани. -#### Памет за персона +#### Персонална памет -Този специализиран тип памет помага на агента да развие последователна "личност" или "персона". Тя позволява на агента да запомни детайли за себе си или за своята роля, правейки взаимодействията по-плавни и фокусирани. +Този специализиран тип памет помага на агента да развие последователна "личност" или "персона". Тя позволява на агента да запомня детайли за себе си или за своята роля, правейки взаимодействията по-плавни и фокусирани. -**Пример за памет за персона** +**Пример за персонална памет** -Ако агентът за пътувания е проектиран да бъде "експерт по планиране на ски", паметта за персона може да подсили тази роля, влияейки върху отговорите му, за да съответстват на тона и знанията на експерт. +Ако агентът за пътувания е проектиран да бъде "експерт по планиране на ски", персоналната памет може да подсили тази роля, влияейки върху отговорите му, за да съответстват на тона и знанията на експерт. -#### Работен поток/епизодична памет +#### Работен/епизодичен спомен -Тази памет съхранява последователността от стъпки, които агентът предприема по време на сложна задача, включително успехи и неуспехи. Това е като запомняне на конкретни "епизоди" или минали преживявания, за да се учи от тях. +Тази памет съхранява последователността от стъпки, които агентът предприема по време на сложна задача, включително успехи и неуспехи. Това е като да помниш конкретни "епизоди" или минали преживявания, за да се учиш от тях. **Пример за епизодична памет** -Ако агентът се е опитал да резервира конкретен полет, но това е било неуспешно поради липса на наличност, епизодичната памет може да запише този неуспех, позволявайки на агента да опита алтернативни полети или да информира потребителя за проблема по-информирано при следващ опит. +Ако агентът се е опитал да резервира конкретен полет, но това е било неуспешно поради липса на наличност, епизодичната памет може да запише този неуспех, позволявайки на агента да опита алтернативни полети или да информира потребителя за проблема по по-информиран начин при следващ опит. #### Памет за обекти -Това включва извличане и запомняне на конкретни обекти (като хора, места или неща) и събития от разговори. Тя позволява на агента да изгради структурирано разбиране за ключовите елементи, които са обсъждани. +Това включва извличане и запомняне на конкретни обекти (като хора, места или неща) и събития от разговори. Това позволява на агента да изгради структурирано разбиране за ключовите елементи, които са обсъждани. **Пример за памет за обекти** @@ -108,53 +116,65 @@ CO_OP_TRANSLATOR_METADATA: #### Структуриран RAG (Извличане с допълнено генериране) -Докато RAG е по-широка техника, "Структуриран RAG" се подчертава като мощна технология за памет. Тя извлича плътна, структурирана информация от различни източници (разговори, имейли, изображения) и я използва за подобряване на прецизността, извличането и скоростта на отговорите. За разлика от класическия RAG, който разчита само на семантична прилика, Структуриран RAG работи със структурата на информацията. +Докато RAG е по-широка техника, "Структуриран RAG" се подчертава като мощна технология за памет. Той извлича плътна, структурирана информация от различни източници (разговори, имейли, изображения) и я използва за подобряване на прецизността, извличането и скоростта на отговорите. За разлика от класическия RAG, който разчита само на семантична прилика, Структурираният RAG работи със структурата на информацията. -**Пример за Структуриран RAG** +**Пример за структуриран RAG** -Вместо просто да съвпада ключови думи, Структуриран RAG може да анализира детайли за полет (дестинация, дата, час, авиокомпания) от имейл и да ги съхрани в структурирана форма. Това позволява точни запитвания като "Какъв полет резервирах за Париж във вторник?" +Вместо просто да съвпада с ключови думи, Структурираният RAG може да анализира детайли за полет (дестинация, дата, час, авиокомпания) от имейл и да ги съхрани по структуриран начин. Това позволява точни запитвания като "Кой полет резервирах за Париж във вторник?" -## Имплементиране и съхранение на памет +## Имплементиране и съхраняване на памет -Имплементирането на памет за AI агенти включва систематичен процес на **управление на паметта**, който включва генериране, съхранение, извличане, интегриране, актуализиране и дори "забравяне" (или изтриване) на информация. Извличането е особено важен аспект. +Имплементирането на памет за AI агенти включва систематичен процес на **управление на паметта**, който включва генериране, съхраняване, извличане, интегриране, актуализиране и дори "забравяне" (или изтриване) на информация. Извличането е особено важен аспект. ### Специализирани инструменти за памет -Един от начините за съхранение и управление на паметта на агента е използването на специализирани инструменти като Mem0. Mem0 работи като слой за постоянна памет, позволявайки на агентите да си припомнят релевантни взаимодействия, да съхраняват потребителски предпочитания и фактически контекст, и да се учат от успехи и неуспехи с времето. Идеята тук е, че агенти без състояние се превръщат в агенти със състояние. +#### Mem0 + +Един от начините за съхраняване и управление на паметта на агента е чрез специализирани инструменти като Mem0. Mem0 работи като слой за постоянна памет, позволявайки на агентите да си припомнят релевантни взаимодействия, да съхраняват предпочитания на потребителя и фактически контекст и да се учат от успехи и неуспехи с времето. Идеята тук е, че агенти без състояние се превръщат в агенти със състояние. + +Той работи чрез **двуфазен процес на памет: извличане и актуализация**. Първо, съобщенията, добавени към нишката на агента, се изпращат към услугата Mem0, която използва голям езиков модел (LLM), за да обобщи историята на разговора и да извлече нови спомени. След това, фаза на актуализация, управлявана от LLM, определя дали да добави, модифицира или изтрие тези спомени, съхранявайки ги в хибридно хранилище за данни, което може да включва векторни, графови и ключ-стойност бази данни. Тази система също така поддържа различни видове памет и може да включва графова памет за управление на взаимоотношенията между обектите. + +#### Cognee + +Друг мощен подход е използването на **Cognee**, отворен код за семантична памет за AI агенти, който трансформира структурирани и неструктурирани данни в запитваеми графове на знания, подкрепени от ембединг. Cognee предоставя **двойна архитектура за съхранение**, комбинираща векторно търсене по прилика с графови взаимоотношения, позволявайки на агентите да разбират не само каква информация е подобна, но и как концепциите са свързани помежду си. + +Той превъзхожда в **хибридно извличане**, което съчетава векторна прилика, графова структура и разсъждения на LLM - от сурово извличане на части до въпроси, осъзнаващи графа. Системата поддържа **жива памет**, която се развива и расте, като същевременно остава запитваема като един свързан граф, поддържащ както краткосрочен контекст на сесията, така и дългосрочна постоянна памет. -Той работи чрез **двуфазен процес на памет: извличане и актуализация**. Първо, съобщенията, добавени към нишката на агента, се изпращат към услугата Mem0, която използва голям езиков модел (LLM), за да обобщи историята на разговора и да извлече нови спомени. След това, фазата на актуализация, управлявана от LLM, определя дали да добави, модифицира или изтрие тези спомени, съхранявайки ги в хибридно хранилище, което може да включва векторни, графови и ключ-стойност бази данни. Тази система също така поддържа различни видове памет и може да включва графова памет за управление на връзките между обектите. +Тетрадковият урок за Cognee ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) демонстрира изграждането на този унифициран слой памет, с практически примери за въвеждане на разнообразни източници на данни, визуализиране на графа на знания и запитвания с различни стратегии за търсене, съобразени с конкретните нужди на агента. -### Съхранение на памет с RAG +### Съхраняване на памет с RAG -Освен специализирани инструменти за памет като Mem0, можете да използвате надеждни услуги за търсене като **Azure AI Search като бекенд за съхранение и извличане на спомени**, особено за структуриран RAG. +Освен специализирани инструменти за памет като Mem0, можете да използвате надеждни услуги за търсене като **Azure AI Search като бекенд за съхраняване и извличане на спомени**, особено за структуриран RAG. -Това ви позволява да основавате отговорите на агента на вашите собствени данни, осигурявайки по-релевантни и точни отговори. Azure AI Search може да се използва за съхранение на потребителски спомени за пътувания, продуктови каталози или всякакви други специфични за домейна знания. +Това ви позволява да основавате отговорите на агента на вашите собствени данни, осигурявайки по-релевантни и точни отговори. Azure AI Search може да се използва за съхраняване на потребителски спомени за пътувания, продуктови каталози или всякакви други специфични за домейна знания. -Azure AI Search поддържа възможности като **Структуриран RAG**, който се отличава в извличането и извличането на плътна, структурирана информация от големи набори от данни като истории на разговори, имейли или дори изображения. Това предоставя "свръхчовешка прецизност и извличане" в сравнение с традиционните подходи за текстово сегментиране и вграждане. +Azure AI Search поддържа възможности като **Структуриран RAG**, който превъзхожда в извличането и съхраняването на плътна, структурирана информация от големи набори от данни като истории на разговори, имейли или дори изображения. Това осигурява "свръхчовешка прецизност и извличане" в сравнение с традиционните подходи за текстово разделяне и ембединг. ## Създаване на самоусъвършенстващи се AI агенти -Често срещан модел за самоусъвършенстващи се агенти включва въвеждането на **"агент за знания"**. Този отделен агент наблюдава основния разговор между потребителя и основния агент. Неговата роля е: +Често срещан модел за самоусъвършенстващи се агенти включва въвеждането на **"знание агент"**. Този отделен агент наблюдава основния разговор между потребителя и основния агент. Неговата роля е да: -1. **Идентифициране на ценна информация**: Определяне дали някоя част от разговора си струва да бъде запазена като общо знание или специфично потребителско предпочитание. +1. **Идентифицира ценна информация**: Да определи дали някоя част от разговора си струва да бъде запазена като общо знание или конкретно потребителско предпочитание. -2. **Извличане и обобщение**: Дестилиране на същественото знание или предпочитание от разговора. +2. **Извлича и обобщава**: Да извлече същественото знание или предпочитание от разговора. -3. **Съхранение в база данни за знания**: Запазване на извлечената информация, често в векторна база данни, за да може да бъде извлечена по-късно. +3. **Съхранява в база знания**: Да запази извлечената информация, често в база данни с вектори, за да може да бъде извлечена по-късно. -4. **Допълване на бъдещи запитвания**: Когато потребителят започне ново запитване, агентът за знания извлича релевантна запазена информация и я добавя към запитването на потребителя, предоставяйки важен контекст на основния агент (подобно на RAG). +4. **Допълва бъдещи запитвания**: Когато потребителят започне ново запитване, знание агентът извлича релевантна съхранена информация и я добавя към запитването на потребителя, предоставяйки важен контекст на основния агент (подобно на RAG). ### Оптимизации за памет -• **Управление на латентността**: За да се избегне забавяне на взаимодействията с потребителя, може да се използва по-евтин, по-бърз модел първоначално, за да се провери бързо дали информацията е ценна за съхранение или извличане, като се използва по-сложен процес само когато е необходимо. +• **Управление на латентността**: За да се избегне забавяне на взаимодействията с потребителя, може да се използва по-евтин, по-бърз модел първоначално, за да се провери бързо дали информацията е ценна за съхранение или извличане, като по-сложният процес на извличане/съхранение се активира само при необходимост. -• **Поддръжка на база данни за знания**: За растяща база данни за знания, по-рядко използваната информация може да бъде преместена в "студено хранилище", за да се управляват разходите. +• **Поддръжка на база знания**: За растяща база знания, по-рядко използваната информация може да бъде преместена в "студено съхранение", за да се управляват разходите. -## Имате още въпроси за паметта на агенти? +## Имате още въпроси относно паметта на агенти? -Присъединете се към [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord), за да се срещнете с други обучаващи се, да присъствате на офис часове и да получите отговори на вашите въпроси за AI агенти. +Присъединете се към [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord), за да се срещнете с други обучаващи се, да присъствате на часове за въпроси и отговори и да получите отговори на вашите въпроси за AI агенти. --- + **Отказ от отговорност**: -Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматичните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия оригинален език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Не носим отговорност за каквито и да е недоразумения или погрешни интерпретации, произтичащи от използването на този превод. \ No newline at end of file +Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод. + \ No newline at end of file diff --git a/translations/bn/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/bn/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..1b4659120 --- /dev/null +++ b/translations/bn/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# কগনি ব্যবহার করে স্থায়ী মেমোরি সহ AI এজেন্ট তৈরি করা\n", + "\n", + "এই নোটবুকটি দেখায় কীভাবে [**কগনি**](https://www.cognee.ai/) ব্যবহার করে উন্নত মেমোরি ক্ষমতা সহ বুদ্ধিমান AI এজেন্ট তৈরি করা যায় - একটি ওপেন সোর্স AI মেমোরি যা জ্ঞান গ্রাফ, সেমান্টিক সার্চ এবং সেশন ম্যানেজমেন্টকে একত্রিত করে প্রসঙ্গ-সচেতন AI সিস্টেম তৈরি করে।\n", + "\n", + "## 🎯 শেখার লক্ষ্যসমূহ\n", + "\n", + "এই টিউটোরিয়াল শেষে, আপনি বুঝতে পারবেন কীভাবে:\n", + "- **এম্বেডিং দ্বারা সমর্থিত জ্ঞান গ্রাফ তৈরি করবেন**: অগঠিত টেক্সটকে গঠিত, অনুসন্ধানযোগ্য জ্ঞানে রূপান্তর করুন\n", + "- **সেশন মেমোরি প্রয়োগ করবেন**: স্বয়ংক্রিয় প্রসঙ্গ সংরক্ষণ সহ বহু-পর্বের কথোপকথন তৈরি করুন\n", + "- **কথোপকথন সংরক্ষণ করবেন**: ভবিষ্যতের রেফারেন্সের জন্য গুরুত্বপূর্ণ ইন্টারঅ্যাকশনগুলো দীর্ঘমেয়াদী মেমোরিতে সংরক্ষণ করুন\n", + "- **প্রাকৃতিক ভাষা ব্যবহার করে অনুসন্ধান করবেন**: নতুন কথোপকথনে ঐতিহাসিক প্রসঙ্গ অ্যাক্সেস এবং ব্যবহার করুন\n", + "- **মেমোরি ভিজুয়ালাইজ করবেন**: আপনার এজেন্টের জ্ঞান গ্রাফে সম্পর্কগুলো অন্বেষণ করুন\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ আপনি যা তৈরি করবেন\n", + "\n", + "এই টিউটোরিয়ালে, আমরা একটি **কোডিং সহকারী** তৈরি করব যা স্থায়ী মেমোরি সহ:\n", + "\n", + "### 1. **জ্ঞানভিত্তিক নির্মাণ**\n", + " - ডেভেলপার প্রোফাইল এবং দক্ষতার তথ্য গ্রহণ করে\n", + " - পাইথন প্রোগ্রামিং নীতিমালা এবং সেরা অনুশীলন প্রক্রিয়াকরণ করে\n", + " - ডেভেলপার এবং AI সহকারীর মধ্যে পূর্ববর্তী কথোপকথন সংরক্ষণ করে\n", + "\n", + "### 2. **সেশন-সচেতন কথোপকথন**\n", + " - একই সেশনে একাধিক প্রশ্নের মধ্যে প্রসঙ্গ বজায় রাখে\n", + " - প্রতিটি প্রশ্ন/উত্তর জোড়া স্বয়ংক্রিয়ভাবে ক্যাশ করে দক্ষ পুনরুদ্ধারের জন্য\n", + " - কথোপকথনের ইতিহাসের উপর ভিত্তি করে সুসংগত, প্রসঙ্গভিত্তিক উত্তর প্রদান করে\n", + "\n", + "### 3. **দীর্ঘমেয়াদী মেমোরি**\n", + " - গুরুত্বপূর্ণ কথোপকথন দীর্ঘমেয়াদী মেমোরিতে সংরক্ষণ করে\n", + " - নতুন ইন্টারঅ্যাকশনের জন্য জ্ঞানভিত্তিক এবং পূর্ববর্তী সেশন থেকে প্রাসঙ্গিক স্মৃতি পুনরুদ্ধার করে\n", + " - একটি ক্রমবর্ধমান জ্ঞানভিত্তিক তৈরি করে যা সময়ের সাথে উন্নত হয়\n", + "\n", + "### 4. **বুদ্ধিমান মেমোরি পুনরুদ্ধার**\n", + " - সমস্ত সংরক্ষিত জ্ঞানের মধ্যে প্রাসঙ্গিক তথ্য খুঁজে পেতে গ্রাফ-সচেতন সেমান্টিক অনুসন্ধান ব্যবহার করে\n", + " - ডেটা উপগোষ্ঠী (ডেভেলপার তথ্য বনাম নীতিমালা) দ্বারা অনুসন্ধান ফিল্টার করে\n", + " - ব্যাপক উত্তর প্রদান করতে একাধিক ডেটা উৎস একত্রিত করে\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 প্রয়োজনীয়তা ও সেটআপ\n", + "\n", + "### সিস্টেমের প্রয়োজনীয়তা\n", + "\n", + "শুরু করার আগে নিশ্চিত করুন যে আপনার কাছে রয়েছে:\n", + "\n", + "1. **পাইথন পরিবেশ**\n", + " - পাইথন 3.9 বা তার উপরের সংস্করণ\n", + " - ভার্চুয়াল পরিবেশ (প্রস্তাবিত)\n", + "\n", + "2. **রেডিস ক্যাশ** (সেশন ম্যানেজমেন্টের জন্য প্রয়োজনীয়)\n", + " - লোকাল রেডিস: `docker run -d -p 6379:6379 redis`\n", + " - অথবা একটি ম্যানেজড রেডিস সার্ভিস ব্যবহার করুন\n", + "\n", + "3. **LLM API অ্যাক্সেস**\n", + " - OpenAI API কী বা অন্যান্য প্রদানকারী (দেখুন [ডকুমেন্টেশন](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **ডাটাবেস কনফিগারেশন**\n", + " - ডিফল্টভাবে কোনো কনফিগারেশন প্রয়োজন নেই। Cognee ফাইল-ভিত্তিক ডাটাবেস (LanceDB এবং Kuzu) ব্যবহার করে।\n", + " - ঐচ্ছিকভাবে, আপনি Azure AI Search কে একটি ভেক্টর স্টোর হিসেবে সেটআপ করতে পারেন (দেখুন [ডকুমেন্টেশন](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### পরিবেশ কনফিগারেশন\n", + "\n", + "আপনার প্রকল্প ডিরেক্টরিতে একটি `.env` ফাইল তৈরি করুন নিম্নলিখিত ভেরিয়েবলগুলির সাথে:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ কগনির মেমোরি আর্কিটেকচার বোঝা\n", + "\n", + "### কগনি কীভাবে কাজ করে\n", + "\n", + "কগনি একটি উন্নত মেমোরি সিস্টেম প্রদান করে যা সাধারণ কী-ভ্যালু স্টোরেজের চেয়েও বেশি কিছু করে:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### প্রধান উপাদানসমূহ:\n", + "\n", + "1. **নলেজ গ্রাফ**: সত্তা, সম্পর্ক এবং অর্থবহ সংযোগ সংরক্ষণ করে\n", + "2. **ভেক্টর এমবেডিংস**: সংরক্ষিত সমস্ত তথ্যের উপর অর্থবহ অনুসন্ধান সক্ষম করে\n", + "3. **সেশন ক্যাশ**: সেশন চলাকালীন এবং সেশনগুলির মধ্যে কথোপকথনের প্রেক্ষাপট বজায় রাখে\n", + "4. **নোডসেটস**: লক্ষ্যভিত্তিক পুনরুদ্ধারের জন্য ডেটাকে যৌক্তিক বিভাগে সংগঠিত করে\n", + "\n", + "### এই টিউটোরিয়ালে মেমোরির ধরনসমূহ:\n", + "\n", + "- **পার্সিস্টেন্ট মেমোরি**: নলেজ গ্রাফে দীর্ঘমেয়াদী সংরক্ষণ\n", + "- **সেশন মেমোরি**: Redis ক্যাশে অস্থায়ী কথোপকথনের প্রেক্ষাপট\n", + "- **সেমান্টিক মেমোরি**: সমস্ত ডেটার উপর ভিত্তি করে ভেক্টর-ভিত্তিক সাদৃশ্য অনুসন্ধান\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 প্রয়োজনীয় প্যাকেজ ইনস্টল করুন\n", + "\n", + "সেশন ব্যবস্থাপনার জন্য Redis সমর্থন সহ Cognee ইনস্টল করুন:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 পরিবেশ প্রস্তুত করুন এবং লাইব্রেরি লোড করুন\n", + "\n", + "নিশ্চিত করুন:\n", + "1. Redis চালু আছে (যেমন, Docker এর মাধ্যমে: `docker run -d -p 6379:6379 redis`)\n", + "2. ক্যাশ মডিউল আমদানি করার আগে পরিবেশ ভেরিয়েবল সেট করা আছে\n", + "3. প্রয়োজন হলে, কের্নেল পুনরায় চালু করুন এবং সেলগুলো সঠিক ক্রমে চালান\n", + "\n", + "নিচের সেলটি করবে:\n", + "1. `.env` থেকে পরিবেশ ভেরিয়েবল লোড করবে\n", + "2. আপনার LLM সেটিংস সহ Cognee কনফিগার করবে\n", + "3. সেশন ব্যবস্থাপনার জন্য ক্যাশিং সক্রিয় করবে\n", + "4. নিশ্চিত করবে যে সব উপাদান সঠিকভাবে সংযুক্ত আছে\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 স্টোরেজ ডিরেক্টরি কনফিগার করুন\n", + "\n", + "Cognee তার কার্যক্রমের জন্য দুটি পৃথক ডিরেক্টরি ব্যবহার করে:\n", + "- **ডেটা রুট**: এখানে ইনজেস্ট করা ডকুমেন্ট এবং প্রক্রিয়াজাত ডেটা সংরক্ষণ করা হয়\n", + "- **সিস্টেম রুট**: এখানে নলেজ গ্রাফ ডাটাবেস এবং সিস্টেম মেটাডেটা থাকে\n", + "\n", + "এই টিউটোরিয়ালের জন্য আমরা নিম্নলিখিতভাবে পৃথক ডিরেক্টরি তৈরি করব:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 মেমোরি স্টেট রিসেট করুন\n", + "\n", + "আমাদের মেমোরি সিস্টেম তৈরি শুরু করার আগে, চলুন নিশ্চিত করি যে আমরা নতুনভাবে শুরু করছি।\n", + "\n", + "> 💡 **পরামর্শ**: আপনি যদি এই নোটবুকটি পরে ব্যবহার করার সময় পূর্বের রান থেকে বিদ্যমান মেমোরি সংরক্ষণ করতে চান, তাহলে এই ধাপটি এড়িয়ে যেতে পারেন।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 অংশ ১: জ্ঞানভাণ্ডার তৈরি করা\n", + "\n", + "### আমাদের ডেভেলপার সহকারী জন্য ডেটা উৎস\n", + "\n", + "আমরা একটি বিস্তৃত জ্ঞানভাণ্ডার তৈরি করতে তিন ধরনের ডেটা সংগ্রহ করব:\n", + "\n", + "1. **ডেভেলপার প্রোফাইল**: ব্যক্তিগত দক্ষতা এবং প্রযুক্তিগত পটভূমি\n", + "2. **পাইথন সেরা অনুশীলন**: পাইথনের জেন এবং ব্যবহারিক নির্দেশিকা\n", + "3. **ঐতিহাসিক কথোপকথন**: ডেভেলপার এবং এআই সহকারীদের মধ্যে অতীতের প্রশ্নোত্তর সেশন\n", + "\n", + "এই বৈচিত্র্যময় ডেটা আমাদের এজেন্টকে সক্ষম করে:\n", + "- ব্যবহারকারীর প্রযুক্তিগত প্রেক্ষাপট বুঝতে\n", + "- সুপারিশে সেরা অনুশীলন প্রয়োগ করতে\n", + "- পূর্ববর্তী সফল ইন্টারঅ্যাকশন থেকে শিখতে\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 ডেটাকে জ্ঞান গ্রাফে রূপান্তর করুন\n", + "\n", + "এখন আমরা আমাদের কাঁচা টেক্সটকে একটি গঠিত স্মৃতিতে রূপান্তর করব। এই প্রক্রিয়া:\n", + "\n", + "1. **NodeSets-এ ডেটা যোগ করে**: তথ্যকে যৌক্তিক বিভাগে সংগঠিত করে\n", + " - `developer_data`: ডেভেলপার প্রোফাইল এবং কথোপকথন\n", + " - `principles_data`: পাইথনের সেরা অনুশীলন এবং নির্দেশিকা\n", + "\n", + "2. **Cognify Pipeline চালায়**: সত্তা, সম্পর্ক বের করে এবং এমবেডিং তৈরি করে\n", + " - গুরুত্বপূর্ণ ধারণাগুলি চিহ্নিত করে\n", + " - সম্পর্কিত তথ্যের মধ্যে অর্থবোধক সংযোগ তৈরি করে\n", + " - ভেক্টর এমবেডিং তৈরি করে\n", + "\n", + "এটি কিছু সময় নিতে পারে কারণ LLM টেক্সট প্রক্রিয়া করে এবং গ্রাফ কাঠামো তৈরি করে:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 জ্ঞান গ্রাফ ভিজুয়ালাইজ করুন\n", + "\n", + "চলুন আমাদের জ্ঞান গ্রাফের গঠনটি অন্বেষণ করি। ভিজুয়ালাইজেশনে দেখা যাবে:\n", + "- **নোডস**: টেক্সট থেকে প্রাপ্ত সত্তা (ধারণা, প্রযুক্তি, ব্যক্তি)\n", + "- **এজেস**: সত্তাগুলোর মধ্যে সম্পর্ক এবং সংযোগ\n", + "- **ক্লাস্টারস**: অর্থগত সাদৃশ্য অনুযায়ী গোষ্ঠীবদ্ধ সম্পর্কিত ধারণা\n", + "\n", + "গ্রাফটি ইন্টারঅ্যাকটিভভাবে অন্বেষণ করতে আপনার ব্রাউজারে তৈরি HTML ফাইলটি খুলুন:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 মেমোরি সমৃদ্ধ করুন Memify দিয়ে\n", + "\n", + "`memify()` ফাংশন জ্ঞান গ্রাফ বিশ্লেষণ করে এবং ডেটা সম্পর্কে বুদ্ধিমান নিয়ম তৈরি করে। এই প্রক্রিয়া:\n", + "- প্যাটার্ন এবং সেরা পদ্ধতিগুলি সনাক্ত করে\n", + "- কন্টেন্টের উপর ভিত্তি করে কার্যকর নির্দেশিকা তৈরি করে\n", + "- বিভিন্ন জ্ঞান ক্ষেত্রের মধ্যে সম্পর্ক স্থাপন করে\n", + "\n", + "এই নিয়মগুলি এজেন্টকে প্রশ্নের উত্তর দেওয়ার সময় আরও তথ্যপূর্ণ সিদ্ধান্ত নিতে সাহায্য করে। দ্বিতীয় ভিজুয়ালাইজেশন ধারণ করলে আপনি তুলনা করতে পারবেন কিভাবে গ্রাফ সমৃদ্ধ হওয়ার পর ঘন হয়ে ওঠে।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 অংশ ২: বুদ্ধিমান মেমোরি পুনরুদ্ধার\n", + "\n", + "### প্রদর্শনী ১: ক্রস-ডকুমেন্ট জ্ঞান সংহতকরণ\n", + "\n", + "এখন যেহেতু আমাদের জ্ঞান গ্রাফ তৈরি হয়েছে, চলুন দেখি কিভাবে Cognee বিভিন্ন উৎস থেকে তথ্য একত্রিত করে জটিল প্রশ্নের উত্তর দেয়।\n", + "\n", + "প্রথম প্রশ্নটি প্রদর্শন করে:\n", + "- **অর্থবোধের ক্ষমতা**: প্রাসঙ্গিক ধারণা খুঁজে বের করা, এমনকি সেগুলি স্পষ্টভাবে উল্লেখ না থাকলেও\n", + "- **ক্রস-রেফারেন্সিং**: ডেভেলপার প্রোফাইল এবং পাইথন নীতিমালার সমন্বয়\n", + "- **প্রাসঙ্গিক যুক্তি**: নির্দিষ্ট বাস্তবায়নে সেরা পদ্ধতিগুলি প্রয়োগ করা\n", + "\n", + "### প্রদর্শনী ২: NodeSets সহ ফিল্টার করা অনুসন্ধান\n", + "\n", + "দ্বিতীয় প্রশ্নটি দেখায় কিভাবে জ্ঞান গ্রাফের নির্দিষ্ট উপসেট লক্ষ্য করা যায়:\n", + "- শুধুমাত্র `principles_data` এর মধ্যে অনুসন্ধান করতে `node_name` প্যারামিটার ব্যবহার করে\n", + "- নির্দিষ্ট জ্ঞান ক্ষেত্র থেকে কেন্দ্রীভূত উত্তর প্রদান করে\n", + "- যখন আপনাকে ক্ষেত্র-নির্দিষ্ট তথ্য প্রয়োজন হয় তখন এটি কার্যকর\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 অংশ ৩: সেশন ব্যবস্থাপনা সেটআপ\n", + "\n", + "### কথোপকথনের স্মৃতি সক্রিয় করা\n", + "\n", + "সেশন ব্যবস্থাপনা একাধিক ইন্টারঅ্যাকশনের মধ্যে প্রসঙ্গ বজায় রাখার জন্য অত্যন্ত গুরুত্বপূর্ণ। এখানে আমরা করব:\n", + "\n", + "1. **ব্যবহারকারীর প্রসঙ্গ আরম্ভ করা**: সেশন ট্র্যাকিংয়ের জন্য একটি ব্যবহারকারী প্রোফাইল তৈরি বা পুনরুদ্ধার করা\n", + "2. **ক্যাশ ইঞ্জিন কনফিগার করা**: কথোপকথনের ইতিহাস সংরক্ষণের জন্য Redis-এ সংযোগ স্থাপন করা\n", + "3. **সেশন ভেরিয়েবল সক্রিয় করা**: এমন প্রসঙ্গ ভেরিয়েবল সেটআপ করা যা প্রশ্নোত্তরের মধ্যে স্থায়ী থাকে\n", + "\n", + "> ⚠️ **গুরুত্বপূর্ণ**: এর জন্য Redis চালু থাকা এবং আপনার পরিবেশে `CACHING=true` প্রয়োজন\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ সহায়ক ফাংশন: সেশন ইতিহাস দেখুন\n", + "\n", + "এই ইউটিলিটি ফাংশনটি আমাদেরকে Redis-এ সংরক্ষিত কথোপকথনের ইতিহাস পরিদর্শন করতে সাহায্য করে। এটি উপকারী:\n", + "- সেশন ব্যবস্থাপনার ডিবাগিংয়ের জন্য\n", + "- নিশ্চিত করার জন্য যে কথোপকথনগুলো ক্যাশ করা হচ্ছে\n", + "- এজেন্টের জন্য কী প্রসঙ্গ উপলব্ধ তা বোঝার জন্য\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## সেশন ১: অ্যাসিঙ্ক সাপোর্ট ল্যাব — প্রথম প্রশ্ন\n", + "\n", + "`async-support-lab` সেশন শুরু করুন একটি বিশাল ওয়েব স্ক্র্যাপারের জন্য টেলিমেট্রি-সাপোর্টেড asyncio প্যাটার্ন সম্পর্কে জিজ্ঞাসা করে। গ্রাফ ইতিমধ্যেই asyncio, aiohttp এবং মনিটরিং প্র্যাকটিস সম্পর্কে জানে, তাই উত্তরটি পূর্ববর্তী কথোপকথনের সাথে সামঞ্জস্যপূর্ণ হওয়া উচিত এবং নতুন প্রশ্নের সাথে মানানসইভাবে সাজানো উচিত।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## প্রথম বিনিময়ের পরে সেশন ১ এর মেমরি পরীক্ষা করুন\n", + "\n", + "প্রাথমিক প্রশ্নের পরপরই `show_history(session_1)` চালালে নিশ্চিত হবে যে Cognee প্রম্পট এবং সম্পূর্ণ উভয়ই Redis-এ লিখেছে। আপনি একক এন্ট্রি দেখতে পাবেন যেখানে সমান্তরাল নির্দেশিকা থাকবে।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## সেশন ১: ডেটা মডেলের উপর অনুসরণ\n", + "\n", + "এরপর আমরা জিজ্ঞাসা করি, \"আমি কখন dataclasses এবং Pydantic এর মধ্যে কোনটি বেছে নেব?\" একই সেশন আইডি ব্যবহার করে। Cognee-কে Python এর নীতিমালা এবং পূর্ববর্তী FastAPI আলোচনাগুলো একত্রিত করে সূক্ষ্ম পরামর্শ দিতে হবে—এটি প্রদর্শন করার জন্য যে একটি নামকৃত সেশনের মধ্যে প্রাসঙ্গিকতা বজায় থাকে।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## নিশ্চিত করুন সেশন ১ এর ইতিহাসে উভয় টার্ন রয়েছে\n", + "\n", + "আরেকটি `show_history(session_1)` কল দুটি প্রশ্নোত্তর এন্ট্রি প্রকাশ করবে। এটি Mem0 ল্যাবের \"মেমরি রিপ্লে\" ধাপের সাথে মিলে যায় এবং প্রমাণ করে যে অতিরিক্ত টার্ন একই ট্রান্সক্রিপ্টে যোগ হয়।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## সেশন ২: ডিজাইন রিভিউ থ্রেড — নতুন সেশন\n", + "\n", + "থ্রেডগুলোর মধ্যে বিচ্ছিন্নতা দেখানোর জন্য আমরা `design-review-session` চালু করি এবং ইনসিডেন্ট রিভিউয়ের জন্য লগিং গাইডেন্স চাই। যদিও ভিত্তিগত জ্ঞানভাণ্ডার একই থাকে, নতুন সেশন আইডি ট্রান্সক্রিপ্টগুলোকে আলাদা রাখে।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## রিভিউ সেশন ২ ইতিহাস\n", + "\n", + "`show_history(session_2)` শুধুমাত্র ডিজাইন-রিভিউ প্রম্পট/রেসপন্স জোড়া তালিকাভুক্ত করবে। সেশন ১ এর সাথে এটি তুলনা করুন যাতে বোঝা যায় কিভাবে Cognee স্বাধীন ট্রান্সক্রিপ্ট সংরক্ষণ করে, একই সাথে শেয়ার করা জ্ঞান গ্রাফ পুনরায় ব্যবহার করে।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## সারসংক্ষেপ\n", + "\n", + "অভিনন্দন! আপনি আপনার কোডিং সহকারীকে Cognee দ্বারা চালিত একটি বাস্তব দীর্ঘমেয়াদী মেমোরি স্তর দিয়েছেন।\n", + "\n", + "এই টিউটোরিয়ালে আপনি কাঁচা ডেভেলপার কন্টেন্ট (কোড, ডকস, চ্যাট) নিয়ে তা একটি গ্রাফ + ভেক্টর মেমোরিতে রূপান্তর করেছেন, যা আপনার এজেন্ট অনুসন্ধান করতে পারে, যুক্তি করতে পারে এবং ক্রমাগত উন্নতি করতে পারে।\n", + "\n", + "আপনি যা শিখেছেন:\n", + "\n", + "1. **কাঁচা টেক্সট থেকে AI মেমোরি**: Cognee কীভাবে অগঠিত ডেটা গ্রহণ করে এবং একটি সম্মিলিত ভেক্টর + নলেজ গ্রাফ আর্কিটেকচার ব্যবহার করে তা বুদ্ধিমান, অনুসন্ধানযোগ্য মেমোরিতে রূপান্তর করে।\n", + "\n", + "2. **মেমিফাই দিয়ে গ্রাফ সমৃদ্ধকরণ**: কীভাবে সাধারণ গ্রাফ তৈরির বাইরে গিয়ে মেমিফাই ব্যবহার করে আপনার বিদ্যমান গ্রাফের উপর ভিত্তি করে প্রাপ্ত তথ্য এবং আরও সমৃদ্ধ সম্পর্ক যোগ করা যায়।\n", + "\n", + "3. **বিভিন্ন অনুসন্ধান কৌশল**: কীভাবে আপনার এজেন্টের প্রয়োজন অনুযায়ী বিভিন্ন অনুসন্ধান প্রকার (গ্রাফ-অবগত Q&A, RAG-স্টাইল সম্পূর্ণকরণ, অন্তর্দৃষ্টি, কাঁচা অংশ, কোড অনুসন্ধান ইত্যাদি) ব্যবহার করে মেমোরি প্রশ্ন করা যায়।\n", + "\n", + "4. **ভিজ্যুয়াল এক্সপ্লোরেশন**: কীভাবে গ্রাফ ভিজ্যুয়ালাইজেশন এবং Cognee UI ব্যবহার করে Cognee যা তৈরি করেছে তা পরিদর্শন এবং ডিবাগ করা যায়, যাতে আপনি জ্ঞানের গঠন দেখতে পারেন।\n", + "\n", + "5. **সেশন-অবগত মেমোরি**: কীভাবে প্রতি-সেশন প্রসঙ্গকে স্থায়ী সেমান্টিক মেমোরির সাথে একত্রিত করা যায়, যাতে এজেন্টরা ব্যবহারকারীদের মধ্যে তথ্য ফাঁস না করে একাধিক রান জুড়ে মনে রাখতে পারে।\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## মূল বিষয়গুলো\n", + "1. এম্বেডিং দ্বারা সমর্থিত একটি জ্ঞান গ্রাফ হিসেবে মেমোরি\n", + "\n", + " - **গঠনমূলক বোঝাপড়া**: Cognee ভেক্টর স্টোর এবং গ্রাফ স্টোরকে একত্রিত করে যাতে আপনার ডেটা অর্থ অনুসন্ধানযোগ্য এবং সম্পর্ক দ্বারা সংযুক্ত থাকে। Cognee ডিফল্টভাবে ফাইল-ভিত্তিক ডেটাবেস ব্যবহার করে (ভেক্টরের জন্য LanceDB, গ্রাফ ডেটাবেসের জন্য Kuzu)।\n", + "\n", + " - **সম্পর্ক-সচেতন পুনরুদ্ধার**: উত্তর শুধুমাত্র \"সদৃশ টেক্সট\" এর উপর ভিত্তি করে নয়, বরং কিভাবে সত্তাগুলি সম্পর্কিত তা থেকেও ভিত্তি পেতে পারে।\n", + "\n", + " - **জীবন্ত মেমোরি**: মেমোরি স্তরটি বিকশিত হয়, বৃদ্ধি পায় এবং একটি সংযুক্ত গ্রাফ হিসেবে অনুসন্ধানযোগ্য থাকে।\n", + "\n", + "2. অনুসন্ধান ও যুক্তি মোড\n", + " - **হাইব্রিড পুনরুদ্ধার**: অনুসন্ধান ভেক্টর সাদৃশ্য, গ্রাফ গঠন এবং LLM যুক্তি মিশ্রিত করে, কাঁচা চাঙ্ক অনুসন্ধান থেকে গ্রাফ-সচেতন প্রশ্ন উত্তর পর্যন্ত।\n", + "\n", + " - **কাজের জন্য মোড নির্বাচন করুন**: প্রাকৃতিক ভাষার উত্তর চাইলে সম্পূর্ণ-স্টাইল মোড ব্যবহার করুন, এবং আপনার এজেন্টের কাঁচা প্রসঙ্গ বা নিজস্ব যুক্তি চালানোর জন্য চাঙ্ক/সারাংশ/গ্রাফ মোড ব্যবহার করুন।\n", + "\n", + "3. ব্যক্তিগতকৃত, সেশন-সচেতন এজেন্ট\n", + " - **সেশন প্রসঙ্গ + দীর্ঘমেয়াদী মেমোরি**: Cognee স্বল্পমেয়াদী \"থ্রেড\" প্রসঙ্গকে দীর্ঘমেয়াদী, ব্যবহারকারী বা সংস্থা-স্তরের মেমোরি থেকে আলাদা রাখে।\n", + "\n", + "## বাস্তব জীবনের প্রয়োগ\n", + "\n", + "1. **ভার্টিকাল এআই এজেন্ট**\n", + "\n", + " এই নোটবুকের প্যাটার্ন ব্যবহার করে Cognee-এর পুনরুদ্ধার এবং যুক্তি কোরের উপর ভিত্তি করে ডোমেইন-স্মার্ট কো-পাইলট তৈরি করুন:\n", + "\n", + "- **ডেভেলপার কো-পাইলট**: কোড রিভিউ, ইনসিডেন্ট বিশ্লেষণ এবং আর্কিটেকচার সহকারী যারা কোড, API, ডিজাইন ডক এবং টিকিটকে একটি একক মেমোরি গ্রাফ হিসেবে অনুসন্ধান করে।\n", + "\n", + "- **গ্রাহক-সামনে কো-পাইলট**: সাপোর্ট বা সাকসেস এজেন্ট যারা প্রোডাক্ট ডক, FAQ, CRM নোট এবং পূর্ববর্তী টিকিট থেকে গ্রাফ-সচেতন পুনরুদ্ধার এবং উদ্ধৃত উত্তর প্রদান করে।\n", + "\n", + "- **অভ্যন্তরীণ বিশেষজ্ঞ কো-পাইলট**: নীতি, আইন বা নিরাপত্তা সহকারী যারা বিচ্ছিন্ন PDF-এর পরিবর্তে আন্তঃসংযুক্ত নিয়ম, নির্দেশিকা এবং ঐতিহাসিক সিদ্ধান্তের উপর যুক্তি করে।\n", + "\n", + " Cognee স্পষ্টভাবে AI এজেন্টদের জন্য স্থায়ী, সঠিক মেমোরি হিসেবে অবস্থান করছে, একটি জীবন্ত জ্ঞান গ্রাফ প্রদান করে যা আপনার এজেন্টের পিছনে স্থাপন করে এবং ভেক্টর স্টোর এবং কাস্টম গ্রাফ কোডের অস্থায়ী সংমিশ্রণ প্রতিস্থাপন করে।\n", + "\n", + "2. **বিভক্ত ডেটা সিলোগুলোকে এক মেমোরিতে একত্রিত করা**\n", + "\n", + " একই পদ্ধতি আপনাকে বিচ্ছিন্ন উৎসগুলির মধ্যে একটি একক মেমোরি স্তর তৈরি করতে সাহায্য করে:\n", + "\n", + "- **সিলো থেকে এক গ্রাফে**: কাঠামোগত (যেমন, ডেটাবেস) এবং অ-কাঠামোগত ডেটা (যেমন, ডক, চ্যাট) একটি একক গ্রাফে এম্বেডিং দ্বারা সমর্থিত করে ইনজেস্ট করুন, প্রতিটি সিস্টেমের জন্য আলাদা সূচকের পরিবর্তে।\n", + "\n", + "- **উদ্ধৃতির সাথে ক্রস-সোর্স যুক্তি**: সবকিছুর উপর মাল্টি-স্টেপ যুক্তি চালান—গ্রাফের মাধ্যমে লগ, মেট্রিক এবং ডক \"জয়ন\" করুন—এবং এখনও প্রমাণ সহ ভিত্তি করা উত্তর প্রদান করুন।\n", + "\n", + "- **জ্ঞান কেন্দ্র**: ব্যাংকিং বা শিক্ষা মতো ডোমেইনের জন্য, Cognee ইতিমধ্যেই PDF, অভ্যন্তরীণ সিস্টেম এবং অ্যাপ ডেটাকে এক জ্ঞান গ্রাফে একত্রিত করতে ব্যবহৃত হয় যাতে এজেন্টরা সঠিক, উদ্ধৃত প্রসঙ্গ সহ প্রশ্নের উত্তর দিতে পারে।\n", + "\n", + "## পরবর্তী পদক্ষেপ\n", + "\n", + "আপনি মূল মেমোরি লুপ বাস্তবায়ন করেছেন। এখানে কিছু প্রাকৃতিক সম্প্রসারণ রয়েছে যা আপনি নিজে চেষ্টা করতে পারেন (বিস্তারিত জানার জন্য [Cognee ডকুমেন্টেশন](https://docs.cognee.ai/) দেখুন):\n", + "\n", + "1. **সময় সচেতনতার সাথে পরীক্ষা করুন**: টেক্সট থেকে ইভেন্ট এবং টাইমস্ট্যাম্প বের করতে টেম্পোরাল কগনিফাই চালু করুন।\n", + "\n", + "2. **অন্টোলজি-চালিত যুক্তি প্রবর্তন করুন**: আপনার ডোমেইনের জন্য একটি OWL অন্টোলজি সংজ্ঞায়িত করুন। Cognee-এর অন্টোলজি সমর্থন ব্যবহার করুন যাতে বের করা সত্তা এবং সম্পর্ক সেই স্কিমায় ভিত্তি করে থাকে, গ্রাফের গুণমান এবং ডোমেইন-নির্দিষ্ট উত্তর উন্নত হয়।\n", + "\n", + "3. **একটি ফিডব্যাক লুপ যোগ করুন**: Cognee-কে প্রকৃত ব্যবহারকারীর প্রতিক্রিয়া থেকে গ্রাফ এজ ওজন সামঞ্জস্য করতে দিন, যাতে পুনরুদ্ধার সময়ের সাথে উন্নত হয় এবং স্থির না থাকে।\n", + "\n", + "4. **ব্যক্তিগতকরণ এবং সেশন আচরণের জন্য টিউন করুন**: ব্যবহারকারী আইডি, টেন্যান্ট এবং ডেটাসেট ব্যবহার করে প্রতিটি ব্যক্তি বা দলকে ভাগ করা মেমোরি ইঞ্জিনের উপর তাদের নিজস্ব দৃশ্য দিন।\n", + "\n", + "5. **আরও জটিল এজেন্টে স্কেল আউট করুন**: Cognee-কে এজেন্ট ফ্রেমওয়ার্কে প্লাগ করুন যাতে মাল্টি-এজেন্ট সিস্টেম তৈরি করা যায় যা একই মেমোরি স্তর ভাগ করে। *Microsoft Agent Framework x Cognee প্লাগইন শীঘ্রই আসছে।*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**অস্বীকৃতি**: \nএই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না।\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:38:46+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "bn" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/bn/13-agent-memory/README.md b/translations/bn/13-agent-memory/README.md index da59857e2..4688612e0 100644 --- a/translations/bn/13-agent-memory/README.md +++ b/translations/bn/13-agent-memory/README.md @@ -1,160 +1,140 @@ -# AI এজেন্টদের জন্য মেমরি -[![Agent Memory](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.bn.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) +# এআই এজেন্টদের জন্য মেমোরি +[![এজেন্ট মেমোরি](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.bn.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -AI এজেন্ট তৈরি করার বিশেষ সুবিধাগুলি নিয়ে আলোচনা করার সময় দুটি বিষয় প্রধানত আলোচিত হয়: টাস্ক সম্পন্ন করার জন্য টুল ব্যবহার করার ক্ষমতা এবং সময়ের সাথে উন্নতি করার ক্ষমতা। মেমরি হলো এমন একটি ভিত্তি যা স্ব-উন্নয়নশীল এজেন্ট তৈরি করতে সাহায্য করে, যা আমাদের ব্যবহারকারীদের জন্য আরও ভালো অভিজ্ঞতা তৈরি করতে পারে। +এআই এজেন্ট তৈরি করার বিশেষ সুবিধাগুলি নিয়ে আলোচনা করতে গেলে দুটি বিষয় প্রধানত উঠে আসে: টুল ব্যবহার করে কাজ সম্পন্ন করার ক্ষমতা এবং সময়ের সাথে সাথে উন্নতি করার ক্ষমতা। মেমোরি হলো এমন একটি ভিত্তি যা স্ব-উন্নতিশীল এজেন্ট তৈরি করতে সাহায্য করে, যা আমাদের ব্যবহারকারীদের জন্য আরও ভালো অভিজ্ঞতা তৈরি করতে পারে। -এই পাঠে, আমরা AI এজেন্টদের জন্য মেমরি কী এবং কীভাবে এটি পরিচালনা ও আমাদের অ্যাপ্লিকেশনের জন্য ব্যবহার করা যায় তা দেখব। +এই পাঠে, আমরা দেখব এআই এজেন্টদের জন্য মেমোরি কী এবং কীভাবে এটি পরিচালনা ও আমাদের অ্যাপ্লিকেশনের জন্য ব্যবহার করা যায়। ## পরিচিতি এই পাঠে আলোচনা করা হবে: -• **AI এজেন্ট মেমরি বোঝা**: মেমরি কী এবং এজেন্টদের জন্য এটি কেন গুরুত্বপূর্ণ। +• **এআই এজেন্ট মেমোরি বোঝা**: মেমোরি কী এবং এটি এজেন্টদের জন্য কেন গুরুত্বপূর্ণ। -• **মেমরি প্রয়োগ ও সংরক্ষণ**: AI এজেন্টদের জন্য মেমরি যোগ করার বাস্তব পদ্ধতি, যেখানে স্বল্পমেয়াদি ও দীর্ঘমেয়াদি মেমরির উপর জোর দেওয়া হবে। +• **মেমোরি প্রয়োগ ও সংরক্ষণ**: আপনার এআই এজেন্টে মেমোরি যোগ করার বাস্তব পদ্ধতি, বিশেষত স্বল্পমেয়াদী ও দীর্ঘমেয়াদী মেমোরির উপর জোর দিয়ে। -• **AI এজেন্টদের স্ব-উন্নয়নশীল করা**: কীভাবে মেমরি এজেন্টদের অতীত ইন্টারঅ্যাকশন থেকে শিখতে এবং সময়ের সাথে উন্নতি করতে সাহায্য করে। +• **এআই এজেন্টদের স্ব-উন্নতিশীল করা**: কীভাবে মেমোরি এজেন্টদের অতীতের ইন্টারঅ্যাকশন থেকে শিখতে এবং সময়ের সাথে উন্নতি করতে সাহায্য করে। -## শেখার লক্ষ্য - -এই পাঠ শেষ করার পর, আপনি জানতে পারবেন: - -• **AI এজেন্ট মেমরির বিভিন্ন প্রকারের মধ্যে পার্থক্য করতে**, যেমন কাজের মেমরি, স্বল্পমেয়াদি ও দীর্ঘমেয়াদি মেমরি, এবং বিশেষায়িত মেমরি যেমন পারসোনা ও এপিসোডিক মেমরি। - -• **AI এজেন্টদের জন্য স্বল্পমেয়াদি ও দীর্ঘমেয়াদি মেমরি প্রয়োগ ও পরিচালনা করতে** Semantic Kernel ফ্রেমওয়ার্ক ব্যবহার করে, Mem0 এবং Whiteboard মেমরি টুলের সাহায্যে, এবং Azure AI Search এর সাথে ইন্টিগ্রেশন করে। - -• **স্ব-উন্নয়নশীল AI এজেন্টদের পেছনের নীতিগুলি বুঝতে** এবং কীভাবে শক্তিশালী মেমরি ব্যবস্থাপনা সিস্টেম ক্রমাগত শেখা ও অভিযোজনকে সহায়তা করে। - -## AI এজেন্ট মেমরি বোঝা - -মূলত, **AI এজেন্টদের জন্য মেমরি হলো এমন প্রক্রিয়া যা তাদের তথ্য সংরক্ষণ ও পুনরায় মনে করার ক্ষমতা প্রদান করে**। এই তথ্য হতে পারে কথোপকথনের নির্দিষ্ট বিবরণ, ব্যবহারকারীর পছন্দ, অতীত কার্যক্রম, বা শেখা প্যাটার্ন। - -মেমরি ছাড়া, AI অ্যাপ্লিকেশনগুলো সাধারণত স্টেটলেস হয়, অর্থাৎ প্রতিটি ইন্টারঅ্যাকশন নতুন করে শুরু হয়। এর ফলে একটি পুনরাবৃত্তিমূলক এবং হতাশাজনক ব্যবহারকারীর অভিজ্ঞতা তৈরি হয় যেখানে এজেন্ট পূর্বের প্রসঙ্গ বা পছন্দ "ভুলে যায়"। - -### মেমরি কেন গুরুত্বপূর্ণ? +## উপলব্ধ প্রয়োগসমূহ -একটি এজেন্টের বুদ্ধিমত্তা তার অতীত তথ্য মনে রাখা এবং ব্যবহার করার ক্ষমতার সাথে গভীরভাবে সম্পর্কিত। মেমরি এজেন্টদেরকে নিম্নলিখিতভাবে সাহায্য করে: +এই পাঠে দুটি বিস্তৃত নোটবুক টিউটোরিয়াল অন্তর্ভুক্ত রয়েছে: -• **প্রতিফলিত**: অতীত কার্যক্রম ও ফলাফল থেকে শেখা। +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: মেমোরি প্রয়োগ করে Mem0 এবং Azure AI Search ব্যবহার করে Semantic Kernel ফ্রেমওয়ার্কের মাধ্যমে। -• **ইন্টারঅ্যাকটিভ**: চলমান কথোপকথনের প্রসঙ্গ ধরে রাখা। +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Cognee ব্যবহার করে কাঠামোগত মেমোরি প্রয়োগ করে, যা এমবেডিং দ্বারা সমর্থিত একটি নলেজ গ্রাফ স্বয়ংক্রিয়ভাবে তৈরি করে, গ্রাফ ভিজুয়ালাইজ করে এবং বুদ্ধিমান রিট্রিভাল সক্ষম করে। -• **প্রোঅ্যাকটিভ ও রিঅ্যাকটিভ**: পূর্বের তথ্যের ভিত্তিতে প্রয়োজন অনুমান করা বা সঠিকভাবে প্রতিক্রিয়া জানানো। - -• **স্বায়ত্তশাসিত**: সংরক্ষিত জ্ঞান ব্যবহার করে আরও স্বাধীনভাবে কাজ করা। - -মেমরি প্রয়োগের লক্ষ্য হলো এজেন্টদের আরও **বিশ্বস্ত ও সক্ষম** করে তোলা। - -### মেমরির প্রকারভেদ +## শেখার লক্ষ্য -#### কাজের মেমরি +এই পাঠ শেষ করার পর, আপনি জানতে পারবেন: -এটি একটি স্ক্র্যাচ পেপারের মতো যা এজেন্ট একটি চলমান টাস্ক বা চিন্তাপ্রক্রিয়ার সময় ব্যবহার করে। এটি তাৎক্ষণিক তথ্য ধরে রাখে যা পরবর্তী ধাপ সম্পন্ন করতে প্রয়োজন। +• **এআই এজেন্ট মেমোরির বিভিন্ন প্রকারের মধ্যে পার্থক্য করতে**, যেমন ওয়ার্কিং, স্বল্পমেয়াদী, দীর্ঘমেয়াদী মেমোরি এবং বিশেষায়িত ফর্ম যেমন পারসোনা ও এপিসোডিক মেমোরি। -AI এজেন্টদের জন্য, কাজের মেমরি সাধারণত কথোপকথনের সবচেয়ে প্রাসঙ্গিক তথ্য ধরে রাখে, এমনকি পুরো চ্যাট ইতিহাস দীর্ঘ বা সংক্ষিপ্ত হলেও। এটি মূল উপাদান যেমন প্রয়োজনীয়তা, প্রস্তাবনা, সিদ্ধান্ত, এবং কার্যক্রম বের করার উপর জোর দেয়। +• **এআই এজেন্টদের জন্য স্বল্পমেয়াদী ও দীর্ঘমেয়াদী মেমোরি প্রয়োগ ও পরিচালনা করতে**, Semantic Kernel ফ্রেমওয়ার্ক ব্যবহার করে, Mem0, Cognee, Whiteboard মেমোরি এবং Azure AI Search এর মতো টুল কাজে লাগিয়ে। -**কাজের মেমরির উদাহরণ** +• **স্ব-উন্নতিশীল এআই এজেন্টদের পেছনের নীতিগুলি বুঝতে** এবং কীভাবে শক্তিশালী মেমোরি ম্যানেজমেন্ট সিস্টেম ধারাবাহিক শেখা ও অভিযোজনকে সহায়তা করে। -একটি ট্রাভেল বুকিং এজেন্টে, কাজের মেমরি ব্যবহারকারীর বর্তমান অনুরোধ ধরে রাখতে পারে, যেমন "আমি প্যারিসে একটি ট্রিপ বুক করতে চাই"। এই নির্দিষ্ট প্রয়োজনটি এজেন্টের তাৎক্ষণিক প্রসঙ্গে ধরে রাখা হয় বর্তমান ইন্টারঅ্যাকশন পরিচালনার জন্য। +## এআই এজেন্ট মেমোরি বোঝা -#### স্বল্পমেয়াদি মেমরি +মূলত, **এআই এজেন্টদের জন্য মেমোরি বলতে বোঝায় এমন প্রক্রিয়া যা তাদের তথ্য সংরক্ষণ ও পুনরুদ্ধার করতে সক্ষম করে**। এই তথ্য হতে পারে কথোপকথনের নির্দিষ্ট বিবরণ, ব্যবহারকারীর পছন্দ, অতীতের কাজ, বা এমনকি শেখা প্যাটার্ন। -এই ধরনের মেমরি একটি কথোপকথন বা সেশনের সময় তথ্য ধরে রাখে। এটি বর্তমান চ্যাটের প্রসঙ্গ, যা এজেন্টকে সংলাপের পূর্ববর্তী অংশগুলোর দিকে ফিরে যেতে সাহায্য করে। +মেমোরি ছাড়া, এআই অ্যাপ্লিকেশনগুলো সাধারণত স্টেটলেস হয়, অর্থাৎ প্রতিটি ইন্টারঅ্যাকশন নতুন করে শুরু হয়। এর ফলে একটি পুনরাবৃত্তিমূলক এবং হতাশাজনক ব্যবহারকারীর অভিজ্ঞতা তৈরি হয় যেখানে এজেন্ট পূর্ববর্তী প্রসঙ্গ বা পছন্দ "ভুলে যায়"। -**স্বল্পমেয়াদি মেমরির উদাহরণ** +### মেমোরি কেন গুরুত্বপূর্ণ? -যদি ব্যবহারকারী জিজ্ঞাসা করে, "প্যারিসে একটি ফ্লাইটের খরচ কত হবে?" এবং তারপর অনুসরণ করে "সেখানে থাকার ব্যবস্থা কেমন?", স্বল্পমেয়াদি মেমরি নিশ্চিত করে যে এজেন্ট জানে "সেখানে" মানে "প্যারিস" একই কথোপকথনের মধ্যে। +একটি এজেন্টের বুদ্ধিমত্তা তার অতীতের তথ্য মনে রাখা এবং ব্যবহার করার ক্ষমতার সাথে গভীরভাবে সম্পর্কিত। মেমোরি এজেন্টদের হতে সাহায্য করে: -#### দীর্ঘমেয়াদি মেমরি +• **প্রতিফলিত**: অতীতের কাজ এবং ফলাফল থেকে শেখা। -এটি এমন তথ্য যা একাধিক কথোপকথন বা সেশনের মধ্যে টিকে থাকে। এটি এজেন্টকে ব্যবহারকারীর পছন্দ, ঐতিহাসিক ইন্টারঅ্যাকশন, বা সাধারণ জ্ঞান দীর্ঘ সময় ধরে মনে রাখতে সাহায্য করে। এটি ব্যক্তিগতকরণের জন্য গুরুত্বপূর্ণ। +• **ইন্টারঅ্যাকটিভ**: চলমান কথোপকথনের প্রসঙ্গ বজায় রাখা। -**দীর্ঘমেয়াদি মেমরির উদাহরণ** +• **প্রোঅ্যাকটিভ এবং রিঅ্যাকটিভ**: ঐতিহাসিক তথ্যের ভিত্তিতে প্রয়োজন অনুমান করা বা সঠিকভাবে প্রতিক্রিয়া জানানো। -দীর্ঘমেয়াদি মেমরি সংরক্ষণ করতে পারে যে "বেন স্কিইং এবং আউটডোর কার্যক্রম উপভোগ করেন, পাহাড়ের দৃশ্য সহ কফি পছন্দ করেন, এবং অতীত আঘাতের কারণে উন্নত স্কি ঢাল এড়িয়ে চলতে চান"। এই তথ্য, পূর্ববর্তী ইন্টারঅ্যাকশন থেকে শেখা, ভবিষ্যতের ট্রাভেল প্ল্যানিং সেশনে সুপারিশগুলোকে অত্যন্ত ব্যক্তিগতকৃত করে তোলে। +• **স্বায়ত্তশাসিত**: সংরক্ষিত জ্ঞান ব্যবহার করে আরও স্বাধীনভাবে কাজ করা। -#### পারসোনা মেমরি +মেমোরি প্রয়োগের লক্ষ্য হলো এজেন্টদের আরও **বিশ্বস্ত এবং সক্ষম** করে তোলা। -এই বিশেষায়িত মেমরি এজেন্টকে একটি ধারাবাহিক "ব্যক্তিত্ব" বা "পারসোনা" তৈরি করতে সাহায্য করে। এটি এজেন্টকে নিজের সম্পর্কে বা তার নির্ধারিত ভূমিকা সম্পর্কে তথ্য মনে রাখতে সাহায্য করে, যা ইন্টারঅ্যাকশনগুলোকে আরও তরল এবং কেন্দ্রীভূত করে তোলে। +### মেমোরির প্রকারভেদ -**পারসোনা মেমরির উদাহরণ** +#### ওয়ার্কিং মেমোরি -যদি ট্রাভেল এজেন্টকে "স্কি পরিকল্পনার বিশেষজ্ঞ" হিসেবে ডিজাইন করা হয়, পারসোনা মেমরি এই ভূমিকা শক্তিশালী করতে পারে, যা তার প্রতিক্রিয়াগুলোকে বিশেষজ্ঞের টোন এবং জ্ঞানের সাথে সামঞ্জস্যপূর্ণ করে তোলে। +এটি এমন একটি স্ক্র্যাচ পেপারের মতো যা একটি এজেন্ট একটি একক চলমান কাজ বা চিন্তাপ্রক্রিয়ার সময় ব্যবহার করে। এটি তাৎক্ষণিক তথ্য ধারণ করে যা পরবর্তী ধাপ গণনা করতে প্রয়োজন। -#### ওয়ার্কফ্লো/এপিসোডিক মেমরি +এআই এজেন্টদের ক্ষেত্রে, ওয়ার্কিং মেমোরি সাধারণত কথোপকথনের সবচেয়ে প্রাসঙ্গিক তথ্য ধারণ করে, এমনকি যদি পুরো চ্যাট ইতিহাস দীর্ঘ বা সংক্ষিপ্ত হয়। এটি মূল উপাদান যেমন প্রয়োজনীয়তা, প্রস্তাবনা, সিদ্ধান্ত এবং কর্মগুলি বের করে আনে। -এই মেমরি একটি জটিল টাস্কের সময় এজেন্ট যে ধাপগুলো নেয়, সেগুলোর ক্রম সংরক্ষণ করে, যার মধ্যে সফলতা এবং ব্যর্থতা অন্তর্ভুক্ত। এটি অতীত "পর্ব" বা অভিজ্ঞতা মনে রাখার মতো, যা থেকে শেখা যায়। +**ওয়ার্কিং মেমোরি উদাহরণ** -**এপিসোডিক মেমরির উদাহরণ** +একটি ভ্রমণ বুকিং এজেন্টে, ওয়ার্কিং মেমোরি ব্যবহারকারীর বর্তমান অনুরোধ ধারণ করতে পারে, যেমন "আমি প্যারিসে একটি ট্রিপ বুক করতে চাই"। এই নির্দিষ্ট প্রয়োজনটি এজেন্টের তাৎক্ষণিক প্রসঙ্গে থাকে বর্তমান ইন্টারঅ্যাকশন পরিচালনার জন্য। -যদি এজেন্ট একটি নির্দিষ্ট ফ্লাইট বুক করার চেষ্টা করে কিন্তু এটি অনুপলব্ধতার কারণে ব্যর্থ হয়, এপিসোডিক মেমরি এই ব্যর্থতাটি রেকর্ড করতে পারে, যা এজেন্টকে বিকল্প ফ্লাইট চেষ্টা করতে বা পরবর্তী প্রচেষ্টায় ব্যবহারকারীকে সমস্যাটি সম্পর্কে আরও তথ্যপূর্ণভাবে জানাতে সাহায্য করে। +#### স্বল্পমেয়াদী মেমোরি -#### এন্টিটি মেমরি +এই ধরনের মেমোরি একটি একক কথোপকথন বা সেশনের সময় তথ্য ধরে রাখে। এটি বর্তমান চ্যাটের প্রসঙ্গ, যা এজেন্টকে সংলাপের পূর্ববর্তী পালাগুলিতে ফিরে যেতে সক্ষম করে। -এটি কথোপকথন থেকে নির্দিষ্ট এন্টিটি (যেমন ব্যক্তি, স্থান, বা বস্তু) এবং ঘটনাগুলো বের করে এবং মনে রাখে। এটি এজেন্টকে আলোচিত মূল উপাদানগুলোর একটি গঠিত ধারণা তৈরি করতে সাহায্য করে। +**স্বল্পমেয়াদী মেমোরি উদাহরণ** -**এন্টিটি মেমরির উদাহরণ** +যদি একজন ব্যবহারকারী জিজ্ঞাসা করেন, "প্যারিসে একটি ফ্লাইটের খরচ কত হবে?" এবং তারপর অনুসরণ করেন "সেখানে থাকার জায়গার কী অবস্থা?", স্বল্পমেয়াদী মেমোরি নিশ্চিত করে যে এজেন্ট জানে "সেখানে" মানে "প্যারিস" একই কথোপকথনের মধ্যে। -একটি অতীত ট্রিপ সম্পর্কে কথোপকথন থেকে, এজেন্ট "প্যারিস," "আইফেল টাওয়ার," এবং "Le Chat Noir রেস্টুরেন্টে ডিনার" এন্টিটি হিসেবে বের করতে পারে। ভবিষ্যতের ইন্টারঅ্যাকশনে, এজেন্ট "Le Chat Noir" মনে রাখতে পারে এবং সেখানে একটি নতুন রিজার্ভেশন করার প্রস্তাব দিতে পারে। +#### দীর্ঘমেয়াদী মেমোরি -#### স্ট্রাকচার্ড RAG (রিট্রিভাল অগমেন্টেড জেনারেশন) +এটি এমন তথ্য যা একাধিক কথোপকথন বা সেশনের মধ্যে টিকে থাকে। এটি এজেন্টকে ব্যবহারকারীর পছন্দ, ঐতিহাসিক ইন্টারঅ্যাকশন বা সাধারণ জ্ঞান দীর্ঘ সময় ধরে মনে রাখতে সাহায্য করে। এটি ব্যক্তিগতকরণের জন্য গুরুত্বপূর্ণ। -যদিও RAG একটি বিস্তৃত কৌশল, "স্ট্রাকচার্ড RAG" একটি শক্তিশালী মেমরি প্রযুক্তি হিসেবে উল্লেখযোগ্য। এটি বিভিন্ন উৎস (কথোপকথন, ইমেইল, ছবি) থেকে ঘন, গঠিত তথ্য বের করে এবং প্রতিক্রিয়ার নির্ভুলতা, পুনরুদ্ধার, এবং গতি উন্নত করতে ব্যবহার করে। ক্লাসিক RAG শুধুমাত্র সেমান্টিক সাদৃশ্যের উপর নির্ভর করে, কিন্তু স্ট্রাকচার্ড RAG তথ্যের অন্তর্নিহিত গঠন নিয়ে কাজ করে। +**দীর্ঘমেয়াদী মেমোরি উদাহরণ** -**স্ট্রাকচার্ড RAG এর উদাহরণ** +একটি দীর্ঘমেয়াদী মেমোরি হয়তো সংরক্ষণ করতে পারে যে "বেন স্কিইং এবং আউটডোর কার্যকলাপ পছন্দ করেন, মাউন্টেন ভিউ সহ কফি পছন্দ করেন এবং অতীতের আঘাতের কারণে উন্নত স্কি স্লোপ এড়িয়ে চলতে চান"। এই তথ্য, পূর্ববর্তী ইন্টারঅ্যাকশন থেকে শেখা, ভবিষ্যতের ভ্রমণ পরিকল্পনা সেশনে সুপারিশগুলিকে অত্যন্ত ব্যক্তিগতকৃত করে তোলে। -কেবল কীওয়ার্ড মেলানোর পরিবর্তে, স্ট্রাকচার্ড RAG একটি ইমেইল থেকে ফ্লাইটের বিবরণ (গন্তব্য, তারিখ, সময়, এয়ারলাইন) পার্স করতে পারে এবং এটি একটি গঠিতভাবে সংরক্ষণ করতে পারে। এটি "আমি মঙ্গলবার প্যারিসে কোন ফ্লাইট বুক করেছি?" এর মতো সুনির্দিষ্ট প্রশ্নের উত্তর দিতে সক্ষম করে। +#### পারসোনা মেমোরি -## মেমরি প্রয়োগ ও সংরক্ষণ +এই বিশেষায়িত মেমোরি প্রকারটি একটি এজেন্টকে একটি ধারাবাহিক "ব্যক্তিত্ব" বা "পারসোনা" তৈরি করতে সাহায্য করে। এটি এজেন্টকে নিজের সম্পর্কে বা তার উদ্দেশ্য ভূমিকা সম্পর্কে বিস্তারিত মনে রাখতে সাহায্য করে, যা ইন্টারঅ্যাকশনকে আরও তরল এবং মনোযোগী করে তোলে। -AI এজেন্টদের জন্য মেমরি প্রয়োগ একটি **মেমরি ব্যবস্থাপনা** প্রক্রিয়ার মাধ্যমে সম্পন্ন হয়, যার মধ্যে তথ্য তৈরি, সংরক্ষণ, পুনরুদ্ধার, ইন্টিগ্রেশন, আপডেট, এবং এমনকি "ভুলে যাওয়া" (বা মুছে ফেলা) অন্তর্ভুক্ত। পুনরুদ্ধার একটি বিশেষভাবে গুরুত্বপূর্ণ দিক। +**পারসোনা মেমোরি উদাহরণ** -### বিশেষায়িত মেমরি টুল +যদি ভ্রমণ এজেন্টটি একটি "বিশেষজ্ঞ স্কি পরিকল্পনাকারী" হিসেবে ডিজাইন করা হয়, পারসোনা মেমোরি এই ভূমিকা জোরদার করতে পারে, যা তার প্রতিক্রিয়াগুলিকে একজন বিশেষজ্ঞের টোন এবং জ্ঞানের সাথে সামঞ্জস্যপূর্ণ করে তোলে। -এজেন্ট মেমরি সংরক্ষণ ও পরিচালনার একটি উপায় হলো Mem0 এর মতো বিশেষায়িত টুল ব্যবহার করা। Mem0 একটি স্থায়ী মেমরি স্তর হিসেবে কাজ করে, যা এজেন্টকে প্রাসঙ্গিক ইন্টারঅ্যাকশন মনে রাখতে, ব্যবহারকারীর পছন্দ এবং বাস্তব প্রসঙ্গ সংরক্ষণ করতে, এবং সময়ের সাথে সফলতা ও ব্যর্থতা থেকে শেখার সুযোগ দেয়। ধারণাটি হলো স্টেটলেস এজেন্টকে স্টেটফুলে রূপান্তর করা। +#### ওয়ার্কফ্লো/এপিসোডিক মেমোরি -এটি একটি **দুই-পর্যায়ের মেমরি পাইপলাইন: এক্সট্রাকশন এবং আপডেট** এর মাধ্যমে কাজ করে। প্রথমে, এজেন্টের থ্রেডে যোগ করা বার্তাগুলো Mem0 সার্ভিসে পাঠানো হয়, যা একটি Large Language Model (LLM) ব্যবহার করে কথোপকথনের ইতিহাস সংক্ষেপ করে এবং নতুন মেমরি বের করে। পরবর্তীতে, একটি LLM-চালিত আপডেট পর্যায় নির্ধারণ করে যে এই মেমরিগুলো যোগ, পরিবর্তন, বা মুছে ফেলা হবে কিনা, এবং এগুলোকে একটি হাইব্রিড ডেটা স্টোরে সংরক্ষণ করে যা ভেক্টর, গ্রাফ, এবং কী-ভ্যালু ডেটাবেস অন্তর্ভুক্ত করতে পারে। এই সিস্টেম বিভিন্ন মেমরি প্রকার সমর্থন করে এবং গ্রাফ মেমরি অন্তর্ভুক্ত করতে পারে যা এন্টিটির মধ্যে সম্পর্ক পরিচালনা করে। +এই মেমোরি একটি জটিল কাজের সময় এজেন্ট যে ধাপগুলি নেয়, সেগুলির ক্রম সংরক্ষণ করে, যার মধ্যে সাফল্য এবং ব্যর্থতাগুলি অন্তর্ভুক্ত। এটি অতীতের নির্দিষ্ট "পর্ব" বা অভিজ্ঞতাগুলি মনে রাখার মতো। -### RAG দিয়ে মেমরি সংরক্ষণ +**এপিসোডিক মেমোরি উদাহরণ** -Mem0 এর মতো বিশেষায়িত মেমরি টুল ছাড়াও, আপনি **Azure AI Search** এর মতো শক্তিশালী সার্চ সার্ভিস ব্যবহার করতে পারেন মেমরি সংরক্ষণ ও পুনরুদ্ধারের ব্যাকএন্ড হিসেবে, বিশেষত স্ট্রাকচার্ড RAG এর জন্য। +যদি এজেন্ট একটি নির্দিষ্ট ফ্লাইট বুক করার চেষ্টা করে কিন্তু এটি অনুপলব্ধতার কারণে ব্যর্থ হয়, এপিসোডিক মেমোরি এই ব্যর্থতাটি রেকর্ড করতে পারে, যা এজেন্টকে বিকল্প ফ্লাইট চেষ্টা করতে বা পরবর্তী প্রচেষ্টায় ব্যবহারকারীকে আরও তথ্যপূর্ণভাবে সমস্যাটি জানাতে সাহায্য করে। -এটি আপনার এজেন্টের প্রতিক্রিয়াগুলোকে আপনার নিজস্ব ডেটার সাথে ভিত্তি প্রদান করতে সাহায্য করে, যা আরও প্রাসঙ্গিক এবং সঠিক উত্তর নিশ্চিত করে। Azure AI Search ব্যবহার করে ব্যবহারকারীর নির্দিষ্ট ট্রাভেল মেমরি, প্রোডাক্ট ক্যাটালগ, বা অন্য যেকোনো ডোমেইন-নির্দিষ্ট জ্ঞান সংরক্ষণ করা যায়। +#### এন্টিটি মেমোরি -Azure AI Search **স্ট্রাকচার্ড RAG** এর মতো ক্ষমতা সমর্থন করে, যা কথোপকথনের ইতিহাস, ইমেইল, বা এমনকি ছবি থেকে ঘন, গঠিত তথ্য বের করা এবং পুনরুদ্ধারে দক্ষ। এটি "সুপারহিউম্যান নির্ভুলতা এবং পুনরুদ্ধার" প্রদান করে, যা প্রচলিত টেক্সট চাঙ্কিং এবং এমবেডিং পদ্ধতির তুলনায় উন্নত। +এটি কথোপকথন থেকে নির্দিষ্ট সত্তা (যেমন ব্যক্তি, স্থান বা বস্তু) এবং ঘটনাগুলি বের করে এবং মনে রাখার সাথে সম্পর্কিত। এটি এজেন্টকে আলোচিত মূল উপাদানগুলির একটি কাঠামোগত বোঝাপড়া তৈরি করতে সাহায্য করে। -## AI এজেন্টদের স্ব-উন্নয়নশীল করা +**এন্টিটি মেমোরি উদাহরণ** -স্ব-উন্নয়নশীল এজেন্টদের জন্য একটি সাধারণ প্যাটার্ন হলো একটি **"জ্ঞান এজেন্ট"** পরিচয় করানো। এই পৃথক এজেন্ট ব্যবহারকারী এবং প্রধান এজেন্টের মধ্যে কথোপকথন পর্যবেক্ষণ করে। এর ভূমিকা হলো: +একটি অতীত ভ্রমণ সম্পর্কে কথোপকথন থেকে, এজেন্ট "প্যারিস," "আইফেল টাওয়ার," এবং "ল্য শা নোয়া রেস্টুরেন্টে ডিনার" এর মতো সত্তাগুলি বের করতে পারে। ভবিষ্যতের ইন্টারঅ্যাকশনে, এজেন্ট "ল্য শা নোয়া" মনে করতে পারে এবং সেখানে একটি নতুন রিজার্ভেশন করার প্রস্তাব দিতে পারে। -1. **মূল্যবান তথ্য চিহ্নিত করা**: কথোপকথনের কোনো অংশ সাধারণ জ্ঞান বা নির্দিষ্ট ব্যবহারকারীর পছন্দ হিসেবে সংরক্ষণ করার যোগ্য কিনা তা নির্ধারণ করা। +#### স্ট্রাকচার্ড RAG (রিট্রিভাল অগমেন্টেড জেনারেশন) -2. **তথ্য বের করা এবং সংক্ষেপ করা**: কথোপকথন থেকে প্রয়োজনীয় শেখা বা পছন্দ বের করা। +যদিও RAG একটি বিস্তৃত কৌশল, "স্ট্রাকচার্ড RAG" একটি শক্তিশালী মেমোরি প্রযুক্তি হিসেবে হাইলাইট করা হয়েছে। এটি বিভিন্ন উৎস (কথোপকথন, ইমেইল, ছবি) থেকে ঘন, কাঠামোগত তথ্য বের করে এবং প্রতিক্রিয়ার নির্ভুলতা, রিকল এবং গতি উন্নত করতে ব্যবহার করে। ক্লাসিক RAG যা শুধুমাত্র সেমান্টিক সাদৃশ্যের উপর নির্ভর করে, তার বিপরীতে স্ট্রাকচার্ড RAG তথ্যের অন্তর্নিহিত কাঠামোর সাথে কাজ করে। -3. **জ্ঞানভাণ্ডারে সংরক্ষণ করা**: এই বের করা তথ্য সংরক্ষণ করা, সাধারণত একটি ভেক্টর ডেটাবেসে, যাতে এটি পরে পুনরুদ্ধার করা যায়। +**স্ট্রাকচার্ড RAG উদাহরণ** -4. **ভবিষ্যতের প্রশ্ন উন্নত করা**: যখন ব্যবহারকারী একটি নতুন প্রশ্ন শুরু করেন, জ্ঞান এজেন্ট প্রাসঙ্গিক সংরক্ষিত তথ্য পুনরুদ্ধার করে এবং এটি ব্যবহারকারীর প্রম্পটে যোগ করে, প্রধান এজেন্টকে গুরুত্বপূর্ণ প্রসঙ্গ প্রদান করে (RAG এর মতো)। +শুধু কীওয়ার্ড মেলানোর পরিবর্তে, স্ট্রাকচার্ড RAG একটি ইমেইল থেকে ফ্লাইটের বিস্তারিত (গন্তব্য, তারিখ, সময়, এয়ারলাইন) বিশ্লেষণ করতে পারে এবং কাঠামোগতভাবে সংরক্ষণ করতে পারে। এটি সুনির্দিষ্ট প্রশ্নের উত্তর দিতে সক্ষম করে, যেমন "মঙ্গলবার আমি প্যারিসে কোন ফ্লাইট বুক করেছিলাম?" -### মেমরির জন্য অপ্টিমাইজেশন +## মেমোরি প্রয়োগ ও সংরক্ষণ -• **লেটেন্সি ব্যবস্থাপনা**: ব্যবহারকারীর ইন্টারঅ্যাকশন ধীর না করার জন্য, একটি সস্তা, দ্রুত মডেল প্রাথমিকভাবে ব্যবহার করা যেতে পারে দ্রুত চেক করতে যে তথ্য সংরক্ষণ বা পুনরুদ্ধার করার যোগ্য কিনা, শুধুমাত্র প্রয়োজন হলে আরও জটিল এক্সট্রাকশন/রিট্রিভাল প্রক্রিয়া চালু করা। +এআই এজেন্টদের জন্য মেমোরি প্রয়োগ একটি **মেমোরি ম্যানেজমেন্ট** প্রক্রিয়া জড়িত, যা তথ্য তৈরি, সংরক্ষণ, পুনরুদ্ধার, একীভূত, আপডেট এবং এমনকি "ভুলে যাওয়া" (বা মুছে ফেলা) অন্তর্ভুক্ত করে। পুনরুদ্ধার একটি বিশেষভাবে গুরুত্বপূর্ণ দিক। -• **জ্ঞানভাণ্ডার রক্ষণাবেক্ষণ**: একটি ক্রমবর্ধমান জ্ঞানভাণ্ডারের জন্য, কম ব্যবহৃত তথ্য "কোল্ড স্টোরেজ"-এ সরানো যেতে পারে খরচ পরিচালনার জন্য। +### বিশেষায়িত মেমোরি টুল -## এজেন্ট মেমরি সম্পর্কে আরও প্রশ্ন আছে? +#### Mem0 -[Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) এ যোগ দিন, যেখানে আপনি অন্যান্য শিক্ষার্থীদের সাথে দেখা করতে পারেন, অফিস আওয়ারে অংশ নিতে পারেন এবং আপনার AI এজেন্ট সম্পর্কিত প্রশ্নের উত্তর পেতে পারেন। +এজেন্ট মেমোরি সংরক্ষণ এবং পরিচালনার একটি উপায় হলো Mem0 এর মতো বিশেষায়িত টুল ব্যবহার করা। Mem0 একটি স্থায়ী মেমোরি স্তর হিসেবে কাজ করে, যা এজেন্টকে প্রাসঙ্গিক ইন্টারঅ্যাকশন মনে রাখতে, ব্যবহারকারীর পছন্দ এবং বাস্তব প্রসঙ্গ সংরক্ষণ করতে এবং সময়ের সাথে সাফল্য ও ব্যর্থতা থেকে শিখতে সক্ষম করে। --- + **অস্বীকৃতি**: -এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিক অনুবাদের চেষ্টা করি, তবে দয়া করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় থাকা সংস্করণটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই। \ No newline at end of file +এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসাধ্য সঠিকতার জন্য চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল ভাষায় থাকা নথিটিকে প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য, পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যা হলে আমরা দায়বদ্ধ থাকব না। + \ No newline at end of file diff --git a/translations/br/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/br/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..d28a853c0 --- /dev/null +++ b/translations/br/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Construindo Agentes de IA com Memória Persistente usando Cognee\n", + "\n", + "Este notebook demonstra como construir agentes de IA inteligentes com capacidades sofisticadas de memória usando [**cognee**](https://www.cognee.ai/) - uma memória de IA de código aberto que combina grafos de conhecimento, busca semântica e gerenciamento de sessões para criar sistemas de IA conscientes de contexto.\n", + "\n", + "## 🎯 Objetivos de Aprendizado\n", + "\n", + "Ao final deste tutorial, você entenderá como:\n", + "- **Construir Grafos de Conhecimento Baseados em Embeddings**: Transformar texto não estruturado em conhecimento estruturado e consultável\n", + "- **Implementar Memória de Sessão**: Criar conversas de múltiplas interações com retenção automática de contexto\n", + "- **Persistir Conversas**: Opcionalmente armazenar interações importantes em memória de longo prazo para referência futura\n", + "- **Consultar Usando Linguagem Natural**: Acessar e aproveitar o contexto histórico em novas conversas\n", + "- **Visualizar Memória**: Explorar os relacionamentos no grafo de conhecimento do seu agente\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ O que você vai construir\n", + "\n", + "Neste tutorial, vamos criar um **Assistente de Codificação** com memória persistente que:\n", + "\n", + "### 1. **Construção de Base de Conhecimento**\n", + " - Ingere informações sobre o perfil e a expertise do desenvolvedor\n", + " - Processa princípios e boas práticas de programação em Python\n", + " - Armazena conversas históricas entre desenvolvedores e assistentes de IA\n", + "\n", + "### 2. **Conversas com Contexto de Sessão**\n", + " - Mantém o contexto ao longo de várias perguntas na mesma sessão\n", + " - Armazena automaticamente cada par de pergunta/resposta para recuperação eficiente\n", + " - Fornece respostas coerentes e contextuais com base no histórico da conversa\n", + "\n", + "### 3. **Memória de Longo Prazo**\n", + " - Persiste conversas importantes em uma memória de longo prazo\n", + " - Recupera memórias relevantes da base de conhecimento e sessões anteriores para informar novas interações\n", + " - Constrói uma base de conhecimento crescente que melhora com o tempo\n", + "\n", + "### 4. **Recuperação Inteligente de Memória**\n", + " - Utiliza busca semântica baseada em grafos para encontrar informações relevantes em todo o conhecimento armazenado\n", + " - Filtra buscas por subgrupos de dados (informações do desenvolvedor vs. princípios)\n", + " - Combina múltiplas fontes de dados para fornecer respostas abrangentes\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Pré-requisitos e Configuração\n", + "\n", + "### Requisitos do Sistema\n", + "\n", + "Antes de começar, certifique-se de ter:\n", + "\n", + "1. **Ambiente Python**\n", + " - Python 3.9 ou superior\n", + " - Ambiente virtual (recomendado)\n", + " \n", + "2. **Cache Redis** (Necessário para Gerenciamento de Sessão)\n", + " - Redis local: `docker run -d -p 6379:6379 redis`\n", + " - Ou use um serviço Redis gerenciado\n", + " \n", + "3. **Acesso à API LLM**\n", + " - Chave de API OpenAI ou outros provedores (veja [documentação](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Configuração de Banco de Dados**\n", + " - Nenhuma configuração necessária por padrão. Cognee utiliza bancos de dados baseados em arquivos (LanceDB e Kuzu)\n", + " - Opcionalmente, você pode configurar o Azure AI Search como um armazenamento vetorial (veja [documentação](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Configuração do Ambiente\n", + "\n", + "Crie um arquivo `.env` no diretório do seu projeto com as seguintes variáveis:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Entendendo a Arquitetura de Memória do Cognee\n", + "\n", + "### Como o Cognee Funciona\n", + "\n", + "O Cognee oferece um sistema de memória sofisticado que vai além do simples armazenamento de chave-valor:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Componentes Principais:\n", + "\n", + "1. **Knowledge Graph (Grafo de Conhecimento)**: Armazena entidades, relacionamentos e conexões semânticas\n", + "2. **Vector Embeddings (Vetores de Embedding)**: Permite busca semântica em todas as informações armazenadas\n", + "3. **Session Cache (Cache de Sessão)**: Mantém o contexto da conversa dentro e entre sessões\n", + "4. **NodeSets**: Organiza os dados em categorias lógicas para recuperação direcionada\n", + "\n", + "### Tipos de Memória Neste Tutorial:\n", + "\n", + "- **Memória Persistente**: Armazenamento de longo prazo no grafo de conhecimento\n", + "- **Memória de Sessão**: Contexto temporário da conversa no cache Redis\n", + "- **Memória Semântica**: Busca baseada em similaridade vetorial em todos os dados\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Instalar Pacotes Necessários\n", + "\n", + "Instale o Cognee com suporte ao Redis para gerenciamento de sessões:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Inicializar Ambiente e Carregar Bibliotecas\n", + "\n", + "Certifique-se de que:\n", + "1. O Redis está em execução (por exemplo, via Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. As variáveis de ambiente estão configuradas antes de importar os módulos de cache\n", + "3. Se necessário, reinicie o kernel e execute as células na ordem\n", + "\n", + "A célula a seguir irá:\n", + "1. Carregar variáveis de ambiente do arquivo `.env`\n", + "2. Configurar o Cognee com suas configurações de LLM\n", + "3. Habilitar o cache para gerenciamento de sessão\n", + "4. Validar se todos os componentes estão devidamente conectados\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Configurar Diretórios de Armazenamento\n", + "\n", + "O Cognee utiliza dois diretórios separados para suas operações:\n", + "- **Raiz de Dados**: Armazena documentos ingeridos e dados processados\n", + "- **Raiz do Sistema**: Contém o banco de dados do grafo de conhecimento e os metadados do sistema\n", + "\n", + "Vamos criar diretórios isolados para este tutorial da seguinte forma:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Redefinir Estado de Memória\n", + "\n", + "Antes de começarmos a construir nosso sistema de memória, vamos garantir que estamos começando do zero.\n", + "\n", + "> 💡 **Dica**: Você pode pular esta etapa se quiser preservar as memórias existentes de execuções anteriores ao usar este notebook novamente.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Parte 1: Construindo a Base de Conhecimento\n", + "\n", + "### Fontes de Dados para Nosso Assistente de Desenvolvedor\n", + "\n", + "Vamos utilizar três tipos de dados para criar uma base de conhecimento abrangente:\n", + "\n", + "1. **Perfil do Desenvolvedor**: Experiência pessoal e histórico técnico\n", + "2. **Melhores Práticas em Python**: O Zen do Python com diretrizes práticas\n", + "3. **Conversas Históricas**: Sessões de perguntas e respostas anteriores entre desenvolvedores e assistentes de IA\n", + "\n", + "Esses dados diversificados permitem que nosso agente:\n", + "- Compreenda o contexto técnico do usuário\n", + "- Aplique as melhores práticas nas recomendações\n", + "- Aprenda com interações bem-sucedidas anteriores\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Processar Dados em um Grafo de Conhecimento\n", + "\n", + "Agora vamos transformar nosso texto bruto em uma memória estruturada. Este processo:\n", + "\n", + "1. **Adiciona dados aos NodeSets**: Organiza informações em categorias lógicas\n", + " - `developer_data`: Perfil do desenvolvedor e conversas\n", + " - `principles_data`: Melhores práticas e diretrizes de Python\n", + "\n", + "2. **Executa o Pipeline Cognify**: Extrai entidades, relacionamentos e cria embeddings\n", + " - Identifica conceitos-chave\n", + " - Cria conexões semânticas entre informações relacionadas\n", + " - Gera embeddings vetoriais\n", + "\n", + "Isso pode levar alguns momentos enquanto o LLM processa o texto e constrói a estrutura do grafo:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Visualizar o Grafo de Conhecimento\n", + "\n", + "Vamos explorar a estrutura do nosso grafo de conhecimento. A visualização mostra:\n", + "- **Nós**: Entidades extraídas do texto (conceitos, tecnologias, pessoas)\n", + "- **Arestas**: Relações e conexões entre as entidades\n", + "- **Agrupamentos**: Conceitos relacionados agrupados por similaridade semântica\n", + "\n", + "Abra o arquivo HTML gerado no seu navegador para explorar o grafo de forma interativa:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Enriquecer a Memória com Memify\n", + "\n", + "A função `memify()` analisa o grafo de conhecimento e gera regras inteligentes sobre os dados. Este processo:\n", + "- Identifica padrões e melhores práticas\n", + "- Cria diretrizes acionáveis com base no conteúdo\n", + "- Estabelece relações entre diferentes áreas de conhecimento\n", + "\n", + "Essas regras ajudam o agente a tomar decisões mais informadas ao responder perguntas. Capturar uma segunda visualização ajuda a comparar como o grafo se torna mais denso após ser enriquecido.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Parte 2: Recuperação Inteligente de Memória\n", + "\n", + "### Demonstração 1: Integração de Conhecimento entre Documentos\n", + "\n", + "Agora que nosso grafo de conhecimento está construído, vamos testar como o Cognee combina informações de várias fontes para responder a perguntas complexas.\n", + "\n", + "A primeira consulta demonstra:\n", + "- **Compreensão semântica**: Encontrar conceitos relevantes mesmo quando não mencionados explicitamente\n", + "- **Referenciamento cruzado**: Combinar o perfil do desenvolvedor com os princípios do Python\n", + "- **Raciocínio contextual**: Aplicar melhores práticas a implementações específicas\n", + "\n", + "### Demonstração 2: Pesquisa Filtrada com NodeSets\n", + "\n", + "A segunda consulta mostra como direcionar subconjuntos específicos do grafo de conhecimento:\n", + "- Usa o parâmetro `node_name` para pesquisar apenas dentro de `principles_data`\n", + "- Fornece respostas focadas de um domínio de conhecimento específico\n", + "- Útil quando você precisa de informações específicas de um domínio\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Parte 3: Configuração de Gerenciamento de Sessão\n", + "\n", + "### Habilitando Memória de Conversação\n", + "\n", + "O gerenciamento de sessão é essencial para manter o contexto em várias interações. Aqui, vamos:\n", + "\n", + "1. **Inicializar o Contexto do Usuário**: Criar ou recuperar um perfil de usuário para rastreamento de sessão\n", + "2. **Configurar o Motor de Cache**: Conectar ao Redis para armazenar o histórico de conversas\n", + "3. **Habilitar Variáveis de Sessão**: Configurar variáveis de contexto que persistem entre consultas\n", + "\n", + "> ⚠️ **Importante**: Isso requer que o Redis esteja em execução e `CACHING=true` no seu ambiente\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Função Auxiliar: Visualizar Histórico de Sessão\n", + "\n", + "Esta função utilitária permite inspecionar o histórico de conversas armazenado no Redis. É útil para:\n", + "- Depurar o gerenciamento de sessões\n", + "- Verificar se as conversas estão sendo armazenadas em cache\n", + "- Entender qual contexto está disponível para o agente\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Sessão 1: Laboratório de Suporte Assíncrono — Primeira Pergunta\n", + "\n", + "Inicie a sessão `async-support-lab` perguntando sobre padrões de asyncio que sejam compatíveis com telemetria para um web scraper em larga escala. O gráfico já conhece asyncio, aiohttp e práticas de monitoramento, então a resposta deve refletir conversas anteriores enquanto adapta a resposta à nova consulta.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Inspecionar a Memória da Sessão 1 Após a Primeira Troca\n", + "\n", + "Executar `show_history(session_1)` imediatamente após a pergunta inicial confirma que o Cognee gravou tanto o prompt quanto a resposta no Redis. Você deve ver uma entrada com a orientação de concorrência.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Sessão 1: Acompanhamento sobre Modelos de Dados\n", + "\n", + "A seguir, perguntamos: \"Quando devo escolher dataclasses em vez de Pydantic?\" usando o mesmo ID de sessão. Cognee deve reunir os princípios do Python junto com conversas anteriores sobre FastAPI para fornecer conselhos detalhados—demonstrando que o contexto é mantido dentro de uma sessão nomeada.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Confirmar que o Histórico da Sessão 1 Contém Ambos os Turnos\n", + "\n", + "Outra chamada para `show_history(session_1)` deve revelar duas entradas de perguntas e respostas. Isso corresponde à etapa de \"replay de memória\" do laboratório Mem0 e prova que turnos adicionais estendem a mesma transcrição.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Sessão 2: Discussão de Revisão de Design — Nova Sessão\n", + "\n", + "Para mostrar isolamento entre as discussões, iniciamos `design-review-session` e solicitamos orientações de registro para revisões de incidentes. Embora a base de conhecimento subjacente seja a mesma, o novo ID de sessão mantém as transcrições separadas.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Revisão da Sessão 2 de História\n", + "\n", + "`show_history(session_2)` deve listar apenas o par de prompt/resposta da revisão de design. Compare isso com a Sessão 1 para destacar como o Cognee mantém transcrições independentes enquanto reutiliza o grafo de conhecimento compartilhado.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Resumo\n", + "\n", + "Parabéns! Você acabou de dar ao seu assistente de codificação uma camada de memória de longo prazo alimentada pelo Cognee.\n", + "\n", + "Neste tutorial, você pegou conteúdo bruto de desenvolvedores (código, documentos, conversas) e o transformou em um gráfico + memória vetorial que seu agente pode pesquisar, raciocinar e melhorar continuamente.\n", + "\n", + "O que Você Aprendeu\n", + "\n", + "1. **De texto bruto para memória de IA**: Como o Cognee processa dados não estruturados e os transforma em uma memória inteligente e pesquisável usando uma arquitetura combinada de vetor + grafo de conhecimento.\n", + "\n", + "2. **Enriquecimento de grafo com memify**: Como ir além da criação básica de grafos e usar o memify para adicionar fatos derivados e relacionamentos mais ricos ao seu grafo existente.\n", + "\n", + "3. **Múltiplas estratégias de busca**: Como consultar a memória com diferentes tipos de busca (Q&A com consciência de grafo, conclusão no estilo RAG, insights, fragmentos brutos, busca de código, etc.) dependendo do que seu agente precisa.\n", + "\n", + "4. **Exploração visual**: Como inspecionar e depurar o que o Cognee construiu usando visualizações de grafo e a interface do Cognee, para que você possa realmente ver como o conhecimento está estruturado.\n", + "\n", + "5. **Memória sensível à sessão**: Como combinar o contexto de cada sessão com uma memória semântica persistente para que os agentes possam lembrar entre execuções sem vazar informações entre usuários.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Principais Pontos\n", + "1. Memória como um Grafo de Conhecimento apoiado por Embeddings\n", + "\n", + " - **Compreensão estruturada**: Cognee combina um armazenamento vetorial e um armazenamento de grafo, permitindo que seus dados sejam pesquisáveis por significado e conectados por relações. Por padrão, Cognee utiliza bancos de dados baseados em arquivos (LanceDB para vetores, Kuzu para banco de dados de grafos).\n", + "\n", + " - **Recuperação consciente de relações**: As respostas podem ser fundamentadas não apenas em \"texto semelhante\", mas também em como as entidades se relacionam.\n", + "\n", + " - **Memória viva**: A camada de memória evolui, cresce e permanece consultável como um grafo conectado.\n", + "\n", + "2. Modos de Busca e Raciocínio\n", + " - **Recuperação híbrida**: A busca combina similaridade vetorial, estrutura de grafo e raciocínio de LLM, desde a busca de fragmentos brutos até respostas a perguntas conscientes do grafo.\n", + "\n", + " - **Ajuste o modo ao trabalho**: Use modos de estilo de conclusão quando quiser respostas em linguagem natural, e modos de fragmento/resumo/grafo quando seu agente precisar de contexto bruto ou conduzir seu próprio raciocínio.\n", + "\n", + "3. Agentes Personalizados e Conscientes de Sessão\n", + " - **Contexto de sessão + memória de longo prazo**: Cognee mantém o contexto de \"thread\" de curto prazo separado da memória de longo prazo, seja no nível do usuário ou da organização.\n", + "\n", + "## Aplicações no Mundo Real\n", + "\n", + "1. **Agentes de IA Verticais**\n", + "\n", + " Use o padrão deste notebook para criar copilotos inteligentes em domínios específicos que utilizam Cognee como núcleo de recuperação e raciocínio:\n", + "\n", + "- **Copilotos para desenvolvedores**: Assistentes de revisão de código, análise de incidentes e arquitetura que percorrem código, APIs, documentos de design e tickets como um único grafo de memória.\n", + "\n", + "- **Copilotos voltados para clientes**: Agentes de suporte ou sucesso que acessam documentos de produtos, FAQs, notas de CRM e tickets anteriores com recuperação consciente de grafo e respostas citadas.\n", + "\n", + "- **Copilotos especialistas internos**: Assistentes de política, jurídico ou segurança que raciocinam sobre regras interconectadas, diretrizes e decisões históricas, em vez de PDFs isolados.\n", + "\n", + " Cognee é explicitamente posicionado como memória persistente e precisa para agentes de IA, fornecendo um grafo de conhecimento vivo que se integra ao seu agente e substitui combinações ad hoc de armazenamentos vetoriais e código de grafo personalizado.\n", + "\n", + "2. **Unificando Silos de Dados em Uma Memória**\n", + "\n", + " A mesma abordagem também ajuda a construir uma camada de memória unificada a partir de fontes dispersas:\n", + "\n", + "- **De silos para um grafo único**: Ingestão de dados estruturados (por exemplo, bancos de dados) e não estruturados (por exemplo, documentos, chats) em um único grafo apoiado por embeddings, em vez de índices separados para cada sistema.\n", + "\n", + "- **Raciocínio entre fontes com citações**: Execute raciocínio em várias etapas sobre tudo—\"una\" logs, métricas e documentos via o grafo—e ainda assim retorne respostas fundamentadas com proveniência.\n", + "\n", + "- **Hubs de conhecimento**: Para domínios como bancos ou educação, Cognee já é usado para unificar PDFs, sistemas internos e dados de aplicativos em um grafo de conhecimento com vetores, permitindo que agentes respondam perguntas com contexto preciso e citado.\n", + "\n", + "## Próximos Passos\n", + "\n", + "Você implementou o núcleo do loop de memória. Aqui estão extensões naturais que você pode experimentar por conta própria (veja [documentação do Cognee](https://docs.cognee.ai/) para detalhes):\n", + "\n", + "1. **Experimente a consciência temporal**: Ative o \"temporal cognify\" para extrair eventos e marcas de tempo do texto.\n", + "\n", + "2. **Introduza raciocínio baseado em ontologia**: Defina uma ontologia OWL para seu domínio. Use o suporte de ontologia do Cognee para que entidades e relações extraídas sejam fundamentadas nesse esquema, melhorando a qualidade do grafo e respostas específicas do domínio.\n", + "\n", + "3. **Adicione um loop de feedback**: Permita que o Cognee ajuste os pesos das arestas do grafo com base no feedback real dos usuários, para que a recuperação melhore ao longo do tempo em vez de permanecer estática.\n", + "\n", + "4. **Ajuste para personalização e comportamento de sessão**: Use IDs de usuários, locatários e conjuntos de dados para oferecer a cada pessoa ou equipe sua própria visão sobre o motor de memória compartilhado.\n", + "\n", + "5. **Expanda para agentes mais complexos**: Conecte o Cognee a frameworks de agentes para construir sistemas multiagentes que compartilhem a mesma camada de memória. *Microsoft Agent Framework x Cognee plugin está chegando em breve.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte oficial. Para informações críticas, recomenda-se a tradução profissional humana. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:48:40+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "br" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/br/13-agent-memory/README.md b/translations/br/13-agent-memory/README.md index 5d4917451..96ba5fd8b 100644 --- a/translations/br/13-agent-memory/README.md +++ b/translations/br/13-agent-memory/README.md @@ -1,18 +1,18 @@ -# Memória para Agentes de IA +# Memória para Agentes de IA [![Memória do Agente](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.br.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Ao discutir os benefícios únicos de criar agentes de IA, dois aspectos principais são abordados: a capacidade de utilizar ferramentas para realizar tarefas e a habilidade de melhorar ao longo do tempo. A memória é a base para criar agentes autossuficientes que proporcionam experiências melhores para nossos usuários. +Ao discutir os benefícios únicos de criar Agentes de IA, dois pontos principais são abordados: a capacidade de utilizar ferramentas para realizar tarefas e a habilidade de melhorar com o tempo. A memória é a base para criar agentes autossuficientes que proporcionam melhores experiências para nossos usuários. -Nesta lição, vamos explorar o que é memória para agentes de IA e como podemos gerenciá-la e utilizá-la para beneficiar nossas aplicações. +Nesta lição, vamos explorar o que é memória para Agentes de IA e como podemos gerenciá-la e utilizá-la para beneficiar nossas aplicações. ## Introdução @@ -22,23 +22,31 @@ Esta lição abordará: • **Implementando e Armazenando Memória**: Métodos práticos para adicionar capacidades de memória aos seus agentes de IA, com foco em memória de curto e longo prazo. -• **Tornando os Agentes de IA Autossuficientes**: Como a memória permite que os agentes aprendam com interações passadas e melhorem ao longo do tempo. +• **Tornando os Agentes de IA Autossuficientes**: Como a memória permite que os agentes aprendam com interações passadas e melhorem com o tempo. + +## Implementações Disponíveis + +Esta lição inclui dois tutoriais completos em notebooks: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Implementa memória usando Mem0 e Azure AI Search com o framework Semantic Kernel. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Implementa memória estruturada usando Cognee, construindo automaticamente um gráfico de conhecimento baseado em embeddings, visualizando o gráfico e realizando recuperação inteligente. ## Objetivos de Aprendizado Após concluir esta lição, você saberá como: -• **Diferenciar entre os vários tipos de memória de agentes de IA**, incluindo memória de trabalho, de curto prazo e de longo prazo, bem como formas especializadas como memória de persona e episódica. +• **Diferenciar entre os vários tipos de memória de agentes de IA**, incluindo memória de trabalho, curto prazo e longo prazo, além de formas especializadas como memória de persona e episódica. -• **Implementar e gerenciar memória de curto e longo prazo para agentes de IA** usando o framework Semantic Kernel, aproveitando ferramentas como Mem0 e memória Whiteboard, e integrando com o Azure AI Search. +• **Implementar e gerenciar memória de curto e longo prazo para agentes de IA** usando o framework Semantic Kernel, aproveitando ferramentas como Mem0, Cognee, memória de quadro branco e integração com Azure AI Search. • **Compreender os princípios por trás de agentes de IA autossuficientes** e como sistemas robustos de gerenciamento de memória contribuem para aprendizado contínuo e adaptação. ## Entendendo a Memória de Agentes de IA -Em sua essência, **memória para agentes de IA refere-se aos mecanismos que permitem que eles retenham e recuperem informações**. Essas informações podem incluir detalhes específicos de uma conversa, preferências do usuário, ações passadas ou até padrões aprendidos. +No essencial, **memória para agentes de IA refere-se aos mecanismos que permitem que eles retenham e recuperem informações**. Essas informações podem incluir detalhes específicos de uma conversa, preferências do usuário, ações passadas ou até padrões aprendidos. -Sem memória, as aplicações de IA geralmente são sem estado, o que significa que cada interação começa do zero. Isso leva a uma experiência repetitiva e frustrante para o usuário, onde o agente "esquece" o contexto ou as preferências anteriores. +Sem memória, aplicações de IA geralmente são sem estado, o que significa que cada interação começa do zero. Isso leva a uma experiência repetitiva e frustrante, onde o agente "esquece" o contexto ou as preferências anteriores. ### Por que a Memória é Importante? @@ -50,7 +58,7 @@ A inteligência de um agente está profundamente ligada à sua capacidade de lem • **Proativos e Reativos**: Antecipando necessidades ou respondendo adequadamente com base em dados históricos. -• **Autônomos**: Operando de forma mais independente ao utilizar o conhecimento armazenado. +• **Autônomos**: Operando de forma mais independente ao utilizar conhecimento armazenado. O objetivo de implementar memória é tornar os agentes mais **confiáveis e capazes**. @@ -58,13 +66,13 @@ O objetivo de implementar memória é tornar os agentes mais **confiáveis e cap #### Memória de Trabalho -Pense nisso como um pedaço de papel usado pelo agente durante uma única tarefa ou processo de pensamento em andamento. Ele mantém informações imediatas necessárias para calcular o próximo passo. +Pense nisso como um pedaço de papel usado pelo agente durante uma única tarefa ou processo de pensamento. Ele mantém informações imediatas necessárias para calcular o próximo passo. -Para agentes de IA, a memória de trabalho frequentemente captura as informações mais relevantes de uma conversa, mesmo que o histórico completo do chat seja longo ou truncado. Ela se concentra em extrair elementos-chave como requisitos, propostas, decisões e ações. +Para agentes de IA, a memória de trabalho frequentemente captura as informações mais relevantes de uma conversa, mesmo que o histórico completo do chat seja longo ou truncado. Ela foca em extrair elementos-chave como requisitos, propostas, decisões e ações. **Exemplo de Memória de Trabalho** -Em um agente de reserva de viagens, a memória de trabalho pode capturar o pedido atual do usuário, como "Quero reservar uma viagem para Paris". Esse requisito específico é mantido no contexto imediato do agente para orientar a interação atual. +Em um agente de reserva de viagens, a memória de trabalho pode capturar o pedido atual do usuário, como "Quero reservar uma viagem para Paris". Esse requisito específico é mantido no contexto imediato do agente para guiar a interação atual. #### Memória de Curto Prazo @@ -72,7 +80,7 @@ Esse tipo de memória retém informações durante uma única conversa ou sessã **Exemplo de Memória de Curto Prazo** -Se um usuário pergunta: "Quanto custa um voo para Paris?" e depois segue com "E sobre hospedagem lá?", a memória de curto prazo garante que o agente saiba que "lá" se refere a "Paris" dentro da mesma conversa. +Se um usuário pergunta: "Quanto custaria um voo para Paris?" e depois segue com "E sobre hospedagem lá?", a memória de curto prazo garante que o agente saiba que "lá" se refere a "Paris" dentro da mesma conversa. #### Memória de Longo Prazo @@ -84,77 +92,88 @@ Uma memória de longo prazo pode armazenar que "Ben gosta de esquiar e atividade #### Memória de Persona -Esse tipo de memória especializada ajuda um agente a desenvolver uma "personalidade" ou "persona" consistente. Permite que o agente lembre detalhes sobre si mesmo ou seu papel pretendido, tornando as interações mais fluidas e focadas. +Esse tipo de memória especializada ajuda o agente a desenvolver uma "personalidade" ou "persona" consistente. Permite que o agente lembre detalhes sobre si mesmo ou seu papel pretendido, tornando as interações mais fluidas e focadas. **Exemplo de Memória de Persona** - -Se o agente de viagens foi projetado para ser um "especialista em planejamento de esqui", a memória de persona pode reforçar esse papel, influenciando suas respostas para se alinhar ao tom e conhecimento de um especialista. +Se o agente de viagens foi projetado para ser um "especialista em planejamento de esqui", a memória de persona pode reforçar esse papel, influenciando suas respostas para alinhar-se ao tom e conhecimento de um especialista. #### Memória de Fluxo/Episódica -Essa memória armazena a sequência de etapas que um agente realiza durante uma tarefa complexa, incluindo sucessos e falhas. É como lembrar "episódios" específicos ou experiências passadas para aprender com eles. +Essa memória armazena a sequência de passos que um agente realiza durante uma tarefa complexa, incluindo sucessos e falhas. É como lembrar "episódios" específicos ou experiências passadas para aprender com eles. **Exemplo de Memória Episódica** Se o agente tentou reservar um voo específico, mas falhou devido à indisponibilidade, a memória episódica pode registrar essa falha, permitindo que o agente tente voos alternativos ou informe o usuário sobre o problema de forma mais informada em uma tentativa subsequente. -#### Memória de Entidades +#### Memória de Entidade Isso envolve extrair e lembrar entidades específicas (como pessoas, lugares ou coisas) e eventos de conversas. Permite que o agente construa uma compreensão estruturada dos elementos-chave discutidos. -**Exemplo de Memória de Entidades** +**Exemplo de Memória de Entidade** -De uma conversa sobre uma viagem passada, o agente pode extrair "Paris", "Torre Eiffel" e "jantar no restaurante Le Chat Noir" como entidades. Em uma interação futura, o agente pode lembrar "Le Chat Noir" e oferecer fazer uma nova reserva lá. +De uma conversa sobre uma viagem passada, o agente pode extrair "Paris", "Torre Eiffel" e "jantar no restaurante Le Chat Noir" como entidades. Em uma interação futura, o agente pode lembrar "Le Chat Noir" e oferecer-se para fazer uma nova reserva lá. #### RAG Estruturado (Geração Aumentada por Recuperação) -Embora o RAG seja uma técnica mais ampla, o "RAG Estruturado" é destacado como uma tecnologia de memória poderosa. Ele extrai informações densas e estruturadas de várias fontes (conversas, e-mails, imagens) e as utiliza para melhorar a precisão, recuperação e velocidade nas respostas. Diferentemente do RAG clássico, que depende apenas de similaridade semântica, o RAG Estruturado trabalha com a estrutura inerente das informações. +Embora o RAG seja uma técnica mais ampla, o "RAG Estruturado" é destacado como uma tecnologia de memória poderosa. Ele extrai informações densas e estruturadas de várias fontes (conversas, e-mails, imagens) e as utiliza para melhorar a precisão, recuperação e velocidade nas respostas. Diferentemente do RAG clássico que depende apenas de similaridade semântica, o RAG Estruturado trabalha com a estrutura inerente das informações. **Exemplo de RAG Estruturado** -Em vez de apenas corresponder palavras-chave, o RAG Estruturado pode analisar detalhes de voos (destino, data, horário, companhia aérea) de um e-mail e armazená-los de forma estruturada. Isso permite consultas precisas como "Qual voo eu reservei para Paris na terça-feira?" +Em vez de apenas combinar palavras-chave, o RAG Estruturado pode analisar detalhes de voos (destino, data, horário, companhia aérea) de um e-mail e armazená-los de forma estruturada. Isso permite consultas precisas como "Qual voo eu reservei para Paris na terça-feira?" ## Implementando e Armazenando Memória -Implementar memória para agentes de IA envolve um processo sistemático de **gerenciamento de memória**, que inclui gerar, armazenar, recuperar, integrar, atualizar e até "esquecer" (ou excluir) informações. A recuperação é um aspecto particularmente crucial. +Implementar memória para agentes de IA envolve um processo sistemático de **gerenciamento de memória**, que inclui gerar, armazenar, recuperar, integrar, atualizar e até "esquecer" (ou deletar) informações. A recuperação é um aspecto particularmente crucial. ### Ferramentas Especializadas de Memória -Uma maneira de armazenar e gerenciar a memória do agente é usando ferramentas especializadas como Mem0. O Mem0 funciona como uma camada de memória persistente, permitindo que os agentes recuperem interações relevantes, armazenem preferências do usuário e contexto factual, e aprendam com sucessos e falhas ao longo do tempo. A ideia aqui é transformar agentes sem estado em agentes com estado. +#### Mem0 + +Uma maneira de armazenar e gerenciar memória de agentes é usando ferramentas especializadas como Mem0. Mem0 funciona como uma camada de memória persistente, permitindo que os agentes recuperem interações relevantes, armazenem preferências do usuário e contexto factual, e aprendam com sucessos e falhas ao longo do tempo. A ideia aqui é transformar agentes sem estado em agentes com estado. + +Ele opera por meio de um **pipeline de memória em duas fases: extração e atualização**. Primeiro, mensagens adicionadas ao thread do agente são enviadas ao serviço Mem0, que usa um Modelo de Linguagem Grande (LLM) para resumir o histórico de conversas e extrair novas memórias. Posteriormente, uma fase de atualização orientada por LLM determina se deve adicionar, modificar ou excluir essas memórias, armazenando-as em um banco de dados híbrido que pode incluir vetores, gráficos e bancos de dados chave-valor. Este sistema também suporta vários tipos de memória e pode incorporar memória gráfica para gerenciar relações entre entidades. + +#### Cognee + +Outra abordagem poderosa é usar **Cognee**, uma memória semântica de código aberto para agentes de IA que transforma dados estruturados e não estruturados em gráficos de conhecimento consultáveis, apoiados por embeddings. Cognee fornece uma **arquitetura de armazenamento duplo** que combina busca por similaridade vetorial com relações gráficas, permitindo que os agentes entendam não apenas o que é semelhante, mas como os conceitos se relacionam. + +Ele se destaca em **recuperação híbrida**, que mistura similaridade vetorial, estrutura gráfica e raciocínio LLM - desde a busca de fragmentos brutos até respostas a perguntas conscientes do gráfico. O sistema mantém uma **memória viva** que evolui e cresce enquanto permanece consultável como um gráfico conectado, suportando tanto o contexto de sessão de curto prazo quanto a memória persistente de longo prazo. -Ele opera por meio de um **pipeline de memória em duas fases: extração e atualização**. Primeiro, as mensagens adicionadas ao thread do agente são enviadas ao serviço Mem0, que usa um Large Language Model (LLM) para resumir o histórico de conversas e extrair novas memórias. Posteriormente, uma fase de atualização orientada por LLM determina se deve adicionar, modificar ou excluir essas memórias, armazenando-as em um banco de dados híbrido que pode incluir vetores, grafos e bancos de dados chave-valor. Este sistema também suporta vários tipos de memória e pode incorporar memória gráfica para gerenciar relações entre entidades. +O tutorial em notebook Cognee ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) demonstra a construção dessa camada de memória unificada, com exemplos práticos de ingestão de diversas fontes de dados, visualização do gráfico de conhecimento e consulta com diferentes estratégias de busca adaptadas às necessidades específicas do agente. ### Armazenando Memória com RAG Além de ferramentas especializadas de memória como Mem0, você pode aproveitar serviços de busca robustos como **Azure AI Search como backend para armazenar e recuperar memórias**, especialmente para RAG estruturado. -Isso permite que você baseie as respostas do agente em seus próprios dados, garantindo respostas mais relevantes e precisas. O Azure AI Search pode ser usado para armazenar memórias específicas de viagens de usuários, catálogos de produtos ou qualquer outro conhecimento específico de domínio. +Isso permite que você baseie as respostas do agente em seus próprios dados, garantindo respostas mais relevantes e precisas. O Azure AI Search pode ser usado para armazenar memórias específicas de usuários sobre viagens, catálogos de produtos ou qualquer outro conhecimento específico de domínio. -O Azure AI Search suporta capacidades como **RAG Estruturado**, que se destaca na extração e recuperação de informações densas e estruturadas de grandes conjuntos de dados, como históricos de conversas, e-mails ou até imagens. Isso proporciona "precisão e recuperação sobre-humanas" em comparação com abordagens tradicionais de fragmentação de texto e incorporação. +O Azure AI Search suporta capacidades como **RAG Estruturado**, que se destaca em extrair e recuperar informações densas e estruturadas de grandes conjuntos de dados como históricos de conversas, e-mails ou até imagens. Isso proporciona "precisão e recuperação sobre-humanas" em comparação com abordagens tradicionais de fragmentação de texto e embeddings. ## Tornando os Agentes de IA Autossuficientes -Um padrão comum para agentes autossuficientes envolve a introdução de um **"agente de conhecimento"**. Este agente separado observa a conversa principal entre o usuário e o agente primário. Seu papel é: +Um padrão comum para agentes autossuficientes envolve introduzir um **"agente de conhecimento"**. Este agente separado observa a conversa principal entre o usuário e o agente primário. Seu papel é: -1. **Identificar informações valiosas**: Determinar se alguma parte da conversa vale a pena ser salva como conhecimento geral ou preferência específica do usuário. +1. **Identificar informações valiosas**: Determinar se alguma parte da conversa vale a pena ser salva como conhecimento geral ou uma preferência específica do usuário. 2. **Extrair e resumir**: Destilar o aprendizado ou preferência essencial da conversa. -3. **Armazenar em uma base de conhecimento**: Persistir essas informações extraídas, frequentemente em um banco de dados vetorial, para que possam ser recuperadas posteriormente. +3. **Armazenar em uma base de conhecimento**: Persistir essa informação extraída, frequentemente em um banco de dados vetorial, para que possa ser recuperada posteriormente. -4. **Aumentar consultas futuras**: Quando o usuário inicia uma nova consulta, o agente de conhecimento recupera informações armazenadas relevantes e as adiciona ao prompt do usuário, fornecendo contexto crucial ao agente primário (similar ao RAG). +4. **Aumentar consultas futuras**: Quando o usuário inicia uma nova consulta, o agente de conhecimento recupera informações armazenadas relevantes e as adiciona ao prompt do usuário, fornecendo contexto crucial ao agente primário (semelhante ao RAG). ### Otimizações para Memória -• **Gerenciamento de Latência**: Para evitar atrasos nas interações do usuário, um modelo mais barato e rápido pode ser usado inicialmente para verificar rapidamente se as informações são valiosas para armazenar ou recuperar, invocando o processo de extração/recuperação mais complexo apenas quando necessário. +• **Gerenciamento de Latência**: Para evitar atrasos nas interações do usuário, um modelo mais barato e rápido pode ser usado inicialmente para verificar rapidamente se a informação é valiosa para armazenar ou recuperar, invocando o processo de extração/recuperação mais complexo apenas quando necessário. • **Manutenção da Base de Conhecimento**: Para uma base de conhecimento em crescimento, informações menos utilizadas podem ser movidas para "armazenamento frio" para gerenciar custos. ## Tem Mais Perguntas Sobre Memória de Agentes? -Participe do [Discord do Azure AI Foundry](https://aka.ms/ai-agents/discord) para se conectar com outros aprendizes, participar de horários de atendimento e tirar suas dúvidas sobre agentes de IA. +Participe do [Discord do Azure AI Foundry](https://aka.ms/ai-agents/discord) para se conectar com outros aprendizes, participar de horários de atendimento e tirar suas dúvidas sobre Agentes de IA. --- + **Aviso Legal**: -Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte oficial. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução. \ No newline at end of file +Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional feita por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução. + \ No newline at end of file diff --git a/translations/cs/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/cs/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..e93b9de4f --- /dev/null +++ b/translations/cs/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Vytváření AI agentů s trvalou pamětí pomocí Cognee\n", + "\n", + "Tento notebook ukazuje, jak vytvořit inteligentní AI agenty s pokročilými schopnostmi paměti pomocí [**cognee**](https://www.cognee.ai/) - open source AI paměti, která kombinuje znalostní grafy, sémantické vyhledávání a správu relací pro vytvoření kontextově uvědomělých AI systémů.\n", + "\n", + "## 🎯 Cíle učení\n", + "\n", + "Na konci tohoto tutoriálu budete rozumět, jak:\n", + "- **Vytvářet znalostní grafy podporované embeddingy**: Převádět nestrukturovaný text na strukturované, dotazovatelné znalosti\n", + "- **Implementovat paměť relací**: Vytvářet vícekrokové konverzace s automatickým uchováním kontextu\n", + "- **Ukládat konverzace**: Volitelně uchovávat důležité interakce v dlouhodobé paměti pro budoucí použití\n", + "- **Dotazovat se pomocí přirozeného jazyka**: Přistupovat k historickému kontextu a využívat ho v nových konverzacích\n", + "- **Vizualizovat paměť**: Prozkoumávat vztahy ve znalostním grafu vašeho agenta\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Co vytvoříte\n", + "\n", + "V tomto tutoriálu vytvoříme **Asistenta pro programování** s trvalou pamětí, který:\n", + "\n", + "### 1. **Vytváření znalostní báze**\n", + " - Zpracovává informace o profilu a odbornosti vývojáře\n", + " - Analyzuje principy a osvědčené postupy programování v Pythonu\n", + " - Ukládá historické konverzace mezi vývojáři a AI asistenty\n", + "\n", + "### 2. **Konverzace s povědomím o relaci**\n", + " - Udržuje kontext napříč více otázkami v rámci jedné relace\n", + " - Automaticky ukládá každou dvojici otázka/odpověď pro efektivní vyhledávání\n", + " - Poskytuje koherentní a kontextové odpovědi na základě historie konverzace\n", + "\n", + "### 3. **Dlouhodobá paměť**\n", + " - Ukládá důležité konverzace do dlouhodobé paměti\n", + " - Získává relevantní vzpomínky ze znalostní báze a minulých relací pro informování nových interakcí\n", + " - Buduje rostoucí znalostní bázi, která se časem zlepšuje\n", + "\n", + "### 4. **Inteligentní vyhledávání v paměti**\n", + " - Používá grafově orientované sémantické vyhledávání k nalezení relevantních informací ve všech uložených znalostech\n", + " - Filtruje vyhledávání podle podskupin dat (informace o vývojáři vs. principy)\n", + " - Kombinuje více zdrojů dat pro poskytování komplexních odpovědí\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Předpoklady a nastavení\n", + "\n", + "### Systémové požadavky\n", + "\n", + "Před začátkem se ujistěte, že máte:\n", + "\n", + "1. **Python prostředí**\n", + " - Python 3.9 nebo novější\n", + " - Virtuální prostředí (doporučeno)\n", + " \n", + "2. **Redis Cache** (Požadováno pro správu relací)\n", + " - Lokální Redis: `docker run -d -p 6379:6379 redis`\n", + " - Nebo použijte spravovanou službu Redis\n", + " \n", + "3. **Přístup k LLM API**\n", + " - OpenAI API klíč nebo jiní poskytovatelé (viz [dokumentace](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Konfigurace databáze**\n", + " - Ve výchozím nastavení není nutná žádná konfigurace. Cognee používá databáze založené na souborech (LanceDB a Kuzu)\n", + " - Volitelně můžete nastavit Azure AI Search jako úložiště vektorů (viz [dokumentace](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Konfigurace prostředí\n", + "\n", + "Vytvořte soubor `.env` ve vašem projektovém adresáři s následujícími proměnnými:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Pochopení paměťové architektury Cognee\n", + "\n", + "### Jak Cognee funguje\n", + "\n", + "Cognee poskytuje sofistikovaný paměťový systém, který přesahuje jednoduché ukládání klíč-hodnota:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Klíčové komponenty:\n", + "\n", + "1. **Knowledge Graph**: Ukládá entity, vztahy a sémantické propojení\n", + "2. **Vector Embeddings**: Umožňuje sémantické vyhledávání ve všech uložených informacích\n", + "3. **Session Cache**: Udržuje kontext konverzace v rámci i mezi jednotlivými sezeními\n", + "4. **NodeSets**: Organizují data do logických kategorií pro cílené vyhledávání\n", + "\n", + "### Typy paměti v tomto tutoriálu:\n", + "\n", + "- **Persistent Memory**: Dlouhodobé ukládání v knowledge graphu\n", + "- **Session Memory**: Dočasný kontext konverzace v Redis cache\n", + "- **Semantic Memory**: Sémantické vyhledávání na základě podobnosti napříč všemi daty\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Instalace požadovaných balíčků\n", + "\n", + "Nainstalujte Cognee s podporou Redis pro správu relací:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Inicializace prostředí a načtení knihoven\n", + "\n", + "Ujistěte se, že:\n", + "1. Redis běží (např. pomocí Dockeru: `docker run -d -p 6379:6379 redis`)\n", + "2. Proměnné prostředí jsou nastaveny před importem modulů pro cache\n", + "3. Pokud je to potřeba, restartujte jádro a spusťte buňky v pořadí\n", + "\n", + "Následující buňka provede:\n", + "1. Načtení proměnných prostředí z `.env`\n", + "2. Konfiguraci Cognee s vaším nastavením LLM\n", + "3. Povolení cache pro správu relací\n", + "4. Ověření, že všechny komponenty jsou správně propojeny\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Nastavení úložných adresářů\n", + "\n", + "Cognee používá dva samostatné adresáře pro své operace:\n", + "- **Kořen dat**: Ukládá nahrané dokumenty a zpracovaná data\n", + "- **Kořen systému**: Obsahuje databázi znalostního grafu a systémová metadata\n", + "\n", + "Pro tento návod vytvoříme oddělené adresáře následujícím způsobem:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Obnovení stavu paměti\n", + "\n", + "Než začneme budovat náš paměťový systém, ujistěme se, že začínáme s čistým štítem.\n", + "\n", + "> 💡 **Tip**: Tento krok můžete přeskočit, pokud si chcete zachovat stávající vzpomínky z předchozích spuštění při pozdějším použití tohoto notebooku.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Část 1: Vytváření znalostní báze\n", + "\n", + "### Zdroje dat pro našeho asistenta vývojářů\n", + "\n", + "Pro vytvoření komplexní znalostní báze budeme zpracovávat tři typy dat:\n", + "\n", + "1. **Profil vývojáře**: Osobní odborné znalosti a technické zázemí\n", + "2. **Nejlepší postupy v Pythonu**: Zen Pythonu s praktickými pokyny\n", + "3. **Historické konverzace**: Minulé Q&A mezi vývojáři a AI asistenty\n", + "\n", + "Tato různorodá data umožní našemu agentovi:\n", + "- Pochopit technický kontext uživatele\n", + "- Uplatňovat nejlepší postupy při doporučeních\n", + "- Učit se z předchozích úspěšných interakcí\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Zpracování dat do znalostního grafu\n", + "\n", + "Nyní převedeme náš surový text do strukturované paměti. Tento proces:\n", + "\n", + "1. **Přidává data do NodeSets**: Organizuje informace do logických kategorií\n", + " - `developer_data`: Profil vývojáře a konverzace\n", + " - `principles_data`: Nejlepší postupy a pokyny pro Python\n", + "\n", + "2. **Spouští Cognify Pipeline**: Extrahuje entity, vztahy a vytváří vektory\n", + " - Identifikuje klíčové koncepty\n", + " - Vytváří sémantické spojení mezi souvisejícími informacemi\n", + " - Generuje vektorové reprezentace\n", + "\n", + "Tento proces může chvíli trvat, protože LLM zpracovává text a vytváří strukturu grafu:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Vizualizace znalostního grafu\n", + "\n", + "Pojďme prozkoumat strukturu našeho znalostního grafu. Vizualizace ukazuje:\n", + "- **Uzly**: Entity extrahované z textu (koncepty, technologie, lidé)\n", + "- **Hrany**: Vztahy a spojení mezi entitami\n", + "- **Shluky**: Související koncepty seskupené podle sémantické podobnosti\n", + "\n", + "Otevřete vygenerovaný HTML soubor ve svém prohlížeči a interaktivně prozkoumejte graf:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Obohaťte paměť s Memify\n", + "\n", + "Funkce `memify()` analyzuje znalostní graf a generuje inteligentní pravidla o datech. Tento proces:\n", + "- Identifikuje vzory a osvědčené postupy\n", + "- Vytváří praktické pokyny na základě obsahu\n", + "- Navazuje vztahy mezi různými oblastmi znalostí\n", + "\n", + "Tato pravidla pomáhají agentovi činit informovanější rozhodnutí při odpovídání na otázky. Zachycení druhé vizualizace vám umožní porovnat, jak se graf zahušťuje po obohacení.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Část 2: Inteligentní vyhledávání v paměti\n", + "\n", + "### Ukázka 1: Integrace znalostí napříč dokumenty\n", + "\n", + "Nyní, když je náš znalostní graf vytvořen, otestujeme, jak Cognee kombinuje informace z více zdrojů k zodpovězení složitých otázek.\n", + "\n", + "První dotaz ukazuje:\n", + "- **Sémantické porozumění**: Nalezení relevantních konceptů, i když nejsou výslovně zmíněny\n", + "- **Křížové odkazování**: Kombinace profilu vývojáře se zásadami Pythonu\n", + "- **Kontekstuální uvažování**: Aplikace osvědčených postupů na konkrétní implementace\n", + "\n", + "### Ukázka 2: Filtrované vyhledávání s NodeSets\n", + "\n", + "Druhý dotaz ukazuje, jak cílit na konkrétní podmnožiny znalostního grafu:\n", + "- Používá parametr `node_name` k vyhledávání pouze v rámci `principles_data`\n", + "- Poskytuje zaměřené odpovědi z konkrétní znalostní oblasti\n", + "- Užitečné, když potřebujete informace specifické pro danou oblast\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Část 3: Nastavení správy relací\n", + "\n", + "### Povolení paměti konverzace\n", + "\n", + "Správa relací je klíčová pro udržení kontextu napříč více interakcemi. Zde provedeme:\n", + "\n", + "1. **Inicializace uživatelského kontextu**: Vytvoření nebo načtení uživatelského profilu pro sledování relací\n", + "2. **Konfigurace cache enginu**: Připojení k Redis pro ukládání historie konverzací\n", + "3. **Povolení proměnných relace**: Nastavení kontextových proměnných, které přetrvávají mezi dotazy\n", + "\n", + "> ⚠️ **Důležité**: To vyžaduje spuštěný Redis a `CACHING=true` ve vašem prostředí\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Pomocná funkce: Zobrazení historie relace\n", + "\n", + "Tato užitečná funkce nám umožňuje prohlížet historii konverzace uloženou v Redis. Je užitečná pro:\n", + "- Ladění správy relací\n", + "- Ověření, že konverzace jsou ukládány do mezipaměti\n", + "- Pochopení, jaký kontext je agentovi k dispozici\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Sezení 1: Laboratoř podpory asynchronního programování — První otázka\n", + "\n", + "Začněte sezení `async-support-lab` položením otázky na telemetrii přívětivé vzory asyncio pro masivní webový scraper. Graf už zná asyncio, aiohttp a monitorovací postupy, takže odpověď by měla odrážet předchozí konverzace a zároveň přizpůsobit odpověď novému dotazu.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Kontrola paměti relace 1 po první výměně\n", + "\n", + "Spuštění `show_history(session_1)` ihned po úvodní otázce potvrdí, že Cognee zapsal jak zadání, tak odpověď do Redis. Měli byste vidět jeden záznam s pokyny pro souběžnost.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Sezení 1: Následná diskuse o datových modelech\n", + "\n", + "Dále se ptáme: „Kdy bych měl zvolit dataclasses oproti Pydantic?“ s použitím stejného ID sezení. Cognee by měl propojit principy Pythonu spolu s předchozími diskusemi o FastAPI, aby poskytl detailní rady – ukazující, že kontext se přenáší v rámci pojmenovaného sezení.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Potvrďte, že historie relace 1 obsahuje oba kroky\n", + "\n", + "Další volání `show_history(session_1)` by mělo odhalit dva záznamy otázek a odpovědí. To odpovídá kroku \"přehrání paměti\" v laboratoři Mem0 a dokazuje, že další kroky rozšiřují stejný přepis.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Relace 2: Vlákno pro kontrolu návrhu — Nová relace\n", + "\n", + "Abychom ukázali izolaci mezi vlákny, spouštíme `design-review-session` a žádáme o pokyny k protokolování pro přezkumy incidentů. I když je základní znalostní báze stejná, nové ID relace udržuje přepisy oddělené.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Revize relace 2 Historie\n", + "\n", + "`show_history(session_2)` by měl zobrazit pouze dvojici výzva/odpověď z designové revize. Porovnejte to s relací 1, abyste zdůraznili, jak Cognee udržuje nezávislé přepisy a zároveň znovu využívá sdílený znalostní graf.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Shrnutí\n", + "\n", + "Gratulujeme! Právě jste svému programátorskému asistentovi přidali skutečnou vrstvu dlouhodobé paměti poháněnou Cognee.\n", + "\n", + "V tomto tutoriálu jste vzali surový obsah pro vývojáře (kód, dokumentaci, chaty) a přeměnili jej na graf + vektorovou paměť, kterou váš agent může prohledávat, analyzovat a neustále zlepšovat.\n", + "\n", + "Co jste se naučili\n", + "\n", + "1. **Od surového textu k AI paměti**: Jak Cognee zpracovává nestrukturovaná data a přeměňuje je na inteligentní, prohledávatelnou paměť pomocí kombinované architektury vektorů a znalostního grafu.\n", + "\n", + "2. **Obohacení grafu pomocí memify**: Jak jít nad rámec základního vytváření grafu a použít memify k přidání odvozených faktů a bohatších vztahů do vašeho stávajícího grafu.\n", + "\n", + "3. **Různé strategie vyhledávání**: Jak dotazovat paměť pomocí různých typů vyhledávání (dotazy s povědomím o grafu, dokončování ve stylu RAG, přehledy, surové části, vyhledávání kódu atd.) podle potřeb vašeho agenta.\n", + "\n", + "4. **Vizualizace a průzkum**: Jak zkontrolovat a ladit, co Cognee vytvořilo, pomocí vizualizací grafů a uživatelského rozhraní Cognee, abyste mohli skutečně vidět, jak je znalost strukturována.\n", + "\n", + "5. **Paměť s ohledem na relace**: Jak kombinovat kontext jednotlivých relací s trvalou sémantickou pamětí, aby si agenti mohli pamatovat mezi jednotlivými spuštěními, aniž by docházelo k úniku informací mezi uživateli.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Klíčové poznatky\n", + "1. Paměť jako znalostní graf podporovaný vektory\n", + "\n", + " - **Strukturované porozumění**: Cognee kombinuje úložiště vektorů a grafové úložiště, takže vaše data jsou vyhledatelná jak podle významu, tak podle vztahů. Cognee standardně používá databáze založené na souborech (LanceDB pro vektorové databáze, Kuzu pro grafové databáze).\n", + "\n", + " - **Vyhledávání s ohledem na vztahy**: Odpovědi mohou být založeny nejen na „podobném textu“, ale také na tom, jak spolu entity souvisejí.\n", + "\n", + " - **Živá paměť**: Vrstva paměti se vyvíjí, roste a zůstává dotazovatelná jako jeden propojený graf.\n", + "\n", + "2. Režimy vyhledávání a uvažování\n", + " - **Hybridní vyhledávání**: Vyhledávání kombinuje podobnost vektorů, strukturu grafu a uvažování LLM, od vyhledávání surových částí až po dotazování s ohledem na graf.\n", + "\n", + " - **Přizpůsobení režimu úkolu**: Používejte režimy ve stylu dokončování, když chcete odpovědi v přirozeném jazyce, a režimy částí/souhrnů/grafů, když váš agent potřebuje surový kontext nebo chce řídit své vlastní uvažování.\n", + "\n", + "3. Personalizovaní agenti s povědomím o relaci\n", + " - **Kontext relace + dlouhodobá paměť**: Cognee odděluje krátkodobý kontext „vlákna“ od dlouhodobé paměti na úrovni uživatele nebo organizace.\n", + "\n", + "## Reálné aplikace\n", + "\n", + "1. **Vertikální AI agenti**\n", + "\n", + " Použijte vzor z tohoto notebooku k vytvoření doménově inteligentních kopilotů, kteří využívají Cognee jako jádro pro vyhledávání a uvažování:\n", + "\n", + "- **Kopiloti pro vývojáře**: Asistenti pro kontrolu kódu, analýzu incidentů a architekturu, kteří procházejí kód, API, návrhové dokumenty a tikety jako jeden paměťový graf.\n", + "\n", + "- **Kopiloti pro zákazníky**: Podpora nebo asistenti úspěchu, kteří čerpají z produktové dokumentace, FAQ, poznámek CRM a minulých tiketů s vyhledáváním s ohledem na graf a citovanými odpověďmi.\n", + "\n", + "- **Interní expertní kopiloti**: Asistenti pro politiku, právo nebo bezpečnost, kteří uvažují nad propojenými pravidly, směrnicemi a historickými rozhodnutími místo izolovaných PDF.\n", + "\n", + " Cognee je výslovně navrženo jako trvalá, přesná paměť pro AI agenty, poskytující živý znalostní graf, který se integruje za vašeho agenta a nahrazuje ad-hoc kombinace úložišť vektorů a vlastního grafového kódu.\n", + "\n", + "2. **Sjednocení datových sil do jedné paměti**\n", + "\n", + " Stejný přístup vám také pomůže vytvořit sjednocenou paměťovou vrstvu napříč rozptýlenými zdroji:\n", + "\n", + "- **Od sil k jednomu grafu**: Načtěte strukturovaná (např. databáze) a nestrukturovaná data (např. dokumenty, chaty) do jednoho grafu podporovaného vektory, místo oddělených indexů pro každý systém.\n", + "\n", + "- **Mezi-zdrojové uvažování s citacemi**: Proveďte vícekrokové uvažování nad vším – „propojte“ logy, metriky a dokumenty prostřednictvím grafu – a stále vracejte odpovědi s doložením původu.\n", + "\n", + "- **Centra znalostí**: Pro oblasti jako bankovnictví nebo vzdělávání je Cognee již využíváno k sjednocení PDF, interních systémů a dat aplikací do jednoho znalostního grafu s vektory, aby agenti mohli odpovídat na otázky s přesným, citovaným kontextem.\n", + "\n", + "## Další kroky\n", + "\n", + "Implementovali jste základní paměťovou smyčku. Zde jsou přirozená rozšíření, která si můžete vyzkoušet sami (viz [dokumentace Cognee](https://docs.cognee.ai/) pro podrobnosti):\n", + "\n", + "1. **Experimentujte s časovým povědomím**: Zapněte časové zpracování, abyste extrahovali události a časové značky z textu.\n", + "\n", + "2. **Zaveďte uvažování řízené ontologií**: Definujte OWL ontologii pro vaši doménu. Použijte podporu ontologií Cognee, aby extrahované entity a vztahy byly ukotveny v tomto schématu, což zlepší kvalitu grafu a odpovědi specifické pro danou doménu.\n", + "\n", + "3. **Přidejte zpětnovazební smyčku**: Nechte Cognee upravovat váhy hran grafu na základě skutečné zpětné vazby uživatelů, aby se vyhledávání časem zlepšovalo místo toho, aby zůstalo statické.\n", + "\n", + "4. **Vylaďte personalizaci a chování relací**: Použijte ID uživatelů, nájemce a datové sady, abyste každé osobě nebo týmu poskytli vlastní pohled na sdílený paměťový engine.\n", + "\n", + "5. **Rozšiřte na složitější agenty**: Připojte Cognee k rámcům agentů, abyste vytvořili systémy s více agenty, které všechny sdílejí stejnou paměťovou vrstvu. *Microsoft Agent Framework x Cognee plugin brzy k dispozici.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Prohlášení**: \nTento dokument byl přeložen pomocí služby AI pro překlady [Co-op Translator](https://github.com/Azure/co-op-translator). I když se snažíme o přesnost, mějte prosím na paměti, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za autoritativní zdroj. Pro důležité informace se doporučuje profesionální lidský překlad. Neodpovídáme za žádná nedorozumění nebo nesprávné interpretace vyplývající z použití tohoto překladu.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:25:40+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "cs" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/cs/13-agent-memory/README.md b/translations/cs/13-agent-memory/README.md index 59196a921..93dac5dd6 100644 --- a/translations/cs/13-agent-memory/README.md +++ b/translations/cs/13-agent-memory/README.md @@ -1,16 +1,16 @@ -# Paměť pro AI agenty -[![Paměť agentů](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.cs.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) +# Paměť pro AI agenty +[![Paměť agenta](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.cs.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Při diskusi o unikátních výhodách vytváření AI agentů se nejčastěji zmiňují dvě věci: schopnost využívat nástroje k plnění úkolů a schopnost se zlepšovat v průběhu času. Paměť je základem pro vytváření samo-zlepšujících se agentů, kteří mohou poskytovat lepší zážitky našim uživatelům. +Při diskusi o unikátních výhodách vytváření AI agentů se nejčastěji zmiňují dvě věci: schopnost využívat nástroje k plnění úkolů a schopnost se zlepšovat v průběhu času. Paměť je základem pro vytvoření samo-zlepšujícího se agenta, který dokáže poskytovat lepší zážitky našim uživatelům. V této lekci se podíváme na to, co je paměť pro AI agenty, jak ji můžeme spravovat a využívat ve prospěch našich aplikací. @@ -18,25 +18,33 @@ V této lekci se podíváme na to, co je paměť pro AI agenty, jak ji můžeme Tato lekce pokryje: -• **Porozumění paměti AI agentů**: Co je paměť a proč je pro agenty nezbytná. +• **Porozumění paměti AI agenta**: Co je paměť a proč je pro agenty nezbytná. • **Implementace a ukládání paměti**: Praktické metody pro přidání paměťových schopností vašim AI agentům, se zaměřením na krátkodobou a dlouhodobou paměť. • **Vytváření samo-zlepšujících se AI agentů**: Jak paměť umožňuje agentům učit se z minulých interakcí a zlepšovat se v průběhu času. +## Dostupné implementace + +Tato lekce obsahuje dvě komplexní tutoriály v podobě notebooků: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Implementuje paměť pomocí Mem0 a Azure AI Search s frameworkem Semantic Kernel. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Implementuje strukturovanou paměť pomocí Cognee, automaticky vytváří znalostní graf podporovaný embeddingy, vizualizuje graf a inteligentně vyhledává. + ## Cíle učení Po dokončení této lekce budete vědět, jak: -• **Rozlišovat mezi různými typy paměti AI agentů**, včetně pracovní, krátkodobé a dlouhodobé paměti, stejně jako specializovaných forem, jako je paměť osobnosti a epizodická paměť. +• **Rozlišovat mezi různými typy paměti AI agenta**, včetně pracovní, krátkodobé a dlouhodobé paměti, stejně jako specializovaných forem, jako je paměť osobnosti a epizodická paměť. -• **Implementovat a spravovat krátkodobou a dlouhodobou paměť pro AI agenty** pomocí frameworku Semantic Kernel, využívat nástroje jako Mem0 a Whiteboard memory a integrovat je s Azure AI Search. +• **Implementovat a spravovat krátkodobou a dlouhodobou paměť pro AI agenty** pomocí frameworku Semantic Kernel, využívat nástroje jako Mem0, Cognee, Whiteboard memory a integraci s Azure AI Search. • **Porozumět principům samo-zlepšujících se AI agentů** a jak robustní systémy správy paměti přispívají k neustálému učení a adaptaci. -## Porozumění paměti AI agentů +## Porozumění paměti AI agenta -V jádru **paměť AI agentů odkazuje na mechanismy, které jim umožňují uchovávat a vybavovat si informace**. Tyto informace mohou zahrnovat specifické detaily o konverzaci, uživatelské preference, minulé akce nebo dokonce naučené vzory. +V jádru **paměť AI agenta odkazuje na mechanismy, které mu umožňují uchovávat a vybavovat si informace**. Tyto informace mohou zahrnovat konkrétní detaily o konverzaci, uživatelské preference, minulé akce nebo dokonce naučené vzory. Bez paměti jsou AI aplikace často bezstavové, což znamená, že každá interakce začíná od nuly. To vede k opakovanému a frustrujícímu uživatelskému zážitku, kdy agent "zapomíná" předchozí kontext nebo preference. @@ -72,7 +80,7 @@ Tento typ paměti uchovává informace po dobu jedné konverzace nebo relace. Je **Příklad krátkodobé paměti** -Pokud se uživatel zeptá: "Kolik by stál let do Paříže?" a poté pokračuje: "A co ubytování tam?", krátkodobá paměť zajistí, že agent ví, že "tam" odkazuje na "Paříž" v rámci stejné konverzace. +Pokud se uživatel zeptá: "Kolik by stál let do Paříže?" a následně pokračuje: "A co ubytování tam?", krátkodobá paměť zajistí, že agent ví, že "tam" odkazuje na "Paříž" v rámci stejné konverzace. #### Dlouhodobá paměť @@ -87,12 +95,11 @@ Dlouhodobá paměť může uchovávat, že "Ben má rád lyžování a outdoorov Tento specializovaný typ paměti pomáhá agentovi rozvíjet konzistentní "osobnost" nebo "roli". Umožňuje agentovi pamatovat si detaily o sobě nebo své zamýšlené roli, což činí interakce plynulejšími a zaměřenějšími. **Příklad paměti osobnosti** +Pokud je cestovní agent navržen jako "expert na plánování lyžařských výletů", paměť osobnosti může posílit tuto roli, ovlivňovat jeho odpovědi tak, aby odpovídaly tónu a znalostem experta. -Pokud je cestovní agent navržen jako "expert na plánování lyžařských výletů", paměť osobnosti může posilovat tuto roli, ovlivňovat jeho odpovědi tak, aby odpovídaly tónu a znalostem experta. - -#### Workflow/Epizodická paměť +#### Paměť pracovního postupu/epizodická paměť -Tato paměť uchovává sekvenci kroků, které agent podniká během složitého úkolu, včetně úspěchů a neúspěchů. Je to jako pamatovat si specifické "epizody" nebo minulé zkušenosti, aby se z nich mohl učit. +Tato paměť uchovává sekvenci kroků, které agent podniká během složitého úkolu, včetně úspěchů a neúspěchů. Je to jako pamatovat si konkrétní "epizody" nebo minulé zkušenosti, aby se z nich mohl učit. **Příklad epizodické paměti** @@ -100,15 +107,15 @@ Pokud se agent pokusil rezervovat konkrétní let, ale neuspěl kvůli nedostupn #### Paměť entit -Tato paměť zahrnuje extrakci a zapamatování specifických entit (jako jsou lidé, místa nebo věci) a událostí z konverzací. Umožňuje agentovi vytvořit strukturované porozumění klíčovým prvkům, o kterých se diskutuje. +Tato paměť zahrnuje extrakci a zapamatování konkrétních entit (jako jsou lidé, místa nebo věci) a událostí z konverzací. Umožňuje agentovi vytvořit strukturované porozumění klíčovým prvkům, o kterých se diskutovalo. **Příklad paměti entit** -Z konverzace o minulém výletu by agent mohl extrahovat "Paříž", "Eiffelova věž" a "večeře v restauraci Le Chat Noir" jako entity. Při budoucí interakci by si agent mohl vzpomenout na "Le Chat Noir" a nabídnout rezervaci tam. +Z konverzace o minulém výletu by agent mohl extrahovat "Paříž", "Eiffelova věž" a "večeře v restauraci Le Chat Noir" jako entity. Při budoucí interakci by si agent mohl vybavit "Le Chat Noir" a nabídnout rezervaci tam. #### Strukturovaný RAG (Retrieval Augmented Generation) -Zatímco RAG je širší technika, "Strukturovaný RAG" je zdůrazněn jako výkonná paměťová technologie. Extrahuje husté, strukturované informace z různých zdrojů (konverzací, e-mailů, obrázků) a využívá je ke zvýšení přesnosti, vybavení a rychlosti odpovědí. Na rozdíl od klasického RAG, který se spoléhá pouze na sémantickou podobnost, Strukturovaný RAG pracuje se samotnou strukturou informací. +Zatímco RAG je širší technika, "Strukturovaný RAG" je zdůrazněn jako výkonná paměťová technologie. Extrahuje husté, strukturované informace z různých zdrojů (konverzací, e-mailů, obrázků) a používá je ke zvýšení přesnosti, vybavení a rychlosti odpovědí. Na rozdíl od klasického RAG, který se spoléhá pouze na sémantickou podobnost, Strukturovaný RAG pracuje s inherentní strukturou informací. **Příklad strukturovaného RAG** @@ -116,45 +123,57 @@ Místo pouhého shody klíčových slov by Strukturovaný RAG mohl analyzovat de ## Implementace a ukládání paměti -Implementace paměti pro AI agenty zahrnuje systematický proces **správy paměti**, který zahrnuje generování, ukládání, vybavování, integraci, aktualizaci a dokonce "zapomínání" (nebo mazání) informací. Vybavování je obzvláště klíčovým aspektem. +Implementace paměti pro AI agenty zahrnuje systematický proces **správy paměti**, který zahrnuje generování, ukládání, vyhledávání, integraci, aktualizaci a dokonce "zapomínání" (nebo mazání) informací. Vyhledávání je obzvláště klíčovým aspektem. ### Specializované nástroje pro paměť -Jedním ze způsobů, jak ukládat a spravovat paměť agenta, je použití specializovaných nástrojů, jako je Mem0. Mem0 funguje jako vrstva trvalé paměti, která umožňuje agentům vybavovat si relevantní interakce, ukládat uživatelské preference a faktický kontext a učit se z úspěchů a neúspěchů v průběhu času. Myšlenkou je, že bezstavoví agenti se mění na stavové. +#### Mem0 + +Jedním ze způsobů, jak ukládat a spravovat paměť agenta, je použití specializovaných nástrojů, jako je Mem0. Mem0 funguje jako vrstva trvalé paměti, která umožňuje agentům vybavovat si relevantní interakce, ukládat uživatelské preference a faktický kontext a učit se z úspěchů a neúspěchů v průběhu času. Myšlenka zde je, že bezstavoví agenti se mění na stavové. Funguje prostřednictvím **dvoufázového paměťového procesu: extrakce a aktualizace**. Nejprve jsou zprávy přidané do vlákna agenta odeslány do služby Mem0, která používá velký jazykový model (LLM) k sumarizaci historie konverzace a extrakci nových pamětí. Následně fáze aktualizace řízená LLM určuje, zda tyto paměti přidat, upravit nebo smazat, a ukládá je do hybridního datového úložiště, které může zahrnovat vektorové, grafové a klíč-hodnota databáze. Tento systém také podporuje různé typy paměti a může zahrnovat grafovou paměť pro správu vztahů mezi entitami. +#### Cognee + +Dalším výkonným přístupem je použití **Cognee**, open-source sémantické paměti pro AI agenty, která transformuje strukturovaná a nestrukturovaná data do dotazovatelného znalostního grafu podporovaného embeddingy. Cognee poskytuje **architekturu dvojího úložiště**, která kombinuje vyhledávání podle vektorové podobnosti s grafovými vztahy, což umožňuje agentům pochopit nejen to, jaké informace jsou podobné, ale také jak se koncepty vztahují k sobě navzájem. + +Vyniká v **hybridním vyhledávání**, které kombinuje vektorovou podobnost, grafovou strukturu a LLM uvažování - od surového vyhledávání chunků až po dotazování s povědomím o grafu. Systém udržuje **živou paměť**, která se vyvíjí a roste, zatímco zůstává dotazovatelná jako jeden propojený graf, podporující jak krátkodobý kontext relace, tak dlouhodobou trvalou paměť. + +Cognee tutoriál v notebooku ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) demonstruje budování této sjednocené paměťové vrstvy, s praktickými příklady ingestování různých datových zdrojů, vizualizace znalostního grafu a dotazování s různými strategiemi vyhledávání přizpůsobenými specifickým potřebám agenta. + ### Ukládání paměti pomocí RAG -Kromě specializovaných nástrojů pro paměť, jako je Mem0, můžete využít robustní vyhledávací služby, jako je **Azure AI Search jako backend pro ukládání a vybavování pamětí**, zejména pro strukturovaný RAG. +Kromě specializovaných nástrojů pro paměť, jako je Mem0, můžete využít robustní vyhledávací služby, jako je **Azure AI Search jako backend pro ukládání a vyhledávání pamětí**, zejména pro strukturovaný RAG. -To vám umožňuje zakotvit odpovědi agenta ve vašich vlastních datech, což zajišťuje relevantnější a přesnější odpovědi. Azure AI Search lze použít k ukládání uživatelsky specifických cestovních pamětí, katalogů produktů nebo jakýchkoli jiných znalostí specifických pro danou oblast. +To vám umožní zakotvit odpovědi vašeho agenta ve vašich vlastních datech, což zajistí relevantnější a přesnější odpovědi. Azure AI Search lze použít k ukládání uživatelsky specifických cestovních pamětí, katalogů produktů nebo jakýchkoli jiných znalostí specifických pro danou oblast. -Azure AI Search podporuje funkce jako **Strukturovaný RAG**, který vyniká při extrakci a vybavování hustých, strukturovaných informací z velkých datových sad, jako jsou historie konverzací, e-maily nebo dokonce obrázky. To poskytuje "nadlidskou přesnost a vybavení" ve srovnání s tradičními přístupy k dělení textu a vkládání. +Azure AI Search podporuje schopnosti jako **Strukturovaný RAG**, který vyniká v extrakci a vyhledávání hustých, strukturovaných informací z velkých datových sad, jako jsou historie konverzací, e-maily nebo dokonce obrázky. To poskytuje "nadlidskou přesnost a vybavení" ve srovnání s tradičními přístupy chunkování textu a embeddingu. ## Vytváření samo-zlepšujících se AI agentů -Běžný vzor pro samo-zlepšující se agenty zahrnuje zavedení **"agenta znalostí"**. Tento samostatný agent sleduje hlavní konverzaci mezi uživatelem a primárním agentem. Jeho role je: +Běžný vzor pro samo-zlepšující se agenty zahrnuje zavedení **"znalostního agenta"**. Tento samostatný agent sleduje hlavní konverzaci mezi uživatelem a primárním agentem. Jeho role je: 1. **Identifikovat hodnotné informace**: Určit, zda je nějaká část konverzace hodná uložení jako obecné znalosti nebo specifická uživatelská preference. 2. **Extrahovat a sumarizovat**: Destilovat podstatné učení nebo preference z konverzace. -3. **Uložit do znalostní databáze**: Uchovat tyto extrahované informace, často ve vektorové databázi, aby mohly být později vybaveny. +3. **Uložit do znalostní databáze**: Uložit tyto extrahované informace, často do vektorové databáze, aby mohly být později vyhledány. -4. **Rozšířit budoucí dotazy**: Když uživatel zahájí nový dotaz, agent znalostí vybaví relevantní uložené informace a připojí je k uživatelskému promptu, čímž poskytne klíčový kontext primárnímu agentovi (podobně jako RAG). +4. **Rozšířit budoucí dotazy**: Když uživatel zahájí nový dotaz, znalostní agent vyhledá relevantní uložené informace a připojí je k uživatelskému promptu, čímž poskytne klíčový kontext primárnímu agentovi (podobně jako RAG). ### Optimalizace pro paměť -• **Správa latence**: Aby se zabránilo zpomalení uživatelských interakcí, může být zpočátku použit levnější, rychlejší model k rychlému ověření, zda je informace hodnotná k uložení nebo vybavení, přičemž složitější proces extrakce/vybavení se spustí pouze v případě potřeby. +• **Správa latence**: Aby se zabránilo zpomalení uživatelských interakcí, může být zpočátku použit levnější, rychlejší model k rychlému ověření, zda je informace hodná uložení nebo vyhledání, a složitější proces extrakce/vyhledávání se spustí pouze v případě potřeby. -• **Údržba znalostní databáze**: Pro rostoucí znalostní databázi mohou být méně často používané informace přesunuty do "studeného úložiště" pro správu nákladů. +• **Údržba znalostní databáze**: Pro rostoucí znalostní databázi mohou být méně často používané informace přesunuty do "chladného úložiště" pro správu nákladů. -## Máte další otázky ohledně paměti agentů? +## Máte další otázky ohledně paměti agenta? -Připojte se na [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord), kde se můžete setkat s dalšími studenty, zúčastnit se konzultačních hodin a získat odpovědi na vaše otázky ohledně AI agentů. +Připojte se na [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord), kde se můžete setkat s ostatními studenty, zúčastnit se konzultačních hodin a získat odpovědi na vaše otázky ohledně AI agentů. --- + **Prohlášení**: -Tento dokument byl přeložen pomocí služby AI pro překlady [Co-op Translator](https://github.com/Azure/co-op-translator). I když se snažíme o přesnost, mějte prosím na paměti, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za autoritativní zdroj. Pro důležité informace doporučujeme profesionální lidský překlad. Neodpovídáme za žádná nedorozumění nebo nesprávné interpretace vyplývající z použití tohoto překladu. \ No newline at end of file +Tento dokument byl přeložen pomocí služby AI pro překlady [Co-op Translator](https://github.com/Azure/co-op-translator). Ačkoli se snažíme o přesnost, mějte prosím na paměti, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho rodném jazyce by měl být považován za autoritativní zdroj. Pro důležité informace se doporučuje profesionální lidský překlad. Neodpovídáme za žádná nedorozumění nebo nesprávné interpretace vyplývající z použití tohoto překladu. + \ No newline at end of file diff --git a/translations/da/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/da/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..d368e53d8 --- /dev/null +++ b/translations/da/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Bygge AI-agenter med vedvarende hukommelse ved hjælp af Cognee\n", + "\n", + "Denne notebook demonstrerer, hvordan man bygger intelligente AI-agenter med avancerede hukommelsesfunktioner ved hjælp af [**cognee**](https://www.cognee.ai/) - en open source AI-hukommelse, der kombinerer vidensgrafer, semantisk søgning og sessionstyring for at skabe kontekstbevidste AI-systemer.\n", + "\n", + "## 🎯 Læringsmål\n", + "\n", + "Ved slutningen af denne tutorial vil du forstå, hvordan man:\n", + "- **Bygger vidensgrafer understøttet af embeddings**: Omformer ustruktureret tekst til struktureret, søgbar viden\n", + "- **Implementerer sessionshukommelse**: Skaber samtaler med flere omgange med automatisk kontekstbevaring\n", + "- **Bevarer samtaler**: Valgfrit gemmer vigtige interaktioner i langtidshukommelse til fremtidig reference\n", + "- **Søger med naturligt sprog**: Tilgår og udnytter historisk kontekst i nye samtaler\n", + "- **Visualiserer hukommelse**: Udforsker relationerne i din agents vidensgraf\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Hvad Du Vil Bygge\n", + "\n", + "I denne tutorial vil vi skabe en **Coding Assistant** med vedvarende hukommelse, der:\n", + "\n", + "### 1. **Opbygning af Vidensbase**\n", + " - Indsamler information om udviklerprofiler og ekspertise\n", + " - Behandler principper og bedste praksis inden for Python-programmering\n", + " - Gemmer historiske samtaler mellem udviklere og AI-assistenter\n", + "\n", + "### 2. **Sessionsbevidste Samtaler**\n", + " - Bevarer konteksten på tværs af flere spørgsmål i samme session\n", + " - Gemmer automatisk hvert spørgsmål/svar-par for effektiv hentning\n", + " - Giver sammenhængende og kontekstuelle svar baseret på samtalehistorik\n", + "\n", + "### 3. **Langtidshukommelse**\n", + " - Bevarer vigtige samtaler i en langtidshukommelse\n", + " - Henter relevante minder fra vidensbasen og tidligere sessioner for at informere nye interaktioner\n", + " - Opbygger en voksende vidensbase, der forbedres over tid\n", + "\n", + "### 4. **Intelligent Hukommelseshentning**\n", + " - Bruger grafbevidst semantisk søgning til at finde relevant information på tværs af al gemt viden\n", + " - Filtrerer søgninger efter datasubgrupper (udviklerinfo vs. principper)\n", + " - Kombinerer flere datakilder for at give omfattende svar\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Forudsætninger & Opsætning\n", + "\n", + "### Systemkrav\n", + "\n", + "Før du starter, skal du sikre dig, at du har:\n", + "\n", + "1. **Python-miljø**\n", + " - Python 3.9 eller nyere\n", + " - Virtuelt miljø (anbefales)\n", + " \n", + "2. **Redis Cache** (Påkrævet til sessionhåndtering)\n", + " - Lokal Redis: `docker run -d -p 6379:6379 redis`\n", + " - Eller brug en administreret Redis-tjeneste\n", + " \n", + "3. **LLM API-adgang**\n", + " - OpenAI API-nøgle eller andre udbydere (se [dokumentation](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Databasekonfiguration**\n", + " - Ingen konfiguration kræves som standard. Cognee bruger filbaserede databaser (LanceDB og Kuzu)\n", + " - Valgfrit kan du opsætte Azure AI Search som en vektorlagring (se [dokumentation](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Miljøkonfiguration\n", + "\n", + "Opret en `.env`-fil i din projektmappe med følgende variabler:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Forståelse af Cognees hukommelsesarkitektur\n", + "\n", + "### Hvordan Cognee fungerer\n", + "\n", + "Cognee tilbyder et avanceret hukommelsessystem, der går ud over simpel nøgle-værdi-lagring:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Nøglekomponenter:\n", + "\n", + "1. **Knowledge Graph**: Lagrer enheder, relationer og semantiske forbindelser\n", + "2. **Vector Embeddings**: Muliggør semantisk søgning på tværs af al lagret information\n", + "3. **Session Cache**: Bevarer samtalekontekst inden for og på tværs af sessioner\n", + "4. **NodeSets**: Organiserer data i logiske kategorier for målrettet hentning\n", + "\n", + "### Hukommelsestyper i denne vejledning:\n", + "\n", + "- **Persistent Memory**: Langtidslagring i knowledge graph\n", + "- **Session Memory**: Midlertidig samtalekontekst i Redis-cache\n", + "- **Semantic Memory**: Vektorbaseret lighedssøgning på tværs af al data\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Installer nødvendige pakker\n", + "\n", + "Installer Cognee med Redis-support til sessionhåndtering:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Initialiser miljø og indlæs biblioteker\n", + "\n", + "Sørg for:\n", + "1. At Redis kører (f.eks. via Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. At miljøvariabler er sat, før cache-moduler importeres\n", + "3. Hvis nødvendigt, genstart kernen og kør cellerne i rækkefølge\n", + "\n", + "Den følgende celle vil:\n", + "1. Indlæse miljøvariabler fra `.env`\n", + "2. Konfigurere Cognee med dine LLM-indstillinger\n", + "3. Aktivere caching til sessionhåndtering\n", + "4. Validere, at alle komponenter er korrekt forbundet\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Konfigurer lagringsmapper\n", + "\n", + "Cognee bruger to separate mapper til sine operationer:\n", + "- **Data Root**: Gemmer importerede dokumenter og behandlede data\n", + "- **System Root**: Indeholder vidensgrafdatabasen og systemmetadata\n", + "\n", + "Vi vil oprette isolerede mapper til denne tutorial som følger:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Nulstil hukommelsestilstand\n", + "\n", + "Før vi begynder at opbygge vores hukommelsessystem, lad os sikre, at vi starter fra bunden.\n", + "\n", + "> 💡 **Tip**: Du kan springe dette trin over, hvis du ønsker at bevare eksisterende minder fra dine tidligere kørseler, når du bruger denne notebook senere.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Del 1: Opbygning af vidensbasen\n", + "\n", + "### Datakilder til vores udviklerassistent\n", + "\n", + "Vi vil indsamle tre typer data for at skabe en omfattende vidensbase:\n", + "\n", + "1. **Udviklerprofil**: Personlig ekspertise og teknisk baggrund \n", + "2. **Python Best Practices**: The Zen of Python med praktiske retningslinjer \n", + "3. **Historiske samtaler**: Tidligere Q&A-sessioner mellem udviklere og AI-assistenter \n", + "\n", + "Denne mangfoldige data gør det muligt for vores agent at: \n", + "- Forstå brugerens tekniske kontekst \n", + "- Anvende bedste praksis i anbefalinger \n", + "- Lære af tidligere vellykkede interaktioner \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Behandl data til en vidensgraf\n", + "\n", + "Nu vil vi omdanne vores rå tekst til en struktureret hukommelse. Denne proces:\n", + "\n", + "1. **Tilføjer data til NodeSets**: Organiserer information i logiske kategorier\n", + " - `developer_data`: Udviklerprofil og samtaler\n", + " - `principles_data`: Python bedste praksis og retningslinjer\n", + "\n", + "2. **Kører Cognify Pipeline**: Ekstraherer enheder, relationer og skaber embeddings\n", + " - Identificerer nøglekoncepter\n", + " - Skaber semantiske forbindelser mellem relateret information\n", + " - Genererer vektorembeddings\n", + "\n", + "Dette kan tage et øjeblik, mens LLM'en behandler teksten og opbygger grafstrukturen:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Visualiser vidensgrafen\n", + "\n", + "Lad os udforske strukturen af vores vidensgraf. Visualiseringen viser:\n", + "- **Noder**: Enheder udtrukket fra teksten (koncepter, teknologier, personer)\n", + "- **Kanter**: Forhold og forbindelser mellem enheder\n", + "- **Klynger**: Relaterede koncepter grupperet efter semantisk lighed\n", + "\n", + "Åbn den genererede HTML-fil i din browser for interaktivt at udforske grafen:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Berig hukommelsen med Memify\n", + "\n", + "Funktionen `memify()` analyserer vidensgrafen og genererer intelligente regler om dataene. Denne proces:\n", + "- Identificerer mønstre og bedste praksis\n", + "- Skaber handlingsorienterede retningslinjer baseret på indholdet\n", + "- Etablerer forbindelser mellem forskellige vidensområder\n", + "\n", + "Disse regler hjælper agenten med at træffe mere velinformerede beslutninger, når der besvares spørgsmål. At fange en anden visualisering hjælper dig med at sammenligne, hvordan grafen bliver tættere, når den beriges.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Del 2: Intelligent hukommelsesindhentning\n", + "\n", + "### Demonstration 1: Integration af viden på tværs af dokumenter\n", + "\n", + "Nu hvor vores vidensgraf er opbygget, lad os teste, hvordan Cognee kombinerer information fra flere kilder for at besvare komplekse spørgsmål.\n", + "\n", + "Den første forespørgsel demonstrerer:\n", + "- **Semantisk forståelse**: Finder relevante begreber, selv når de ikke er nævnt direkte\n", + "- **Krydshenvisning**: Kombinerer udviklerprofil med Python-principper\n", + "- **Kontekstuel ræsonnement**: Anvender bedste praksis på specifikke implementeringer\n", + "\n", + "### Demonstration 2: Filtreret søgning med NodeSets\n", + "\n", + "Den anden forespørgsel viser, hvordan man kan målrette specifikke undergrupper af vidensgrafen:\n", + "- Bruger `node_name`-parameteren til kun at søge inden for `principles_data`\n", + "- Giver fokuserede svar fra et specifikt vidensområde\n", + "- Nyttigt, når du har brug for domænespecifik information\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Del 3: Opsætning af sessionsstyring\n", + "\n", + "### Aktivering af samtalehukommelse\n", + "\n", + "Sessionsstyring er afgørende for at bevare konteksten på tværs af flere interaktioner. Her vil vi:\n", + "\n", + "1. **Initialisere brugerens kontekst**: Oprette eller hente en brugerprofil til sporing af sessioner\n", + "2. **Konfigurere cache-motor**: Forbinde til Redis for at gemme samtalehistorik\n", + "3. **Aktivere sessionsvariabler**: Opsætte kontekstvariabler, der vedvarer på tværs af forespørgsler\n", + "\n", + "> ⚠️ **Vigtigt**: Dette kræver, at Redis kører, og at `CACHING=true` er aktiveret i dit miljø\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Hjælpefunktion: Se sessionshistorik\n", + "\n", + "Denne hjælpefunktion giver os mulighed for at inspicere samtalehistorikken, der er gemt i Redis. Den er nyttig til:\n", + "- Fejlfinding af sessionsstyring\n", + "- Bekræftelse af, at samtaler bliver gemt i cache\n", + "- Forståelse af, hvilken kontekst der er tilgængelig for agenten\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Session 1: Async Support Lab — Første Spørgsmål\n", + "\n", + "Start `async-support-lab` sessionen ved at spørge om telemetri-venlige asyncio-mønstre til en massiv webscraper. Grafen kender allerede til asyncio, aiohttp og overvågningspraksis, så svaret bør afspejle tidligere samtaler, mens det tilpasses det nye spørgsmål.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Inspicer Session 1 Hukommelse Efter Den Første Udveksling\n", + "\n", + "Ved at køre `show_history(session_1)` umiddelbart efter det indledende spørgsmål bekræftes det, at Cognee skrev både prompten og svaret ind i Redis. Du bør se én post med vejledning om samtidighed.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Session 1: Opfølgning på Datamodeller\n", + "\n", + "Dernæst spørger vi, \"Hvornår skal jeg vælge dataclasses frem for Pydantic?\" ved at bruge det samme session-id. Cognee bør kombinere Python-principperne med tidligere FastAPI-samtaler for at give nuanceret rådgivning—og demonstrere, at konteksten videreføres inden for en navngivet session.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Bekræft, at session 1-historikken indeholder begge ture\n", + "\n", + "Endnu et `show_history(session_1)`-kald bør vise to spørgsmål og svar. Dette stemmer overens med Mem0-laboratoriets \"memory replay\"-trin og beviser, at yderligere ture udvider den samme transskription.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Session 2: Design Review Tråd — Ny Session\n", + "\n", + "For at vise isolation mellem tråde starter vi `design-review-session` og beder om logningsvejledning til hændelsesgennemgange. Selvom den underliggende vidensbase er den samme, holder det nye session-id transkriptionerne adskilt.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Gennemgang Session 2 Historie\n", + "\n", + "`show_history(session_2)` bør kun vise design-gennemgangens prompt/svar-par. Sammenlign det med Session 1 for at fremhæve, hvordan Cognee holder uafhængige transkriptioner, mens den genbruger den delte vidensgraf.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Resumé\n", + "\n", + "Tillykke! Du har lige givet din kodeassistent et ægte langtidshukommelseslag drevet af Cognee.\n", + "\n", + "I denne tutorial har du taget rå udviklerindhold (kode, dokumentation, chats) og omdannet det til en graf + vektormemory, som din agent kan søge i, ræsonnere over og løbende forbedre.\n", + "\n", + "Hvad du har lært\n", + "\n", + "1. **Fra rå tekst til AI-hukommelse**: Hvordan Cognee indtager ustrukturerede data og omdanner dem til intelligent, søgbar hukommelse ved hjælp af en kombineret vektor- og vidensgrafarkitektur.\n", + "\n", + "2. **Grafberigelse med memify**: Hvordan man går ud over grundlæggende grafoprettelse og bruger memify til at tilføje afledte fakta og rigere relationer oven på din eksisterende graf.\n", + "\n", + "3. **Flere søgestrategier**: Hvordan man forespørger hukommelsen med forskellige søgetyper (graf-bevidst Q&A, RAG-stil fuldførelse, indsigter, rå tekststykker, kodesøgning osv.) afhængigt af, hvad din agent har brug for.\n", + "\n", + "4. **Visuel udforskning**: Hvordan man inspicerer og fejlretter det, Cognee har bygget, ved hjælp af grafvisualiseringer og Cognee UI, så du faktisk kan se, hvordan viden er struktureret.\n", + "\n", + "5. **Sessionsbevidst hukommelse**: Hvordan man kombinerer kontekst fra en session med vedvarende semantisk hukommelse, så agenter kan huske på tværs af sessioner uden at lække information mellem brugere.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Vigtige Punkter\n", + "1. Hukommelse som en Vidensgraf understøttet af Embeddings\n", + "\n", + " - **Struktureret forståelse**: Cognee kombinerer en vektor-database og en graf-database, så dine data både kan søges efter betydning og forbindes gennem relationer. Cognee bruger som standard filbaserede databaser (LanceDB til vektor- og Kuzu til graf-database).\n", + "\n", + " - **Relationsbevidst søgning**: Svar kan baseres ikke kun på \"lignende tekst\", men også på, hvordan enheder relaterer til hinanden.\n", + "\n", + " - **Levende hukommelse**: Hukommelseslaget udvikler sig, vokser og forbliver søgbart som én sammenhængende graf.\n", + "\n", + "2. Søge- og Ræsonneringsmodi\n", + " - **Hybrid søgning**: Søgefunktionen kombinerer vektorsimilaritet, grafstruktur og LLM-ræsonnering, fra rå dataopslag til grafbevidst spørgsmål-svar.\n", + "\n", + " - **Tilpas til opgaven**: Brug completion-stil til naturlige sprog-svar, og chunk-/resumé-/graf-modi, når din agent har brug for rå kontekst eller skal udføre egen ræsonnering.\n", + "\n", + "3. Personlige, Sessionsbevidste Agenter\n", + " - **Sessionskontekst + langtidshukommelse**: Cognee holder kortvarig \"tråd\"-kontekst adskilt fra langvarig, bruger- eller organisationsniveau hukommelse.\n", + "\n", + "## Anvendelser i den Virkelige Verden\n", + "\n", + "1. **Vertikale AI-Agenter**\n", + "\n", + " Brug mønsteret fra denne notebook til at drive domænespecifikke copiloter, der bygger på Cognee som deres kerne for søgning og ræsonnering:\n", + "\n", + "- **Udvikler-copiloter**: Kodegennemgang, hændelsesanalyse og arkitekturassistenter, der navigerer gennem kode, API'er, design-dokumenter og tickets som én samlet hukommelsesgraf.\n", + "\n", + "- **Kundeorienterede copiloter**: Support- eller succesagenter, der trækker fra produktdokumentation, FAQ'er, CRM-noter og tidligere tickets med grafbevidst søgning og citerede svar.\n", + "\n", + "- **Interne ekspert-copiloter**: Politik-, juridiske eller sikkerhedsassistenter, der ræsonnerer over sammenhængende regler, retningslinjer og historiske beslutninger i stedet for isolerede PDF'er.\n", + "\n", + " Cognee er eksplicit positioneret som en vedvarende, præcis hukommelse for AI-agenter og tilbyder en levende vidensgraf, der kan integreres bag din agent og erstatte ad hoc-kombinationer af vektordatabaser og specialtilpasset grafkode.\n", + "\n", + "2. **Forene Datasiloer til Én Hukommelse**\n", + "\n", + " Den samme tilgang hjælper dig med at bygge et samlet hukommelseslag på tværs af spredte kilder:\n", + "\n", + "- **Fra siloer til én graf**: Indlæs strukturerede (f.eks. databaser) og ustrukturerede data (f.eks. dokumenter, chats) i en enkelt graf understøttet af embeddings, i stedet for separate indekser for hvert system.\n", + "\n", + "- **Tværkilde-ræsonnering med citater**: Udfør flertrinsræsonnering over alt—\"forbind\" logs, metrics og dokumenter via grafen—og returner stadig velbegrundede svar med kildeangivelse.\n", + "\n", + "- **Videnshubs**: For domæner som bank eller uddannelse bruges Cognee allerede til at forene PDF'er, interne systemer og app-data i én vidensgraf med vektorer, så agenter kan besvare spørgsmål med præcis, citeret kontekst.\n", + "\n", + "## Næste Skridt\n", + "\n", + "Du har implementeret den grundlæggende hukommelsesloop. Her er naturlige udvidelser, du kan prøve på egen hånd (se [Cognee-dokumentation](https://docs.cognee.ai/) for detaljer):\n", + "\n", + "1. **Eksperimentér med tidsmæssig bevidsthed**: Aktivér temporal cognify for at udtrække begivenheder og tidsstempler fra tekst.\n", + "\n", + "2. **Introducér ontologi-drevet ræsonnering**: Definér en OWL-ontologi for dit domæne. Brug Cognee's ontologistøtte, så udtrukne enheder og relationer forankres i det skema, hvilket forbedrer grafkvaliteten og domænespecifikke svar.\n", + "\n", + "3. **Tilføj en feedback-loop**: Lad Cognee justere grafens kantvægte baseret på reel brugerfeedback, så søgningen forbedres over tid i stedet for at forblive statisk.\n", + "\n", + "4. **Tilpas til personalisering og sessionsadfærd**: Brug bruger-ID'er, lejere og datasæt til at give hver person eller team deres eget perspektiv på den delte hukommelsesmotor.\n", + "\n", + "5. **Skalér til mere komplekse agenter**: Integrér Cognee i agentrammer for at bygge multi-agent-systemer, der alle deler det samme hukommelseslag. *Microsoft Agent Framework x Cognee-plugin kommer snart.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Ansvarsfraskrivelse**: \nDette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:01:44+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "da" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/da/13-agent-memory/README.md b/translations/da/13-agent-memory/README.md index 9fc881e4c..bf07f4d28 100644 --- a/translations/da/13-agent-memory/README.md +++ b/translations/da/13-agent-memory/README.md @@ -1,16 +1,16 @@ -# Hukommelse for AI-agenter +# Hukommelse for AI-agenter [![Agent Memory](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.da.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Når man diskuterer de unikke fordele ved at skabe AI-agenter, fokuseres der primært på to ting: evnen til at bruge værktøjer til at udføre opgaver og evnen til at forbedre sig over tid. Hukommelse er fundamentet for at skabe selvforbedrende agenter, der kan levere bedre oplevelser til vores brugere. +Når man diskuterer de unikke fordele ved at skabe AI-agenter, er der to ting, der ofte nævnes: evnen til at bruge værktøjer til at udføre opgaver og evnen til at forbedre sig over tid. Hukommelse er fundamentet for at skabe selvforbedrende agenter, der kan levere bedre oplevelser for vores brugere. I denne lektion vil vi se på, hvad hukommelse er for AI-agenter, og hvordan vi kan administrere og bruge den til fordel for vores applikationer. @@ -24,29 +24,37 @@ Denne lektion vil dække: • **At gøre AI-agenter selvforbedrende**: Hvordan hukommelse gør det muligt for agenter at lære af tidligere interaktioner og forbedre sig over tid. +## Tilgængelige implementeringer + +Denne lektion inkluderer to omfattende notebook-tutorials: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Implementerer hukommelse ved hjælp af Mem0 og Azure AI Search med Semantic Kernel-rammen. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Implementerer struktureret hukommelse ved hjælp af Cognee, der automatisk opbygger en vidensgraf understøttet af embeddings, visualiserer grafen og muliggør intelligent søgning. + ## Læringsmål -Efter at have gennemført denne lektion vil du kunne: +Efter at have gennemført denne lektion vil du vide, hvordan du: -• **Skelne mellem forskellige typer af AI-agenters hukommelse**, herunder arbejdshukommelse, korttidshukommelse og langtidshukommelse samt specialiserede former som persona- og episodisk hukommelse. +• **Skelner mellem forskellige typer AI-agenters hukommelse**, herunder arbejdshukommelse, kort- og langtidshukommelse samt specialiserede former som persona- og episodisk hukommelse. -• **Implementere og administrere kort- og langtidshukommelse for AI-agenter** ved hjælp af Semantic Kernel-frameworket, værktøjer som Mem0 og Whiteboard-hukommelse samt integration med Azure AI Search. +• **Implementerer og administrerer kort- og langtidshukommelse for AI-agenter** ved hjælp af Semantic Kernel-rammen, med værktøjer som Mem0, Cognee, Whiteboard-hukommelse og integration med Azure AI Search. -• **Forstå principperne bag selvforbedrende AI-agenter**, og hvordan robuste hukommelsessystemer bidrager til kontinuerlig læring og tilpasning. +• **Forstår principperne bag selvforbedrende AI-agenter**, og hvordan robuste hukommelsessystemer bidrager til kontinuerlig læring og tilpasning. ## Forståelse af AI-agenters hukommelse -Grundlæggende refererer **hukommelse for AI-agenter til de mekanismer, der gør det muligt for dem at gemme og genkalde information**. Denne information kan være specifikke detaljer om en samtale, brugerpræferencer, tidligere handlinger eller endda lærte mønstre. +I sin kerne refererer **hukommelse for AI-agenter til de mekanismer, der gør det muligt for dem at gemme og genkalde information**. Denne information kan være specifikke detaljer om en samtale, brugerpræferencer, tidligere handlinger eller endda lærte mønstre. Uden hukommelse er AI-applikationer ofte tilstandsløse, hvilket betyder, at hver interaktion starter fra bunden. Dette fører til en gentagende og frustrerende brugeroplevelse, hvor agenten "glemmer" tidligere kontekst eller præferencer. ### Hvorfor er hukommelse vigtig? -En agents intelligens er tæt knyttet til dens evne til at genkalde og bruge tidligere information. Hukommelse gør det muligt for agenter at være: +En agents intelligens er tæt forbundet med dens evne til at genkalde og bruge tidligere information. Hukommelse gør det muligt for agenter at være: • **Reflekterende**: Lære af tidligere handlinger og resultater. -• **Interaktive**: Bevare konteksten i en igangværende samtale. +• **Interaktive**: Bevare kontekst i en igangværende samtale. • **Proaktive og reaktive**: Forudse behov eller reagere passende baseret på historiske data. @@ -58,13 +66,13 @@ Målet med at implementere hukommelse er at gøre agenter mere **pålidelige og #### Arbejdshukommelse -Tænk på dette som et stykke kladdepapir, som en agent bruger under en enkelt, igangværende opgave eller tankeproces. Det indeholder umiddelbar information, der er nødvendig for at beregne det næste skridt. +Tænk på dette som et stykke kladdepapir, som en agent bruger under en enkelt, igangværende opgave eller tankeproces. Det holder den umiddelbare information, der er nødvendig for at beregne det næste skridt. -For AI-agenter fanger arbejdshukommelse ofte de mest relevante oplysninger fra en samtale, selv hvis hele chat-historikken er lang eller afkortet. Den fokuserer på at udtrække nøgleelementer som krav, forslag, beslutninger og handlinger. +For AI-agenter fanger arbejdshukommelse ofte de mest relevante oplysninger fra en samtale, selvom hele chat-historikken er lang eller afkortet. Den fokuserer på at udtrække nøgleelementer som krav, forslag, beslutninger og handlinger. **Eksempel på arbejdshukommelse** -I en rejsebooking-agent kan arbejdshukommelsen fange brugerens aktuelle anmodning, såsom "Jeg vil gerne booke en rejse til Paris". Dette specifikke krav holdes i agentens umiddelbare kontekst for at styre den aktuelle interaktion. +I en rejsebookingsagent kan arbejdshukommelsen fange brugerens aktuelle anmodning, såsom "Jeg vil gerne booke en rejse til Paris". Dette specifikke krav holdes i agentens umiddelbare kontekst for at styre den aktuelle interaktion. #### Korttidshukommelse @@ -72,7 +80,7 @@ Denne type hukommelse bevarer information i løbet af en enkelt samtale eller se **Eksempel på korttidshukommelse** -Hvis en bruger spørger, "Hvor meget koster en flybillet til Paris?" og derefter følger op med "Hvad med overnatning der?", sikrer korttidshukommelsen, at agenten ved, at "der" refererer til "Paris" inden for den samme samtale. +Hvis en bruger spørger, "Hvor meget koster en flybillet til Paris?" og derefter følger op med "Hvad med overnatning der?", sikrer korttidshukommelsen, at agenten ved, at "der" refererer til "Paris" inden for samme samtale. #### Langtidshukommelse @@ -80,27 +88,27 @@ Dette er information, der vedvarer på tværs af flere samtaler eller sessioner. **Eksempel på langtidshukommelse** -En langtidshukommelse kan gemme, at "Ben nyder skiløb og udendørs aktiviteter, kan lide kaffe med udsigt til bjerge og ønsker at undgå avancerede skipister på grund af en tidligere skade". Denne information, lært fra tidligere interaktioner, påvirker anbefalinger i fremtidige rejseplanlægningssessioner, hvilket gør dem meget personlige. +En langtidshukommelse kan gemme, at "Ben nyder skiløb og udendørsaktiviteter, kan lide kaffe med udsigt til bjerge og ønsker at undgå avancerede skipister på grund af en tidligere skade". Denne information, lært fra tidligere interaktioner, påvirker anbefalinger i fremtidige rejseplanlægningssessioner og gør dem meget personlige. #### Persona-hukommelse -Denne specialiserede hukommelsestype hjælper en agent med at udvikle en konsistent "personlighed" eller "persona". Det gør det muligt for agenten at huske detaljer om sig selv eller sin tilsigtede rolle, hvilket gør interaktioner mere flydende og fokuserede. +Denne specialiserede hukommelsestype hjælper en agent med at udvikle en konsistent "personlighed" eller "persona". Det gør det muligt for agenten at huske detaljer om sig selv eller sin tiltænkte rolle, hvilket gør interaktioner mere flydende og fokuserede. **Eksempel på persona-hukommelse** -Hvis rejseagenten er designet til at være en "ekspert i skiplanlægning", kan persona-hukommelsen styrke denne rolle og påvirke dens svar, så de stemmer overens med en eksperts tone og viden. +Hvis rejseagenten er designet til at være en "ekspert i skiplanlægning", kan persona-hukommelsen forstærke denne rolle og påvirke dens svar, så de stemmer overens med en eksperts tone og viden. -#### Workflow/episodisk hukommelse +#### Workflow/Episodisk hukommelse Denne hukommelse gemmer rækkefølgen af trin, en agent tager under en kompleks opgave, inklusive succeser og fejl. Det er som at huske specifikke "episoder" eller tidligere oplevelser for at lære af dem. **Eksempel på episodisk hukommelse** -Hvis agenten forsøgte at booke en specifik flyrejse, men det mislykkedes på grund af manglende tilgængelighed, kunne episodisk hukommelse registrere denne fejl, så agenten kan prøve alternative flyrejser eller informere brugeren om problemet på en mere informeret måde under et efterfølgende forsøg. +Hvis agenten forsøgte at booke en specifik flyrejse, men det mislykkedes på grund af utilgængelighed, kunne den episodiske hukommelse registrere denne fejl, så agenten kan prøve alternative fly eller informere brugeren om problemet på en mere informeret måde under et efterfølgende forsøg. #### Enhedshukommelse -Dette indebærer at udtrække og huske specifikke enheder (som personer, steder eller ting) og begivenheder fra samtaler. Det gør det muligt for agenten at opbygge en struktureret forståelse af nøgleelementer, der er blevet diskuteret. +Dette indebærer at udtrække og huske specifikke enheder (som personer, steder eller ting) og begivenheder fra samtaler. Det gør det muligt for agenten at opbygge en struktureret forståelse af nøgleelementer, der diskuteres. **Eksempel på enhedshukommelse** @@ -108,29 +116,39 @@ Fra en samtale om en tidligere rejse kan agenten udtrække "Paris", "Eiffeltårn #### Struktureret RAG (Retrieval Augmented Generation) -Mens RAG er en bredere teknik, fremhæves "Struktureret RAG" som en kraftfuld hukommelsesteknologi. Det udtrækker tæt, struktureret information fra forskellige kilder (samtaler, e-mails, billeder) og bruger det til at forbedre præcision, genkaldelse og hastighed i svar. I modsætning til klassisk RAG, der udelukkende er afhængig af semantisk lighed, arbejder Struktureret RAG med den iboende struktur af information. +Mens RAG er en bredere teknik, fremhæves "Struktureret RAG" som en kraftfuld hukommelsesteknologi. Den udtrækker tæt, struktureret information fra forskellige kilder (samtaler, e-mails, billeder) og bruger det til at forbedre præcision, genkaldelse og hastighed i svar. I modsætning til klassisk RAG, der udelukkende er afhængig af semantisk lighed, arbejder Struktureret RAG med informationens iboende struktur. **Eksempel på struktureret RAG** -I stedet for blot at matche nøgleord kunne Struktureret RAG analysere flydetaljer (destination, dato, tid, flyselskab) fra en e-mail og gemme dem på en struktureret måde. Dette muliggør præcise forespørgsler som "Hvilket fly bookede jeg til Paris på tirsdag?" +I stedet for blot at matche nøgleord kunne Struktureret RAG analysere flyoplysninger (destination, dato, tid, flyselskab) fra en e-mail og gemme dem på en struktureret måde. Dette muliggør præcise forespørgsler som "Hvilket fly bookede jeg til Paris på tirsdag?" ## Implementering og lagring af hukommelse -Implementering af hukommelse for AI-agenter indebærer en systematisk proces med **hukommelsesstyring**, som inkluderer generering, lagring, genkaldelse, integration, opdatering og endda "glemsel" (eller sletning) af information. Genkaldelse er en særlig vigtig aspekt. +Implementering af hukommelse for AI-agenter indebærer en systematisk proces med **hukommelsesstyring**, som inkluderer generering, lagring, hentning, integration, opdatering og endda "glemsel" (eller sletning) af information. Hentning er en særlig vigtig del. ### Specialiserede hukommelsesværktøjer -En måde at lagre og administrere agenthukommelse på er ved at bruge specialiserede værktøjer som Mem0. Mem0 fungerer som et vedvarende hukommelseslag, der gør det muligt for agenter at genkalde relevante interaktioner, lagre brugerpræferencer og faktuel kontekst samt lære af succeser og fejl over tid. Ideen her er, at tilstandsløse agenter bliver til tilstandsfulde. +#### Mem0 + +En måde at lagre og administrere agenthukommelse på er ved hjælp af specialiserede værktøjer som Mem0. Mem0 fungerer som et vedvarende hukommelseslag, der gør det muligt for agenter at genkalde relevante interaktioner, gemme brugerpræferencer og faktuel kontekst samt lære af succeser og fejl over tid. Ideen her er, at tilstandsløse agenter bliver til tilstandsfulde. Det fungerer gennem en **to-faset hukommelsespipeline: udtrækning og opdatering**. Først sendes meddelelser, der tilføjes til en agents tråd, til Mem0-tjenesten, som bruger en Large Language Model (LLM) til at opsummere samtalehistorik og udtrække nye minder. Derefter bestemmer en LLM-drevet opdateringsfase, om disse minder skal tilføjes, ændres eller slettes, og gemmer dem i en hybrid datalager, der kan inkludere vektor-, graf- og nøgle-værdidatabaser. Dette system understøtter også forskellige hukommelsestyper og kan inkorporere grafhukommelse til at administrere relationer mellem enheder. +#### Cognee + +En anden kraftfuld tilgang er at bruge **Cognee**, en open-source semantisk hukommelse for AI-agenter, der transformerer strukturerede og ustrukturerede data til forespørgselsbare vidensgrafer understøttet af embeddings. Cognee tilbyder en **dual-store arkitektur**, der kombinerer vektorsimilaritetssøgning med grafrelationer, hvilket gør det muligt for agenter at forstå ikke kun, hvad information er lignende, men også hvordan begreber relaterer til hinanden. + +Det udmærker sig ved **hybrid hentning**, der blander vektorsimilaritet, grafstruktur og LLM-reasoning - fra rå dataopslag til grafbevidst spørgsmål-svar. Systemet opretholder en **levende hukommelse**, der udvikler sig og vokser, mens den forbliver forespørgselsbar som én sammenhængende graf, der understøtter både kortvarig sessionskontekst og langvarig vedvarende hukommelse. + +Cognee-notebook-tutorialen ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) demonstrerer opbygningen af dette samlede hukommelseslag med praktiske eksempler på indtagelse af forskellige datakilder, visualisering af vidensgrafen og forespørgsler med forskellige søgestrategier skræddersyet til specifikke agentbehov. + ### Lagring af hukommelse med RAG -Ud over specialiserede hukommelsesværktøjer som Mem0 kan du udnytte robuste søgetjenester som **Azure AI Search som backend til lagring og genkaldelse af minder**, især for struktureret RAG. +Ud over specialiserede hukommelsesværktøjer som Mem0 kan du udnytte robuste søgetjenester som **Azure AI Search som backend til lagring og hentning af minder**, især for struktureret RAG. -Dette gør det muligt at forankre agentens svar med dine egne data, hvilket sikrer mere relevante og præcise svar. Azure AI Search kan bruges til at lagre bruger-specifikke rejseminder, produktkataloger eller enhver anden domænespecifik viden. +Dette gør det muligt at forankre agentens svar med dine egne data og sikre mere relevante og præcise svar. Azure AI Search kan bruges til at lagre bruger-specifikke rejseminder, produktkataloger eller enhver anden domænespecifik viden. -Azure AI Search understøtter funktioner som **Struktureret RAG**, der udmærker sig ved at udtrække og genkalde tæt, struktureret information fra store datasæt som samtalehistorikker, e-mails eller endda billeder. Dette giver "supermenneskelig præcision og genkaldelse" sammenlignet med traditionelle tekstchunking- og indlejringsmetoder. +Azure AI Search understøtter funktioner som **Struktureret RAG**, der udmærker sig ved at udtrække og hente tæt, struktureret information fra store datasæt som samtalehistorikker, e-mails eller endda billeder. Dette giver "supermenneskelig præcision og genkaldelse" sammenlignet med traditionelle tekstchunking- og embedding-tilgange. ## At gøre AI-agenter selvforbedrende @@ -140,15 +158,15 @@ Et almindeligt mønster for selvforbedrende agenter indebærer introduktion af e 2. **Udtrække og opsummere**: Destillere den essentielle læring eller præference fra samtalen. -3. **Lagre i en vidensbase**: Gemme denne udtrukne information, ofte i en vektordatabase, så den kan genkaldes senere. +3. **Gem i en vidensbase**: Bevare denne udtrukne information, ofte i en vektordatabase, så den kan hentes senere. -4. **Forstærke fremtidige forespørgsler**: Når brugeren starter en ny forespørgsel, genkalder vidensagenten relevant lagret information og tilføjer det til brugerens prompt, hvilket giver vigtig kontekst til den primære agent (svarende til RAG). +4. **Forstærke fremtidige forespørgsler**: Når brugeren starter en ny forespørgsel, henter vidensagenten relevant lagret information og tilføjer det til brugerens prompt, hvilket giver vigtig kontekst til den primære agent (svarende til RAG). ### Optimeringer for hukommelse -• **Latensstyring**: For at undgå at forsinke brugerinteraktioner kan en billigere, hurtigere model bruges først til hurtigt at tjekke, om information er værd at lagre eller genkalde, og kun aktivere den mere komplekse udtræknings-/genkaldelsesproces, når det er nødvendigt. +• **Latensstyring**: For at undgå at bremse brugerinteraktioner kan en billigere, hurtigere model bruges først til hurtigt at tjekke, om information er værd at gemme eller hente, og kun aktivere den mere komplekse udtræknings-/hentningsproces, når det er nødvendigt. -• **Vedligeholdelse af vidensbase**: For en voksende vidensbase kan mindre ofte brugt information flyttes til "kold lagring" for at styre omkostninger. +• **Vedligeholdelse af vidensbase**: For en voksende vidensbase kan mindre hyppigt brugt information flyttes til "kold lagerplads" for at styre omkostninger. ## Har du flere spørgsmål om agenthukommelse? @@ -156,5 +174,7 @@ Deltag i [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) for at mø --- + **Ansvarsfraskrivelse**: -Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. \ No newline at end of file +Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selvom vi bestræber os på nøjagtighed, skal det bemærkes, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi er ikke ansvarlige for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse. + \ No newline at end of file diff --git a/translations/de/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/de/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..8f39e455d --- /dev/null +++ b/translations/de/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Aufbau von KI-Agenten mit persistentem Gedächtnis mithilfe von Cognee\n", + "\n", + "Dieses Notebook zeigt, wie man intelligente KI-Agenten mit fortschrittlichen Gedächtnisfähigkeiten mithilfe von [**cognee**](https://www.cognee.ai/) erstellt – einem Open-Source-KI-Gedächtnis, das Wissensgraphen, semantische Suche und Sitzungsmanagement kombiniert, um kontextbewusste KI-Systeme zu entwickeln.\n", + "\n", + "## 🎯 Lernziele\n", + "\n", + "Am Ende dieses Tutorials wirst du verstehen, wie man:\n", + "- **Wissensgraphen basierend auf Embeddings erstellt**: Unstrukturierte Texte in strukturierte, abfragbare Wissensdaten umwandelt\n", + "- **Sitzungsgedächtnis implementiert**: Mehrstufige Gespräche mit automatischer Kontextbeibehaltung erstellt\n", + "- **Gespräche speichert**: Wichtige Interaktionen optional im Langzeitgedächtnis für zukünftige Verwendungen aufbewahrt\n", + "- **Mit natürlicher Sprache abfragt**: Historischen Kontext in neuen Gesprächen nutzt und darauf zugreift\n", + "- **Gedächtnis visualisiert**: Die Beziehungen im Wissensgraphen deines Agenten erkundet\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Was Sie bauen werden\n", + "\n", + "In diesem Tutorial erstellen wir einen **Coding-Assistenten** mit persistentem Speicher, der:\n", + "\n", + "### 1. **Wissensdatenbank-Erstellung**\n", + " - Entwicklerprofile und Fachkenntnisse aufnimmt\n", + " - Prinzipien und Best Practices der Python-Programmierung verarbeitet\n", + " - Historische Gespräche zwischen Entwicklern und KI-Assistenten speichert\n", + "\n", + "### 2. **Sitzungsbewusste Gespräche**\n", + " - Kontext über mehrere Fragen in derselben Sitzung beibehält\n", + " - Jedes Frage-/Antwort-Paar automatisch zwischenspeichert, um eine effiziente Abrufbarkeit zu gewährleisten\n", + " - Kohärente, kontextbezogene Antworten basierend auf der Gesprächshistorie liefert\n", + "\n", + "### 3. **Langzeitgedächtnis**\n", + " - Wichtige Gespräche in ein Langzeitgedächtnis speichert\n", + " - Relevante Erinnerungen aus der Wissensdatenbank und früheren Sitzungen abruft, um neue Interaktionen zu informieren\n", + " - Eine wachsende Wissensdatenbank aufbaut, die sich im Laufe der Zeit verbessert\n", + "\n", + "### 4. **Intelligente Speicherabrufung**\n", + " - Graph-bewusste semantische Suche verwendet, um relevante Informationen in allen gespeicherten Daten zu finden\n", + " - Suchanfragen nach Datenuntergruppen filtert (Entwicklerinformationen vs. Prinzipien)\n", + " - Mehrere Datenquellen kombiniert, um umfassende Antworten zu liefern\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Voraussetzungen & Einrichtung\n", + "\n", + "### Systemanforderungen\n", + "\n", + "Bevor Sie beginnen, stellen Sie sicher, dass Sie Folgendes haben:\n", + "\n", + "1. **Python-Umgebung**\n", + " - Python 3.9 oder höher\n", + " - Virtuelle Umgebung (empfohlen)\n", + " \n", + "2. **Redis-Cache** (Erforderlich für Sitzungsverwaltung)\n", + " - Lokales Redis: `docker run -d -p 6379:6379 redis`\n", + " - Oder nutzen Sie einen verwalteten Redis-Dienst\n", + " \n", + "3. **LLM-API-Zugriff**\n", + " - OpenAI-API-Schlüssel oder andere Anbieter (siehe [Dokumentation](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Datenbankkonfiguration**\n", + " - Standardmäßig ist keine Konfiguration erforderlich. Cognee verwendet dateibasierte Datenbanken (LanceDB und Kuzu)\n", + " - Optional können Sie Azure AI Search als Vektorspeicher einrichten (siehe [Dokumentation](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Umgebungs-Konfiguration\n", + "\n", + "Erstellen Sie eine `.env`-Datei in Ihrem Projektverzeichnis mit den folgenden Variablen:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Verständnis der Speicherarchitektur von Cognee\n", + "\n", + "### Wie Cognee funktioniert\n", + "\n", + "Cognee bietet ein ausgeklügeltes Speichersystem, das über einfache Schlüssel-Wert-Speicherung hinausgeht:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Hauptkomponenten:\n", + "\n", + "1. **Wissensgraph**: Speichert Entitäten, Beziehungen und semantische Verbindungen\n", + "2. **Vektoreinbettungen**: Ermöglicht semantische Suche über alle gespeicherten Informationen\n", + "3. **Sitzungscache**: Hält den Gesprächskontext innerhalb und zwischen Sitzungen aufrecht\n", + "4. **NodeSets**: Organisieren Daten in logische Kategorien für gezielte Abrufe\n", + "\n", + "### Speicherarten in diesem Tutorial:\n", + "\n", + "- **Persistenter Speicher**: Langzeitspeicherung im Wissensgraph\n", + "- **Sitzungsspeicher**: Temporärer Gesprächskontext im Redis-Cache\n", + "- **Semantischer Speicher**: Vektorbasierte Ähnlichkeitssuche über alle Daten hinweg\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Erforderliche Pakete installieren\n", + "\n", + "Installieren Sie Cognee mit Redis-Unterstützung für die Sitzungsverwaltung:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Umgebung initialisieren und Bibliotheken laden\n", + "\n", + "Stellen Sie sicher:\n", + "1. Redis läuft (z. B. über Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Umgebungsvariablen sind gesetzt, bevor Cache-Module importiert werden\n", + "3. Falls nötig, starten Sie den Kernel neu und führen Sie die Zellen der Reihe nach aus\n", + "\n", + "Die folgende Zelle wird:\n", + "1. Umgebungsvariablen aus `.env` laden\n", + "2. Cognee mit Ihren LLM-Einstellungen konfigurieren\n", + "3. Caching für das Sitzungsmanagement aktivieren\n", + "4. Überprüfen, ob alle Komponenten ordnungsgemäß verbunden sind\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Speicherverzeichnisse konfigurieren\n", + "\n", + "Cognee verwendet zwei separate Verzeichnisse für seine Operationen:\n", + "- **Daten-Root**: Speichert eingelesene Dokumente und verarbeitete Daten\n", + "- **System-Root**: Enthält die Wissensgraph-Datenbank und System-Metadaten\n", + "\n", + "Für dieses Tutorial erstellen wir isolierte Verzeichnisse wie folgt:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Speicherzustand zurücksetzen\n", + "\n", + "Bevor wir mit dem Aufbau unseres Speichersystems beginnen, stellen wir sicher, dass wir mit einem sauberen Start beginnen.\n", + "\n", + "> 💡 **Tipp**: Sie können diesen Schritt überspringen, wenn Sie bestehende Erinnerungen aus Ihren vorherigen Durchläufen beibehalten möchten, wenn Sie dieses Notebook später verwenden.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Teil 1: Aufbau der Wissensdatenbank\n", + "\n", + "### Datenquellen für unseren Entwicklerassistenten\n", + "\n", + "Wir werden drei Arten von Daten einbinden, um eine umfassende Wissensdatenbank zu erstellen:\n", + "\n", + "1. **Entwicklerprofil**: Persönliche Expertise und technischer Hintergrund \n", + "2. **Python Best Practices**: Die Zen-Prinzipien von Python mit praktischen Richtlinien \n", + "3. **Historische Gespräche**: Frühere Q&A-Sitzungen zwischen Entwicklern und KI-Assistenten \n", + "\n", + "Diese vielfältigen Daten ermöglichen es unserem Agenten: \n", + "- Den technischen Kontext des Nutzers zu verstehen \n", + "- Best Practices in Empfehlungen anzuwenden \n", + "- Aus früheren erfolgreichen Interaktionen zu lernen \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Daten in Wissensgraph umwandeln\n", + "\n", + "Jetzt werden wir unseren Rohtext in eine strukturierte Erinnerung umwandeln. Dieser Prozess:\n", + "\n", + "1. **Fügt Daten zu NodeSets hinzu**: Organisiert Informationen in logische Kategorien\n", + " - `developer_data`: Entwicklerprofile und Gespräche\n", + " - `principles_data`: Python-Best Practices und Richtlinien\n", + "\n", + "2. **Führt die Cognify-Pipeline aus**: Extrahiert Entitäten, Beziehungen und erstellt Embeddings\n", + " - Identifiziert Schlüsselkonzepte\n", + " - Erstellt semantische Verbindungen zwischen verwandten Informationen\n", + " - Generiert Vektor-Embeddings\n", + "\n", + "Dies kann einige Momente dauern, während das LLM den Text verarbeitet und die Graphstruktur erstellt:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Visualisieren des Wissensgraphen\n", + "\n", + "Lassen Sie uns die Struktur unseres Wissensgraphen erkunden. Die Visualisierung zeigt:\n", + "- **Knoten**: Aus dem Text extrahierte Entitäten (Konzepte, Technologien, Personen)\n", + "- **Kanten**: Beziehungen und Verbindungen zwischen den Entitäten\n", + "- **Cluster**: Verwandte Konzepte, gruppiert nach semantischer Ähnlichkeit\n", + "\n", + "Öffnen Sie die generierte HTML-Datei in Ihrem Browser, um den Graphen interaktiv zu erkunden:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Gedächtnis mit Memify bereichern\n", + "\n", + "Die Funktion `memify()` analysiert den Wissensgraphen und generiert intelligente Regeln über die Daten. Dieser Prozess:\n", + "- Identifiziert Muster und bewährte Praktiken\n", + "- Erstellt umsetzbare Richtlinien basierend auf dem Inhalt\n", + "- Stellt Beziehungen zwischen verschiedenen Wissensbereichen her\n", + "\n", + "Diese Regeln helfen dem Agenten, fundiertere Entscheidungen zu treffen, wenn Fragen beantwortet werden. Das Erfassen einer zweiten Visualisierung ermöglicht es Ihnen, zu vergleichen, wie der Graph nach der Anreicherung dichter wird.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Teil 2: Intelligente Speicherabfrage\n", + "\n", + "### Demonstration 1: Wissensintegration über Dokumente hinweg\n", + "\n", + "Jetzt, da unser Wissensgraph erstellt ist, testen wir, wie Cognee Informationen aus mehreren Quellen kombiniert, um komplexe Fragen zu beantworten.\n", + "\n", + "Die erste Abfrage demonstriert:\n", + "- **Semantisches Verständnis**: Relevante Konzepte finden, auch wenn sie nicht explizit erwähnt werden\n", + "- **Querverweise**: Verknüpfung von Entwicklerprofilen mit Python-Prinzipien\n", + "- **Kontextuelles Denken**: Anwendung von Best Practices auf spezifische Implementierungen\n", + "\n", + "### Demonstration 2: Gefilterte Suche mit NodeSets\n", + "\n", + "Die zweite Abfrage zeigt, wie spezifische Teilmengen des Wissensgraphen gezielt durchsucht werden können:\n", + "- Verwendet den Parameter `node_name`, um nur innerhalb von `principles_data` zu suchen\n", + "- Liefert fokussierte Antworten aus einem spezifischen Wissensbereich\n", + "- Nützlich, wenn domänenspezifische Informationen benötigt werden\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Teil 3: Einrichtung des Sitzungsmanagements\n", + "\n", + "### Aktivieren der Gesprächsspeicherung\n", + "\n", + "Das Sitzungsmanagement ist entscheidend, um den Kontext über mehrere Interaktionen hinweg beizubehalten. Hier werden wir:\n", + "\n", + "1. **Benutzerkontext initialisieren**: Ein Benutzerprofil erstellen oder abrufen, um die Sitzung zu verfolgen\n", + "2. **Cache-Engine konfigurieren**: Verbindung zu Redis herstellen, um den Gesprächsverlauf zu speichern\n", + "3. **Sitzungsvariablen aktivieren**: Kontextvariablen einrichten, die über Abfragen hinweg bestehen bleiben\n", + "\n", + "> ⚠️ **Wichtig**: Dafür muss Redis laufen und `CACHING=true` in Ihrer Umgebung gesetzt sein\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Hilfsfunktion: Sitzungsverlauf anzeigen\n", + "\n", + "Diese Hilfsfunktion ermöglicht es uns, den in Redis gespeicherten Gesprächsverlauf zu überprüfen. Sie ist nützlich für:\n", + "- Debugging der Sitzungsverwaltung\n", + "- Überprüfung, ob Gespräche zwischengespeichert werden\n", + "- Verständnis, welcher Kontext dem Agenten zur Verfügung steht\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Sitzung 1: Async Support Lab — Erste Frage\n", + "\n", + "Starten Sie die `async-support-lab`-Sitzung, indem Sie nach telemetrie-freundlichen asyncio-Mustern für einen massiven Web-Scraper fragen. Der Graph kennt bereits asyncio, aiohttp und Überwachungspraktiken, daher sollte die Antwort frühere Gespräche widerspiegeln und gleichzeitig auf die neue Anfrage zugeschnitten sein.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Speicher von Sitzung 1 nach dem ersten Austausch überprüfen\n", + "\n", + "Das Ausführen von `show_history(session_1)` direkt nach der ersten Frage bestätigt, dass Cognee sowohl die Eingabeaufforderung als auch die Antwort in Redis geschrieben hat. Sie sollten einen Eintrag mit der Parallelitätsanleitung sehen.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Sitzung 1: Nachverfolgung von Datenmodellen\n", + "\n", + "Als Nächstes fragen wir: \"Wann sollte ich dataclasses gegenüber Pydantic wählen?\" unter Verwendung derselben Sitzungs-ID. Cognee sollte die Python-Prinzipien sowie frühere FastAPI-Gespräche zusammenführen, um differenzierte Ratschläge zu geben – und damit zeigen, dass der Kontext innerhalb einer benannten Sitzung erhalten bleibt.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Bestätigen, dass der Verlauf von Sitzung 1 beide Dialoge enthält\n", + "\n", + "Ein weiterer Aufruf von `show_history(session_1)` sollte zwei Q&A-Einträge anzeigen. Dies entspricht dem \"Memory Replay\"-Schritt des Mem0-Labors und beweist, dass zusätzliche Dialoge das gleiche Transkript erweitern.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Sitzung 2: Design-Review-Thread — Neue Sitzung\n", + "\n", + "Um die Trennung zwischen Threads zu zeigen, starten wir `design-review-session` und bitten um Protokollierungsrichtlinien für Vorfallbewertungen. Obwohl die zugrunde liegende Wissensbasis dieselbe ist, sorgt die neue Sitzungs-ID dafür, dass Transkripte getrennt bleiben.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Überprüfungssitzung 2 Geschichte\n", + "\n", + "`show_history(session_2)` sollte nur das Design-Review-Prompt/Antwort-Paar auflisten. Vergleichen Sie es mit Sitzung 1, um hervorzuheben, wie Cognee unabhängige Transkripte beibehält, während das gemeinsame Wissensgraphen genutzt wird.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Zusammenfassung\n", + "\n", + "Herzlichen Glückwunsch! Sie haben Ihrem Coding-Assistenten gerade eine echte Langzeitspeicherschicht mit Cognee hinzugefügt.\n", + "\n", + "In diesem Tutorial haben Sie rohe Entwicklerinhalte (Code, Dokumentationen, Chats) in ein Graph- und Vektorspeicherformat umgewandelt, das Ihr Agent durchsuchen, analysieren und kontinuierlich verbessern kann.\n", + "\n", + "Was Sie gelernt haben:\n", + "\n", + "1. **Von rohem Text zu KI-Speicher**: Wie Cognee unstrukturierte Daten aufnimmt und sie mithilfe einer kombinierten Vektor- und Wissensgraph-Architektur in intelligenten, durchsuchbaren Speicher umwandelt.\n", + "\n", + "2. **Graph-Anreicherung mit memify**: Wie Sie über die grundlegende Graph-Erstellung hinausgehen und memify nutzen können, um abgeleitete Fakten und reichhaltigere Beziehungen zu Ihrem bestehenden Graphen hinzuzufügen.\n", + "\n", + "3. **Verschiedene Suchstrategien**: Wie Sie den Speicher mit unterschiedlichen Suchtypen abfragen können (graph-basiertes Q&A, RAG-ähnliche Vervollständigung, Einblicke, rohe Textabschnitte, Codesuche usw.), je nachdem, was Ihr Agent benötigt.\n", + "\n", + "4. **Visuelle Erkundung**: Wie Sie mit Graph-Visualisierungen und der Cognee-Benutzeroberfläche inspizieren und debuggen können, was Cognee erstellt hat, sodass Sie tatsächlich sehen können, wie Wissen strukturiert ist.\n", + "\n", + "5. **Sitzungsbewusster Speicher**: Wie Sie kontextbezogene Sitzungsdaten mit persistentem semantischem Speicher kombinieren können, damit Agenten sich über mehrere Sitzungen hinweg erinnern können, ohne Informationen zwischen Benutzern zu vermischen.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Wichtige Erkenntnisse\n", + "1. Speicher als Wissensgraph unterstützt durch Embeddings\n", + "\n", + " - **Strukturierte Verständlichkeit**: Cognee kombiniert einen Vektorspeicher und einen Graphspeicher, sodass Ihre Daten sowohl nach Bedeutung durchsuchbar als auch durch Beziehungen verbunden sind. Standardmäßig verwendet Cognee dateibasierte Datenbanken (LanceDB für Vektoren, Kuzu für Graphdatenbanken).\n", + "\n", + " - **Beziehungsbewusste Suche**: Antworten basieren nicht nur auf „ähnlichem Text“, sondern auch darauf, wie Entitäten miteinander in Beziehung stehen.\n", + "\n", + " - **Lebendiger Speicher**: Die Speicherebene entwickelt sich weiter, wächst und bleibt als ein verbundener Graph abfragbar.\n", + "\n", + "2. Such- und Denkmodi\n", + " - **Hybride Suche**: Die Suche kombiniert Vektorsimilarität, Graphstruktur und LLM-Logik, von der Suche nach Rohdaten bis hin zu graphbewussten Frage-Antworten.\n", + "\n", + " - **Den Modus an die Aufgabe anpassen**: Verwenden Sie Modi im Stil von Vervollständigungen, wenn Sie Antworten in natürlicher Sprache möchten, und Chunk-/Zusammenfassungs-/Graph-Modi, wenn Ihr Agent Rohkontext benötigt oder eigene Schlussfolgerungen ziehen soll.\n", + "\n", + "3. Personalisierte, sitzungsbewusste Agenten\n", + " - **Sitzungskontext + Langzeitspeicher**: Cognee trennt den kurzfristigen „Thread“-Kontext vom langfristigen Speicher auf Benutzer- oder Organisationsebene.\n", + "\n", + "## Anwendungen in der Praxis\n", + "\n", + "1. **Vertikale KI-Agenten**\n", + "\n", + " Nutzen Sie das Muster aus diesem Notebook, um domänenspezifische Copiloten zu entwickeln, die Cognee als Kern für Abruf und Logik verwenden:\n", + "\n", + "- **Entwickler-Copiloten**: Code-Review, Vorfallanalyse und Architekturassistenten, die Code, APIs, Entwurfsdokumente und Tickets als einen einzigen Speichergraphen durchlaufen.\n", + "\n", + "- **Kundenorientierte Copiloten**: Support- oder Erfolgsagenten, die Produktdokumente, FAQs, CRM-Notizen und frühere Tickets mit graphbewusster Suche und zitierten Antworten nutzen.\n", + "\n", + "- **Interne Experten-Copiloten**: Richtlinien-, Rechts- oder Sicherheitsassistenten, die über miteinander verbundene Regeln, Richtlinien und historische Entscheidungen nachdenken, anstatt isolierte PDFs zu verwenden.\n", + "\n", + " Cognee ist explizit als persistenter, genauer Speicher für KI-Agenten positioniert und bietet einen lebendigen Wissensgraphen, der hinter Ihrem Agenten eingesetzt wird und ad-hoc Kombinationen aus Vektorspeichern und benutzerdefiniertem Graphcode ersetzt.\n", + "\n", + "2. **Daten-Silos in einen Speicher vereinen**\n", + "\n", + " Der gleiche Ansatz hilft Ihnen, eine einheitliche Speicherebene über verstreute Quellen hinweg aufzubauen:\n", + "\n", + "- **Von Silos zu einem Graphen**: Strukturierte (z. B. Datenbanken) und unstrukturierte Daten (z. B. Dokumente, Chats) in einen einzigen Graphen mit Embeddings einfügen, anstatt separate Indizes für jedes System zu verwenden.\n", + "\n", + "- **Quellenübergreifende Logik mit Zitaten**: Führen Sie mehrstufige Logik über alles aus – „verbinden“ Sie Protokolle, Metriken und Dokumente über den Graphen – und liefern Sie dennoch fundierte Antworten mit Herkunftsnachweisen.\n", + "\n", + "- **Wissenszentren**: Für Bereiche wie Banken oder Bildung wird Cognee bereits genutzt, um PDFs, interne Systeme und App-Daten in einen Wissensgraphen mit Vektoren zu vereinen, sodass Agenten Fragen mit präzisem, zitiertem Kontext beantworten können.\n", + "\n", + "## Nächste Schritte\n", + "\n", + "Sie haben die Kernspeicherschleife implementiert. Hier sind natürliche Erweiterungen, die Sie selbst ausprobieren können (siehe [Cognee-Dokumentation](https://docs.cognee.ai/) für Details):\n", + "\n", + "1. **Mit zeitlicher Bewusstheit experimentieren**: Aktivieren Sie „temporal cognify“, um Ereignisse und Zeitstempel aus Text zu extrahieren.\n", + "\n", + "2. **Ontologie-gesteuerte Logik einführen**: Definieren Sie eine OWL-Ontologie für Ihre Domäne. Nutzen Sie Cognee’s Ontologie-Unterstützung, damit extrahierte Entitäten und Beziehungen in diesem Schema verankert sind, was die Graphqualität und domänenspezifische Antworten verbessert.\n", + "\n", + "3. **Eine Feedback-Schleife hinzufügen**: Lassen Sie Cognee die Gewichtung von Graphkanten basierend auf echtem Benutzerfeedback anpassen, sodass die Suche sich im Laufe der Zeit verbessert, anstatt statisch zu bleiben.\n", + "\n", + "4. **Für Personalisierung & Sitzungsverhalten optimieren**: Verwenden Sie Benutzer-IDs, Mandanten und Datensätze, um jeder Person oder jedem Team eine eigene Ansicht über die gemeinsame Speicher-Engine zu geben.\n", + "\n", + "5. **Auf komplexere Agenten skalieren**: Integrieren Sie Cognee in Agenten-Frameworks, um Multi-Agenten-Systeme zu entwickeln, die alle die gleiche Speicherebene teilen. *Microsoft Agent Framework x Cognee Plugin kommt bald.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Haftungsausschluss**: \nDieses Dokument wurde mit dem KI-Übersetzungsdienst [Co-op Translator](https://github.com/Azure/co-op-translator) übersetzt. Obwohl wir uns um Genauigkeit bemühen, beachten Sie bitte, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner ursprünglichen Sprache sollte als maßgebliche Quelle betrachtet werden. Für kritische Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die sich aus der Nutzung dieser Übersetzung ergeben.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:17:01+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "de" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/de/13-agent-memory/README.md b/translations/de/13-agent-memory/README.md index 34ebdca33..5930ff948 100644 --- a/translations/de/13-agent-memory/README.md +++ b/translations/de/13-agent-memory/README.md @@ -1,16 +1,16 @@ -# Speicher für KI-Agenten +# Speicher für KI-Agenten [![Agentenspeicher](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.de.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Wenn es um die einzigartigen Vorteile der Erstellung von KI-Agenten geht, werden hauptsächlich zwei Dinge diskutiert: die Fähigkeit, Werkzeuge aufzurufen, um Aufgaben zu erledigen, und die Fähigkeit, sich im Laufe der Zeit zu verbessern. Speicher bildet die Grundlage für die Entwicklung selbstverbessernder Agenten, die bessere Erlebnisse für unsere Nutzer schaffen können. +Wenn es um die einzigartigen Vorteile der Erstellung von KI-Agenten geht, werden hauptsächlich zwei Dinge diskutiert: die Fähigkeit, Werkzeuge zur Erledigung von Aufgaben aufzurufen, und die Fähigkeit, sich im Laufe der Zeit zu verbessern. Speicher bildet die Grundlage für die Erstellung selbstverbessernder Agenten, die bessere Erlebnisse für unsere Nutzer schaffen können. In dieser Lektion werden wir uns ansehen, was Speicher für KI-Agenten bedeutet und wie wir ihn verwalten und für unsere Anwendungen nutzen können. @@ -18,27 +18,35 @@ In dieser Lektion werden wir uns ansehen, was Speicher für KI-Agenten bedeutet Diese Lektion behandelt: -• **Verständnis des Speichers von KI-Agenten**: Was Speicher ist und warum er für Agenten unverzichtbar ist. +• **Verständnis des Speichers von KI-Agenten**: Was Speicher ist und warum er für Agenten essenziell ist. -• **Implementierung und Speicherung von Speicher**: Praktische Methoden, um Speicherfunktionen in Ihre KI-Agenten einzubauen, mit Fokus auf Kurzzeit- und Langzeitspeicher. +• **Implementierung und Speicherung von Speicher**: Praktische Methoden, um Speicherfunktionen zu Ihren KI-Agenten hinzuzufügen, mit Fokus auf Kurzzeit- und Langzeitspeicher. • **Selbstverbesserung von KI-Agenten**: Wie Speicher es Agenten ermöglicht, aus vergangenen Interaktionen zu lernen und sich im Laufe der Zeit zu verbessern. +## Verfügbare Implementierungen + +Diese Lektion enthält zwei umfassende Notebook-Tutorials: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Implementiert Speicher mit Mem0 und Azure AI Search unter Verwendung des Semantic Kernel Frameworks. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Implementiert strukturierten Speicher mit Cognee, erstellt automatisch Wissensgraphen basierend auf Embeddings, visualisiert den Graphen und ermöglicht intelligentes Abrufen. + ## Lernziele Nach Abschluss dieser Lektion werden Sie wissen, wie man: • **Zwischen verschiedenen Arten von KI-Agenten-Speicher unterscheidet**, einschließlich Arbeits-, Kurzzeit- und Langzeitspeicher sowie spezialisierter Formen wie Persona- und episodischer Speicher. -• **Kurzzeit- und Langzeitspeicher für KI-Agenten implementiert und verwaltet** mit dem Semantic Kernel Framework, unter Nutzung von Tools wie Mem0 und Whiteboard-Speicher sowie der Integration mit Azure AI Search. +• **Kurzzeit- und Langzeitspeicher für KI-Agenten implementiert und verwaltet**, unter Verwendung des Semantic Kernel Frameworks und Tools wie Mem0, Cognee, Whiteboard-Speicher sowie der Integration mit Azure AI Search. -• **Die Prinzipien hinter selbstverbessernden KI-Agenten versteht** und wie robuste Speicherverwaltungssysteme zu kontinuierlichem Lernen und Anpassung beitragen. +• **Die Prinzipien hinter selbstverbessernden KI-Agenten versteht** und wie robuste Speichermanagementsysteme zu kontinuierlichem Lernen und Anpassung beitragen. ## Verständnis des Speichers von KI-Agenten -Im Kern bezieht sich **Speicher für KI-Agenten auf Mechanismen, die es ihnen ermöglichen, Informationen zu behalten und abzurufen**. Diese Informationen können spezifische Details über ein Gespräch, Nutzerpräferenzen, vergangene Aktionen oder sogar erlernte Muster umfassen. +Im Kern bezieht sich **Speicher für KI-Agenten auf Mechanismen, die es ihnen ermöglichen, Informationen zu speichern und abzurufen**. Diese Informationen können spezifische Details über ein Gespräch, Nutzerpräferenzen, vergangene Aktionen oder sogar erlernte Muster sein. -Ohne Speicher sind KI-Anwendungen oft zustandslos, was bedeutet, dass jede Interaktion von vorne beginnt. Dies führt zu einer repetitiven und frustrierenden Nutzererfahrung, bei der der Agent den vorherigen Kontext oder die Präferenzen "vergisst". +Ohne Speicher sind KI-Anwendungen oft zustandslos, was bedeutet, dass jede Interaktion von vorne beginnt. Dies führt zu einer sich wiederholenden und frustrierenden Nutzererfahrung, bei der der Agent den vorherigen Kontext oder die Präferenzen "vergisst". ### Warum ist Speicher wichtig? @@ -46,57 +54,57 @@ Die Intelligenz eines Agenten hängt stark von seiner Fähigkeit ab, vergangene • **Reflexion**: Lernen aus vergangenen Aktionen und Ergebnissen. -• **Interaktivität**: Kontext über ein laufendes Gespräch hinweg aufrechterhalten. +• **Interaktivität**: Beibehaltung des Kontexts während eines laufenden Gesprächs. • **Proaktivität und Reaktivität**: Bedürfnisse antizipieren oder angemessen auf Basis historischer Daten reagieren. -• **Autonomie**: Unabhängiger arbeiten, indem gespeichertes Wissen genutzt wird. +• **Autonomie**: Unabhängiger agieren, indem gespeichertes Wissen genutzt wird. Das Ziel der Implementierung von Speicher ist es, Agenten **zuverlässiger und leistungsfähiger** zu machen. ### Arten von Speicher -#### Arbeitsgedächtnis +#### Arbeitsspeicher -Stellen Sie sich dies wie ein Stück Notizpapier vor, das ein Agent während einer einzelnen, laufenden Aufgabe oder eines Denkprozesses verwendet. Es hält unmittelbare Informationen, die für den nächsten Schritt benötigt werden. +Stellen Sie sich dies wie ein Notizblatt vor, das ein Agent während einer einzelnen, laufenden Aufgabe oder eines Denkprozesses verwendet. Es enthält unmittelbare Informationen, die für die nächste Aktion benötigt werden. -Für KI-Agenten erfasst das Arbeitsgedächtnis oft die relevantesten Informationen aus einem Gespräch, auch wenn die vollständige Chat-Historie lang oder gekürzt ist. Es konzentriert sich darauf, Schlüsselaspekte wie Anforderungen, Vorschläge, Entscheidungen und Aktionen zu extrahieren. +Für KI-Agenten erfasst der Arbeitsspeicher oft die relevantesten Informationen aus einem Gespräch, selbst wenn der vollständige Chatverlauf lang oder gekürzt ist. Der Fokus liegt auf der Extraktion von Schlüsselelementen wie Anforderungen, Vorschlägen, Entscheidungen und Aktionen. -**Beispiel für Arbeitsgedächtnis** +**Beispiel für Arbeitsspeicher** -In einem Reisebuchungs-Agenten könnte das Arbeitsgedächtnis die aktuelle Anfrage des Nutzers erfassen, wie "Ich möchte eine Reise nach Paris buchen". Diese spezifische Anforderung wird im unmittelbaren Kontext des Agenten gehalten, um die aktuelle Interaktion zu steuern. +In einem Reisebuchungs-Agenten könnte der Arbeitsspeicher die aktuelle Anfrage des Nutzers erfassen, wie z. B. "Ich möchte eine Reise nach Paris buchen". Diese spezifische Anforderung wird im unmittelbaren Kontext des Agenten gehalten, um die aktuelle Interaktion zu leiten. -#### Kurzzeitgedächtnis +#### Kurzzeitspeicher -Diese Art von Speicher behält Informationen für die Dauer eines einzelnen Gesprächs oder einer Sitzung. Es ist der Kontext des aktuellen Chats, der es dem Agenten ermöglicht, auf vorherige Gesprächsbeiträge zurückzugreifen. +Dieser Speichertyp bewahrt Informationen für die Dauer eines einzelnen Gesprächs oder einer Sitzung. Es ist der Kontext des aktuellen Chats, der es dem Agenten ermöglicht, auf vorherige Gesprächsbeiträge Bezug zu nehmen. -**Beispiel für Kurzzeitgedächtnis** +**Beispiel für Kurzzeitspeicher** -Wenn ein Nutzer fragt: "Wie viel würde ein Flug nach Paris kosten?" und anschließend sagt: "Was ist mit der Unterkunft dort?", stellt das Kurzzeitgedächtnis sicher, dass der Agent weiß, dass "dort" sich auf "Paris" bezieht, innerhalb desselben Gesprächs. +Wenn ein Nutzer fragt: "Wie viel würde ein Flug nach Paris kosten?" und dann nachfragt: "Was ist mit einer Unterkunft dort?", stellt der Kurzzeitspeicher sicher, dass der Agent weiß, dass sich "dort" auf "Paris" bezieht. -#### Langzeitgedächtnis +#### Langzeitspeicher -Dies sind Informationen, die über mehrere Gespräche oder Sitzungen hinweg bestehen bleiben. Es ermöglicht Agenten, Nutzerpräferenzen, historische Interaktionen oder allgemeines Wissen über längere Zeiträume hinweg zu speichern. Dies ist wichtig für die Personalisierung. +Dies sind Informationen, die über mehrere Gespräche oder Sitzungen hinweg bestehen bleiben. Sie ermöglichen es Agenten, Nutzerpräferenzen, historische Interaktionen oder allgemeines Wissen über längere Zeiträume hinweg zu speichern. Dies ist wichtig für die Personalisierung. -**Beispiel für Langzeitgedächtnis** +**Beispiel für Langzeitspeicher** -Ein Langzeitgedächtnis könnte speichern, dass "Ben gerne Ski fährt und Outdoor-Aktivitäten mag, Kaffee mit Bergblick bevorzugt und aufgrund einer früheren Verletzung fortgeschrittene Skipisten vermeiden möchte". Diese Informationen, die aus früheren Interaktionen gelernt wurden, beeinflussen Empfehlungen in zukünftigen Reiseplanungs-Sitzungen und machen sie hochgradig personalisiert. +Ein Langzeitspeicher könnte speichern, dass "Ben gerne Ski fährt und Outdoor-Aktivitäten mag, Kaffee mit Bergblick bevorzugt und aufgrund einer früheren Verletzung fortgeschrittene Skipisten vermeiden möchte". Diese Informationen, die aus früheren Interaktionen gelernt wurden, beeinflussen zukünftige Reiseempfehlungen und machen sie hochgradig personalisiert. #### Persona-Speicher -Dieser spezialisierte Speicher hilft einem Agenten, eine konsistente "Persönlichkeit" oder "Rolle" zu entwickeln. Er ermöglicht es dem Agenten, Details über sich selbst oder seine beabsichtigte Rolle zu speichern, wodurch Interaktionen flüssiger und fokussierter werden. +Dieser spezialisierte Speichertyp hilft einem Agenten, eine konsistente "Persönlichkeit" oder "Rolle" zu entwickeln. Er ermöglicht es dem Agenten, Details über sich selbst oder seine beabsichtigte Rolle zu speichern, was die Interaktionen flüssiger und fokussierter macht. **Beispiel für Persona-Speicher** -Wenn der Reiseagent als "Experte für Ski-Planung" konzipiert ist, könnte der Persona-Speicher diese Rolle verstärken und seine Antworten so beeinflussen, dass sie dem Ton und Wissen eines Experten entsprechen. +Wenn der Reiseagent als "Experte für Skiplanung" konzipiert ist, könnte der Persona-Speicher diese Rolle verstärken und die Antworten des Agenten so beeinflussen, dass sie dem Ton und Wissen eines Experten entsprechen. #### Workflow-/Episodenspeicher Dieser Speicher speichert die Abfolge von Schritten, die ein Agent während einer komplexen Aufgabe unternimmt, einschließlich Erfolgen und Misserfolgen. Es ist wie das Erinnern an spezifische "Episoden" oder vergangene Erfahrungen, um daraus zu lernen. -**Beispiel für episodischen Speicher** +**Beispiel für Episodenspeicher** -Wenn der Agent versucht hat, einen bestimmten Flug zu buchen, dies jedoch aufgrund von Nichtverfügbarkeit scheiterte, könnte der episodische Speicher diesen Misserfolg aufzeichnen, sodass der Agent alternative Flüge ausprobieren oder den Nutzer bei einem erneuten Versuch besser über das Problem informieren kann. +Wenn der Agent versucht hat, einen bestimmten Flug zu buchen, dies jedoch aufgrund von Nichtverfügbarkeit scheiterte, könnte der Episodenspeicher diesen Misserfolg aufzeichnen. Dadurch kann der Agent alternative Flüge ausprobieren oder den Nutzer bei einem erneuten Versuch besser über das Problem informieren. #### Entitätenspeicher @@ -108,47 +116,57 @@ Aus einem Gespräch über eine vergangene Reise könnte der Agent "Paris", "Eiff #### Strukturierter RAG (Retrieval Augmented Generation) -Während RAG eine umfassendere Technik ist, wird "strukturierter RAG" als eine leistungsstarke Speichertechnologie hervorgehoben. Es extrahiert dichte, strukturierte Informationen aus verschiedenen Quellen (Gesprächen, E-Mails, Bildern) und nutzt sie, um Präzision, Abruf und Geschwindigkeit bei Antworten zu verbessern. Im Gegensatz zu klassischem RAG, das ausschließlich auf semantischer Ähnlichkeit basiert, arbeitet strukturierter RAG mit der inhärenten Struktur von Informationen. +Während RAG eine breitere Technik ist, wird "strukturierter RAG" als leistungsstarke Speichertechnologie hervorgehoben. Es extrahiert dichte, strukturierte Informationen aus verschiedenen Quellen (Gesprächen, E-Mails, Bildern) und nutzt sie, um Präzision, Abruf und Geschwindigkeit bei Antworten zu verbessern. Im Gegensatz zu klassischem RAG, das sich ausschließlich auf semantische Ähnlichkeit stützt, arbeitet strukturierter RAG mit der inhärenten Struktur von Informationen. **Beispiel für strukturierten RAG** -Anstatt nur Schlüsselwörter abzugleichen, könnte strukturierter RAG Flugdaten (Ziel, Datum, Uhrzeit, Fluggesellschaft) aus einer E-Mail analysieren und sie strukturiert speichern. Dies ermöglicht präzise Abfragen wie "Welchen Flug habe ich am Dienstag nach Paris gebucht?" +Anstatt nur Schlüsselwörter abzugleichen, könnte strukturierter RAG Flugdaten (Ziel, Datum, Uhrzeit, Fluggesellschaft) aus einer E-Mail analysieren und strukturiert speichern. Dies ermöglicht präzise Abfragen wie "Welchen Flug habe ich am Dienstag nach Paris gebucht?" ## Implementierung und Speicherung von Speicher -Die Implementierung von Speicher für KI-Agenten umfasst einen systematischen Prozess der **Speicherverwaltung**, der das Generieren, Speichern, Abrufen, Integrieren, Aktualisieren und sogar das "Vergessen" (oder Löschen) von Informationen einschließt. Das Abrufen ist dabei ein besonders wichtiger Aspekt. +Die Implementierung von Speicher für KI-Agenten erfordert einen systematischen Prozess des **Speichermanagements**, der das Generieren, Speichern, Abrufen, Integrieren, Aktualisieren und sogar das "Vergessen" (oder Löschen) von Informationen umfasst. Besonders wichtig ist der Abruf. + +### Spezialisierte Speicherwerkzeuge + +#### Mem0 + +Eine Möglichkeit, Agentenspeicher zu speichern und zu verwalten, ist die Verwendung spezialisierter Werkzeuge wie Mem0. Mem0 fungiert als persistente Speicherschicht, die es Agenten ermöglicht, relevante Interaktionen abzurufen, Nutzerpräferenzen und faktischen Kontext zu speichern und aus Erfolgen und Misserfolgen im Laufe der Zeit zu lernen. Die Idee dahinter ist, zustandslose Agenten in zustandsbehaftete zu verwandeln. + +Es funktioniert durch eine **zweiphasige Speicherpipeline: Extraktion und Aktualisierung**. Zunächst werden Nachrichten, die einem Agenten-Thread hinzugefügt werden, an den Mem0-Dienst gesendet, der ein Large Language Model (LLM) verwendet, um den Gesprächsverlauf zusammenzufassen und neue Erinnerungen zu extrahieren. Anschließend bestimmt eine LLM-gesteuerte Aktualisierungsphase, ob diese Erinnerungen hinzugefügt, geändert oder gelöscht werden sollen, und speichert sie in einem hybriden Datenspeicher, der Vektor-, Graph- und Schlüssel-Wert-Datenbanken umfassen kann. Dieses System unterstützt auch verschiedene Speichertypen und kann Graph-Speicher für die Verwaltung von Beziehungen zwischen Entitäten einbeziehen. + +#### Cognee -### Spezialisierte Speicher-Tools +Ein weiterer leistungsstarker Ansatz ist die Verwendung von **Cognee**, einem Open-Source-Semantik-Speicher für KI-Agenten, der strukturierte und unstrukturierte Daten in abfragbare Wissensgraphen umwandelt, die durch Embeddings unterstützt werden. Cognee bietet eine **Dual-Store-Architektur**, die Vektorähnlichkeitssuche mit Graph-Beziehungen kombiniert, sodass Agenten nicht nur verstehen, welche Informationen ähnlich sind, sondern auch, wie Konzepte miteinander in Beziehung stehen. -Eine Möglichkeit, den Speicher eines Agenten zu speichern und zu verwalten, ist die Nutzung spezialisierter Tools wie Mem0. Mem0 fungiert als persistente Speicherschicht, die es Agenten ermöglicht, relevante Interaktionen abzurufen, Nutzerpräferenzen und faktischen Kontext zu speichern und aus Erfolgen und Misserfolgen im Laufe der Zeit zu lernen. Die Idee dahinter ist, zustandslose Agenten in zustandsbehaftete zu verwandeln. +Es zeichnet sich durch **hybrides Abrufen** aus, das Vektorähnlichkeit, Graphstruktur und LLM-Logik kombiniert – von der Suche nach Rohdaten bis hin zu graphbewussten Antworten auf Fragen. Das System pflegt einen **lebendigen Speicher**, der sich weiterentwickelt und wächst, während er als ein zusammenhängender Graph abfragbar bleibt. Es unterstützt sowohl den kurzfristigen Sitzungs-Kontext als auch den langfristigen persistenten Speicher. -Es funktioniert durch eine **zweiphasige Speicherpipeline: Extraktion und Aktualisierung**. Zunächst werden Nachrichten, die einem Agenten-Thread hinzugefügt werden, an den Mem0-Dienst gesendet, der ein Large Language Model (LLM) verwendet, um die Gesprächshistorie zusammenzufassen und neue Erinnerungen zu extrahieren. Anschließend bestimmt eine LLM-gesteuerte Aktualisierungsphase, ob diese Erinnerungen hinzugefügt, modifiziert oder gelöscht werden sollen, und speichert sie in einem hybriden Datenspeicher, der Vektor-, Graph- und Schlüssel-Wert-Datenbanken umfassen kann. Dieses System unterstützt auch verschiedene Speicherarten und kann Graph-Speicher für die Verwaltung von Beziehungen zwischen Entitäten integrieren. +Das Cognee-Notebook-Tutorial ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) zeigt, wie diese einheitliche Speicherschicht aufgebaut wird, mit praktischen Beispielen zum Einlesen verschiedener Datenquellen, Visualisieren des Wissensgraphen und Abfragen mit unterschiedlichen Suchstrategien, die auf spezifische Agentenbedürfnisse zugeschnitten sind. ### Speicherung von Speicher mit RAG -Neben spezialisierten Speicher-Tools wie Mem0 können Sie robuste Suchdienste wie **Azure AI Search als Backend für die Speicherung und das Abrufen von Erinnerungen** nutzen, insbesondere für strukturierten RAG. +Neben spezialisierten Speicherwerkzeugen wie Mem0 können Sie robuste Suchdienste wie **Azure AI Search als Backend für die Speicherung und den Abruf von Erinnerungen** nutzen, insbesondere für strukturiertes RAG. -Dies ermöglicht es Ihnen, die Antworten Ihres Agenten mit Ihren eigenen Daten zu untermauern und so relevantere und genauere Antworten zu gewährleisten. Azure AI Search kann verwendet werden, um nutzerspezifische Reiseerinnerungen, Produktkataloge oder andere domänenspezifische Kenntnisse zu speichern. +Dies ermöglicht es Ihnen, die Antworten Ihres Agenten mit Ihren eigenen Daten zu untermauern und so relevantere und genauere Antworten zu gewährleisten. Azure AI Search kann verwendet werden, um nutzerspezifische Reiseerinnerungen, Produktkataloge oder jedes andere domänenspezifische Wissen zu speichern. -Azure AI Search unterstützt Funktionen wie **strukturierter RAG**, das sich durch die Extraktion und das Abrufen dichter, strukturierter Informationen aus großen Datensätzen wie Gesprächshistorien, E-Mails oder sogar Bildern auszeichnet. Dies bietet "übermenschliche Präzision und Abruf" im Vergleich zu traditionellen Ansätzen wie Textchunking und Einbettung. +Azure AI Search unterstützt Funktionen wie **strukturiertes RAG**, das sich durch das Extrahieren und Abrufen dichter, strukturierter Informationen aus großen Datensätzen wie Gesprächsverläufen, E-Mails oder sogar Bildern auszeichnet. Dies bietet "übermenschliche Präzision und Abruf" im Vergleich zu herkömmlichen Textchunking- und Embedding-Ansätzen. ## Selbstverbesserung von KI-Agenten -Ein häufiges Muster für selbstverbessernde Agenten besteht darin, einen **"Wissensagenten"** einzuführen. Dieser separate Agent beobachtet das Hauptgespräch zwischen dem Nutzer und dem primären Agenten. Seine Aufgabe ist es: +Ein gängiges Muster für selbstverbessernde Agenten besteht darin, einen **"Wissensagenten"** einzuführen. Dieser separate Agent beobachtet das Hauptgespräch zwischen dem Nutzer und dem primären Agenten. Seine Aufgabe ist es: -1. **Wertvolle Informationen identifizieren**: Feststellen, ob ein Teil des Gesprächs als allgemeines Wissen oder spezifische Nutzerpräferenz gespeichert werden sollte. +1. **Wertvolle Informationen zu identifizieren**: Festzustellen, ob ein Teil des Gesprächs es wert ist, als allgemeines Wissen oder spezifische Nutzerpräferenz gespeichert zu werden. -2. **Extrahieren und zusammenfassen**: Die wesentlichen Erkenntnisse oder Präferenzen aus dem Gespräch destillieren. +2. **Extrahieren und Zusammenfassen**: Die wesentlichen Erkenntnisse oder Präferenzen aus dem Gespräch destillieren. 3. **In einer Wissensdatenbank speichern**: Diese extrahierten Informationen dauerhaft speichern, oft in einer Vektordatenbank, damit sie später abgerufen werden können. -4. **Zukünftige Abfragen erweitern**: Wenn der Nutzer eine neue Anfrage stellt, ruft der Wissensagent relevante gespeicherte Informationen ab und fügt sie der Anfrage des Nutzers hinzu, um dem primären Agenten entscheidenden Kontext zu liefern (ähnlich wie RAG). +4. **Zukünftige Abfragen erweitern**: Wenn der Nutzer eine neue Abfrage startet, ruft der Wissensagent relevante gespeicherte Informationen ab und fügt sie der Nutzeranfrage hinzu, um dem primären Agenten entscheidenden Kontext zu liefern (ähnlich wie RAG). ### Optimierungen für Speicher -• **Latenzmanagement**: Um die Nutzerinteraktionen nicht zu verlangsamen, kann zunächst ein günstigeres, schnelleres Modell verwendet werden, um schnell zu prüfen, ob Informationen wertvoll sind, um gespeichert oder abgerufen zu werden. Der komplexere Extraktions-/Abrufprozess wird nur bei Bedarf ausgelöst. +• **Latenzmanagement**: Um Verzögerungen bei Nutzerinteraktionen zu vermeiden, kann zunächst ein günstigeres, schnelleres Modell verwendet werden, um schnell zu prüfen, ob Informationen es wert sind, gespeichert oder abgerufen zu werden. Der komplexere Extraktions-/Abrufprozess wird nur bei Bedarf aufgerufen. -• **Wissensdatenbank-Wartung**: Für eine wachsende Wissensdatenbank können weniger häufig genutzte Informationen in "Cold Storage" verschoben werden, um Kosten zu verwalten. +• **Wartung der Wissensdatenbank**: Für eine wachsende Wissensdatenbank können weniger häufig genutzte Informationen in einen "Kältespeicher" verschoben werden, um Kosten zu verwalten. ## Noch Fragen zum Agentenspeicher? @@ -156,5 +174,7 @@ Treten Sie dem [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) bei, --- + **Haftungsausschluss**: -Dieses Dokument wurde mit dem KI-Übersetzungsdienst [Co-op Translator](https://github.com/Azure/co-op-translator) übersetzt. Obwohl wir uns um Genauigkeit bemühen, beachten Sie bitte, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner ursprünglichen Sprache sollte als maßgebliche Quelle betrachtet werden. Für kritische Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die sich aus der Nutzung dieser Übersetzung ergeben. \ No newline at end of file +Dieses Dokument wurde mit dem KI-Übersetzungsdienst [Co-op Translator](https://github.com/Azure/co-op-translator) übersetzt. Obwohl wir uns um Genauigkeit bemühen, beachten Sie bitte, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner ursprünglichen Sprache sollte als maßgebliche Quelle betrachtet werden. Für kritische Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die sich aus der Nutzung dieser Übersetzung ergeben. + \ No newline at end of file diff --git a/translations/el/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/el/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..6736b5b30 --- /dev/null +++ b/translations/el/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Δημιουργία Πρακτόρων AI με Μόνιμη Μνήμη χρησιμοποιώντας το Cognee\n", + "\n", + "Αυτό το σημειωματάριο δείχνει πώς να δημιουργήσετε έξυπνους πράκτορες AI με προηγμένες δυνατότητες μνήμης χρησιμοποιώντας το [**cognee**](https://www.cognee.ai/) - μια ανοιχτού κώδικα μνήμη AI που συνδυάζει γραφήματα γνώσης, σημασιολογική αναζήτηση και διαχείριση συνεδριών για τη δημιουργία συστημάτων AI με επίγνωση του πλαισίου.\n", + "\n", + "## 🎯 Στόχοι Μάθησης\n", + "\n", + "Μέχρι το τέλος αυτού του οδηγού, θα κατανοήσετε πώς να:\n", + "- **Δημιουργήσετε Γραφήματα Γνώσης Υποστηριζόμενα από Ενσωματώσεις**: Μετατρέψτε μη δομημένο κείμενο σε δομημένη, ερωτήσιμη γνώση\n", + "- **Υλοποιήσετε Μνήμη Συνεδρίας**: Δημιουργήστε συνομιλίες πολλαπλών γύρων με αυτόματη διατήρηση πλαισίου\n", + "- **Διατηρήσετε Συνομιλίες**: Αποθηκεύστε προαιρετικά σημαντικές αλληλεπιδράσεις στη μακροχρόνια μνήμη για μελλοντική αναφορά\n", + "- **Εκτελέσετε Ερωτήσεις με Φυσική Γλώσσα**: Αξιοποιήστε και χρησιμοποιήστε το ιστορικό πλαίσιο σε νέες συνομιλίες\n", + "- **Οπτικοποιήσετε τη Μνήμη**: Εξερευνήστε τις σχέσεις στο γράφημα γνώσης του πράκτορά σας\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Τι Θα Δημιουργήσετε\n", + "\n", + "Σε αυτό το σεμινάριο, θα δημιουργήσουμε έναν **Βοηθό Κωδικοποίησης** με μόνιμη μνήμη που:\n", + "\n", + "### 1. **Δημιουργία Βάσης Γνώσεων**\n", + " - Εισάγει πληροφορίες προφίλ και εξειδίκευσης προγραμματιστών\n", + " - Επεξεργάζεται αρχές και βέλτιστες πρακτικές προγραμματισμού Python\n", + " - Αποθηκεύει ιστορικές συνομιλίες μεταξύ προγραμματιστών και βοηθών AI\n", + "\n", + "### 2. **Συνομιλίες με Επίγνωση Συνεδρίας**\n", + " - Διατηρεί το πλαίσιο σε πολλαπλές ερωτήσεις στην ίδια συνεδρία\n", + " - Αποθηκεύει αυτόματα κάθε ζεύγος ερώτησης/απάντησης για αποδοτική ανάκτηση\n", + " - Παρέχει συνεκτικές, συμφραζόμενες απαντήσεις βασισμένες στο ιστορικό συνομιλιών\n", + "\n", + "### 3. **Μακροπρόθεσμη Μνήμη**\n", + " - Διατηρεί σημαντικές συνομιλίες σε μακροπρόθεσμη μνήμη\n", + " - Ανακτά σχετικές μνήμες από τη βάση γνώσεων και προηγούμενες συνεδρίες για να ενημερώσει νέες αλληλεπιδράσεις\n", + " - Δημιουργεί μια αυξανόμενη βάση γνώσεων που βελτιώνεται με την πάροδο του χρόνου\n", + "\n", + "### 4. **Έξυπνη Ανάκτηση Μνήμης**\n", + " - Χρησιμοποιεί αναζήτηση με γνώση γραφημάτων για να βρει σχετικές πληροφορίες σε όλη την αποθηκευμένη γνώση\n", + " - Φιλτράρει τις αναζητήσεις ανά υποομάδες δεδομένων (πληροφορίες προγραμματιστή έναντι αρχών)\n", + " - Συνδυάζει πολλαπλές πηγές δεδομένων για να παρέχει ολοκληρωμένες απαντήσεις\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Προαπαιτούμενα & Ρύθμιση\n", + "\n", + "### Απαιτήσεις Συστήματος\n", + "\n", + "Πριν ξεκινήσετε, βεβαιωθείτε ότι έχετε:\n", + "\n", + "1. **Περιβάλλον Python**\n", + " - Python 3.9 ή νεότερη έκδοση\n", + " - Εικονικό περιβάλλον (συνιστάται)\n", + " \n", + "2. **Redis Cache** (Απαραίτητο για τη Διαχείριση Συνεδριών)\n", + " - Τοπικό Redis: `docker run -d -p 6379:6379 redis`\n", + " - Ή χρησιμοποιήστε μια διαχειριζόμενη υπηρεσία Redis\n", + " \n", + "3. **Πρόσβαση σε LLM API**\n", + " - Κλειδί API OpenAI ή άλλων παρόχων (δείτε [τεκμηρίωση](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Ρύθμιση Βάσης Δεδομένων**\n", + " - Δεν απαιτείται ρύθμιση από προεπιλογή. Το Cognee χρησιμοποιεί βάσεις δεδομένων βασισμένες σε αρχεία (LanceDB και Kuzu)\n", + " - Προαιρετικά, μπορείτε να ρυθμίσετε το Azure AI Search ως κατάστημα διανυσμάτων (δείτε [τεκμηρίωση](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Ρύθμιση Περιβάλλοντος\n", + "\n", + "Δημιουργήστε ένα αρχείο `.env` στον κατάλογο του έργου σας με τις παρακάτω μεταβλητές:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Κατανόηση της Αρχιτεκτονικής Μνήμης του Cognee\n", + "\n", + "### Πώς Λειτουργεί το Cognee\n", + "\n", + "Το Cognee παρέχει ένα εξελιγμένο σύστημα μνήμης που ξεπερνά την απλή αποθήκευση κλειδιού-τιμής:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Κύρια Συστατικά:\n", + "\n", + "1. **Γραφική Παράσταση Γνώσης**: Αποθηκεύει οντότητες, σχέσεις και σημασιολογικές συνδέσεις\n", + "2. **Ενσωματώσεις Διανυσμάτων**: Επιτρέπει σημασιολογική αναζήτηση σε όλες τις αποθηκευμένες πληροφορίες\n", + "3. **Προσωρινή Μνήμη Συνεδρίας**: Διατηρεί το πλαίσιο συνομιλίας εντός και μεταξύ συνεδριών\n", + "4. **NodeSets**: Οργανώνουν τα δεδομένα σε λογικές κατηγορίες για στοχευμένη ανάκτηση\n", + "\n", + "### Τύποι Μνήμης σε Αυτό το Εκπαιδευτικό Υλικό:\n", + "\n", + "- **Μόνιμη Μνήμη**: Μακροχρόνια αποθήκευση στη γραφική παράσταση γνώσης\n", + "- **Μνήμη Συνεδρίας**: Προσωρινό πλαίσιο συνομιλίας στην προσωρινή μνήμη Redis\n", + "- **Σημασιολογική Μνήμη**: Αναζήτηση βασισμένη σε ομοιότητα διανυσμάτων σε όλα τα δεδομένα\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Εγκατάσταση Απαραίτητων Πακέτων\n", + "\n", + "Εγκαταστήστε το Cognee με υποστήριξη Redis για τη διαχείριση συνεδριών:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Αρχικοποίηση Περιβάλλοντος και Φόρτωση Βιβλιοθηκών\n", + "\n", + "Βεβαιωθείτε ότι:\n", + "1. Το Redis λειτουργεί (π.χ., μέσω Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Οι μεταβλητές περιβάλλοντος έχουν οριστεί πριν την εισαγωγή των cache modules\n", + "3. Εάν χρειαστεί, επανεκκινήστε τον kernel και εκτελέστε τα cells με τη σωστή σειρά\n", + "\n", + "Το παρακάτω cell θα:\n", + "1. Φορτώσει τις μεταβλητές περιβάλλοντος από το `.env`\n", + "2. Ρυθμίσει το Cognee με τις ρυθμίσεις LLM σας\n", + "3. Ενεργοποιήσει την προσωρινή αποθήκευση για τη διαχείριση συνεδριών\n", + "4. Επαληθεύσει ότι όλα τα στοιχεία είναι σωστά συνδεδεμένα\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Διαμόρφωση Καταλόγων Αποθήκευσης\n", + "\n", + "Το Cognee χρησιμοποιεί δύο ξεχωριστούς καταλόγους για τις λειτουργίες του:\n", + "- **Data Root**: Αποθηκεύει τα εισαγόμενα έγγραφα και τα επεξεργασμένα δεδομένα\n", + "- **System Root**: Περιέχει τη βάση δεδομένων του γραφήματος γνώσης και τα μεταδεδομένα του συστήματος\n", + "\n", + "Θα δημιουργήσουμε απομονωμένους καταλόγους για αυτό το σεμινάριο ως εξής:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Επαναφορά Κατάστασης Μνήμης\n", + "\n", + "Πριν ξεκινήσουμε να δημιουργούμε το σύστημα μνήμης μας, ας βεβαιωθούμε ότι ξεκινάμε από την αρχή.\n", + "\n", + "> 💡 **Συμβουλή**: Μπορείτε να παραλείψετε αυτό το βήμα αν θέλετε να διατηρήσετε τις υπάρχουσες μνήμες από τις προηγούμενες εκτελέσεις σας όταν χρησιμοποιήσετε αυτό το σημειωματάριο αργότερα.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Μέρος 1: Δημιουργία της Βάσης Γνώσεων\n", + "\n", + "### Πηγές Δεδομένων για τον Βοηθό Προγραμματιστών\n", + "\n", + "Θα συλλέξουμε τρεις τύπους δεδομένων για να δημιουργήσουμε μια ολοκληρωμένη βάση γνώσεων:\n", + "\n", + "1. **Προφίλ Προγραμματιστή**: Προσωπική εξειδίκευση και τεχνικό υπόβαθρο\n", + "2. **Καλές Πρακτικές Python**: Το Zen της Python με πρακτικές κατευθυντήριες γραμμές\n", + "3. **Ιστορικές Συνομιλίες**: Παλιές συνεδρίες Ερωτήσεων & Απαντήσεων μεταξύ προγραμματιστών και βοηθών AI\n", + "\n", + "Αυτά τα ποικίλα δεδομένα επιτρέπουν στον πράκτορά μας να:\n", + "- Κατανοεί το τεχνικό πλαίσιο του χρήστη\n", + "- Εφαρμόζει τις καλύτερες πρακτικές στις προτάσεις του\n", + "- Μαθαίνει από προηγούμενες επιτυχημένες αλληλεπιδράσεις\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Μετατροπή Δεδομένων σε Γραφικό Γνώσης\n", + "\n", + "Τώρα θα μετατρέψουμε το ακατέργαστο κείμενο σε μια δομημένη μνήμη. Αυτή η διαδικασία:\n", + "\n", + "1. **Προσθέτει δεδομένα στα NodeSets**: Οργανώνει πληροφορίες σε λογικές κατηγορίες\n", + " - `developer_data`: Προφίλ προγραμματιστή και συνομιλίες\n", + " - `principles_data`: Βέλτιστες πρακτικές και οδηγίες για Python\n", + "\n", + "2. **Εκτελεί τον Cognify Pipeline**: Εξάγει οντότητες, σχέσεις και δημιουργεί embeddings\n", + " - Εντοπίζει βασικές έννοιες\n", + " - Δημιουργεί σημασιολογικές συνδέσεις μεταξύ σχετικών πληροφοριών\n", + " - Παράγει vector embeddings\n", + "\n", + "Αυτό μπορεί να πάρει λίγη ώρα καθώς το LLM επεξεργάζεται το κείμενο και δημιουργεί τη δομή του γραφήματος:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Οπτικοποίηση του Γραφήματος Γνώσης\n", + "\n", + "Ας εξερευνήσουμε τη δομή του γραφήματος γνώσης μας. Η οπτικοποίηση δείχνει:\n", + "- **Κόμβοι**: Οντότητες που εξάγονται από το κείμενο (έννοιες, τεχνολογίες, άνθρωποι)\n", + "- **Ακμές**: Σχέσεις και συνδέσεις μεταξύ των οντοτήτων\n", + "- **Συστάδες**: Σχετικές έννοιες ομαδοποιημένες με βάση τη σημασιολογική ομοιότητα\n", + "\n", + "Ανοίξτε το παραγόμενο αρχείο HTML στον περιηγητή σας για να εξερευνήσετε διαδραστικά το γράφημα:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Εμπλουτίστε τη Μνήμη με το Memify\n", + "\n", + "Η συνάρτηση `memify()` αναλύει το γράφημα γνώσης και δημιουργεί έξυπνους κανόνες σχετικά με τα δεδομένα. Αυτή η διαδικασία:\n", + "- Εντοπίζει μοτίβα και βέλτιστες πρακτικές\n", + "- Δημιουργεί εφαρμόσιμες κατευθυντήριες γραμμές βασισμένες στο περιεχόμενο\n", + "- Καθιερώνει σχέσεις μεταξύ διαφορετικών περιοχών γνώσης\n", + "\n", + "Αυτοί οι κανόνες βοηθούν τον πράκτορα να λαμβάνει πιο ενημερωμένες αποφάσεις όταν απαντά σε ερωτήσεις. Η καταγραφή μιας δεύτερης απεικόνισης σας βοηθά να συγκρίνετε πώς το γράφημα γίνεται πιο πυκνό μόλις εμπλουτιστεί.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Μέρος 2: Έξυπνη Ανάκτηση Μνήμης\n", + "\n", + "### Επίδειξη 1: Ενοποίηση Γνώσης από Πολλαπλά Έγγραφα\n", + "\n", + "Τώρα που ο γράφος γνώσης μας έχει δημιουργηθεί, ας δοκιμάσουμε πώς το Cognee συνδυάζει πληροφορίες από πολλαπλές πηγές για να απαντήσει σε σύνθετες ερωτήσεις.\n", + "\n", + "Το πρώτο ερώτημα επιδεικνύει:\n", + "- **Σημασιολογική κατανόηση**: Εύρεση σχετικών εννοιών ακόμα και όταν δεν αναφέρονται ρητά\n", + "- **Διασταύρωση πληροφοριών**: Συνδυασμός προφίλ προγραμματιστή με αρχές της Python\n", + "- **Συμφραστική λογική**: Εφαρμογή βέλτιστων πρακτικών σε συγκεκριμένες υλοποιήσεις\n", + "\n", + "### Επίδειξη 2: Φιλτραρισμένη Αναζήτηση με NodeSets\n", + "\n", + "Το δεύτερο ερώτημα δείχνει πώς να στοχεύσετε συγκεκριμένα υποσύνολα του γράφου γνώσης:\n", + "- Χρησιμοποιεί την παράμετρο `node_name` για αναζήτηση μόνο μέσα στο `principles_data`\n", + "- Παρέχει εστιασμένες απαντήσεις από έναν συγκεκριμένο τομέα γνώσης\n", + "- Χρήσιμο όταν χρειάζεστε πληροφορίες που αφορούν έναν συγκεκριμένο τομέα\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Μέρος 3: Ρύθμιση Διαχείρισης Συνεδρίας\n", + "\n", + "### Ενεργοποίηση Μνήμης Συνομιλίας\n", + "\n", + "Η διαχείριση συνεδρίας είναι κρίσιμη για τη διατήρηση του πλαισίου σε πολλαπλές αλληλεπιδράσεις. Εδώ θα:\n", + "\n", + "1. **Αρχικοποιήσουμε το Πλαίσιο Χρήστη**: Δημιουργήσουμε ή ανακτήσουμε ένα προφίλ χρήστη για την παρακολούθηση της συνεδρίας\n", + "2. **Ρυθμίσουμε τη Μηχανή Cache**: Συνδεθούμε με το Redis για την αποθήκευση του ιστορικού συνομιλιών\n", + "3. **Ενεργοποιήσουμε Μεταβλητές Συνεδρίας**: Ρυθμίσουμε μεταβλητές πλαισίου που παραμένουν σταθερές μεταξύ ερωτημάτων\n", + "\n", + "> ⚠️ **Σημαντικό**: Απαιτείται το Redis να είναι σε λειτουργία και το `CACHING=true` στο περιβάλλον σας\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Βοηθητική Συνάρτηση: Προβολή Ιστορικού Συνεδρίας\n", + "\n", + "Αυτή η βοηθητική συνάρτηση μας επιτρέπει να επιθεωρούμε το ιστορικό συνομιλιών που αποθηκεύεται στο Redis. Είναι χρήσιμη για:\n", + "- Εντοπισμό σφαλμάτων στη διαχείριση συνεδριών\n", + "- Επαλήθευση ότι οι συνομιλίες αποθηκεύονται προσωρινά\n", + "- Κατανόηση του διαθέσιμου πλαισίου για τον πράκτορα\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Συνεδρία 1: Εργαστήριο Υποστήριξης Async — Πρώτη Ερώτηση\n", + "\n", + "Ξεκινήστε τη συνεδρία `async-support-lab` ζητώντας φιλικά προς την τηλεμετρία μοτίβα asyncio για έναν τεράστιο web scraper. Το γράφημα ήδη γνωρίζει για το asyncio, το aiohttp και τις πρακτικές παρακολούθησης, οπότε η απάντηση θα πρέπει να αντικατοπτρίζει προηγούμενες συνομιλίες ενώ προσαρμόζεται στη νέα ερώτηση.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Εξέταση της Μνήμης της Συνεδρίας 1 Μετά την Πρώτη Ανταλλαγή\n", + "\n", + "Η εκτέλεση της εντολής `show_history(session_1)` αμέσως μετά την αρχική ερώτηση επιβεβαιώνει ότι το Cognee κατέγραψε τόσο την προτροπή όσο και την απάντηση στο Redis. Θα πρέπει να δείτε μία καταχώρηση με την καθοδήγηση για τη σύγχρονη λειτουργία.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Συνεδρία 1: Παρακολούθηση για Μοντέλα Δεδομένων\n", + "\n", + "Στη συνέχεια ρωτάμε, \"Πότε πρέπει να επιλέξω dataclasses αντί για Pydantic;\" χρησιμοποιώντας το ίδιο αναγνωριστικό συνεδρίας. Ο Cognee θα πρέπει να συνδυάσει τις αρχές της Python μαζί με προηγούμενες συζητήσεις για το FastAPI, ώστε να παρέχει λεπτομερείς συμβουλές—δείχνοντας ότι το πλαίσιο μεταφέρεται μέσα σε μια ονομασμένη συνεδρία.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Επιβεβαιώστε ότι το Ιστορικό της Συνεδρίας 1 Περιέχει και τις Δύο Ερωταποκρίσεις\n", + "\n", + "Μια άλλη κλήση `show_history(session_1)` θα πρέπει να εμφανίσει δύο καταχωρήσεις Ερωταποκρίσεων. Αυτό ταιριάζει με το βήμα \"αναπαραγωγής μνήμης\" του εργαστηρίου Mem0 και αποδεικνύει ότι οι επιπλέον ερωταποκρίσεις επεκτείνουν την ίδια μεταγραφή.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Συνεδρία 2: Νήμα Ανασκόπησης Σχεδίασης — Νέα Συνεδρία\n", + "\n", + "Για να δείξουμε απομόνωση μεταξύ των νημάτων, ξεκινάμε το `design-review-session` και ζητάμε καθοδήγηση για την καταγραφή ανασκοπήσεων περιστατικών. Παρόλο που η υποκείμενη βάση γνώσεων είναι η ίδια, το νέο αναγνωριστικό συνεδρίας διατηρεί τα πρακτικά ξεχωριστά.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Ανασκόπηση Συνεδρίας 2 Ιστορία\n", + "\n", + "`show_history(session_2)` θα πρέπει να εμφανίζει μόνο το ζεύγος προτροπής/απάντησης της ανασκόπησης σχεδίασης. Συγκρίνετέ το με τη Συνεδρία 1 για να τονίσετε πώς το Cognee διατηρεί ανεξάρτητα πρακτικά ενώ επαναχρησιμοποιεί το κοινό γράφημα γνώσης.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Περίληψη\n", + "\n", + "Συγχαρητήρια! Μόλις δώσατε στον βοηθό προγραμματισμού σας ένα πραγματικό στρώμα μακροχρόνιας μνήμης με την υποστήριξη του Cognee.\n", + "\n", + "Σε αυτό το σεμινάριο, πήρατε ακατέργαστο περιεχόμενο προγραμματιστή (κώδικα, έγγραφα, συνομιλίες) και το μετατρέψατε σε ένα γράφημα + μνήμη με διανύσματα που ο πράκτοράς σας μπορεί να αναζητήσει, να αναλύσει και να βελτιώσει συνεχώς.\n", + "\n", + "Τι Έχετε Μάθει\n", + "\n", + "1. **Από ακατέργαστο κείμενο σε μνήμη AI**: Πώς το Cognee επεξεργάζεται μη δομημένα δεδομένα και τα μετατρέπει σε ευφυή, αναζητήσιμη μνήμη χρησιμοποιώντας μια συνδυασμένη αρχιτεκτονική διανυσμάτων + γράφου γνώσης.\n", + "\n", + "2. **Εμπλουτισμός γραφήματος με memify**: Πώς να ξεπεράσετε τη βασική δημιουργία γραφήματος και να χρησιμοποιήσετε το memify για να προσθέσετε παράγωγα δεδομένα και πλουσιότερες σχέσεις πάνω από το υπάρχον γράφημά σας.\n", + "\n", + "3. **Πολλαπλές στρατηγικές αναζήτησης**: Πώς να κάνετε ερωτήσεις στη μνήμη με διαφορετικούς τύπους αναζήτησης (ερωτήσεις με γνώση γραφήματος, ολοκλήρωση τύπου RAG, πληροφορίες, ακατέργαστα τμήματα, αναζήτηση κώδικα κ.λπ.) ανάλογα με τις ανάγκες του πράκτορά σας.\n", + "\n", + "4. **Οπτική εξερεύνηση**: Πώς να επιθεωρήσετε και να διορθώσετε ό,τι δημιούργησε το Cognee χρησιμοποιώντας οπτικοποιήσεις γραφήματος και το Cognee UI, ώστε να μπορείτε πραγματικά να δείτε πώς είναι δομημένη η γνώση.\n", + "\n", + "5. **Μνήμη με επίγνωση συνεδρίας**: Πώς να συνδυάσετε το πλαίσιο ανά συνεδρία με επίμονη σημασιολογική μνήμη, ώστε οι πράκτορες να μπορούν να θυμούνται μεταξύ εκτελέσεων χωρίς να διαρρέουν πληροφορίες μεταξύ χρηστών.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Βασικά Σημεία\n", + "1. Μνήμη ως Γράφημα Γνώσης υποστηριζόμενο από Ενσωματώσεις\n", + "\n", + " - **Δομημένη κατανόηση**: Το Cognee συνδυάζει μια αποθήκη διανυσμάτων και μια αποθήκη γραφημάτων, ώστε τα δεδομένα σας να είναι τόσο αναζητήσιμα με βάση τη σημασία όσο και συνδεδεμένα μέσω σχέσεων. Το Cognee χρησιμοποιεί βάσεις δεδομένων αρχείων από προεπιλογή (LanceDB για διανύσματα, Kuzu για βάση δεδομένων γραφημάτων).\n", + "\n", + " - **Ανάκτηση με επίγνωση σχέσεων**: Οι απαντήσεις μπορούν να βασίζονται όχι μόνο σε \"παρόμοιο κείμενο\", αλλά και στο πώς σχετίζονται οι οντότητες.\n", + "\n", + " - **Ζωντανή μνήμη**: Το επίπεδο μνήμης εξελίσσεται, μεγαλώνει και παραμένει προσβάσιμο ως ένα ενιαίο γράφημα.\n", + "\n", + "2. Λειτουργίες Αναζήτησης & Συλλογιστικής\n", + " - **Υβριδική ανάκτηση**: Η αναζήτηση συνδυάζει ομοιότητα διανυσμάτων, δομή γραφημάτων και συλλογιστική LLM, από απλή αναζήτηση κομματιών έως ερωτήσεις με επίγνωση γραφημάτων.\n", + "\n", + " - **Προσαρμογή λειτουργίας στη δουλειά**: Χρησιμοποιήστε λειτουργίες τύπου ολοκλήρωσης όταν θέλετε απαντήσεις σε φυσική γλώσσα, και λειτουργίες κομματιών/περίληψης/γραφημάτων όταν ο πράκτοράς σας χρειάζεται ακατέργαστο πλαίσιο ή να καθοδηγήσει τη δική του συλλογιστική.\n", + "\n", + "3. Εξατομικευμένοι, Ενήμεροι για Συνεδρίες Πράκτορες\n", + " - **Πλαίσιο συνεδρίας + μακροπρόθεσμη μνήμη**: Το Cognee διατηρεί το βραχυπρόθεσμο πλαίσιο \"νήματος\" ξεχωριστό από τη μακροχρόνια μνήμη σε επίπεδο χρήστη ή οργανισμού.\n", + "\n", + "## Εφαρμογές στον Πραγματικό Κόσμο\n", + "\n", + "1. **Κάθετοι Πράκτορες Τεχνητής Νοημοσύνης**\n", + "\n", + " Χρησιμοποιήστε το μοτίβο από αυτό το σημειωματάριο για να ενισχύσετε έξυπνους συνεργάτες τομέα που βασίζονται στο Cognee ως τον πυρήνα ανάκτησης και συλλογιστικής τους:\n", + "\n", + "- **Συνεργάτες προγραμματιστών**: Ανασκόπηση κώδικα, ανάλυση περιστατικών και βοηθοί αρχιτεκτονικής που διατρέχουν κώδικα, APIs, έγγραφα σχεδίασης και εισιτήρια ως ένα ενιαίο γράφημα μνήμης.\n", + "\n", + "- **Συνεργάτες για πελάτες**: Πράκτορες υποστήριξης ή επιτυχίας που αντλούν από έγγραφα προϊόντων, FAQs, σημειώσεις CRM και προηγούμενα εισιτήρια με ανάκτηση με επίγνωση γραφημάτων και τεκμηριωμένες απαντήσεις.\n", + "\n", + "- **Εσωτερικοί ειδικοί συνεργάτες**: Βοηθοί πολιτικής, νομικής ή ασφάλειας που συλλογίζονται πάνω σε διασυνδεδεμένους κανόνες, κατευθυντήριες γραμμές και ιστορικές αποφάσεις αντί για απομονωμένα PDFs.\n", + "\n", + " Το Cognee τοποθετείται ρητά ως μνήμη ακριβείας και διάρκειας για πράκτορες τεχνητής νοημοσύνης, παρέχοντας ένα ζωντανό γράφημα γνώσης που ενσωματώνεται πίσω από τον πράκτορά σας και αντικαθιστά συνδυασμούς ad-hoc αποθηκών διανυσμάτων και προσαρμοσμένου κώδικα γραφημάτων.\n", + "\n", + "2. **Ενοποίηση Δεδομένων από Σιλό σε Μία Μνήμη**\n", + "\n", + " Η ίδια προσέγγιση σας βοηθά επίσης να δημιουργήσετε ένα ενιαίο επίπεδο μνήμης από διάσπαρτες πηγές:\n", + "\n", + "- **Από σιλό σε ένα γράφημα**: Εισάγετε δομημένα (π.χ. βάσεις δεδομένων) και μη δομημένα δεδομένα (π.χ. έγγραφα, συνομιλίες) σε ένα ενιαίο γράφημα υποστηριζόμενο από ενσωματώσεις, αντί για ξεχωριστούς δείκτες για κάθε σύστημα.\n", + "\n", + "- **Συλλογιστική μεταξύ πηγών με παραπομπές**: Εκτελέστε συλλογιστική πολλών βημάτων πάνω σε όλα—\"ενώστε\" αρχεία καταγραφής, μετρήσεις και έγγραφα μέσω του γραφήματος—και επιστρέψτε ακόμα απαντήσεις με τεκμηρίωση.\n", + "\n", + "- **Κόμβοι γνώσης**: Για τομείς όπως η τραπεζική ή η εκπαίδευση, το Cognee χρησιμοποιείται ήδη για την ενοποίηση PDFs, εσωτερικών συστημάτων και δεδομένων εφαρμογών σε ένα γράφημα γνώσης με διανύσματα, ώστε οι πράκτορες να μπορούν να απαντούν σε ερωτήσεις με ακριβές, τεκμηριωμένο πλαίσιο.\n", + "\n", + "## Επόμενα Βήματα\n", + "\n", + "Έχετε υλοποιήσει τον βασικό βρόχο μνήμης. Εδώ είναι φυσικές επεκτάσεις που μπορείτε να δοκιμάσετε μόνοι σας (δείτε την [τεκμηρίωση του Cognee](https://docs.cognee.ai/) για λεπτομέρειες):\n", + "\n", + "1. **Πειραματιστείτε με την επίγνωση του χρόνου**: Ενεργοποιήστε την \"χρονική κατανόηση\" για να εξάγετε γεγονότα και χρονικές σημάνσεις από κείμενο.\n", + "\n", + "2. **Εισάγετε συλλογιστική βασισμένη σε οντολογία**: Ορίστε μια οντολογία OWL για τον τομέα σας. Χρησιμοποιήστε την υποστήριξη οντολογίας του Cognee ώστε οι εξαγόμενες οντότητες και σχέσεις να βασίζονται σε αυτό το σχήμα, βελτιώνοντας την ποιότητα του γραφήματος και τις απαντήσεις που σχετίζονται με τον τομέα.\n", + "\n", + "3. **Προσθέστε έναν βρόχο ανατροφοδότησης**: Επιτρέψτε στο Cognee να προσαρμόζει τα βάρη των ακμών του γραφήματος από πραγματική ανατροφοδότηση χρηστών, ώστε η ανάκτηση να βελτιώνεται με την πάροδο του χρόνου αντί να παραμένει στατική.\n", + "\n", + "4. **Βελτιστοποιήστε για εξατομίκευση & συμπεριφορά συνεδρίας**: Χρησιμοποιήστε αναγνωριστικά χρηστών, ενοικιαστές και σύνολα δεδομένων για να δώσετε σε κάθε άτομο ή ομάδα τη δική τους προβολή πάνω από τη κοινή μηχανή μνήμης.\n", + "\n", + "5. **Επεκταθείτε σε πιο σύνθετους πράκτορες**: Συνδέστε το Cognee σε πλαίσια πρακτόρων για να δημιουργήσετε συστήματα πολλαπλών πρακτόρων που μοιράζονται όλα το ίδιο επίπεδο μνήμης. *Το Microsoft Agent Framework x Cognee plugin έρχεται σύντομα.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Αποποίηση ευθύνης**: \nΑυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία μετάφρασης AI [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να γνωρίζετε ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:56:13+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "el" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/el/13-agent-memory/README.md b/translations/el/13-agent-memory/README.md index 3aff6ede0..fe612eed3 100644 --- a/translations/el/13-agent-memory/README.md +++ b/translations/el/13-agent-memory/README.md @@ -1,56 +1,64 @@ -# Μνήμη για Πράκτορες AI +# Μνήμη για Πράκτορες Τεχνητής Νοημοσύνης [![Μνήμη Πράκτορα](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.el.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Όταν συζητάμε για τα μοναδικά πλεονεκτήματα της δημιουργίας Πρακτόρων AI, δύο πράγματα αναφέρονται κυρίως: η δυνατότητα να καλούν εργαλεία για την ολοκλήρωση εργασιών και η δυνατότητα να βελτιώνονται με την πάροδο του χρόνου. Η μνήμη αποτελεί τη βάση για τη δημιουργία αυτοβελτιούμενων πρακτόρων που μπορούν να προσφέρουν καλύτερες εμπειρίες στους χρήστες μας. +Όταν συζητάμε για τα μοναδικά οφέλη της δημιουργίας Πρακτόρων Τεχνητής Νοημοσύνης, δύο πράγματα συζητούνται κυρίως: η ικανότητα να καλούν εργαλεία για την ολοκλήρωση εργασιών και η ικανότητα να βελτιώνονται με την πάροδο του χρόνου. Η μνήμη αποτελεί τη βάση για τη δημιουργία αυτοβελτιούμενων πρακτόρων που μπορούν να προσφέρουν καλύτερες εμπειρίες στους χρήστες μας. -Σε αυτό το μάθημα, θα εξετάσουμε τι είναι η μνήμη για τους Πράκτορες AI και πώς μπορούμε να τη διαχειριστούμε και να τη χρησιμοποιήσουμε προς όφελος των εφαρμογών μας. +Σε αυτό το μάθημα, θα εξετάσουμε τι είναι η μνήμη για τους Πράκτορες Τεχνητής Νοημοσύνης και πώς μπορούμε να τη διαχειριστούμε και να τη χρησιμοποιήσουμε προς όφελος των εφαρμογών μας. ## Εισαγωγή Αυτό το μάθημα θα καλύψει: -• **Κατανόηση της Μνήμης Πρακτόρων AI**: Τι είναι η μνήμη και γιατί είναι απαραίτητη για τους πράκτορες. +• **Κατανόηση της Μνήμης Πρακτόρων Τεχνητής Νοημοσύνης**: Τι είναι η μνήμη και γιατί είναι απαραίτητη για τους πράκτορες. -• **Υλοποίηση και Αποθήκευση Μνήμης**: Πρακτικές μέθοδοι για την προσθήκη δυνατοτήτων μνήμης στους Πράκτορες AI, με έμφαση στη βραχυπρόθεσμη και μακροπρόθεσμη μνήμη. +• **Υλοποίηση και Αποθήκευση Μνήμης**: Πρακτικές μέθοδοι για την προσθήκη δυνατοτήτων μνήμης στους πράκτορες Τεχνητής Νοημοσύνης, με έμφαση στη βραχυπρόθεσμη και μακροπρόθεσμη μνήμη. -• **Δημιουργία Αυτοβελτιούμενων Πρακτόρων AI**: Πώς η μνήμη επιτρέπει στους πράκτορες να μαθαίνουν από προηγούμενες αλληλεπιδράσεις και να βελτιώνονται με την πάροδο του χρόνου. +• **Δημιουργία Αυτοβελτιούμενων Πρακτόρων Τεχνητής Νοημοσύνης**: Πώς η μνήμη επιτρέπει στους πράκτορες να μαθαίνουν από προηγούμενες αλληλεπιδράσεις και να βελτιώνονται με την πάροδο του χρόνου. + +## Διαθέσιμες Υλοποιήσεις + +Αυτό το μάθημα περιλαμβάνει δύο ολοκληρωμένα tutorials σε notebook: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Υλοποιεί μνήμη χρησιμοποιώντας Mem0 και Azure AI Search με το πλαίσιο Semantic Kernel. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Υλοποιεί δομημένη μνήμη χρησιμοποιώντας το Cognee, δημιουργώντας αυτόματα γράφημα γνώσης με embeddings, οπτικοποιώντας το γράφημα και πραγματοποιώντας έξυπνη ανάκτηση. ## Στόχοι Μάθησης Μετά την ολοκλήρωση αυτού του μαθήματος, θα γνωρίζετε πώς να: -• **Διακρίνετε μεταξύ των διαφορετικών τύπων μνήμης Πρακτόρων AI**, όπως η λειτουργική, η βραχυπρόθεσμη και η μακροπρόθεσμη μνήμη, καθώς και εξειδικευμένες μορφές όπως η μνήμη προσωπικότητας και επεισοδίων. +• **Διακρίνετε τους διάφορους τύπους μνήμης πρακτόρων Τεχνητής Νοημοσύνης**, συμπεριλαμβανομένων της λειτουργικής, βραχυπρόθεσμης και μακροπρόθεσμης μνήμης, καθώς και εξειδικευμένων μορφών όπως η μνήμη προσωπικότητας και επεισοδίων. -• **Υλοποιήσετε και διαχειριστείτε τη βραχυπρόθεσμη και μακροπρόθεσμη μνήμη για Πράκτορες AI** χρησιμοποιώντας το πλαίσιο Semantic Kernel, αξιοποιώντας εργαλεία όπως το Mem0 και τη μνήμη Whiteboard, και ενσωματώνοντας το Azure AI Search. +• **Υλοποιείτε και διαχειρίζεστε βραχυπρόθεσμη και μακροπρόθεσμη μνήμη για πράκτορες Τεχνητής Νοημοσύνης** χρησιμοποιώντας το πλαίσιο Semantic Kernel, αξιοποιώντας εργαλεία όπως Mem0, Cognee, Whiteboard memory και ενσωματώνοντας το Azure AI Search. -• **Κατανοήσετε τις αρχές πίσω από τους αυτοβελτιούμενους Πράκτορες AI** και πώς τα ισχυρά συστήματα διαχείρισης μνήμης συμβάλλουν στη συνεχή μάθηση και προσαρμογή. +• **Κατανοείτε τις αρχές πίσω από τους αυτοβελτιούμενους πράκτορες Τεχνητής Νοημοσύνης** και πώς τα ισχυρά συστήματα διαχείρισης μνήμης συμβάλλουν στη συνεχή μάθηση και προσαρμογή. -## Κατανόηση της Μνήμης Πρακτόρων AI +## Κατανόηση της Μνήμης Πρακτόρων Τεχνητής Νοημοσύνης -Στον πυρήνα της, **η μνήμη για τους Πράκτορες AI αναφέρεται στους μηχανισμούς που τους επιτρέπουν να διατηρούν και να ανακαλούν πληροφορίες**. Αυτές οι πληροφορίες μπορεί να είναι συγκεκριμένες λεπτομέρειες μιας συνομιλίας, προτιμήσεις χρηστών, προηγούμενες ενέργειες ή ακόμα και μοτίβα που έχουν μάθει. +Στον πυρήνα της, **η μνήμη για τους πράκτορες Τεχνητής Νοημοσύνης αναφέρεται στους μηχανισμούς που τους επιτρέπουν να διατηρούν και να ανακαλούν πληροφορίες**. Αυτές οι πληροφορίες μπορεί να είναι συγκεκριμένες λεπτομέρειες μιας συνομιλίας, προτιμήσεις χρηστών, προηγούμενες ενέργειες ή ακόμα και μοτίβα που έχουν μάθει. -Χωρίς μνήμη, οι εφαρμογές AI είναι συχνά χωρίς κατάσταση, πράγμα που σημαίνει ότι κάθε αλληλεπίδραση ξεκινά από την αρχή. Αυτό οδηγεί σε μια επαναλαμβανόμενη και απογοητευτική εμπειρία χρήστη, όπου ο πράκτορας "ξεχνά" το προηγούμενο πλαίσιο ή τις προτιμήσεις. +Χωρίς μνήμη, οι εφαρμογές Τεχνητής Νοημοσύνης είναι συχνά χωρίς κατάσταση, που σημαίνει ότι κάθε αλληλεπίδραση ξεκινά από την αρχή. Αυτό οδηγεί σε μια επαναλαμβανόμενη και απογοητευτική εμπειρία χρήστη, όπου ο πράκτορας "ξεχνά" το προηγούμενο πλαίσιο ή τις προτιμήσεις. ### Γιατί είναι Σημαντική η Μνήμη; -Η νοημοσύνη ενός πράκτορα συνδέεται στενά με την ικανότητά του να ανακαλεί και να χρησιμοποιεί προηγούμενες πληροφορίες. Η μνήμη επιτρέπει στους πράκτορες να είναι: +Η νοημοσύνη ενός πράκτορα συνδέεται βαθιά με την ικανότητά του να ανακαλεί και να χρησιμοποιεί προηγούμενες πληροφορίες. Η μνήμη επιτρέπει στους πράκτορες να είναι: -• **Στοχαστικοί**: Μαθαίνουν από προηγούμενες ενέργειες και αποτελέσματα. +• **Αναστοχαστικοί**: Μαθαίνοντας από προηγούμενες ενέργειες και αποτελέσματα. -• **Διαδραστικοί**: Διατηρούν το πλαίσιο σε μια συνεχιζόμενη συνομιλία. +• **Διαδραστικοί**: Διατηρώντας το πλαίσιο κατά τη διάρκεια μιας συνεχιζόμενης συνομιλίας. -• **Προληπτικοί και Αντιδραστικοί**: Προβλέπουν ανάγκες ή ανταποκρίνονται κατάλληλα βάσει ιστορικών δεδομένων. +• **Προδραστικοί και Αντιδραστικοί**: Προβλέποντας ανάγκες ή ανταποκρινόμενοι κατάλληλα με βάση ιστορικά δεδομένα. -• **Αυτόνομοι**: Λειτουργούν πιο ανεξάρτητα αντλώντας από αποθηκευμένες γνώσεις. +• **Αυτόνομοι**: Λειτουργώντας πιο ανεξάρτητα αντλώντας από αποθηκευμένη γνώση. Ο στόχος της υλοποίησης μνήμης είναι να κάνει τους πράκτορες πιο **αξιόπιστους και ικανούς**. @@ -58,9 +66,9 @@ CO_OP_TRANSLATOR_METADATA: #### Λειτουργική Μνήμη -Σκεφτείτε τη σαν ένα κομμάτι χαρτί που χρησιμοποιεί ένας πράκτορας κατά τη διάρκεια μιας μοναδικής, τρέχουσας εργασίας ή διαδικασίας σκέψης. Κρατά άμεσες πληροφορίες που χρειάζονται για τον υπολογισμό του επόμενου βήματος. +Σκεφτείτε τη σαν ένα κομμάτι χαρτί που χρησιμοποιεί ένας πράκτορας κατά τη διάρκεια μιας μόνο, συνεχιζόμενης εργασίας ή διαδικασίας σκέψης. Κρατά άμεσες πληροφορίες που χρειάζονται για τον υπολογισμό του επόμενου βήματος. -Για τους Πράκτορες AI, η λειτουργική μνήμη συχνά καταγράφει τις πιο σχετικές πληροφορίες από μια συνομιλία, ακόμα κι αν το πλήρες ιστορικό συνομιλίας είναι μεγάλο ή περικομμένο. Εστιάζει στην εξαγωγή βασικών στοιχείων όπως απαιτήσεις, προτάσεις, αποφάσεις και ενέργειες. +Για τους πράκτορες Τεχνητής Νοημοσύνης, η λειτουργική μνήμη συχνά καταγράφει τις πιο σχετικές πληροφορίες από μια συνομιλία, ακόμα κι αν το πλήρες ιστορικό συνομιλίας είναι μεγάλο ή περικόπτεται. Εστιάζει στην εξαγωγή βασικών στοιχείων όπως απαιτήσεις, προτάσεις, αποφάσεις και ενέργειες. **Παράδειγμα Λειτουργικής Μνήμης** @@ -68,23 +76,23 @@ CO_OP_TRANSLATOR_METADATA: #### Βραχυπρόθεσμη Μνήμη -Αυτός ο τύπος μνήμης διατηρεί πληροφορίες για τη διάρκεια μιας μοναδικής συνομιλίας ή συνεδρίας. Είναι το πλαίσιο της τρέχουσας συνομιλίας, επιτρέποντας στον πράκτορα να αναφέρεται σε προηγούμενες στροφές του διαλόγου. +Αυτός ο τύπος μνήμης διατηρεί πληροφορίες για τη διάρκεια μιας μόνο συνομιλίας ή συνεδρίας. Είναι το πλαίσιο της τρέχουσας συνομιλίας, επιτρέποντας στον πράκτορα να αναφέρεται σε προηγούμενες στροφές του διαλόγου. **Παράδειγμα Βραχυπρόθεσμης Μνήμης** -Αν ένας χρήστης ρωτήσει, "Πόσο κοστίζει μια πτήση για το Παρίσι;" και στη συνέχεια συνεχίσει με "Τι γίνεται με τη διαμονή εκεί;", η βραχυπρόθεσμη μνήμη εξασφαλίζει ότι ο πράκτορας γνωρίζει ότι "εκεί" αναφέρεται στο "Παρίσι" μέσα στην ίδια συνομιλία. +Αν ένας χρήστης ρωτήσει, "Πόσο κοστίζει μια πτήση για το Παρίσι;" και στη συνέχεια συνεχίσει με "Τι γίνεται με τη διαμονή εκεί;", η βραχυπρόθεσμη μνήμη διασφαλίζει ότι ο πράκτορας γνωρίζει ότι το "εκεί" αναφέρεται στο "Παρίσι" μέσα στην ίδια συνομιλία. #### Μακροπρόθεσμη Μνήμη -Αυτές είναι πληροφορίες που παραμένουν σε πολλές συνομιλίες ή συνεδρίες. Επιτρέπει στους πράκτορες να θυμούνται προτιμήσεις χρηστών, ιστορικές αλληλεπιδράσεις ή γενικές γνώσεις για παρατεταμένες περιόδους. Αυτό είναι σημαντικό για την εξατομίκευση. +Αυτή είναι η πληροφορία που παραμένει σε πολλές συνομιλίες ή συνεδρίες. Επιτρέπει στους πράκτορες να θυμούνται προτιμήσεις χρηστών, ιστορικές αλληλεπιδράσεις ή γενικές γνώσεις για μεγάλα χρονικά διαστήματα. Αυτό είναι σημαντικό για την εξατομίκευση. **Παράδειγμα Μακροπρόθεσμης Μνήμης** -Μια μακροπρόθεσμη μνήμη μπορεί να αποθηκεύσει ότι "Ο Μπεν απολαμβάνει το σκι και τις υπαίθριες δραστηριότητες, του αρέσει ο καφές με θέα στο βουνό και θέλει να αποφύγει τις προχωρημένες πίστες σκι λόγω ενός παλιού τραυματισμού". Αυτές οι πληροφορίες, που μαθαίνονται από προηγούμενες αλληλεπιδράσεις, επηρεάζουν τις συστάσεις σε μελλοντικές συνεδρίες σχεδιασμού ταξιδιών, καθιστώντας τις εξαιρετικά εξατομικευμένες. +Μια μακροπρόθεσμη μνήμη μπορεί να αποθηκεύσει ότι "Ο Μπεν απολαμβάνει το σκι και τις υπαίθριες δραστηριότητες, του αρέσει ο καφές με θέα στο βουνό και θέλει να αποφεύγει τις προχωρημένες πίστες σκι λόγω ενός παλιού τραυματισμού". Αυτή η πληροφορία, που μαθαίνεται από προηγούμενες αλληλεπιδράσεις, επηρεάζει τις προτάσεις σε μελλοντικές συνεδρίες σχεδιασμού ταξιδιών, καθιστώντας τις εξαιρετικά εξατομικευμένες. #### Μνήμη Προσωπικότητας -Αυτός ο εξειδικευμένος τύπος μνήμης βοηθά έναν πράκτορα να αναπτύξει μια συνεπή "προσωπικότητα" ή "ρόλο". Επιτρέπει στον πράκτορα να θυμάται λεπτομέρειες για τον εαυτό του ή τον προοριζόμενο ρόλο του, κάνοντας τις αλληλεπιδράσεις πιο ομαλές και εστιασμένες. +Αυτός ο εξειδικευμένος τύπος μνήμης βοηθά έναν πράκτορα να αναπτύξει μια συνεπή "προσωπικότητα" ή "ρόλο". Επιτρέπει στον πράκτορα να θυμάται λεπτομέρειες για τον εαυτό του ή τον προοριζόμενο ρόλο του, καθιστώντας τις αλληλεπιδράσεις πιο ομαλές και εστιασμένες. **Παράδειγμα Μνήμης Προσωπικότητας** @@ -96,19 +104,19 @@ CO_OP_TRANSLATOR_METADATA: **Παράδειγμα Μνήμης Επεισοδίων** -Αν ο πράκτορας προσπάθησε να κλείσει μια συγκεκριμένη πτήση αλλά απέτυχε λόγω μη διαθεσιμότητας, η μνήμη επεισοδίων μπορεί να καταγράψει αυτήν την αποτυχία, επιτρέποντας στον πράκτορα να δοκιμάσει εναλλακτικές πτήσεις ή να ενημερώσει τον χρήστη για το ζήτημα με πιο ενημερωμένο τρόπο κατά τη διάρκεια μιας επόμενης προσπάθειας. +Αν ο πράκτορας προσπάθησε να κλείσει μια συγκεκριμένη πτήση αλλά απέτυχε λόγω μη διαθεσιμότητας, η μνήμη επεισοδίων θα μπορούσε να καταγράψει αυτήν την αποτυχία, επιτρέποντας στον πράκτορα να δοκιμάσει εναλλακτικές πτήσεις ή να ενημερώσει τον χρήστη για το πρόβλημα με πιο ενημερωμένο τρόπο κατά την επόμενη προσπάθεια. #### Μνήμη Οντοτήτων -Αυτή περιλαμβάνει την εξαγωγή και την αποθήκευση συγκεκριμένων οντοτήτων (όπως άτομα, μέρη ή πράγματα) και γεγονότων από συνομιλίες. Επιτρέπει στον πράκτορα να δημιουργήσει μια δομημένη κατανόηση των βασικών στοιχείων που συζητήθηκαν. +Αυτή περιλαμβάνει την εξαγωγή και αποθήκευση συγκεκριμένων οντοτήτων (όπως άτομα, μέρη ή πράγματα) και γεγονότων από συνομιλίες. Επιτρέπει στον πράκτορα να δημιουργήσει μια δομημένη κατανόηση των βασικών στοιχείων που συζητήθηκαν. **Παράδειγμα Μνήμης Οντοτήτων** -Από μια συνομιλία για ένα προηγούμενο ταξίδι, ο πράκτορας μπορεί να εξαγάγει "Παρίσι", "Πύργος του Άιφελ" και "δείπνο στο εστιατόριο Le Chat Noir" ως οντότητες. Σε μια μελλοντική αλληλεπίδραση, ο πράκτορας θα μπορούσε να θυμηθεί το "Le Chat Noir" και να προσφέρει να κάνει μια νέα κράτηση εκεί. +Από μια συνομιλία για ένα προηγούμενο ταξίδι, ο πράκτορας μπορεί να εξάγει "Παρίσι", "Πύργος του Άιφελ" και "δείπνο στο εστιατόριο Le Chat Noir" ως οντότητες. Σε μια μελλοντική αλληλεπίδραση, ο πράκτορας θα μπορούσε να θυμηθεί το "Le Chat Noir" και να προσφέρει να κάνει μια νέα κράτηση εκεί. -#### Δομημένο RAG (Ανάκτηση Ενισχυμένης Γενιάς) +#### Δομημένο RAG (Ανάκτηση Ενισχυμένης Δημιουργίας) -Ενώ το RAG είναι μια ευρύτερη τεχνική, το "Δομημένο RAG" αναδεικνύεται ως μια ισχυρή τεχνολογία μνήμης. Εξάγει πυκνές, δομημένες πληροφορίες από διάφορες πηγές (συνομιλίες, email, εικόνες) και τις χρησιμοποιεί για να ενισχύσει την ακρίβεια, την ανάκτηση και την ταχύτητα στις απαντήσεις. Σε αντίθεση με το κλασικό RAG που βασίζεται αποκλειστικά στη σημασιολογική ομοιότητα, το Δομημένο RAG λειτουργεί με την εγγενή δομή των πληροφοριών. +Ενώ το RAG είναι μια ευρύτερη τεχνική, το "Δομημένο RAG" αναδεικνύεται ως μια ισχυρή τεχνολογία μνήμης. Εξάγει πυκνές, δομημένες πληροφορίες από διάφορες πηγές (συνομιλίες, emails, εικόνες) και τις χρησιμοποιεί για να ενισχύσει την ακρίβεια, την ανάκληση και την ταχύτητα στις απαντήσεις. Σε αντίθεση με το κλασικό RAG που βασίζεται αποκλειστικά στη σημασιολογική ομοιότητα, το Δομημένο RAG λειτουργεί με την εγγενή δομή των πληροφοριών. **Παράδειγμα Δομημένου RAG** @@ -116,43 +124,33 @@ CO_OP_TRANSLATOR_METADATA: ## Υλοποίηση και Αποθήκευση Μνήμης -Η υλοποίηση μνήμης για Πράκτορες AI περιλαμβάνει μια συστηματική διαδικασία **διαχείρισης μνήμης**, η οποία περιλαμβάνει τη δημιουργία, την αποθήκευση, την ανάκτηση, την ενσωμάτωση, την ενημέρωση και ακόμα και τη "λήθη" (ή τη διαγραφή) πληροφοριών. Η ανάκτηση είναι ιδιαίτερα κρίσιμη. +Η υλοποίηση μνήμης για πράκτορες Τεχνητής Νοημοσύνης περιλαμβάνει μια συστηματική διαδικασία **διαχείρισης μνήμης**, η οποία περιλαμβάνει τη δημιουργία, αποθήκευση, ανάκτηση, ενσωμάτωση, ενημέρωση και ακόμη και "λησμονιά" (ή διαγραφή) πληροφοριών. Η ανάκτηση είναι ιδιαίτερα κρίσιμη. ### Εξειδικευμένα Εργαλεία Μνήμης -Ένας τρόπος για την αποθήκευση και τη διαχείριση της μνήμης πρακτόρων είναι η χρήση εξειδικευμένων εργαλείων όπως το Mem0. Το Mem0 λειτουργεί ως ένα επίμονο επίπεδο μνήμης, επιτρέποντας στους πράκτορες να ανακαλούν σχετικές αλληλεπιδράσεις, να αποθηκεύουν προτιμήσεις χρηστών και πραγματικό πλαίσιο, και να μαθαίνουν από επιτυχίες και αποτυχίες με την πάροδο του χρόνου. Η ιδέα εδώ είναι ότι οι πράκτορες χωρίς κατάσταση μετατρέπονται σε πράκτορες με κατάσταση. - -Λειτουργεί μέσω ενός **διφασικού αγωγού μνήμης: εξαγωγή και ενημέρωση**. Πρώτα, τα μηνύματα που προστίθενται στο νήμα ενός πράκτορα αποστέλλονται στην υπηρεσία Mem0, η οποία χρησιμοποιεί ένα Μεγάλο Γλωσσικό Μοντέλο (LLM) για να συνοψίσει το ιστορικό συνομιλίας και να εξαγάγει νέες μνήμες. Στη συνέχεια, μια φάση ενημέρωσης που καθοδηγείται από LLM αποφασίζει αν θα προσθέσει, τροποποιήσει ή διαγράψει αυτές τις μνήμες, αποθηκεύοντάς τες σε ένα υβριδικό κατάστημα δεδομένων που μπορεί να περιλαμβάνει βάσεις δεδομένων διανυσμάτων, γραφημάτων και κλειδιών-τιμών. Αυτό το σύστημα υποστηρίζει επίσης διάφορους τύπους μνήμης και μπορεί να ενσωματώσει μνήμη γραφήματος για τη διαχείριση σχέσεων μεταξύ οντοτήτων. - -### Αποθήκευση Μνήμης με RAG - -Πέρα από εξειδικευμένα εργαλεία μνήμης όπως το Mem0, μπορείτε να αξιοποιήσετε ισχυρές υπηρεσίες αναζήτησης όπως το **Azure AI Search ως backend για την αποθήκευση και την ανάκτηση μνημών**, ειδικά για το δομημένο RAG. - -Αυτό σας επιτρέπει να βασίζετε τις απαντήσεις του πράκτορα στα δικά σας δεδομένα, εξασφαλίζοντας πιο σχετικές και ακριβείς απαντήσεις. Το Azure AI Search μπορεί να χρησιμοποιηθεί για την αποθήκευση ταξιδιωτικών μνημών χρηστών, καταλόγων προϊόντων ή οποιαδήποτε άλλη γνώση συγκεκριμένου τομέα. +#### Mem0 -Το Azure AI Search υποστηρίζει δυνατότητες όπως το **Δομημένο RAG**, το οποίο διαπρέπει στην εξαγωγή και την ανάκτηση πυκνών, δομημένων πληροφοριών από μεγάλα σύνολα δεδομένων όπως ιστορικά συνομιλιών, email ή ακόμα και εικόνες. Αυτό παρέχει "υπεράνθρωπη ακρίβεια και ανάκτηση" σε σύγκριση με τις παραδοσιακές προσεγγίσεις τεμαχισμού κειμένου και ενσωμάτωσης. +Ένας τρόπος αποθήκευσης και διαχείρισης μνήμης πρακτόρων είναι η χρήση εξειδικευμένων εργαλείων όπως το Mem0. Το Mem0 λειτουργεί ως ένα επίμονο επίπεδο μνήμης, επιτρέποντας στους πράκτορες να ανακαλούν σχετικές αλληλεπιδράσεις, να αποθηκεύουν προτιμήσεις χρηστών και πραγματικά πλαίσια και να μαθαίνουν από επιτυχίες και αποτυχίες με την πάροδο του χρόνου. Η ιδέα εδώ είναι ότι οι πράκτορες χωρίς κατάσταση μετατρέπονται σε πράκτορες με κατάσταση. -## Δημιουργία Αυτοβελτιούμενων Πρακτόρων AI +Λειτουργεί μέσω ενός **διφασικού αγωγού μνήμης: εξαγωγή και ενημέρωση**. Αρχικά, τα μηνύματα που προστίθενται στο νήμα ενός πράκτορα αποστέλλονται στην υπηρεσία Mem0, η οποία χρησιμοποιεί ένα Μεγάλο Μοντέλο Γλώσσας (LLM) για να συνοψίσει το ιστορικό συνομιλίας και να εξάγει νέες μνήμες. Στη συνέχεια, μια φάση ενημέρωσης που καθοδηγείται από LLM καθορίζει αν θα προστεθούν, τροποποιηθούν ή διαγραφούν αυτές οι μνήμες, αποθηκεύοντάς τες σε ένα υβριδικό κατάστημα δεδομένων που μπορεί να περιλαμβάνει βάσεις δεδομένων vector, γράφου και key-value. Αυτό το σύστημα υποστηρίζει επίσης διάφορους τύπους μνήμης και μπορεί να ενσωματώσει μνήμη γράφου για τη διαχείριση σχέσεων μεταξύ οντοτήτων. -Ένα κοινό μοτίβο για αυτοβελτιούμενους πράκτορες περιλαμβάνει την εισαγωγή ενός **"πράκτορα γνώσης"**. Αυτός ο ξεχωριστός πράκτορας παρακολουθεί την κύρια συνομιλία μεταξύ του χρήστη και του κύριου πράκτορα. Ο ρόλος του είναι να: +#### Cognee -1. **Εντοπίζει πολύτιμες πληροφορίες**: Καθορίζει αν κάποιο μέρος της συνομιλίας αξίζει να αποθηκευτεί ως γενική γνώση ή συγκεκριμένη προτίμηση χρήστη. +Μια άλλη ισχυρή προσέγγιση είναι η χρήση του **Cognee**, μιας ανοιχτού κώδικα σημασιολογικής μνήμης για πράκτορες Τεχνητής Νοημοσύνης που μετατρέπει δομημένα και μη δομημένα δεδομένα σε γράφημα γνώσης που μπορεί να αναζητηθεί, υποστηριζόμενο από embeddings. Το Cognee παρέχει μια **αρχιτεκτονική διπλού καταστήματος** που συνδυάζει αναζήτηση ομοιότητας vector με σχέσεις γράφου, επιτρέποντας στους πράκτορες να κατανοούν όχι μόνο ποιες πληροφορίες είναι παρόμοιες, αλλά και πώς σχετίζονται οι έννοιες μεταξύ τους. -2. **Εξάγει και συνοψίζει**: Αποστάζει την ουσιώδη μάθηση ή προτίμηση από τη συνομιλία. +Διαπρέπει στην **υβριδική ανάκτηση** που συνδυάζει ομοιότητα vector, δομή γράφου και συλλογιστική LLM - από την αναζήτηση ακατέργαστων τμημάτων έως την ερώτηση με επίγνωση του γράφου. Το σύστημα διατηρεί **ζωντανή μνήμη** που εξελίσσεται και μεγαλώνει ενώ παραμένει αναζητήσιμη ως ένα συνδεδεμένο γράφημα, υποστηρίζοντας τόσο το βραχυπρόθεσμο πλαίσιο συνεδρίας όσο και τη μακροπρόθεσμη επίμονη μνήμη. -3. **Αποθηκεύει σε βάση γνώσεων**: Διατηρεί αυτές τις εξαγόμενες πληροφορίες, συχνά σε μια βάση δεδομένων διανυσμάτων, ώστε να μπορούν να ανακτηθούν αργότερα. +Το tutorial notebook του Cognee ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) δείχνει πώς να δημιουργήσετε αυτό το ενιαίο επίπεδο μνήμης, με πρακτικά παραδείγματα εισαγωγής ποικίλων πηγών δεδομένων, οπτικοποίησης του γραφήματος γνώσης και ερωτήσεων με διαφορετικές στρατηγικές αναζήτησης προσαρμοσμένες στις ανάγκες συγκεκριμένων πρακτόρων. -4. **Ενισχύει μελλοντικά ερωτήματα**: Όταν ο χρήστης ξεκινά ένα νέο ερώτημα, ο πράκτορας γνώσης ανακτά σχετικές αποθηκευμένες πληροφορίες και τις προσθέτει στην προτροπή του χρήστη, παρέχοντας κρίσιμο πλαίσιο στον κύριο πράκτορα (παρόμοιο με το RAG). - -### Βελτιστοποιήσεις για Μνήμη - -• **Διαχείριση Καθυστέρησης**: Για να αποφευχθεί η επιβράδυνση των αλληλεπιδράσεων του χρήστη, ένα φθηνότερο, ταχύτερο μοντέλο μπορεί να χρησιμοποιηθεί αρχικά για να ελέγξει γρήγορα αν οι πληροφορίες είναι πολύτιμες για αποθήκευση ή ανάκτηση, καλώντας μόνο τη πιο σύνθετη διαδικασία εξαγωγής/ανάκτησης όταν είναι απαραίτητο. +### Αποθήκευση Μνήμης με RAG -• **Συντήρηση Βάσης Γνώσεων**: Για μια αυξανόμενη βάση γνώσεων, οι λιγότερο συχνά χρησιμοποιούμενες πληροφορίες μπορούν να μετακινηθούν σε "ψυχρή αποθήκευση" για τη διαχείριση του κόστους. +Πέρα από εξειδικευμένα εργαλεία μνήμης όπως το Mem0, μπορείτε να αξιοποιήσετε ισχυρές υπηρεσίες αναζήτησης όπως το **Azure AI Search ως backend για την αποθήκευση και ανάκτηση μνημών**, ειδικά για δομημένο RAG. -## Έχετε Πε +Αυτό σας επιτρέπει να βασίζετε τις απαντήσεις του πράκτορα στα δικά σας δεδομένα, διασφαλίζοντας πιο σχε --- + **Αποποίηση ευθύνης**: -Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. \ No newline at end of file +Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης. + \ No newline at end of file diff --git a/translations/en/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/en/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..09932f010 --- /dev/null +++ b/translations/en/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Building AI Agents with Persistent Memory using Cognee\n", + "\n", + "This notebook demonstrates how to create intelligent AI agents with advanced memory capabilities using [**cognee**](https://www.cognee.ai/) - an open-source AI memory system that integrates knowledge graphs, semantic search, and session management to develop context-aware AI systems.\n", + "\n", + "## 🎯 Learning Objectives\n", + "\n", + "By the end of this tutorial, you will learn how to:\n", + "- **Build Knowledge Graphs Backed by Embeddings**: Convert unstructured text into structured, queryable knowledge\n", + "- **Implement Session Memory**: Enable multi-turn conversations with automatic context retention\n", + "- **Persist Conversations**: Optionally save significant interactions in long-term memory for future use\n", + "- **Query Using Natural Language**: Retrieve and utilize historical context in new conversations\n", + "- **Visualize Memory**: Examine the connections within your agent's knowledge graph\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ What You'll Build\n", + "\n", + "In this tutorial, we will create a **Coding Assistant** with persistent memory that:\n", + "\n", + "### 1. **Knowledge Base Construction**\n", + " - Gathers information about developer profiles and expertise\n", + " - Processes principles and best practices of Python programming\n", + " - Stores historical conversations between developers and AI assistants\n", + "\n", + "### 2. **Session-Aware Conversations**\n", + " - Maintains context across multiple questions within the same session\n", + " - Automatically saves each question/answer pair for efficient retrieval\n", + " - Delivers coherent, context-aware responses based on conversation history\n", + "\n", + "### 3. **Long-term Memory**\n", + " - Saves important conversations into a long-term memory\n", + " - Retrieves relevant memories from the knowledge base and past sessions to enhance new interactions\n", + " - Builds an expanding knowledge base that improves over time\n", + "\n", + "### 4. **Intelligent Memory Retrieval**\n", + " - Utilizes graph-aware semantic search to locate relevant information across all stored knowledge\n", + " - Filters searches by data categories (developer information vs. principles)\n", + " - Combines multiple data sources to provide comprehensive answers\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Prerequisites & Setup\n", + "\n", + "### System Requirements\n", + "\n", + "Before you begin, make sure you have:\n", + "\n", + "1. **Python Environment**\n", + " - Python 3.9 or higher\n", + " - Virtual environment (recommended)\n", + " \n", + "2. **Redis Cache** (Required for Session Management)\n", + " - Local Redis: `docker run -d -p 6379:6379 redis`\n", + " - Or use a managed Redis service\n", + " \n", + "3. **LLM API Access**\n", + " - OpenAI API key or other providers (see [documentation](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Database Configuration**\n", + " - No configuration required by default. Cognee uses file-based databases (LanceDB and Kuzu)\n", + " - Optionally, you can set up Azure AI Search as a vector store (see [documentation](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Environment Configuration\n", + "\n", + "Create a `.env` file in your project directory with the following variables:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Understanding Cognee's Memory Architecture\n", + "\n", + "### How Cognee Works\n", + "\n", + "Cognee offers an advanced memory system that surpasses basic key-value storage:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Key Components:\n", + "\n", + "1. **Knowledge Graph**: Stores entities, relationships, and semantic connections\n", + "2. **Vector Embeddings**: Enables semantic search across all stored information\n", + "3. **Session Cache**: Keeps track of conversation context within and across sessions\n", + "4. **NodeSets**: Organize data into logical categories for focused retrieval\n", + "\n", + "### Memory Types in This Tutorial:\n", + "\n", + "- **Persistent Memory**: Long-term storage in the knowledge graph\n", + "- **Session Memory**: Temporary conversation context stored in Redis cache\n", + "- **Semantic Memory**: Vector-based similarity search across all data\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Install Required Packages\n", + "\n", + "Install Cognee with Redis support for session management:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Initialize Environment and Load Libraries\n", + "\n", + "Make sure:\n", + "1. Redis is running (e.g., via Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Environment variables are set before importing cache modules\n", + "3. If needed, restart the kernel and run cells in order\n", + "\n", + "The following cell will:\n", + "1. Load environment variables from `.env`\n", + "2. Configure Cognee with your LLM settings\n", + "3. Enable caching for session management\n", + "4. Validate all components are properly connected\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Configure Storage Directories\n", + "\n", + "Cognee uses two separate directories for its operations:\n", + "- **Data Root**: Stores ingested documents and processed data\n", + "- **System Root**: Contains the knowledge graph database and system metadata\n", + "\n", + "We'll create isolated directories for this tutorial as follows:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Reset Memory State\n", + "\n", + "Before we start building our memory system, let's make sure we're starting with a clean slate.\n", + "\n", + "> 💡 **Tip**: You can skip this step if you want to keep existing memories from your previous runs when using this notebook later.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Part 1: Building the Knowledge Base\n", + "\n", + "### Data Sources for Our Developer Assistant\n", + "\n", + "We'll incorporate three types of data to build a comprehensive knowledge base:\n", + "\n", + "1. **Developer Profile**: Personal expertise and technical background\n", + "2. **Python Best Practices**: The Zen of Python along with practical guidelines\n", + "3. **Historical Conversations**: Past Q&A sessions between developers and AI assistants\n", + "\n", + "This diverse data enables our agent to:\n", + "- Understand the user's technical context\n", + "- Provide recommendations based on best practices\n", + "- Learn from previous successful interactions\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Process Data into Knowledge Graph\n", + "\n", + "Now we'll transform our raw text into a structured memory. This process:\n", + "\n", + "1. **Adds data to NodeSets**: Organizes information into logical categories\n", + " - `developer_data`: Developer profile and conversations\n", + " - `principles_data`: Python best practices and guidelines\n", + "\n", + "2. **Runs Cognify Pipeline**: Extracts entities, relationships, and creates embeddings\n", + " - Identifies key concepts\n", + " - Creates semantic connections between related information\n", + " - Generates vector embeddings\n", + "\n", + "This may take a few moments as the LLM processes the text and builds the graph structure:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Visualize the Knowledge Graph\n", + "\n", + "Let's examine the structure of our knowledge graph. The visualization includes:\n", + "- **Nodes**: Entities extracted from the text (concepts, technologies, individuals)\n", + "- **Edges**: Relationships and connections between entities\n", + "- **Clusters**: Related concepts grouped by semantic similarity\n", + "\n", + "Open the generated HTML file in your browser to interactively explore the graph:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Enhance Memory with Memify\n", + "\n", + "The `memify()` function examines the knowledge graph and formulates smart rules about the data. This process:\n", + "- Detects patterns and optimal practices\n", + "- Develops practical guidelines derived from the content\n", + "- Builds connections between various knowledge domains\n", + "\n", + "These rules enable the agent to provide more insightful answers to questions. Capturing a second visualization allows you to observe how the graph becomes more interconnected after enrichment.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Part 2: Intelligent Memory Retrieval\n", + "\n", + "### Demonstration 1: Cross-Document Knowledge Integration\n", + "\n", + "Now that our knowledge graph is built, let's test how Cognee combines information from multiple sources to answer complex questions.\n", + "\n", + "The first query demonstrates:\n", + "- **Semantic understanding**: Identifying relevant concepts even if they are not explicitly mentioned\n", + "- **Cross-referencing**: Merging developer profiles with Python principles\n", + "- **Contextual reasoning**: Applying best practices to specific implementations\n", + "\n", + "### Demonstration 2: Filtered Search with NodeSets\n", + "\n", + "The second query illustrates how to focus on specific subsets of the knowledge graph:\n", + "- Utilizes the `node_name` parameter to search exclusively within `principles_data`\n", + "- Delivers targeted answers from a particular knowledge domain\n", + "- Ideal for situations requiring domain-specific insights\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Part 3: Session Management Setup\n", + "\n", + "### Enabling Conversation Memory\n", + "\n", + "Session management is essential for preserving context throughout multiple interactions. Here we will:\n", + "\n", + "1. **Initialize User Context**: Create or retrieve a user profile for session tracking\n", + "2. **Configure Cache Engine**: Connect to Redis to store conversation history\n", + "3. **Enable Session Variables**: Set up context variables that remain consistent across queries\n", + "\n", + "> ⚠️ **Important**: This requires Redis to be running and `CACHING=true` in your environment\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Helper Function: View Session History\n", + "\n", + "This utility function allows us to check the conversation history stored in Redis. It's useful for:\n", + "- Debugging session management\n", + "- Ensuring that conversations are being cached\n", + "- Understanding what context is available to the agent\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Session 1: Async Support Lab — First Question\n", + "\n", + "Start the `async-support-lab` session by asking for asyncio patterns that are telemetry-friendly for a large-scale web scraper. The graph is already familiar with asyncio, aiohttp, and monitoring practices, so the response should reflect previous discussions while adapting the answer to this new question.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Inspect Session 1 Memory After the First Exchange\n", + "\n", + "Running `show_history(session_1)` immediately after the initial question confirms that Cognee saved both the prompt and the completion into Redis. You should see one entry with the concurrency guidance.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Session 1: Follow-up on Data Models\n", + "\n", + "Next, we ask, \"When should I choose dataclasses versus Pydantic?\" using the same session ID. Cognee should combine Python principles with previous FastAPI discussions to offer detailed advice—showing that context is maintained within a named session.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Confirm Session 1 History Contains Both Turns\n", + "\n", + "Another `show_history(session_1)` call should reveal two Q&A entries. This corresponds to the \"memory replay\" step in the Mem0 lab and demonstrates that additional turns are added to the same transcript.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Session 2: Design Review Thread — Fresh Session\n", + "\n", + "To demonstrate isolation between threads, we initiate `design-review-session` and request logging guidance for incident reviews. Although the underlying knowledge base remains the same, the new session ID ensures that transcripts are kept separate.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Review Session 2 History\n", + "\n", + "`show_history(session_2)` should only display the design-review prompt/response pair. Compare it with Session 1 to emphasize how Cognee maintains separate transcripts while leveraging the shared knowledge graph.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "Congratulations! You’ve just equipped your coding assistant with a robust long-term memory layer powered by Cognee.\n", + "\n", + "In this tutorial, you transformed raw developer content (code, documentation, chats) into a graph + vector memory that your agent can search, reason about, and continuously enhance.\n", + "\n", + "What You’ve Learned:\n", + "\n", + "1. **From raw text to AI memory**: How Cognee processes unstructured data and converts it into intelligent, searchable memory using a combined vector + knowledge graph architecture.\n", + "\n", + "2. **Graph enrichment with memify**: How to go beyond basic graph creation by using memify to add derived facts and richer relationships to your existing graph.\n", + "\n", + "3. **Multiple search strategies**: How to query memory using various search methods (graph-aware Q&A, RAG-style completion, insights, raw chunks, code search, etc.) based on your agent’s needs.\n", + "\n", + "4. **Visual exploration**: How to inspect and debug what Cognee has built using graph visualizations and the Cognee UI, allowing you to see how knowledge is structured.\n", + "\n", + "5. **Session-aware memory**: How to integrate per-session context with persistent semantic memory, enabling agents to retain information across sessions without leaking data between users.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Key Takeaways\n", + "1. Memory as a Knowledge Graph backed by Embeddings\n", + "\n", + " - **Structured understanding**: Cognee combines a vector store and a graph store, making your data both searchable by meaning and connected through relationships. By default, Cognee uses file-based databases (LanceDB for vector storage, Kuzu for graph database).\n", + "\n", + " - **Relationship-aware retrieval**: Answers are grounded not just in “similar text” but also in how entities are interconnected.\n", + "\n", + " - **Living memory**: The memory layer evolves, grows, and remains queryable as a unified graph.\n", + "\n", + "2. Search & Reasoning Modes\n", + " - **Hybrid retrieval**: Combines vector similarity, graph structure, and LLM reasoning, ranging from raw chunk lookups to graph-aware question answering.\n", + "\n", + " - **Adapt the mode to the task**: Use completion-style modes for natural language answers, and chunk/summary/graph modes when your agent needs raw context or to drive its own reasoning.\n", + "\n", + "3. Personalized, Session-Aware Agents\n", + " - **Session context + long-term memory**: Cognee separates short-term “thread” context from long-term, user- or organization-level memory.\n", + "\n", + "## Real-World Applications\n", + "\n", + "1. **Vertical AI Agents**\n", + "\n", + " Use the approach outlined in this notebook to create domain-specific copilots powered by Cognee as their retrieval and reasoning backbone:\n", + "\n", + "- **Developer copilots**: Assist with code reviews, incident analysis, and architecture by navigating code, APIs, design documents, and tickets as a unified memory graph.\n", + "\n", + "- **Customer-facing copilots**: Support or success agents that retrieve information from product documentation, FAQs, CRM notes, and past tickets using graph-aware retrieval and cited answers.\n", + "\n", + "- **Internal expert copilots**: Policy, legal, or security assistants that reason over interconnected rules, guidelines, and historical decisions instead of isolated PDFs.\n", + "\n", + " Cognee is designed to serve as a persistent, accurate memory for AI agents, providing a living knowledge graph that integrates seamlessly with your agent, replacing ad-hoc combinations of vector stores and custom graph code.\n", + "\n", + "2. **Unifying Data Silos into One Memory**\n", + "\n", + " This approach also enables the creation of a unified memory layer across disparate data sources:\n", + "\n", + "- **From silos to one graph**: Combine structured (e.g., databases) and unstructured data (e.g., documents, chats) into a single graph backed by embeddings, rather than maintaining separate indices for each system.\n", + "\n", + "- **Cross-source reasoning with citations**: Perform multi-step reasoning across all data—“join” logs, metrics, and documents via the graph—and still provide grounded answers with proper citations.\n", + "\n", + "- **Knowledge hubs**: In domains like banking or education, Cognee is already being used to unify PDFs, internal systems, and app data into a single knowledge graph with vectors, enabling agents to answer questions with precise, cited context.\n", + "\n", + "## Next Steps\n", + "\n", + "You’ve implemented the core memory loop. Here are some natural extensions you can explore on your own (refer to [Cognee documentation](https://docs.cognee.ai/) for more details):\n", + "\n", + "1. **Experiment with temporal awareness**: Enable temporal cognify to extract events and timestamps from text.\n", + "\n", + "2. **Introduce ontology-driven reasoning**: Define an OWL ontology for your domain. Use Cognee’s ontology support to ground extracted entities and relationships in that schema, enhancing graph quality and domain-specific answers.\n", + "\n", + "3. **Add a feedback loop**: Allow Cognee to adjust graph edge weights based on real user feedback, so retrieval improves over time instead of remaining static.\n", + "\n", + "4. **Tune for personalization & session behavior**: Use user IDs, tenants, and datasets to provide each individual or team with their own view of the shared memory engine.\n", + "\n", + "5. **Scale out to more complex agents**: Integrate Cognee into agent frameworks to build multi-agent systems that share the same memory layer. *Microsoft Agent Framework x Cognee plugin is coming soon.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Disclaimer**: \nThis document has been translated using the AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). While we aim for accuracy, please note that automated translations may include errors or inaccuracies. The original document in its native language should be regarded as the authoritative source. For critical information, professional human translation is advised. We are not responsible for any misunderstandings or misinterpretations resulting from the use of this translation.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:12:18+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "en" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/en/13-agent-memory/README.md b/translations/en/13-agent-memory/README.md index be4214131..c421f2d37 100644 --- a/translations/en/13-agent-memory/README.md +++ b/translations/en/13-agent-memory/README.md @@ -1,8 +1,8 @@ **Disclaimer**: -This document has been translated using the AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). While we aim for accuracy, please note that automated translations may contain errors or inaccuracies. The original document in its native language should be regarded as the authoritative source. For critical information, professional human translation is recommended. We are not responsible for any misunderstandings or misinterpretations resulting from the use of this translation. \ No newline at end of file +This document has been translated using the AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator). While we aim for accuracy, please note that automated translations may include errors or inaccuracies. The original document in its native language should be regarded as the authoritative source. For critical information, professional human translation is advised. We are not responsible for any misunderstandings or misinterpretations resulting from the use of this translation. + \ No newline at end of file diff --git a/translations/es/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/es/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..6bcb3357f --- /dev/null +++ b/translations/es/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Construyendo Agentes de IA con Memoria Persistente usando Cognee\n", + "\n", + "Este cuaderno demuestra cómo construir agentes de IA inteligentes con capacidades avanzadas de memoria utilizando [**cognee**](https://www.cognee.ai/) - una memoria de IA de código abierto que combina gráficos de conocimiento, búsqueda semántica y gestión de sesiones para crear sistemas de IA conscientes del contexto.\n", + "\n", + "## 🎯 Objetivos de Aprendizaje\n", + "\n", + "Al final de este tutorial, comprenderás cómo:\n", + "- **Construir Gráficos de Conocimiento Respaldados por Embeddings**: Transformar texto no estructurado en conocimiento estructurado y consultable\n", + "- **Implementar Memoria de Sesión**: Crear conversaciones de múltiples turnos con retención automática de contexto\n", + "- **Persistir Conversaciones**: Almacenar opcionalmente interacciones importantes en memoria a largo plazo para referencia futura\n", + "- **Consultar Usando Lenguaje Natural**: Acceder y aprovechar el contexto histórico en nuevas conversaciones\n", + "- **Visualizar Memoria**: Explorar las relaciones en el gráfico de conocimiento de tu agente\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Lo que Construirás\n", + "\n", + "En este tutorial, crearemos un **Asistente de Programación** con memoria persistente que:\n", + "\n", + "### 1. **Construcción de una Base de Conocimientos**\n", + " - Ingiera información del perfil y experiencia del desarrollador\n", + " - Procese principios y mejores prácticas de programación en Python\n", + " - Almacene conversaciones históricas entre desarrolladores y asistentes de IA\n", + "\n", + "### 2. **Conversaciones Conscientes de la Sesión**\n", + " - Mantenga el contexto a lo largo de múltiples preguntas en la misma sesión\n", + " - Almacene automáticamente cada par de pregunta/respuesta para una recuperación eficiente\n", + " - Proporcione respuestas coherentes y contextuales basadas en el historial de la conversación\n", + "\n", + "### 3. **Memoria a Largo Plazo**\n", + " - Persista conversaciones importantes en una memoria a largo plazo\n", + " - Recupere recuerdos relevantes de la base de conocimientos y sesiones pasadas para informar nuevas interacciones\n", + " - Construya una base de conocimientos en crecimiento que mejore con el tiempo\n", + "\n", + "### 4. **Recuperación Inteligente de Memoria**\n", + " - Utilice búsqueda semántica basada en grafos para encontrar información relevante en todo el conocimiento almacenado\n", + " - Filtre búsquedas por subgrupos de datos (información del desarrollador vs. principios)\n", + " - Combine múltiples fuentes de datos para proporcionar respuestas completas\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Requisitos previos y configuración\n", + "\n", + "### Requisitos del sistema\n", + "\n", + "Antes de comenzar, asegúrate de tener:\n", + "\n", + "1. **Entorno de Python**\n", + " - Python 3.9 o superior\n", + " - Entorno virtual (recomendado)\n", + " \n", + "2. **Cache de Redis** (Requerido para la gestión de sesiones)\n", + " - Redis local: `docker run -d -p 6379:6379 redis`\n", + " - O utiliza un servicio gestionado de Redis\n", + " \n", + "3. **Acceso a la API de LLM**\n", + " - Clave de API de OpenAI u otros proveedores (consulta la [documentación](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Configuración de la base de datos**\n", + " - No se requiere configuración por defecto. Cognee utiliza bases de datos basadas en archivos (LanceDB y Kuzu)\n", + " - Opcionalmente, puedes configurar Azure AI Search como un almacén vectorial (consulta la [documentación](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Configuración del entorno\n", + "\n", + "Crea un archivo `.env` en el directorio de tu proyecto con las siguientes variables:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Comprendiendo la Arquitectura de Memoria de Cognee\n", + "\n", + "### Cómo Funciona Cognee\n", + "\n", + "Cognee ofrece un sistema de memoria sofisticado que va más allá del simple almacenamiento de clave-valor:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Componentes Clave:\n", + "\n", + "1. **Grafo de Conocimiento**: Almacena entidades, relaciones y conexiones semánticas\n", + "2. **Embeddings Vectoriales**: Permite la búsqueda semántica en toda la información almacenada\n", + "3. **Caché de Sesión**: Mantiene el contexto de la conversación dentro y entre sesiones\n", + "4. **NodeSets**: Organiza los datos en categorías lógicas para una recuperación específica\n", + "\n", + "### Tipos de Memoria en Este Tutorial:\n", + "\n", + "- **Memoria Persistente**: Almacenamiento a largo plazo en el grafo de conocimiento\n", + "- **Memoria de Sesión**: Contexto temporal de la conversación en la caché de Redis\n", + "- **Memoria Semántica**: Búsqueda basada en similitud vectorial en todos los datos\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Instalar paquetes requeridos\n", + "\n", + "Instala Cognee con soporte de Redis para la gestión de sesiones:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Inicializar el Entorno y Cargar Bibliotecas\n", + "\n", + "Asegúrate de que:\n", + "1. Redis esté en funcionamiento (por ejemplo, usando Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Las variables de entorno estén configuradas antes de importar los módulos de caché\n", + "3. Si es necesario, reinicia el kernel y ejecuta las celdas en orden\n", + "\n", + "La siguiente celda hará lo siguiente:\n", + "1. Cargar las variables de entorno desde `.env`\n", + "2. Configurar Cognee con tus ajustes de LLM\n", + "3. Habilitar la caché para la gestión de sesiones\n", + "4. Validar que todos los componentes estén correctamente conectados\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Configurar Directorios de Almacenamiento\n", + "\n", + "Cognee utiliza dos directorios separados para sus operaciones:\n", + "- **Raíz de Datos**: Almacena documentos ingeridos y datos procesados\n", + "- **Raíz del Sistema**: Contiene la base de datos del grafo de conocimiento y los metadatos del sistema\n", + "\n", + "Crearemos directorios aislados para este tutorial de la siguiente manera:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Restablecer el Estado de la Memoria\n", + "\n", + "Antes de comenzar a construir nuestro sistema de memoria, asegurémonos de empezar desde cero.\n", + "\n", + "> 💡 **Consejo**: Puedes omitir este paso si deseas conservar los recuerdos existentes de ejecuciones anteriores cuando uses este cuaderno más adelante.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Parte 1: Construyendo la Base de Conocimiento\n", + "\n", + "### Fuentes de Datos para Nuestro Asistente de Desarrolladores\n", + "\n", + "Incorporaremos tres tipos de datos para crear una base de conocimiento integral:\n", + "\n", + "1. **Perfil del Desarrollador**: Experiencia personal y antecedentes técnicos\n", + "2. **Mejores Prácticas de Python**: El Zen de Python con pautas prácticas\n", + "3. **Conversaciones Históricas**: Sesiones de preguntas y respuestas pasadas entre desarrolladores y asistentes de IA\n", + "\n", + "Estos datos diversos permiten que nuestro agente:\n", + "- Comprenda el contexto técnico del usuario\n", + "- Aplique mejores prácticas en sus recomendaciones\n", + "- Aprenda de interacciones exitosas anteriores\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Procesar Datos en un Grafo de Conocimiento\n", + "\n", + "Ahora transformaremos nuestro texto sin procesar en una memoria estructurada. Este proceso:\n", + "\n", + "1. **Agrega datos a NodeSets**: Organiza la información en categorías lógicas\n", + " - `developer_data`: Perfil del desarrollador y conversaciones\n", + " - `principles_data`: Mejores prácticas y directrices de Python\n", + "\n", + "2. **Ejecuta el Pipeline Cognify**: Extrae entidades, relaciones y crea embeddings\n", + " - Identifica conceptos clave\n", + " - Crea conexiones semánticas entre información relacionada\n", + " - Genera embeddings vectoriales\n", + "\n", + "Esto puede tomar unos momentos mientras el LLM procesa el texto y construye la estructura del grafo:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Visualizar el Grafo de Conocimiento\n", + "\n", + "Vamos a explorar la estructura de nuestro grafo de conocimiento. La visualización muestra:\n", + "- **Nodos**: Entidades extraídas del texto (conceptos, tecnologías, personas)\n", + "- **Aristas**: Relaciones y conexiones entre las entidades\n", + "- **Clústeres**: Conceptos relacionados agrupados por similitud semántica\n", + "\n", + "Abre el archivo HTML generado en tu navegador para explorar el grafo de manera interactiva:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Enriquecer la Memoria con Memify\n", + "\n", + "La función `memify()` analiza el grafo de conocimiento y genera reglas inteligentes sobre los datos. Este proceso:\n", + "- Identifica patrones y mejores prácticas\n", + "- Crea pautas accionables basadas en el contenido\n", + "- Establece relaciones entre diferentes áreas de conocimiento\n", + "\n", + "Estas reglas ayudan al agente a tomar decisiones más informadas al responder preguntas. Capturar una segunda visualización te permite comparar cómo se densifica el grafo una vez enriquecido.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Parte 2: Recuperación Inteligente de Memoria\n", + "\n", + "### Demostración 1: Integración de Conocimientos entre Documentos\n", + "\n", + "Ahora que nuestro grafo de conocimiento está construido, probemos cómo Cognee combina información de múltiples fuentes para responder preguntas complejas.\n", + "\n", + "La primera consulta demuestra:\n", + "- **Comprensión semántica**: Encontrar conceptos relevantes incluso cuando no se mencionan explícitamente\n", + "- **Referencia cruzada**: Combinar el perfil del desarrollador con principios de Python\n", + "- **Razonamiento contextual**: Aplicar mejores prácticas a implementaciones específicas\n", + "\n", + "### Demostración 2: Búsqueda Filtrada con NodeSets\n", + "\n", + "La segunda consulta muestra cómo dirigirnos a subconjuntos específicos del grafo de conocimiento:\n", + "- Utiliza el parámetro `node_name` para buscar solo dentro de `principles_data`\n", + "- Proporciona respuestas enfocadas de un dominio de conocimiento específico\n", + "- Útil cuando necesitas información específica de un dominio\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Parte 3: Configuración de Gestión de Sesiones\n", + "\n", + "### Habilitar Memoria de Conversación\n", + "\n", + "La gestión de sesiones es crucial para mantener el contexto a lo largo de múltiples interacciones. Aquí haremos lo siguiente:\n", + "\n", + "1. **Inicializar el Contexto del Usuario**: Crear o recuperar un perfil de usuario para el seguimiento de la sesión.\n", + "2. **Configurar el Motor de Caché**: Conectar a Redis para almacenar el historial de conversaciones.\n", + "3. **Habilitar Variables de Sesión**: Configurar variables de contexto que persistan entre consultas.\n", + "\n", + "> ⚠️ **Importante**: Esto requiere que Redis esté en funcionamiento y que `CACHING=true` esté configurado en tu entorno.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Función de Ayuda: Ver Historial de Sesión\n", + "\n", + "Esta función de utilidad nos permite inspeccionar el historial de conversaciones almacenado en Redis. Es útil para:\n", + "- Depurar la gestión de sesiones\n", + "- Verificar que las conversaciones se están almacenando en caché\n", + "- Comprender qué contexto está disponible para el agente\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Sesión 1: Laboratorio de soporte asíncrono — Primera pregunta\n", + "\n", + "Inicia la sesión `async-support-lab` preguntando por patrones de asyncio compatibles con telemetría para un scraper web masivo. El gráfico ya tiene conocimiento sobre asyncio, aiohttp y prácticas de monitoreo, por lo que la respuesta debería reflejar conversaciones previas mientras adapta la respuesta a la nueva consulta.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Inspeccionar la Memoria de la Sesión 1 Después del Primer Intercambio\n", + "\n", + "Ejecutar `show_history(session_1)` inmediatamente después de la pregunta inicial confirma que Cognee escribió tanto el mensaje inicial como la respuesta en Redis. Deberías ver una entrada con la guía de concurrencia.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Sesión 1: Seguimiento de Modelos de Datos\n", + "\n", + "A continuación, preguntamos: \"¿Cuándo debería elegir dataclasses en lugar de Pydantic?\" utilizando el mismo id de sesión. Cognee debería combinar los principios de Python junto con conversaciones previas sobre FastAPI para ofrecer un consejo matizado, demostrando que el contexto se mantiene dentro de una sesión nombrada.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Confirmar que el Historial de la Sesión 1 Contiene Ambos Turnos\n", + "\n", + "Otra llamada a `show_history(session_1)` debería mostrar dos entradas de preguntas y respuestas. Esto coincide con el paso de \"reproducción de memoria\" del laboratorio Mem0 y demuestra que los turnos adicionales amplían la misma transcripción.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Sesión 2: Hilo de Revisión de Diseño — Sesión Nueva\n", + "\n", + "Para mostrar aislamiento entre hilos, iniciamos `design-review-session` y pedimos orientación sobre el registro para revisiones de incidentes. Aunque la base de conocimiento subyacente es la misma, el nuevo id de sesión mantiene las transcripciones separadas.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Revisión de la Sesión 2 Historia\n", + "\n", + "`show_history(session_2)` debería listar únicamente el par de solicitud/respuesta de revisión de diseño. Compáralo con la Sesión 1 para destacar cómo Cognee mantiene transcripciones independientes mientras reutiliza el gráfico de conocimiento compartido.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Resumen\n", + "\n", + "¡Felicidades! Acabas de darle a tu asistente de codificación una capa de memoria a largo plazo impulsada por Cognee.\n", + "\n", + "En este tutorial, tomaste contenido de desarrollador en bruto (código, documentos, chats) y lo transformaste en un grafo + memoria vectorial que tu agente puede buscar, razonar y mejorar continuamente.\n", + "\n", + "Lo que has aprendido\n", + "\n", + "1. **De texto en bruto a memoria de IA**: Cómo Cognee ingiere datos no estructurados y los convierte en una memoria inteligente y buscable utilizando una arquitectura combinada de vector + grafo de conocimiento.\n", + "\n", + "2. **Enriquecimiento del grafo con memify**: Cómo ir más allá de la creación básica de grafos y usar memify para agregar hechos derivados y relaciones más ricas sobre tu grafo existente.\n", + "\n", + "3. **Múltiples estrategias de búsqueda**: Cómo consultar la memoria con diferentes tipos de búsqueda (preguntas y respuestas conscientes del grafo, completado estilo RAG, insights, fragmentos en bruto, búsqueda de código, etc.) dependiendo de lo que necesite tu agente.\n", + "\n", + "4. **Exploración visual**: Cómo inspeccionar y depurar lo que Cognee construyó utilizando visualizaciones de grafos y la interfaz de usuario de Cognee, para que realmente puedas ver cómo está estructurado el conocimiento.\n", + "\n", + "5. **Memoria consciente de la sesión**: Cómo combinar el contexto por sesión con la memoria semántica persistente para que los agentes puedan recordar entre ejecuciones sin filtrar información entre usuarios.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Puntos Clave\n", + "1. Memoria como un Grafo de Conocimiento respaldado por Embeddings\n", + "\n", + " - **Comprensión estructurada**: Cognee combina un almacén vectorial y un almacén de grafos para que tus datos sean tanto buscables por significado como conectados por relaciones. Cognee utiliza bases de datos basadas en archivos por defecto (LanceDB para vectores, Kuzu para bases de datos de grafos).\n", + "\n", + " - **Recuperación consciente de relaciones**: Las respuestas pueden estar fundamentadas no solo en \"texto similar\", sino también en cómo se relacionan las entidades.\n", + "\n", + " - **Memoria viva**: La capa de memoria evoluciona, crece y permanece consultable como un grafo conectado.\n", + "\n", + "2. Modos de Búsqueda y Razonamiento\n", + " - **Recuperación híbrida**: La búsqueda combina similitud vectorial, estructura de grafos y razonamiento de LLM, desde la búsqueda de fragmentos hasta respuestas a preguntas conscientes del grafo.\n", + "\n", + " - **Ajusta el modo al trabajo**: Usa modos de estilo de completado cuando necesites respuestas en lenguaje natural, y modos de fragmento/resumen/grafo cuando tu agente necesite contexto bruto o impulsar su propio razonamiento.\n", + "\n", + "3. Agentes Personalizados y Conscientes de la Sesión\n", + " - **Contexto de sesión + memoria a largo plazo**: Cognee mantiene el contexto de \"hilo\" a corto plazo separado de la memoria duradera a nivel de usuario u organización.\n", + "\n", + "## Aplicaciones en el Mundo Real\n", + "\n", + "1. **Agentes Verticales de IA**\n", + "\n", + " Usa el patrón de este cuaderno para potenciar copilotos inteligentes en dominios que se basen en Cognee como su núcleo de recuperación y razonamiento:\n", + "\n", + "- **Copilotos para desarrolladores**: Asistentes de revisión de código, análisis de incidentes y arquitectura que recorren código, APIs, documentos de diseño y tickets como un único grafo de memoria.\n", + "\n", + "- **Copilotos orientados al cliente**: Agentes de soporte o éxito que extraen información de documentos de productos, preguntas frecuentes, notas de CRM y tickets anteriores con recuperación consciente del grafo y respuestas citadas.\n", + "\n", + "- **Copilotos expertos internos**: Asistentes de políticas, legales o de seguridad que razonan sobre reglas interconectadas, guías y decisiones históricas en lugar de PDFs aislados.\n", + "\n", + " Cognee está explícitamente posicionado como memoria persistente y precisa para agentes de IA, proporcionando un grafo de conocimiento vivo que se integra detrás de tu agente y reemplaza combinaciones ad-hoc de almacenes vectoriales y código de grafos personalizado.\n", + "\n", + "2. **Unificar Silos de Datos en Una Memoria**\n", + "\n", + " El mismo enfoque también te ayuda a construir una capa de memoria unificada a partir de fuentes dispersas:\n", + "\n", + "- **De silos a un grafo único**: Ingresa datos estructurados (por ejemplo, bases de datos) y no estructurados (por ejemplo, documentos, chats) en un único grafo respaldado por embeddings, en lugar de índices separados para cada sistema.\n", + "\n", + "- **Razonamiento entre fuentes con citas**: Realiza razonamientos de múltiples pasos sobre todo—\"une\" registros, métricas y documentos a través del grafo—y aún devuelve respuestas fundamentadas con procedencia.\n", + "\n", + "- **Centros de conocimiento**: Para dominios como banca o educación, Cognee ya se utiliza para unificar PDFs, sistemas internos y datos de aplicaciones en un grafo de conocimiento con vectores para que los agentes puedan responder preguntas con contexto preciso y citado.\n", + "\n", + "## Próximos Pasos\n", + "\n", + "Has implementado el bucle de memoria principal. Aquí hay extensiones naturales que puedes probar por tu cuenta (consulta la [documentación de Cognee](https://docs.cognee.ai/) para más detalles):\n", + "\n", + "1. **Experimenta con conciencia temporal**: Activa la cognificación temporal para extraer eventos y marcas de tiempo del texto.\n", + "\n", + "2. **Introduce razonamiento basado en ontologías**: Define una ontología OWL para tu dominio. Usa el soporte de ontologías de Cognee para que las entidades y relaciones extraídas estén fundamentadas en ese esquema, mejorando la calidad del grafo y las respuestas específicas del dominio.\n", + "\n", + "3. **Añade un bucle de retroalimentación**: Permite que Cognee ajuste los pesos de los bordes del grafo a partir de la retroalimentación real de los usuarios, para que la recuperación mejore con el tiempo en lugar de permanecer estática.\n", + "\n", + "4. **Optimiza para personalización y comportamiento de sesión**: Usa IDs de usuario, inquilinos y conjuntos de datos para dar a cada persona o equipo su propia vista sobre el motor de memoria compartido.\n", + "\n", + "5. **Escala hacia agentes más complejos**: Conecta Cognee a marcos de agentes para construir sistemas multi-agente que compartan la misma capa de memoria. *El plugin Microsoft Agent Framework x Cognee estará disponible pronto.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Descargo de responsabilidad**: \nEste documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Aunque nos esforzamos por lograr precisión, tenga en cuenta que las traducciones automáticas pueden contener errores o imprecisiones. El documento original en su idioma nativo debe considerarse la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables de malentendidos o interpretaciones erróneas que surjan del uso de esta traducción.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:15:24+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "es" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/es/13-agent-memory/README.md b/translations/es/13-agent-memory/README.md index dfc3982d0..cc359ae49 100644 --- a/translations/es/13-agent-memory/README.md +++ b/translations/es/13-agent-memory/README.md @@ -1,48 +1,56 @@ -# Memoria para Agentes de IA -[![Memoria de Agentes](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.es.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) +# Memoria para Agentes de IA +[![Memoria del Agente](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.es.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Cuando se habla de los beneficios únicos de crear agentes de IA, se destacan principalmente dos aspectos: la capacidad de utilizar herramientas para completar tareas y la habilidad de mejorar con el tiempo. La memoria es la base para crear agentes que se auto-mejoran y que pueden ofrecer mejores experiencias a nuestros usuarios. +Cuando se habla de los beneficios únicos de crear Agentes de IA, se destacan principalmente dos cosas: la capacidad de utilizar herramientas para completar tareas y la capacidad de mejorar con el tiempo. La memoria es la base para crear agentes auto-mejorables que puedan ofrecer mejores experiencias a nuestros usuarios. -En esta lección, exploraremos qué es la memoria para los agentes de IA y cómo podemos gestionarla y utilizarla para mejorar nuestras aplicaciones. +En esta lección, exploraremos qué es la memoria para los Agentes de IA y cómo podemos gestionarla y utilizarla en beneficio de nuestras aplicaciones. ## Introducción Esta lección cubrirá: -• **Comprender la memoria de los agentes de IA**: Qué es la memoria y por qué es esencial para los agentes. +• **Comprender la Memoria de los Agentes de IA**: Qué es la memoria y por qué es esencial para los agentes. -• **Implementar y almacenar memoria**: Métodos prácticos para añadir capacidades de memoria a tus agentes de IA, centrándonos en memoria a corto y largo plazo. +• **Implementar y Almacenar Memoria**: Métodos prácticos para añadir capacidades de memoria a tus agentes de IA, centrándonos en la memoria a corto y largo plazo. -• **Hacer que los agentes de IA se auto-mejoren**: Cómo la memoria permite a los agentes aprender de interacciones pasadas y mejorar con el tiempo. +• **Hacer que los Agentes de IA se Auto-Mejoren**: Cómo la memoria permite a los agentes aprender de interacciones pasadas y mejorar con el tiempo. + +## Implementaciones Disponibles + +Esta lección incluye dos tutoriales completos en cuadernos: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Implementa memoria utilizando Mem0 y Azure AI Search con el marco de trabajo Semantic Kernel. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Implementa memoria estructurada utilizando Cognee, construyendo automáticamente un grafo de conocimiento respaldado por embeddings, visualizando el grafo y realizando recuperaciones inteligentes. ## Objetivos de Aprendizaje -Al completar esta lección, sabrás cómo: +Después de completar esta lección, sabrás cómo: -• **Diferenciar entre los distintos tipos de memoria de los agentes de IA**, incluyendo memoria de trabajo, memoria a corto plazo, memoria a largo plazo y formas especializadas como memoria de personalidad y memoria episódica. +• **Diferenciar entre varios tipos de memoria de agentes de IA**, incluyendo memoria de trabajo, a corto plazo y a largo plazo, así como formas especializadas como memoria de personalidad y episódica. -• **Implementar y gestionar memoria a corto y largo plazo para agentes de IA** utilizando el marco Semantic Kernel, aprovechando herramientas como Mem0 y memoria de Whiteboard, e integrando con Azure AI Search. +• **Implementar y gestionar memoria a corto y largo plazo para agentes de IA** utilizando el marco de trabajo Semantic Kernel, aprovechando herramientas como Mem0, Cognee, memoria de pizarra y la integración con Azure AI Search. -• **Comprender los principios detrás de los agentes de IA que se auto-mejoran** y cómo los sistemas robustos de gestión de memoria contribuyen al aprendizaje continuo y la adaptación. +• **Comprender los principios detrás de los agentes de IA auto-mejorables** y cómo los sistemas robustos de gestión de memoria contribuyen al aprendizaje continuo y la adaptación. -## Comprender la Memoria de los Agentes de IA +## Comprendiendo la Memoria de los Agentes de IA -En esencia, **la memoria para los agentes de IA se refiere a los mecanismos que les permiten retener y recordar información**. Esta información puede incluir detalles específicos de una conversación, preferencias del usuario, acciones pasadas o incluso patrones aprendidos. +En su esencia, **la memoria para los agentes de IA se refiere a los mecanismos que les permiten retener y recordar información**. Esta información puede incluir detalles específicos de una conversación, preferencias del usuario, acciones pasadas o incluso patrones aprendidos. -Sin memoria, las aplicaciones de IA suelen ser "sin estado", lo que significa que cada interacción comienza desde cero. Esto genera una experiencia repetitiva y frustrante para el usuario, ya que el agente "olvida" el contexto o las preferencias previas. +Sin memoria, las aplicaciones de IA suelen ser sin estado, lo que significa que cada interacción comienza desde cero. Esto lleva a una experiencia de usuario repetitiva y frustrante, donde el agente "olvida" el contexto o las preferencias previas. -### ¿Por qué es importante la memoria? +### ¿Por qué es Importante la Memoria? -La inteligencia de un agente está profundamente ligada a su capacidad de recordar y utilizar información pasada. La memoria permite que los agentes sean: +La inteligencia de un agente está profundamente ligada a su capacidad para recordar y utilizar información pasada. La memoria permite que los agentes sean: • **Reflexivos**: Aprender de acciones y resultados pasados. @@ -50,7 +58,7 @@ La inteligencia de un agente está profundamente ligada a su capacidad de record • **Proactivos y Reactivos**: Anticipar necesidades o responder adecuadamente basándose en datos históricos. -• **Autónomos**: Operar de manera más independiente utilizando el conocimiento almacenado. +• **Autónomos**: Operar de manera más independiente al recurrir a conocimientos almacenados. El objetivo de implementar memoria es hacer que los agentes sean más **confiables y capaces**. @@ -58,9 +66,9 @@ El objetivo de implementar memoria es hacer que los agentes sean más **confiabl #### Memoria de Trabajo -Piensa en esto como un papel de borrador que un agente utiliza durante una tarea o proceso de pensamiento en curso. Contiene información inmediata necesaria para calcular el siguiente paso. +Piensa en esto como un papel de borrador que un agente utiliza durante una tarea o proceso de pensamiento único. Contiene información inmediata necesaria para calcular el siguiente paso. -Para los agentes de IA, la memoria de trabajo suele capturar la información más relevante de una conversación, incluso si el historial completo del chat es largo o está truncado. Se centra en extraer elementos clave como requisitos, propuestas, decisiones y acciones. +Para los agentes de IA, la memoria de trabajo a menudo captura la información más relevante de una conversación, incluso si el historial completo del chat es largo o está truncado. Se centra en extraer elementos clave como requisitos, propuestas, decisiones y acciones. **Ejemplo de Memoria de Trabajo** @@ -68,23 +76,23 @@ En un agente de reservas de viajes, la memoria de trabajo podría capturar la so #### Memoria a Corto Plazo -Este tipo de memoria retiene información durante la duración de una sola conversación o sesión. Es el contexto del chat actual, lo que permite al agente referirse a turnos previos en el diálogo. +Este tipo de memoria retiene información durante la duración de una sola conversación o sesión. Es el contexto del chat actual, permitiendo que el agente se refiera a turnos previos en el diálogo. **Ejemplo de Memoria a Corto Plazo** -Si un usuario pregunta: "¿Cuánto costaría un vuelo a París?" y luego sigue con "¿Qué hay de alojamiento allí?", la memoria a corto plazo asegura que el agente sepa que "allí" se refiere a "París" dentro de la misma conversación. +Si un usuario pregunta, "¿Cuánto costaría un vuelo a París?" y luego sigue con "¿Y el alojamiento allí?", la memoria a corto plazo asegura que el agente sepa que "allí" se refiere a "París" dentro de la misma conversación. #### Memoria a Largo Plazo -Esta es información que persiste a lo largo de múltiples conversaciones o sesiones. Permite a los agentes recordar preferencias del usuario, interacciones históricas o conocimiento general durante períodos prolongados. Esto es importante para la personalización. +Esta es información que persiste a lo largo de múltiples conversaciones o sesiones. Permite a los agentes recordar preferencias del usuario, interacciones históricas o conocimientos generales durante períodos prolongados. Esto es importante para la personalización. **Ejemplo de Memoria a Largo Plazo** -Una memoria a largo plazo podría almacenar que "Ben disfruta del esquí y actividades al aire libre, le gusta el café con vistas a la montaña y quiere evitar pistas de esquí avanzadas debido a una lesión pasada". Esta información, aprendida de interacciones previas, influye en las recomendaciones en futuras sesiones de planificación de viajes, haciéndolas altamente personalizadas. +Una memoria a largo plazo podría almacenar que "A Ben le gusta esquiar y las actividades al aire libre, disfruta del café con vistas a la montaña y quiere evitar pistas de esquí avanzadas debido a una lesión pasada". Esta información, aprendida de interacciones previas, influye en las recomendaciones en futuras sesiones de planificación de viajes, haciéndolas altamente personalizadas. #### Memoria de Personalidad -Este tipo de memoria especializada ayuda a un agente a desarrollar una "personalidad" o "rol" consistente. Permite al agente recordar detalles sobre sí mismo o su función prevista, haciendo que las interacciones sean más fluidas y enfocadas. +Este tipo de memoria especializada ayuda a un agente a desarrollar una "personalidad" o "rol" consistente. Permite que el agente recuerde detalles sobre sí mismo o su rol previsto, haciendo que las interacciones sean más fluidas y enfocadas. **Ejemplo de Memoria de Personalidad** @@ -96,11 +104,11 @@ Esta memoria almacena la secuencia de pasos que un agente toma durante una tarea **Ejemplo de Memoria Episódica** -Si el agente intentó reservar un vuelo específico pero falló debido a la falta de disponibilidad, la memoria episódica podría registrar este fallo, permitiendo al agente intentar vuelos alternativos o informar al usuario sobre el problema de manera más informada en un intento posterior. +Si el agente intentó reservar un vuelo específico pero falló debido a la falta de disponibilidad, la memoria episódica podría registrar este fallo, permitiendo que el agente intente vuelos alternativos o informe al usuario sobre el problema de manera más informada en un intento posterior. #### Memoria de Entidades -Esto implica extraer y recordar entidades específicas (como personas, lugares o cosas) y eventos de conversaciones. Permite al agente construir una comprensión estructurada de los elementos clave discutidos. +Esto implica extraer y recordar entidades específicas (como personas, lugares o cosas) y eventos de las conversaciones. Permite que el agente construya una comprensión estructurada de los elementos clave discutidos. **Ejemplo de Memoria de Entidades** @@ -108,11 +116,11 @@ De una conversación sobre un viaje pasado, el agente podría extraer "París", #### RAG Estructurado (Generación Aumentada por Recuperación) -Aunque RAG es una técnica más amplia, el "RAG Estructurado" se destaca como una tecnología de memoria poderosa. Extrae información densa y estructurada de diversas fuentes (conversaciones, correos electrónicos, imágenes) y la utiliza para mejorar la precisión, recuperación y velocidad en las respuestas. A diferencia del RAG clásico que se basa únicamente en similitud semántica, el RAG Estructurado trabaja con la estructura inherente de la información. +Aunque RAG es una técnica más amplia, el "RAG Estructurado" se destaca como una tecnología de memoria poderosa. Extrae información densa y estructurada de diversas fuentes (conversaciones, correos electrónicos, imágenes) y la utiliza para mejorar la precisión, recuperación y velocidad en las respuestas. A diferencia del RAG clásico que se basa únicamente en la similitud semántica, el RAG Estructurado trabaja con la estructura inherente de la información. **Ejemplo de RAG Estructurado** -En lugar de solo coincidir palabras clave, el RAG Estructurado podría analizar detalles de vuelo (destino, fecha, hora, aerolínea) de un correo electrónico y almacenarlos de manera estructurada. Esto permite consultas precisas como "¿Qué vuelo reservé a París el martes?" +En lugar de solo coincidir palabras clave, el RAG Estructurado podría analizar detalles de un vuelo (destino, fecha, hora, aerolínea) de un correo electrónico y almacenarlos de manera estructurada. Esto permite consultas precisas como "¿Qué vuelo reservé a París el martes?" ## Implementar y Almacenar Memoria @@ -120,41 +128,53 @@ Implementar memoria para agentes de IA implica un proceso sistemático de **gest ### Herramientas Especializadas de Memoria -Una forma de almacenar y gestionar la memoria de los agentes es utilizando herramientas especializadas como Mem0. Mem0 funciona como una capa de memoria persistente, permitiendo a los agentes recordar interacciones relevantes, almacenar preferencias del usuario y contexto factual, y aprender de éxitos y fracasos con el tiempo. La idea aquí es que los agentes sin estado se conviertan en agentes con estado. +#### Mem0 + +Una forma de almacenar y gestionar la memoria del agente es utilizando herramientas especializadas como Mem0. Mem0 funciona como una capa de memoria persistente, permitiendo que los agentes recuerden interacciones relevantes, almacenen preferencias del usuario y contexto factual, y aprendan de éxitos y fracasos con el tiempo. La idea aquí es que los agentes sin estado se conviertan en agentes con estado. + +Funciona a través de un **pipeline de memoria en dos fases: extracción y actualización**. Primero, los mensajes añadidos al hilo de un agente se envían al servicio Mem0, que utiliza un Modelo de Lenguaje Extenso (LLM) para resumir el historial de la conversación y extraer nuevos recuerdos. Posteriormente, una fase de actualización impulsada por LLM determina si añadir, modificar o eliminar estos recuerdos, almacenándolos en un almacén de datos híbrido que puede incluir bases de datos vectoriales, de grafos y de clave-valor. Este sistema también admite varios tipos de memoria y puede incorporar memoria de grafo para gestionar relaciones entre entidades. + +#### Cognee + +Otro enfoque poderoso es utilizar **Cognee**, una memoria semántica de código abierto para agentes de IA que transforma datos estructurados y no estructurados en grafos de conocimiento consultables respaldados por embeddings. Cognee proporciona una **arquitectura de doble almacenamiento** que combina búsqueda por similitud vectorial con relaciones de grafo, permitiendo que los agentes comprendan no solo qué información es similar, sino cómo los conceptos se relacionan entre sí. + +Sobresale en la **recuperación híbrida** que combina similitud vectorial, estructura de grafo y razonamiento de LLM, desde la búsqueda de fragmentos crudos hasta la respuesta a preguntas conscientes del grafo. El sistema mantiene una **memoria viva** que evoluciona y crece mientras sigue siendo consultable como un grafo conectado, apoyando tanto el contexto de sesión a corto plazo como la memoria persistente a largo plazo. -Funciona a través de un **pipeline de memoria en dos fases: extracción y actualización**. Primero, los mensajes añadidos al hilo de un agente se envían al servicio Mem0, que utiliza un modelo de lenguaje grande (LLM) para resumir el historial de la conversación y extraer nuevos recuerdos. Posteriormente, una fase de actualización impulsada por LLM determina si añadir, modificar o eliminar estos recuerdos, almacenándolos en un almacén de datos híbrido que puede incluir bases de datos vectoriales, gráficas y de clave-valor. Este sistema también admite varios tipos de memoria y puede incorporar memoria gráfica para gestionar relaciones entre entidades. +El tutorial del cuaderno de Cognee ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) demuestra cómo construir esta capa de memoria unificada, con ejemplos prácticos de cómo ingerir diversas fuentes de datos, visualizar el grafo de conocimiento y realizar consultas con diferentes estrategias de búsqueda adaptadas a las necesidades específicas del agente. -### Almacenar Memoria con RAG +### Almacenando Memoria con RAG -Más allá de herramientas especializadas como Mem0, puedes aprovechar servicios de búsqueda robustos como **Azure AI Search como backend para almacenar y recuperar recuerdos**, especialmente para RAG estructurado. +Más allá de herramientas especializadas de memoria como Mem0, puedes aprovechar servicios de búsqueda robustos como **Azure AI Search como backend para almacenar y recuperar memorias**, especialmente para RAG estructurado. -Esto permite fundamentar las respuestas de tu agente con tus propios datos, asegurando respuestas más relevantes y precisas. Azure AI Search puede usarse para almacenar recuerdos específicos de viajes de usuarios, catálogos de productos o cualquier otro conocimiento específico de un dominio. +Esto permite fundamentar las respuestas de tu agente con tus propios datos, asegurando respuestas más relevantes y precisas. Azure AI Search puede usarse para almacenar memorias de viajes específicas del usuario, catálogos de productos o cualquier otro conocimiento específico de dominio. -Azure AI Search admite capacidades como **RAG Estructurado**, que sobresale en extraer y recuperar información densa y estructurada de grandes conjuntos de datos como historiales de conversación, correos electrónicos o incluso imágenes. Esto proporciona "precisión y recuperación superhumanas" en comparación con los enfoques tradicionales de fragmentación de texto y embeddings. +Azure AI Search admite capacidades como **RAG Estructurado**, que sobresale en extraer y recuperar información densa y estructurada de grandes conjuntos de datos como historiales de conversación, correos electrónicos o incluso imágenes. Esto proporciona "precisión y recuperación sobrehumanas" en comparación con los enfoques tradicionales de fragmentación de texto y embeddings. -## Hacer que los Agentes de IA se Auto-Mejoren +## Haciendo que los Agentes de IA se Auto-Mejoren -Un patrón común para agentes que se auto-mejoran implica introducir un **"agente de conocimiento"**. Este agente separado observa la conversación principal entre el usuario y el agente primario. Su función es: +Un patrón común para agentes auto-mejorables implica introducir un **"agente de conocimiento"**. Este agente separado observa la conversación principal entre el usuario y el agente principal. Su rol es: -1. **Identificar información valiosa**: Determinar si alguna parte de la conversación merece ser guardada como conocimiento general o preferencia específica del usuario. +1. **Identificar información valiosa**: Determinar si alguna parte de la conversación vale la pena guardar como conocimiento general o preferencia específica del usuario. 2. **Extraer y resumir**: Destilar el aprendizaje o preferencia esencial de la conversación. -3. **Almacenar en una base de conocimiento**: Persistir esta información extraída, a menudo en una base de datos vectorial, para que pueda ser recuperada más tarde. +3. **Almacenar en una base de conocimiento**: Persistir esta información extraída, a menudo en una base de datos vectorial, para que pueda recuperarse más tarde. -4. **Aumentar consultas futuras**: Cuando el usuario inicia una nueva consulta, el agente de conocimiento recupera información relevante almacenada y la agrega al prompt del usuario, proporcionando contexto crucial al agente primario (similar a RAG). +4. **Aumentar consultas futuras**: Cuando el usuario inicia una nueva consulta, el agente de conocimiento recupera información almacenada relevante y la agrega al prompt del usuario, proporcionando contexto crucial al agente principal (similar a RAG). -### Optimizaciones para la Memoria +### Optimización para la Memoria -• **Gestión de Latencia**: Para evitar ralentizar las interacciones del usuario, se puede usar inicialmente un modelo más económico y rápido para verificar rápidamente si la información es valiosa para almacenar o recuperar, invocando solo el proceso de extracción/recuperación más complejo cuando sea necesario. +• **Gestión de Latencia**: Para evitar ralentizar las interacciones del usuario, se puede usar inicialmente un modelo más barato y rápido para verificar rápidamente si la información es valiosa para almacenar o recuperar, invocando solo el proceso de extracción/recuperación más complejo cuando sea necesario. -• **Mantenimiento de la Base de Conocimiento**: Para una base de conocimiento en crecimiento, la información menos utilizada puede trasladarse a "almacenamiento frío" para gestionar costos. +• **Mantenimiento de la Base de Conocimiento**: Para una base de conocimiento en crecimiento, la información menos utilizada con frecuencia puede moverse a un "almacenamiento frío" para gestionar costos. -## ¿Tienes más preguntas sobre la memoria de los agentes? +## ¿Tienes Más Preguntas Sobre la Memoria de los Agentes? -Únete al [Discord de Azure AI Foundry](https://aka.ms/ai-agents/discord) para conectarte con otros estudiantes, asistir a horas de oficina y resolver tus dudas sobre agentes de IA. +Únete al [Discord de Azure AI Foundry](https://aka.ms/ai-agents/discord) para conectarte con otros estudiantes, asistir a horas de oficina y resolver tus dudas sobre Agentes de IA. --- + **Descargo de responsabilidad**: -Este documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Aunque nos esforzamos por garantizar la precisión, tenga en cuenta que las traducciones automatizadas pueden contener errores o imprecisiones. El documento original en su idioma nativo debe considerarse como la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables de malentendidos o interpretaciones erróneas que puedan surgir del uso de esta traducción. \ No newline at end of file +Este documento ha sido traducido utilizando el servicio de traducción automática [Co-op Translator](https://github.com/Azure/co-op-translator). Aunque nos esforzamos por lograr precisión, tenga en cuenta que las traducciones automáticas pueden contener errores o imprecisiones. El documento original en su idioma nativo debe considerarse como la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables de malentendidos o interpretaciones erróneas que puedan surgir del uso de esta traducción. + \ No newline at end of file diff --git a/translations/et/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/et/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..25463eb0b --- /dev/null +++ b/translations/et/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Kuidas luua AI agente püsiva mäluga, kasutades Cognee't\n", + "\n", + "See märkmik näitab, kuidas luua intelligentseid AI agente, kellel on arenenud mälufunktsioonid, kasutades [**cognee**](https://www.cognee.ai/) - avatud lähtekoodiga AI mälu, mis ühendab teadmiste graafikud, semantilise otsingu ja sessioonihalduse, et luua kontekstitundlikke AI süsteeme.\n", + "\n", + "## 🎯 Õpieesmärgid\n", + "\n", + "Selle õpetuse lõpuks mõistad, kuidas:\n", + "- **Luua teadmiste graafikuid, mis põhinevad sisseehitatud mudelitel**: Muuta struktureerimata tekst struktureeritud ja päringuteks sobivaks teadmisteks\n", + "- **Rakendada sessioonimälu**: Luua mitme pöördega vestlusi automaatse konteksti säilitamisega\n", + "- **Salvestada vestlusi**: Valikuliselt talletada olulisi interaktsioone pikaajalisse mällu tulevaseks kasutamiseks\n", + "- **Pärida loomuliku keele abil**: Juurdepääs ja ajaloolise konteksti kasutamine uutes vestlustes\n", + "- **Visualiseerida mälu**: Uurida oma agendi teadmiste graafiku seoseid\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Mida Sa Lood\n", + "\n", + "Selles juhendis loome **Koodimisassistendi** püsiva mäluga, mis:\n", + "\n", + "### 1. **Teadmistebaasi loomine**\n", + " - Kogub arendajate profiili ja ekspertteadmiste infot\n", + " - Töötleb Python programmeerimise põhimõtteid ja parimaid praktikaid\n", + " - Salvestab ajaloolisi vestlusi arendajate ja AI assistentide vahel\n", + "\n", + "### 2. **Sessiooniteadlikud vestlused**\n", + " - Säilitab konteksti mitme küsimuse vahel samas sessioonis\n", + " - Salvestab automaatselt iga küsimuse/vastuse paari tõhusaks otsinguks\n", + " - Pakub sidusaid ja kontekstipõhiseid vastuseid vestluse ajaloo põhjal\n", + "\n", + "### 3. **Pikaajaline mälu**\n", + " - Salvestab olulised vestlused pikaajalisse mällu\n", + " - Otsib asjakohaseid mälestusi teadmistebaasist ja varasematest sessioonidest, et rikastada uusi suhtlusi\n", + " - Loob kasvava teadmistebaasi, mis aja jooksul paraneb\n", + "\n", + "### 4. **Tark mälestuste otsing**\n", + " - Kasutab graafikupõhist semantilist otsingut, et leida asjakohast infot kogu salvestatud teadmiste hulgast\n", + " - Filtreerib otsinguid andmealamrühmade järgi (arendaja info vs. põhimõtted)\n", + " - Kombineerib mitmeid andmeallikaid, et pakkuda põhjalikke vastuseid\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Eeltingimused ja Seadistamine\n", + "\n", + "### Süsteeminõuded\n", + "\n", + "Enne alustamist veendu, et sul on:\n", + "\n", + "1. **Python Keskkond**\n", + " - Python 3.9 või uuem\n", + " - Virtuaalne keskkond (soovitatav)\n", + " \n", + "2. **Redis Vahemälu** (Nõutav sessioonihalduseks)\n", + " - Kohalik Redis: `docker run -d -p 6379:6379 redis`\n", + " - Või kasuta hallatud Redis-teenust\n", + " \n", + "3. **LLM API Juurdepääs**\n", + " - OpenAI API võti või muud teenusepakkujad (vaata [dokumentatsiooni](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Andmebaasi Konfiguratsioon**\n", + " - Vaikimisi pole konfiguratsiooni vaja. Cognee kasutab failipõhiseid andmebaase (LanceDB ja Kuzu)\n", + " - Soovi korral saad seadistada Azure AI Search vektoripoena (vaata [dokumentatsiooni](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Keskkonna Konfiguratsioon\n", + "\n", + "Loo oma projekti kausta `.env` fail järgmiste muutujatega:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Cognee mäluarhitektuuri mõistmine\n", + "\n", + "### Kuidas Cognee töötab\n", + "\n", + "Cognee pakub keerukat mälusüsteemi, mis ületab lihtsa võtme-väärtuse salvestuse:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Põhikomponendid:\n", + "\n", + "1. **Teadmusgraafik**: Salvestab üksused, seosed ja semantilised ühendused\n", + "2. **Vektorembeddingud**: Võimaldab semantilist otsingut kogu salvestatud teabe ulatuses\n", + "3. **Seansi vahemälu**: Säilitab vestluse konteksti seansi sees ja vahel\n", + "4. **NodeSets**: Korraldab andmed loogilistesse kategooriatesse sihipäraseks otsinguks\n", + "\n", + "### Mälutüübid selles juhendis:\n", + "\n", + "- **Püsiv mälu**: Pikaajaline salvestus teadmusgraafikus\n", + "- **Seansi mälu**: Ajutine vestluse kontekst Redis-vahemälus\n", + "- **Semantiline mälu**: Vektoripõhine sarnasuse otsing kogu andmete ulatuses\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Paigalda vajalikud paketid\n", + "\n", + "Paigalda Cognee koos Redis toe abil sessioonihalduseks:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Keskkonna algatamine ja teekide laadimine\n", + "\n", + "Veendu, et:\n", + "1. Redis töötab (näiteks Dockeriga: `docker run -d -p 6379:6379 redis`)\n", + "2. Keskkonnamuutujad on seadistatud enne vahemälu moodulite importimist\n", + "3. Vajadusel taaskäivita kernel ja käivita lahtrid järjekorras\n", + "\n", + "Järgmine lahter teeb järgmist:\n", + "1. Laadib keskkonnamuutujad `.env` failist\n", + "2. Konfigureerib Cognee sinu LLM seadistustega\n", + "3. Lubab vahemälu sessioonihalduseks\n", + "4. Kontrollib, et kõik komponendid oleksid korralikult ühendatud\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Konfigureeri salvestuskataloogid\n", + "\n", + "Cognee kasutab oma toimingute jaoks kahte eraldi kataloogi:\n", + "- **Andmete juurkataloog**: Salvestab sisestatud dokumendid ja töödeldud andmed\n", + "- **Süsteemi juurkataloog**: Sisaldab teadmiste graafi andmebaasi ja süsteemi metaandmeid\n", + "\n", + "Selles juhendis loome eraldatud kataloogid järgmiselt:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Mälu oleku lähtestamine\n", + "\n", + "Enne kui alustame oma mälusüsteemi loomist, veendume, et alustame puhtalt lehelt.\n", + "\n", + "> 💡 **Näpunäide**: Võite selle sammu vahele jätta, kui soovite säilitada olemasolevaid mälestusi oma varasematest käivitustest, kui kasutate seda märkmikku hiljem.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Osa 1: Teadmistebaasi loomine\n", + "\n", + "### Andmeallikad meie arendaja assistendi jaoks\n", + "\n", + "Teadmistebaasi loomiseks kasutame kolme tüüpi andmeid:\n", + "\n", + "1. **Arendaja profiil**: Isiklikud teadmised ja tehniline taust\n", + "2. **Python'i parimad praktikad**: Python'i Zen koos praktiliste juhistega\n", + "3. **Ajaloolised vestlused**: Varasemad küsimuste ja vastuste sessioonid arendajate ja AI assistentide vahel\n", + "\n", + "See mitmekesine andmestik võimaldab meie agendil:\n", + "- Mõista kasutaja tehnilist konteksti\n", + "- Rakendada parimaid praktikaid soovitustes\n", + "- Õppida varasematest edukatest interaktsioonidest\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Töötle andmed teadmiste graafikuks\n", + "\n", + "Nüüd muudame oma toorteksti struktureeritud mäluks. See protsess:\n", + "\n", + "1. **Lisab andmed NodeSets'i**: Korraldab teabe loogilistesse kategooriatesse\n", + " - `developer_data`: Arendaja profiil ja vestlused\n", + " - `principles_data`: Python'i parimad praktikad ja juhised\n", + "\n", + "2. **Käivitab Cognify Pipeline'i**: Ekstraheerib üksused, seosed ja loob sisukorrad\n", + " - Tuvastab peamised mõisted\n", + " - Loob semantilised ühendused seotud teabe vahel\n", + " - Genereerib vektorite sisukorrad\n", + "\n", + "See võib võtta veidi aega, kuna LLM töötleb teksti ja ehitab graafiku struktuuri:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Visualiseeri teadmiste graafik\n", + "\n", + "Uurime oma teadmiste graafiku struktuuri. Visualisatsioon näitab:\n", + "- **Sõlmed**: Tekstist tuvastatud üksused (mõisted, tehnoloogiad, inimesed)\n", + "- **Servad**: Suhted ja seosed üksuste vahel\n", + "- **Klastrid**: Semantilise sarnasuse alusel grupeeritud seotud mõisted\n", + "\n", + "Avage loodud HTML-fail oma brauseris, et graafikut interaktiivselt uurida:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Rikasta mälu Memify abil\n", + "\n", + "Funktsioon `memify()` analüüsib teadmiste graafikut ja loob andmete kohta nutikaid reegleid. See protsess:\n", + "- Tuvastab mustrid ja parimad praktikad\n", + "- Loob sisu põhjal rakendatavad juhised\n", + "- Määratleb seosed erinevate teadmiste valdkondade vahel\n", + "\n", + "Need reeglid aitavad agendil teha teadlikumaid otsuseid küsimustele vastamisel. Teise visualiseerimise jäädvustamine võimaldab võrrelda, kuidas graafik rikastamise järel tihedamaks muutub.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Osa 2: Nutikas mäluotsing\n", + "\n", + "### Demonstratsioon 1: Dokumentidevaheline teadmiste integreerimine\n", + "\n", + "Nüüd, kui meie teadmiste graafik on loodud, testime, kuidas Cognee ühendab teavet mitmest allikast, et vastata keerukatele küsimustele.\n", + "\n", + "Esimene päring näitab:\n", + "- **Semantiline mõistmine**: Leidmine asjakohastele mõistetele isegi siis, kui neid pole otseselt mainitud\n", + "- **Ristviitamine**: Arendaja profiili ühendamine Python'i põhimõtetega\n", + "- **Kontekstuaalne arutlemine**: Parimate praktikate rakendamine konkreetsetele lahendustele\n", + "\n", + "### Demonstratsioon 2: Filtreeritud otsing NodeSets'iga\n", + "\n", + "Teine päring näitab, kuidas suunata otsing konkreetsetele teadmiste graafiku alamhulkadele:\n", + "- Kasutab `node_name` parameetrit, et otsida ainult `principles_data` piires\n", + "- Pakub keskendunud vastuseid konkreetsest teadmiste valdkonnast\n", + "- Kasulik, kui vajate valdkonnaspetsiifilist teavet\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Osa 3: Sessioonihalduse seadistamine\n", + "\n", + "### Vestlusmälu lubamine\n", + "\n", + "Sessioonihaldus on oluline, et säilitada konteksti mitme suhtluse jooksul. Siin teeme järgmist:\n", + "\n", + "1. **Kasutajakonteksti initsialiseerimine**: Loome või hangime kasutajaprofiili sessiooni jälgimiseks\n", + "2. **Vahemootori seadistamine**: Ühendame Redis'ega, et salvestada vestluste ajalugu\n", + "3. **Sessioonimuutujate lubamine**: Seadistame kontekstimuutujad, mis püsivad päringute vahel\n", + "\n", + "> ⚠️ **Oluline**: Selleks peab Redis töötama ja keskkonnas peab olema `CACHING=true`\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Abifunktsioon: Vaata sessiooni ajalugu\n", + "\n", + "See abifunktsioon võimaldab meil vaadata Redis'is salvestatud vestluste ajalugu. See on kasulik:\n", + "- Sessioonihalduse silumiseks\n", + "- Vestluste vahemällu salvestamise kontrollimiseks\n", + "- Mõistmaks, milline kontekst on agendile kättesaadav\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Sessie 1: Asünkroonse toe labor — Esimene küsimus\n", + "\n", + "Alustage `async-support-lab` sessiooni, küsides telemeetria-sõbralikke asyncio mustreid massiivse veebikraapija jaoks. Graafik on juba teadlik asyncio, aiohttp ja monitooringu praktikate kohta, seega peaks vastus peegeldama varasemaid vestlusi, kohandades samal ajal vastust uuele küsimusele.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Kontrolli sessiooni 1 mälu pärast esimest vahetust\n", + "\n", + "Käivitades `show_history(session_1)` kohe pärast esimest küsimust, kinnitab see, et Cognee salvestas nii küsimuse kui ka vastuse Redis andmebaasi. Sa peaksid nägema ühte kirjet koos samaaegse juhendamisega.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Sessioon 1: Andmemudelite järelarutelu\n", + "\n", + "Järgmisena küsime: \"Millal peaksin valima dataclasses versus Pydantic?\" kasutades sama sessiooni ID-d. Cognee peaks ühendama Python'i põhimõtted ja varasemad FastAPI vestlused, et pakkuda nüansirikast nõu—näidates, et kontekst kandub edasi nimetatud sessiooni raames.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Kinnita, et sessiooni 1 ajalugu sisaldab mõlemat vahetust\n", + "\n", + "Veel üks `show_history(session_1)` käsk peaks näitama kahte küsimuse-vastuse kirjet. See vastab Mem0 labori \"mälutaasesituse\" sammule ja tõestab, et lisavahetused pikendavad sama transkriptsiooni.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Sessioon 2: Kujunduse ülevaate teema — Uus sessioon\n", + "\n", + "Et näidata teemade eraldatust, käivitame `design-review-session` ja küsime logimise juhiseid juhtumite ülevaatamiseks. Kuigi aluseks olev teadmistebaas on sama, hoiab uus sessiooni ID ärakirjad eraldi.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Ülevaatuse Sessioon 2 Ajalugu\n", + "\n", + "`show_history(session_2)` peaks kuvama ainult disainiülevaate küsimuse/vastuse paari. Võrdle seda Sessiooniga 1, et näidata, kuidas Cognee hoiab eraldiseisvaid transkripte, samal ajal jagatud teadmistegraafikut uuesti kasutades.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Kokkuvõte\n", + "\n", + "Palju õnne! Olete just andnud oma kodeerimisabilisele tõelise pikaajalise mälukihi, mida toetab Cognee.\n", + "\n", + "Selles juhendis võtsite toorandmed (kood, dokumendid, vestlused) ja muutsid need graafikuks + vektormäluks, mida teie agent saab otsida, analüüsida ja pidevalt täiustada.\n", + "\n", + "Mida olete õppinud\n", + "\n", + "1. **Toortekstist tehisintellekti mäluni**: Kuidas Cognee töötleb struktureerimata andmeid ja muudab need intelligentseks, otsitavaks mäluks, kasutades kombineeritud vektori + teadmiste graafi arhitektuuri.\n", + "\n", + "2. **Graafi rikastamine memify abil**: Kuidas minna kaugemale lihtsast graafi loomisest ja kasutada memify't, et lisada tuletatud fakte ja rikkamaid seoseid olemasolevale graafile.\n", + "\n", + "3. **Mitmed otsingustrateegiad**: Kuidas pärida mälu erinevate otsingutüüpidega (graafiteadlik Q&A, RAG-stiilis lõpetamine, ülevaated, toorfragmendid, koodiotsing jne), sõltuvalt sellest, mida teie agent vajab.\n", + "\n", + "4. **Visuaalne uurimine**: Kuidas inspekteerida ja siluda seda, mida Cognee on loonud, kasutades graafikavisualiseeringuid ja Cognee kasutajaliidest, et saaksite tegelikult näha, kuidas teadmised on struktureeritud.\n", + "\n", + "5. **Sessiooniteadlik mälu**: Kuidas kombineerida sessioonipõhist konteksti püsiva semantilise mäluga, et agendid saaksid mäletada erinevate sessioonide vahel ilma kasutajatevahelist teavet lekkimata.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Peamised järeldused\n", + "1. Mälu kui teadmiste graafik, mida toetavad manused\n", + "\n", + " - **Struktureeritud arusaam**: Cognee ühendab vektorpõhise andmebaasi ja graafipõhise andmebaasi, nii et teie andmed on otsitavad nii tähenduse kui ka seoste järgi. Cognee kasutab vaikimisi failipõhiseid andmebaase (LanceDB vektorite jaoks, Kuzu graafipõhise andmebaasi jaoks).\n", + "\n", + " - **Seostest teadlik otsing**: Vastused põhinevad mitte ainult \"sarnasel tekstil\", vaid ka sellel, kuidas üksused omavahel seotud on.\n", + "\n", + " - **Elav mälu**: Mälukiht areneb, kasvab ja jääb päringuteks kättesaadavaks kui üks ühendatud graafik.\n", + "\n", + "2. Otsingu- ja põhjendusrežiimid\n", + " - **Hübriidotsing**: otsing ühendab vektori sarnasuse, graafistruktuuri ja LLM-i põhjenduse, alates toorandmete otsimisest kuni graafikuteadliku küsimustele vastamiseni.\n", + "\n", + " - **Sobita režiim ülesandega**: Kasuta loomuliku keele vastuste jaoks täitmisstiilis režiime ning toorandmete, kokkuvõtete või graafikute jaoks režiime, kui agent vajab konteksti või oma põhjenduste juhtimist.\n", + "\n", + "3. Isikupärastatud, sessiooniteadlikud agendid\n", + " - **Sessioonikontekst + pikaajaline mälu**: Cognee hoiab lühiajalise \"teema\" konteksti eraldi pikaajalisest, kasutaja- või organisatsioonitasemel mälust.\n", + "\n", + "## Reaalsed rakendused\n", + "\n", + "1. **Vertikaalsed tehisintellekti agendid**\n", + "\n", + " Kasutage selle märkmiku mustrit, et luua valdkonnaspetsiifilisi kaaslasi, kes tuginevad Cognee'le kui nende otsingu- ja põhjendustuumale:\n", + "\n", + "- **Arendajate kaaslased**: Koodi ülevaatus, intsidentide analüüs ja arhitektuuri assistendid, kes läbivad koodi, API-sid, disainidokumente ja pileteid kui ühtset mälugraafikut.\n", + "\n", + "- **Kliendisuunalised kaaslased**: Tugiteenuste või kliendiedu agendid, kes ammutavad teavet tootetokumentidest, KKK-dest, CRM-i märkmetest ja varasematest piletitest graafikuteadliku otsingu ja viidatud vastustega.\n", + "\n", + "- **Sisemised eksperdi kaaslased**: Poliitika, juriidika või turvalisuse assistendid, kes põhjendavad omavahel seotud reeglite, juhiste ja ajalooliste otsuste põhjal, mitte eraldiseisvate PDF-ide alusel.\n", + "\n", + " Cognee on selgelt positsioneeritud kui püsiv ja täpne mälu tehisintellekti agentidele, pakkudes elavat teadmiste graafikut, mis asendab agentide taga ad-hoc vektoripoodide ja kohandatud graafikukoodi kombinatsioone.\n", + "\n", + "2. **Andmesilode ühendamine üheks mäluks**\n", + "\n", + " Sama lähenemine aitab teil luua ühtse mälukihi hajutatud allikate vahel:\n", + "\n", + "- **Silodest üheks graafikuks**: Importige struktureeritud (nt andmebaasid) ja struktureerimata andmed (nt dokumendid, vestlused) ühte graafikusse, mida toetavad manused, selle asemel et luua iga süsteemi jaoks eraldi indeksid.\n", + "\n", + "- **Allikateülene põhjendus viidetega**: Tehke mitmeastmeline põhjendus kõige üle—\"ühendage\" logid, mõõdikud ja dokumendid graafiku kaudu—ja tagastage siiski põhjendatud vastused koos allikaviidetega.\n", + "\n", + "- **Teadmiste keskused**: Valdkondades nagu pangandus või haridus kasutatakse Cognee't juba PDF-ide, sisemiste süsteemide ja rakenduste andmete ühendamiseks ühte teadmiste graafikusse, et agendid saaksid vastata küsimustele täpse ja viidatud kontekstiga.\n", + "\n", + "## Järgmised sammud\n", + "\n", + "Olete rakendanud mälusilmuse põhiosa. Siin on loomulikud laiendused, mida saate ise proovida (vt [Cognee dokumentatsiooni](https://docs.cognee.ai/) üksikasjade jaoks):\n", + "\n", + "1. **Katsetage ajalist teadlikkust**: Lülitage sisse ajaline kognitsioon, et eraldada tekstist sündmusi ja ajatempleid.\n", + "\n", + "2. **Tutvustage ontoloogiapõhist põhjendust**: Määratlege oma valdkonna jaoks OWL-ontoloogia. Kasutage Cognee ontoloogia tuge, et eraldatud üksused ja seosed oleksid seotud selle skeemiga, parandades graafiku kvaliteeti ja valdkonnaspetsiifilisi vastuseid.\n", + "\n", + "3. **Lisage tagasisideahel**: Laske Cognee'l kohandada graafiku servade kaale reaalsete kasutajate tagasiside põhjal, nii et otsing paraneb aja jooksul, mitte ei jää staatiliseks.\n", + "\n", + "4. **Häälestage isikupärastamise ja sessioonikäitumise jaoks**: Kasutage kasutaja ID-sid, rentnikke ja andmekogumeid, et anda igale inimesele või meeskonnale oma vaade jagatud mälumootorile.\n", + "\n", + "5. **Laiendage keerukamate agentide jaoks**: Ühendage Cognee agentide raamistikesse, et luua mitmeagendilisi süsteeme, mis kõik jagavad sama mälukihti. *Microsoft Agent Framework x Cognee plugin on peagi tulemas.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Lahtiütlus**: \nSee dokument on tõlgitud AI tõlketeenuse [Co-op Translator](https://github.com/Azure/co-op-translator) abil. Kuigi püüame tagada täpsust, palun arvestage, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algses keeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul on soovitatav kasutada professionaalset inimtõlget. Me ei vastuta arusaamatuste või valesti tõlgendamise eest, mis tulenevad selle tõlke kasutamisest.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:52:55+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "et" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/et/13-agent-memory/README.md b/translations/et/13-agent-memory/README.md index f22d1892f..89b10e2bc 100644 --- a/translations/et/13-agent-memory/README.md +++ b/translations/et/13-agent-memory/README.md @@ -1,56 +1,64 @@ -# Mälu AI-agentide jaoks -[![Agent Memory](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.et.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) +# Mälu tehisintellekti agentide jaoks +[![Agendi mälu](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.et.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -AI-agentide loomise unikaalsete eeliste arutamisel keskendutakse peamiselt kahele asjale: tööriistade kasutamisele ülesannete täitmiseks ja võimele aja jooksul paremaks muutuda. Mälu on aluseks isetäieneva agendi loomisele, mis suudab pakkuda meie kasutajatele paremaid kogemusi. +Kui räägitakse tehisintellekti agentide loomise unikaalsetest eelistest, keskendutakse peamiselt kahele asjale: võimele kasutada tööriistu ülesannete täitmiseks ja võimele aja jooksul paremaks muutuda. Mälu on enesetäiendavate agentide loomise alus, mis suudavad pakkuda meie kasutajatele paremaid kogemusi. -Selles õppetükis vaatame, mis on mälu AI-agentide jaoks ning kuidas seda hallata ja rakendada meie rakenduste kasuks. +Selles õppetükis vaatleme, mis on mälu tehisintellekti agentide jaoks, kuidas seda hallata ja kuidas seda oma rakenduste kasuks kasutada. ## Sissejuhatus Selles õppetükis käsitletakse: -• **AI-agentide mälu mõistmine**: Mis on mälu ja miks see agentide jaoks oluline on. +• **Tehisintellekti agendi mälu mõistmine**: Mis on mälu ja miks see agentide jaoks oluline on. -• **Mälu rakendamine ja salvestamine**: Praktilised meetodid, kuidas lisada AI-agentidele mälufunktsioone, keskendudes lühi- ja pikaajalisele mälule. +• **Mälu rakendamine ja salvestamine**: Praktilised meetodid, kuidas lisada oma tehisintellekti agentidele mälufunktsioone, keskendudes lühi- ja pikaajalisele mälule. -• **AI-agentide isetäiendamine**: Kuidas mälu võimaldab agentidel õppida varasematest interaktsioonidest ja aja jooksul paremaks muutuda. +• **Tehisintellekti agentide enesetäiendamine**: Kuidas mälu võimaldab agentidel õppida varasematest interaktsioonidest ja aja jooksul paremaks muutuda. -## Õpieesmärgid +## Saadaval olevad rakendused -Pärast selle õppetüki läbimist oskad: +See õppetund sisaldab kahte põhjalikku märkmikujuhendit: -• **Eristada erinevaid AI-agentide mälutüüpe**, sealhulgas töömälu, lühiajalist ja pikaajalist mälu, samuti spetsialiseeritud vorme nagu persona- ja episoodiline mälu. +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Rakendab mälu kasutades Mem0 ja Azure AI Search'i koos Semantic Kernel raamistikuga. -• **Rakendada ja hallata AI-agentide lühi- ja pikaajalist mälu** kasutades Semantic Kernel raamistikku, tööriistu nagu Mem0 ja Whiteboard memory ning integreerides Azure AI Searchiga. +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Rakendab struktureeritud mälu kasutades Cognee't, luues automaatselt teadmiste graafiku, mida toetavad embeddingud, visualiseerides graafikut ja pakkudes intelligentset otsingut. -• **Mõista isetäiendavate AI-agentide põhimõtteid** ja kuidas tugevad mäluhaldussüsteemid aitavad kaasa pidevale õppimisele ja kohanemisele. +## Õppimise eesmärgid -## AI-agentide mälu mõistmine +Pärast selle õppetüki läbimist oskate: -Põhimõtteliselt viitab **mälu AI-agentide jaoks mehhanismidele, mis võimaldavad neil säilitada ja meenutada teavet**. See teave võib hõlmata konkreetseid detaile vestlusest, kasutaja eelistusi, varasemaid tegevusi või isegi õpitud mustreid. +• **Eristada erinevaid tehisintellekti agendi mälutüüpe**, sealhulgas töömälu, lühiajalist ja pikaajalist mälu, samuti spetsialiseeritud vorme nagu persona- ja episoodiline mälu. -Ilma mäluta on AI-rakendused sageli olekuta, mis tähendab, et iga interaktsioon algab nullist. See viib korduva ja frustreeriva kasutajakogemuseni, kus agent "unustab" varasema konteksti või eelistused. +• **Rakendada ja hallata lühi- ja pikaajalist mälu tehisintellekti agentide jaoks**, kasutades Semantic Kernel raamistikku ja tööriistu nagu Mem0, Cognee, Whiteboard memory ning integreerides Azure AI Search'iga. + +• **Mõista enesetäiendavate tehisintellekti agentide põhimõtteid** ja kuidas tugevad mäluhaldussüsteemid aitavad kaasa pidevale õppimisele ja kohanemisele. + +## Tehisintellekti agendi mälu mõistmine + +Põhimõtteliselt tähendab **mälu tehisintellekti agentide jaoks mehhanisme, mis võimaldavad neil teavet säilitada ja meenutada**. See teave võib hõlmata konkreetseid detaile vestlusest, kasutaja eelistusi, varasemaid tegevusi või isegi õpitud mustreid. + +Ilma mäluta on tehisintellekti rakendused sageli olekuta, mis tähendab, et iga interaktsioon algab nullist. See viib korduva ja frustreeriva kasutajakogemuseni, kus agent "unustab" varasema konteksti või eelistused. ### Miks on mälu oluline? Agendi intelligentsus on tihedalt seotud tema võimega meenutada ja kasutada varasemat teavet. Mälu võimaldab agentidel olla: -• **Reflektiivne**: Õppida varasematest tegevustest ja tulemustest. +• **Reflektiivsed**: Õppida varasematest tegevustest ja tulemustest. -• **Interaktiivne**: Säilitada konteksti käimasoleva vestluse ajal. +• **Interaktiivsed**: Säilitada konteksti käimasoleva vestluse ajal. -• **Proaktiivne ja reaktiivne**: Ennustada vajadusi või reageerida sobivalt ajalooliste andmete põhjal. +• **Proaktiivsed ja reaktiivsed**: Ennustada vajadusi või reageerida sobivalt ajalooliste andmete põhjal. -• **Autonoomne**: Tegutseda iseseisvamalt, tuginedes salvestatud teadmistele. +• **Autonoomsed**: Tegutseda iseseisvamalt, tuginedes salvestatud teadmistele. Mälu rakendamise eesmärk on muuta agendid **usaldusväärsemaks ja võimekamaks**. @@ -58,103 +66,115 @@ Mälu rakendamise eesmärk on muuta agendid **usaldusväärsemaks ja võimekamak #### Töömälu -Mõtle sellele kui agendi "märkmepaberile", mida ta kasutab ühe käimasoleva ülesande või mõtteprotsessi ajal. See hoiab kohest teavet, mis on vajalik järgmise sammu arvutamiseks. +Mõelge sellele kui paberilehele, mida agent kasutab ühe käimasoleva ülesande või mõtteprotsessi ajal. See hoiab vahetut teavet, mis on vajalik järgmise sammu arvutamiseks. -AI-agentide puhul salvestab töömälu sageli vestluse kõige olulisema teabe, isegi kui kogu vestluse ajalugu on pikk või kärbitud. See keskendub võtmeelementide, nagu nõuded, ettepanekud, otsused ja tegevused, väljavõtmisele. +Tehisintellekti agentide puhul salvestab töömälu sageli vestluse kõige olulisema teabe, isegi kui kogu vestluse ajalugu on pikk või kärbitud. See keskendub võtmeelementide, nagu nõuded, ettepanekud, otsused ja tegevused, väljavõtmisele. **Töömälu näide** -Reisi broneerimise agent võib töömälu abil salvestada kasutaja praeguse soovi, näiteks "Ma tahan broneerida reisi Pariisi". See konkreetne nõue hoitakse agendi vahetus kontekstis, et suunata käimasolevat interaktsiooni. +Reisi broneerimise agendi puhul võib töömälu salvestada kasutaja praeguse soovi, näiteks "Ma tahan broneerida reisi Pariisi". See konkreetne nõue hoitakse agendi vahetus kontekstis, et suunata praegust interaktsiooni. #### Lühiajaline mälu -See mälutüüp säilitab teavet ühe vestluse või sessiooni jooksul. See on praeguse vestluse kontekst, mis võimaldab agendil viidata vestluse varasematele pöördumistele. +See mälutüüp säilitab teavet ühe vestluse või seansi jooksul. See on praeguse vestluse kontekst, mis võimaldab agendil viidata varasematele dialoogikäikudele. **Lühiajalise mälu näide** -Kui kasutaja küsib: "Kui palju maksaks lend Pariisi?" ja seejärel jätkab: "Aga majutus seal?", tagab lühiajaline mälu, et agent teab, et "seal" viitab "Pariisile" sama vestluse raames. +Kui kasutaja küsib: "Kui palju maksab lend Pariisi?" ja seejärel jätkab: "Aga majutus seal?", tagab lühiajaline mälu, et agent teab, et "seal" viitab "Pariisile" sama vestluse raames. #### Pikaajaline mälu -See on teave, mis püsib mitme vestluse või sessiooni jooksul. See võimaldab agentidel meeles pidada kasutaja eelistusi, ajaloolisi interaktsioone või üldisi teadmisi pikema aja jooksul. See on oluline personaliseerimise jaoks. +See on teave, mis püsib mitme vestluse või seansi jooksul. See võimaldab agentidel meeles pidada kasutaja eelistusi, ajaloolisi interaktsioone või üldteadmisi pikema aja jooksul. See on oluline personaliseerimise jaoks. **Pikaajalise mälu näide** -Pikaajaline mälu võib salvestada, et "Ben naudib suusatamist ja välitegevusi, eelistab kohvi mäevaatega ning soovib vältida keerulisi suusaradu varasema vigastuse tõttu". See teave, mis on õpitud varasematest interaktsioonidest, mõjutab tulevaste reisiplaanide soovitusi, muutes need väga isikupäraseks. +Pikaajaline mälu võib salvestada, et "Ben naudib suusatamist ja välitegevusi, eelistab kohvi mäevaatega ning soovib vältida keerulisi suusaradu varasema vigastuse tõttu". See teave, mis on õpitud varasematest interaktsioonidest, mõjutab tulevasi reisiplaanide soovitusi, muutes need väga isikupäraseks. #### Persona mälu -See spetsialiseeritud mälutüüp aitab agendil arendada järjepidevat "isiksust" või "rolli". See võimaldab agendil meeles pidada detaile enda kohta või oma kavandatud rolli, muutes interaktsioonid sujuvamaks ja keskendunumaks. +See spetsiaalne mälutüüp aitab agendil arendada järjepidevat "isiksust" või "persoona". See võimaldab agendil meeles pidada üksikasju enda või oma kavandatud rolli kohta, muutes interaktsioonid sujuvamaks ja keskendunumaks. **Persona mälu näide** -Kui reisiplaneerimise agent on loodud olema "ekspert suusareiside planeerimisel", võib persona mälu tugevdada seda rolli, mõjutades vastuseid, et need vastaksid eksperdi toonile ja teadmistele. +Kui reisiplaneerimise agent on loodud olema "ekspert suusaplaneerija", võib persona mälu seda rolli tugevdada, mõjutades vastuseid nii, et need vastaksid eksperdi toonile ja teadmistele. #### Töövoo/episoodiline mälu -See mälu salvestab agendi tehtud sammude järjestuse keeruka ülesande ajal, sealhulgas õnnestumised ja ebaõnnestumised. See on nagu konkreetsete "episoodide" või varasemate kogemuste meelespidamine, et neist õppida. +See mälu salvestab järjestikused sammud, mida agent teeb keeruka ülesande täitmisel, sealhulgas õnnestumised ja ebaõnnestumised. See on nagu konkreetsete "episoodide" või varasemate kogemuste meelespidamine, et neist õppida. **Episoodilise mälu näide** -Kui agent üritas broneerida konkreetset lendu, kuid see ebaõnnestus saadavuse puudumise tõttu, võiks episoodiline mälu salvestada selle ebaõnnestumise, võimaldades agendil proovida alternatiivseid lende või teavitada kasutajat probleemist informeeritumalt järgmisel katsel. +Kui agent üritas broneerida konkreetset lendu, kuid see ebaõnnestus saadavuse puudumise tõttu, võiks episoodiline mälu selle ebaõnnestumise salvestada, võimaldades agendil proovida alternatiivseid lende või teavitada kasutajat probleemist järgmisel katsel informeeritumalt. #### Entiteedi mälu -See hõlmab konkreetsete entiteetide (nagu inimesed, kohad või asjad) ja sündmuste väljavõtmist ja meelespidamist vestlustest. See võimaldab agendil luua struktureeritud arusaama arutatud võtmeelementidest. +See hõlmab konkreetsete entiteetide (nagu inimesed, kohad või asjad) ja sündmuste väljavõtmist ja meeldejätmist vestlustest. See võimaldab agendil luua struktureeritud arusaama arutatud võtmeelementidest. **Entiteedi mälu näide** -Vestlusest varasema reisi kohta võib agent välja võtta "Pariis", "Eiffeli torn" ja "õhtusöök restoranis Le Chat Noir". Tulevases interaktsioonis võiks agent meenutada "Le Chat Noir" ja pakkuda seal uut broneeringut. +Vestlusest varasema reisi kohta võib agent välja võtta "Pariis", "Eiffeli torn" ja "õhtusöök restoranis Le Chat Noir". Tulevases interaktsioonis võiks agent meenutada "Le Chat Noir'i" ja pakkuda seal uut broneeringut. #### Struktureeritud RAG (Retrieval Augmented Generation) -Kuigi RAG on laiem tehnika, tõstetakse "Struktureeritud RAG" esile kui võimsat mälutehnoloogiat. See eraldab tihedalt struktureeritud teavet erinevatest allikatest (vestlused, e-kirjad, pildid) ja kasutab seda täpsuse, meenutamise ja kiiruse parandamiseks vastustes. Erinevalt klassikalisest RAG-st, mis tugineb ainult semantilisele sarnasusele, töötab Struktureeritud RAG teabe sisemise struktuuriga. +Kuigi RAG on laiem tehnika, rõhutatakse "struktureeritud RAG-i" kui võimsat mälutehnoloogiat. See eraldab tihedat, struktureeritud teavet erinevatest allikatest (vestlused, e-kirjad, pildid) ja kasutab seda vastuste täpsuse, meenutamise ja kiiruse parandamiseks. Erinevalt klassikalisest RAG-ist, mis tugineb ainult semantilisele sarnasusele, töötab struktureeritud RAG teabe sisemise struktuuriga. **Struktureeritud RAG näide** -Selle asemel, et lihtsalt märksõnu sobitada, võiks Struktureeritud RAG e-kirjast välja võtta lennuandmed (sihtkoht, kuupäev, kellaaeg, lennufirma) ja salvestada need struktureeritud viisil. See võimaldab täpseid päringuid, nagu "Millise lennu ma Pariisi teisipäeval broneerisin?" +Selle asemel, et lihtsalt märksõnu sobitada, võiks struktureeritud RAG analüüsida lennu üksikasju (sihtkoht, kuupäev, kellaaeg, lennufirma) e-kirjast ja salvestada need struktureeritud viisil. See võimaldab täpseid päringuid, näiteks "Millise lennu ma Pariisi teisipäeval broneerisin?" ## Mälu rakendamine ja salvestamine -AI-agentide mälu rakendamine hõlmab **mäluhalduse** süstemaatilist protsessi, mis sisaldab teabe genereerimist, salvestamist, meenutamist, integreerimist, uuendamist ja isegi "unustamist" (või kustutamist). Meenutamine on eriti oluline aspekt. +Mälu rakendamine tehisintellekti agentide jaoks hõlmab **mäluhalduse** süstemaatilist protsessi, mis sisaldab teabe genereerimist, salvestamist, meenutamist, integreerimist, uuendamist ja isegi "unustamist" (või kustutamist). Meenutamine on eriti oluline aspekt. ### Spetsialiseeritud mälutööriistad -Üks viis agendi mälu salvestamiseks ja haldamiseks on kasutada spetsialiseeritud tööriistu nagu Mem0. Mem0 toimib püsiva mälukihina, võimaldades agentidel meenutada asjakohaseid interaktsioone, salvestada kasutaja eelistusi ja faktilist konteksti ning õppida aja jooksul õnnestumistest ja ebaõnnestumistest. Idee seisneb selles, et olekuta agendid muutuvad olekuga agentideks. +#### Mem0 + +Üks viis agendi mälu salvestamiseks ja haldamiseks on kasutada spetsiaalseid tööriistu nagu Mem0. Mem0 toimib püsiva mälukihina, võimaldades agentidel meenutada asjakohaseid interaktsioone, salvestada kasutaja eelistusi ja faktilist konteksti ning õppida aja jooksul õnnestumistest ja ebaõnnestumistest. Idee on muuta olekuta agendid olekuga agentideks. + +See töötab läbi **kahefaasilise mälutoru: väljavõtmine ja uuendamine**. Esiteks saadetakse agendi lõime lisatud sõnumid Mem0 teenusesse, mis kasutab suurt keelemudelit (LLM), et kokku võtta vestluse ajalugu ja eraldada uusi mälestusi. Seejärel määrab LLM-põhine uuendusfaas, kas need mälestused lisada, muuta või kustutada, salvestades need hübriidandmebaasi, mis võib sisaldada vektorit, graafikut ja võtme-väärtuse andmebaase. See süsteem toetab ka erinevaid mälutüüpe ja võib hõlmata graafimälu, et hallata entiteetide vahelisi seoseid. + +#### Cognee + +Teine võimas lähenemine on kasutada **Cognee't**, avatud lähtekoodiga semantilist mälu tehisintellekti agentide jaoks, mis muudab struktureeritud ja struktureerimata andmed päringuteks sobivateks teadmiste graafikuteks, mida toetavad embeddingud. Cognee pakub **kahekihilist arhitektuuri**, mis ühendab vektori sarnasuse otsingu graafiku suhetega, võimaldades agentidel mõista mitte ainult seda, milline teave on sarnane, vaid ka seda, kuidas mõisted omavahel seotud on. + +See paistab silma **hübriidotsinguga**, mis ühendab vektori sarnasuse, graafiku struktuuri ja LLM-i põhjendamise - alates toorandmete otsingust kuni graafikuteadliku küsimustele vastamiseni. Süsteem säilitab **elava mälu**, mis areneb ja kasvab, jäädes samal ajal ühe ühendatud graafikuna päringuteks kättesaadavaks, toetades nii lühiajalist seansi konteksti kui ka pikaajalist püsivat mälu. -See töötab **kahefaasilise mälutoru kaudu: väljavõtmine ja uuendamine**. Esiteks saadetakse agendi lõime lisatud sõnumid Mem0 teenusesse, mis kasutab suurt keelemudelit (LLM), et kokku võtta vestluse ajalugu ja välja võtta uued mälud. Seejärel määrab LLM-põhine uuendusfaas, kas need mälud lisada, muuta või kustutada, salvestades need hübriidandmehoidlasse, mis võib hõlmata vektorit, graafi ja võtme-väärtuse andmebaase. See süsteem toetab ka erinevaid mälutüüpe ja võib sisaldada graafimälu, et hallata entiteetide vahelisi suhteid. +Cognee märkmikujuhend ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) demonstreerib selle ühtse mälukihi loomist, praktiliste näidetega mitmesuguste andmeallikate sisestamisest, teadmiste graafiku visualiseerimisest ja erinevate otsingustrateegiate kasutamisest, mis on kohandatud konkreetsete agendi vajaduste jaoks. -### Mälu salvestamine RAG-ga +### Mälu salvestamine RAG-iga -Lisaks spetsialiseeritud mälutööriistadele nagu Mem0, saab kasutada tugevaid otsinguteenuseid, nagu **Azure AI Search, mälude salvestamiseks ja meenutamiseks**, eriti struktureeritud RAG jaoks. +Lisaks spetsialiseeritud mälutööriistadele nagu Mem0, saate kasutada tugevaid otsinguteenuseid, näiteks **Azure AI Search'i, mälestuste salvestamiseks ja meenutamiseks**, eriti struktureeritud RAG-i jaoks. -See võimaldab agendi vastuseid siduda oma andmetega, tagades asjakohasemad ja täpsemad vastused. Azure AI Searchi saab kasutada kasutajaspetsiifiliste reiside mälude, tootekataloogide või mis tahes muu valdkonnaspetsiifilise teadmise salvestamiseks. +See võimaldab teie agendi vastuseid siduda teie enda andmetega, tagades asjakohasemad ja täpsemad vastused. Azure AI Search'i saab kasutada kasutajaspetsiifiliste reiside mälestuste, tootekataloogide või mis tahes muu valdkonnapõhise teadmise salvestamiseks. -Azure AI Search toetab funktsioone nagu **Struktureeritud RAG**, mis paistab silma tihedalt struktureeritud teabe eraldamise ja meenutamisega suurtest andmekogumitest, nagu vestluste ajalugu, e-kirjad või isegi pildid. See pakub "üliinimlikku täpsust ja meenutamist" võrreldes traditsiooniliste tekstitükeldamise ja sisestamise lähenemisviisidega. +Azure AI Search toetab funktsioone nagu **struktureeritud RAG**, mis paistab silma tiheda, struktureeritud teabe eraldamise ja meenutamisega suurtest andmekogumitest, nagu vestluste ajalugu, e-kirjad või isegi pildid. See pakub "üliinimlikku täpsust ja meenutamist" võrreldes traditsiooniliste tekstilõikude ja embeddingute lähenemisviisidega. -## AI-agentide isetäiendamine +## Tehisintellekti agentide enesetäiendamine -Isetäiendavate agentide tavaline muster hõlmab **"teadmiste agendi"** kasutuselevõttu. See eraldi agent jälgib peamist vestlust kasutaja ja põhivahendi vahel. Selle roll on: +Levinud muster enesetäiendavate agentide jaoks hõlmab **"teadmiste agendi"** kasutuselevõttu. See eraldi agent jälgib peamist vestlust kasutaja ja põhivahendi vahel. Selle roll on: -1. **Väärtusliku teabe tuvastamine**: Määrata, kas vestluse mõni osa on väärt salvestamist üldteadmiste või konkreetse kasutaja eelistusena. +1. **Tuvastada väärtuslik teave**: Määrata, kas mõni osa vestlusest on väärt salvestamist üldteadmiste või konkreetse kasutaja eelistusena. -2. **Väljavõtmine ja kokkuvõte**: Destilleerida vestlusest olulised õppetunnid või eelistused. +2. **Eraldada ja kokku võtta**: Destilleerida vestlusest oluline õppetund või eelistus. -3. **Salvestamine teadmistebaasi**: Säilitada see väljavõetud teave, sageli vektorandmebaasis, et seda hiljem meenutada. +3. **Salvestada teadmiste baasi**: Püsivalt salvestada see eraldatud teave, sageli vektorandmebaasi, et seda hiljem meenutada. -4. **Tulevaste päringute täiendamine**: Kui kasutaja algatab uue päringu, otsib teadmiste agent asjakohast salvestatud teavet ja lisab selle kasutaja päringule, pakkudes põhivahendile olulist konteksti (sarnaselt RAG-le). +4. **Täiendada tulevasi päringuid**: Kui kasutaja algatab uue päringu, toob teadmiste agent asjakohase salvestatud teabe ja lisab selle kasutaja päringule, pakkudes põhivahendile olulist konteksti (sarnaselt RAG-ile). ### Mälu optimeerimine • **Latentsuse haldamine**: Kasutajainteraktsioonide aeglustumise vältimiseks saab algselt kasutada odavamat ja kiiremat mudelit, et kiiresti kontrollida, kas teave on väärt salvestamist või meenutamist, kutsudes keerukama väljavõtmise/meenutamise protsessi ainult vajadusel. -• **Teadmistebaasi hooldus**: Kasvava teadmistebaasi jaoks saab harvemini kasutatavat teavet viia "külmsäilitusse", et hallata kulusid. +• **Teadmiste baasi hooldus**: Kasvava teadmiste baasi jaoks saab harvemini kasutatava teabe viia "külmsäilitusse", et hallata kulusid. -## Kas sul on rohkem küsimusi agendi mälu kohta? +## Kas teil on rohkem küsimusi agendi mälu kohta? -Liitu [Azure AI Foundry Discordiga](https://aka.ms/ai-agents/discord), et kohtuda teiste õppijatega, osaleda vastuvõtuaegadel ja saada vastuseid oma AI-agentide küsimustele. +Liituge [Azure AI Foundry Discordiga](https://aka.ms/ai-agents/discord), et kohtuda teiste õppijatega, osaleda vastuvõtutundides ja saada vastuseid oma tehisintellekti agentide küsimustele. --- + **Lahtiütlus**: -See dokument on tõlgitud, kasutades AI tõlketeenust [Co-op Translator](https://github.com/Azure/co-op-translator). Kuigi püüame tagada täpsust, palume arvestada, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algkeeles tuleks lugeda autoriteetseks allikaks. Olulise teabe puhul soovitame kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste või valede tõlgenduste eest. \ No newline at end of file +See dokument on tõlgitud AI tõlketeenuse [Co-op Translator](https://github.com/Azure/co-op-translator) abil. Kuigi püüame tagada täpsust, palume arvestada, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algses keeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitame kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste või valesti tõlgenduste eest. + \ No newline at end of file diff --git a/translations/fa/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/fa/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..85144c814 --- /dev/null +++ b/translations/fa/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# ساخت عوامل هوش مصنوعی با حافظه پایدار با استفاده از Cognee\n", + "\n", + "این دفترچه نشان می‌دهد که چگونه می‌توان عوامل هوش مصنوعی هوشمند با قابلیت‌های پیشرفته حافظه را با استفاده از [**cognee**](https://www.cognee.ai/) - یک حافظه هوش مصنوعی متن‌باز که گراف‌های دانش، جستجوی معنایی و مدیریت جلسات را ترکیب می‌کند تا سیستم‌های هوش مصنوعی آگاه به زمینه ایجاد کند، ساخت.\n", + "\n", + "## 🎯 اهداف یادگیری\n", + "\n", + "تا پایان این آموزش، شما خواهید آموخت که چگونه:\n", + "- **ساخت گراف‌های دانش مبتنی بر تعبیه‌ها**: تبدیل متن غیرساختاریافته به دانش ساختاریافته و قابل پرس‌وجو\n", + "- **پیاده‌سازی حافظه جلسه**: ایجاد مکالمات چند مرحله‌ای با حفظ خودکار زمینه\n", + "- **ذخیره مکالمات**: به صورت اختیاری تعاملات مهم را در حافظه بلندمدت برای استفاده در آینده ذخیره کنید\n", + "- **پرس‌وجو با استفاده از زبان طبیعی**: دسترسی و استفاده از زمینه تاریخی در مکالمات جدید\n", + "- **بصری‌سازی حافظه**: بررسی روابط در گراف دانش عامل خود\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ آنچه خواهید ساخت\n", + "\n", + "در این آموزش، یک **دستیار کدنویسی** با حافظه پایدار ایجاد خواهیم کرد که:\n", + "\n", + "### 1. **ساخت پایگاه دانش**\n", + " - اطلاعات پروفایل و تخصص توسعه‌دهنده را دریافت می‌کند\n", + " - اصول و بهترین شیوه‌های برنامه‌نویسی پایتون را پردازش می‌کند\n", + " - مکالمات تاریخی بین توسعه‌دهندگان و دستیارهای هوش مصنوعی را ذخیره می‌کند\n", + "\n", + "### 2. **مکالمات آگاه از جلسه**\n", + " - زمینه را در طول چندین سؤال در یک جلسه حفظ می‌کند\n", + " - هر جفت سؤال/پاسخ را به‌طور خودکار برای بازیابی کارآمد ذخیره می‌کند\n", + " - پاسخ‌های منسجم و مرتبط بر اساس تاریخچه مکالمه ارائه می‌دهد\n", + "\n", + "### 3. **حافظه بلندمدت**\n", + " - مکالمات مهم را در حافظه بلندمدت ذخیره می‌کند\n", + " - خاطرات مرتبط را از پایگاه دانش و جلسات گذشته برای اطلاع‌رسانی تعاملات جدید بازیابی می‌کند\n", + " - پایگاه دانشی ایجاد می‌کند که با گذشت زمان بهبود می‌یابد\n", + "\n", + "### 4. **بازیابی هوشمند حافظه**\n", + " - از جستجوی معنایی مبتنی بر گراف برای یافتن اطلاعات مرتبط در میان تمام دانش ذخیره‌شده استفاده می‌کند\n", + " - جستجوها را بر اساس زیرگروه‌های داده (اطلاعات توسعه‌دهنده در مقابل اصول) فیلتر می‌کند\n", + " - منابع داده مختلف را ترکیب می‌کند تا پاسخ‌های جامع ارائه دهد\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 پیش‌نیازها و تنظیمات\n", + "\n", + "### الزامات سیستم\n", + "\n", + "قبل از شروع، مطمئن شوید که موارد زیر را دارید:\n", + "\n", + "1. **محیط پایتون**\n", + " - پایتون نسخه 3.9 یا بالاتر\n", + " - استفاده از محیط مجازی (توصیه می‌شود)\n", + "\n", + "2. **کش Redis** (ضروری برای مدیریت جلسات)\n", + " - Redis محلی: `docker run -d -p 6379:6379 redis`\n", + " - یا استفاده از یک سرویس مدیریت‌شده Redis\n", + "\n", + "3. **دسترسی به API مدل‌های زبانی**\n", + " - کلید API OpenAI یا سایر ارائه‌دهندگان (به [مستندات](https://docs.cognee.ai/setup-configuration/llm-providers) مراجعه کنید)\n", + "\n", + "4. **پیکربندی پایگاه داده**\n", + " - به‌طور پیش‌فرض نیازی به پیکربندی نیست. Cognee از پایگاه داده‌های مبتنی بر فایل (LanceDB و Kuzu) استفاده می‌کند.\n", + " - به‌صورت اختیاری، می‌توانید Azure AI Search را به‌عنوان یک ذخیره‌ساز برداری تنظیم کنید (به [مستندات](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch) مراجعه کنید).\n", + "\n", + "### پیکربندی محیط\n", + "\n", + "یک فایل `.env` در دایرکتوری پروژه خود ایجاد کنید و متغیرهای زیر را وارد کنید:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ درک معماری حافظه Cognee\n", + "\n", + "### نحوه عملکرد Cognee\n", + "\n", + "Cognee یک سیستم حافظه پیشرفته ارائه می‌دهد که فراتر از ذخیره‌سازی ساده کلید-مقدار عمل می‌کند:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### اجزای کلیدی:\n", + "\n", + "1. **گراف دانش**: ذخیره موجودیت‌ها، روابط و ارتباطات معنایی\n", + "2. **بردارهای جاسازی**: امکان جستجوی معنایی در تمام اطلاعات ذخیره‌شده\n", + "3. **کش جلسه**: حفظ زمینه مکالمه در جلسات و بین جلسات\n", + "4. **NodeSets**: سازماندهی داده‌ها در دسته‌های منطقی برای بازیابی هدفمند\n", + "\n", + "### انواع حافظه در این آموزش:\n", + "\n", + "- **حافظه پایدار**: ذخیره‌سازی بلندمدت در گراف دانش\n", + "- **حافظه جلسه**: زمینه مکالمه موقت در کش Redis\n", + "- **حافظه معنایی**: جستجوی شباهت مبتنی بر بردار در تمام داده‌ها\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 نصب بسته‌های مورد نیاز\n", + "\n", + "Cognee را با پشتیبانی Redis برای مدیریت جلسات نصب کنید:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 راه‌اندازی محیط و بارگذاری کتابخانه‌ها\n", + "\n", + "اطمینان حاصل کنید:\n", + "1. Redis در حال اجرا باشد (مثلاً با استفاده از Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. متغیرهای محیطی قبل از وارد کردن ماژول‌های کش تنظیم شده باشند\n", + "3. در صورت نیاز، کرنل را مجدداً راه‌اندازی کرده و سلول‌ها را به ترتیب اجرا کنید\n", + "\n", + "سلول زیر:\n", + "1. متغیرهای محیطی را از فایل `.env` بارگذاری می‌کند\n", + "2. Cognee را با تنظیمات LLM شما پیکربندی می‌کند\n", + "3. کش را برای مدیریت جلسه فعال می‌کند\n", + "4. بررسی می‌کند که همه اجزا به درستی متصل شده باشند\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 تنظیم دایرکتوری‌های ذخیره‌سازی\n", + "\n", + "Cognee از دو دایرکتوری جداگانه برای عملیات خود استفاده می‌کند:\n", + "- **ریشه داده**: ذخیره اسناد وارد شده و داده‌های پردازش شده\n", + "- **ریشه سیستم**: شامل پایگاه داده گراف دانش و متادیتای سیستم\n", + "\n", + "ما برای این آموزش دایرکتوری‌های جداگانه‌ای به صورت زیر ایجاد خواهیم کرد:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 تنظیم مجدد حالت حافظه\n", + "\n", + "قبل از اینکه سیستم حافظه خود را بسازیم، بیایید مطمئن شویم که از ابتدا شروع می‌کنیم.\n", + "\n", + "> 💡 **نکته**: اگر می‌خواهید حافظه‌های موجود از اجراهای قبلی خود را هنگام استفاده مجدد از این دفترچه حفظ کنید، می‌توانید این مرحله را رد کنید.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 بخش ۱: ساخت پایگاه دانش\n", + "\n", + "### منابع داده برای دستیار توسعه‌دهنده ما\n", + "\n", + "ما سه نوع داده را برای ایجاد یک پایگاه دانش جامع وارد می‌کنیم:\n", + "\n", + "1. **پروفایل توسعه‌دهنده**: تخصص شخصی و پیشینه فنی\n", + "2. **بهترین روش‌های پایتون**: اصول پایتون همراه با راهنمایی‌های عملی\n", + "3. **مکالمات تاریخی**: جلسات پرسش و پاسخ گذشته بین توسعه‌دهندگان و دستیارهای هوش مصنوعی\n", + "\n", + "این داده‌های متنوع به عامل ما اجازه می‌دهد:\n", + "- زمینه فنی کاربر را درک کند\n", + "- بهترین روش‌ها را در توصیه‌ها اعمال کند\n", + "- از تعاملات موفق قبلی یاد بگیرد\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 تبدیل داده‌ها به نمودار دانش\n", + "\n", + "اکنون متن خام خود را به یک حافظه ساختاریافته تبدیل می‌کنیم. این فرآیند:\n", + "\n", + "1. **اضافه کردن داده‌ها به NodeSets**: سازماندهی اطلاعات در دسته‌بندی‌های منطقی\n", + " - `developer_data`: پروفایل توسعه‌دهنده و مکالمات\n", + " - `principles_data`: بهترین روش‌ها و دستورالعمل‌های پایتون\n", + "\n", + "2. **اجرای Cognify Pipeline**: استخراج موجودیت‌ها، روابط و ایجاد تعبیه‌ها\n", + " - شناسایی مفاهیم کلیدی\n", + " - ایجاد ارتباطات معنایی بین اطلاعات مرتبط\n", + " - تولید تعبیه‌های برداری\n", + "\n", + "این ممکن است چند لحظه طول بکشد زیرا LLM متن را پردازش کرده و ساختار نمودار را ایجاد می‌کند:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 نمایش گراف دانش\n", + "\n", + "بیایید ساختار گراف دانش خود را بررسی کنیم. این نمایش شامل موارد زیر است:\n", + "- **گره‌ها**: موجودیت‌هایی که از متن استخراج شده‌اند (مفاهیم، فناوری‌ها، افراد)\n", + "- **پیوندها**: روابط و ارتباطات بین موجودیت‌ها\n", + "- **خوشه‌ها**: مفاهیم مرتبط که بر اساس شباهت معنایی گروه‌بندی شده‌اند\n", + "\n", + "فایل HTML تولید شده را در مرورگر خود باز کنید تا بتوانید به صورت تعاملی گراف را بررسی کنید:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 تقویت حافظه با Memify\n", + "\n", + "تابع `memify()` نمودار دانش را تحلیل کرده و قوانین هوشمندی درباره داده‌ها ایجاد می‌کند. این فرآیند:\n", + "- الگوها و بهترین روش‌ها را شناسایی می‌کند\n", + "- دستورالعمل‌های قابل اجرا بر اساس محتوا ایجاد می‌کند\n", + "- روابط بین حوزه‌های مختلف دانش را برقرار می‌کند\n", + "\n", + "این قوانین به عامل کمک می‌کنند تا هنگام پاسخ به سوالات تصمیمات آگاهانه‌تری بگیرد. ثبت یک تصویر دوم از نمودار به شما امکان می‌دهد مقایسه کنید که چگونه نمودار پس از غنی‌سازی متراکم‌تر می‌شود.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 بخش ۲: بازیابی هوشمند حافظه\n", + "\n", + "### نمایش ۱: یکپارچه‌سازی دانش میان اسناد\n", + "\n", + "حالا که گراف دانش ما ساخته شده است، بیایید آزمایش کنیم که چگونه Cognee اطلاعات را از منابع مختلف ترکیب می‌کند تا به سوالات پیچیده پاسخ دهد.\n", + "\n", + "اولین پرسش نشان می‌دهد:\n", + "- **درک معنایی**: یافتن مفاهیم مرتبط حتی زمانی که به‌طور صریح ذکر نشده‌اند\n", + "- **ارجاع متقابل**: ترکیب پروفایل توسعه‌دهنده با اصول Python\n", + "- **استدلال زمینه‌ای**: اعمال بهترین روش‌ها در پیاده‌سازی‌های خاص\n", + "\n", + "### نمایش ۲: جستجوی فیلتر شده با NodeSets\n", + "\n", + "پرسش دوم نشان می‌دهد که چگونه می‌توان بخش‌های خاصی از گراف دانش را هدف قرار داد:\n", + "- از پارامتر `node_name` برای جستجو فقط در `principles_data` استفاده می‌کند\n", + "- پاسخ‌های متمرکز از یک حوزه دانش خاص ارائه می‌دهد\n", + "- مفید برای زمانی که به اطلاعات خاص حوزه نیاز دارید\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 بخش ۳: تنظیم مدیریت جلسه\n", + "\n", + "### فعال‌سازی حافظه مکالمه\n", + "\n", + "مدیریت جلسه برای حفظ زمینه در تعاملات متعدد بسیار مهم است. در اینجا ما:\n", + "\n", + "1. **ایجاد زمینه کاربر**: یک پروفایل کاربر ایجاد کنید یا بازیابی کنید برای ردیابی جلسه\n", + "2. **پیکربندی موتور کش**: اتصال به Redis برای ذخیره تاریخچه مکالمات\n", + "3. **فعال‌سازی متغیرهای جلسه**: تنظیم متغیرهای زمینه که در پرسش‌ها باقی می‌مانند\n", + "\n", + "> ⚠️ **مهم**: این نیاز به اجرای Redis و `CACHING=true` در محیط شما دارد\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ تابع کمکی: مشاهده تاریخچه جلسه\n", + "\n", + "این تابع کمکی به ما امکان می‌دهد تاریخچه مکالمات ذخیره‌شده در Redis را بررسی کنیم. این تابع برای موارد زیر مفید است:\n", + "- رفع اشکال مدیریت جلسات\n", + "- اطمینان از اینکه مکالمات ذخیره می‌شوند\n", + "- درک اینکه چه زمینه‌ای برای عامل موجود است\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## جلسه ۱: آزمایش پشتیبانی غیرهمزمان — سوال اول\n", + "\n", + "جلسه `async-support-lab` را با درخواست الگوهای مناسب و سازگار با تله‌متری برای asyncio در یک وب‌اسکرپر بزرگ آغاز کنید. گراف از قبل با asyncio، aiohttp و روش‌های نظارت آشنا است، بنابراین پاسخ باید مشابه مکالمات قبلی باشد و در عین حال به پرسش جدید اختصاص داده شود.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## بررسی حافظه جلسه ۱ پس از اولین تبادل\n", + "\n", + "اجرای `show_history(session_1)` بلافاصله پس از پرسش اولیه تأیید می‌کند که Cognee هم پرسش و هم پاسخ را در Redis ذخیره کرده است. شما باید یک ورودی با راهنمایی همزمانی مشاهده کنید.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## جلسه ۱: پیگیری مدل‌های داده\n", + "\n", + "در ادامه می‌پرسیم: \"چه زمانی باید dataclasses را انتخاب کنم و چه زمانی Pydantic را؟\" با استفاده از همان شناسه جلسه. Cognee باید اصول Python و مکالمات قبلی FastAPI را ترکیب کند تا مشاوره‌ای دقیق ارائه دهد—نشان دادن اینکه زمینه در یک جلسه نام‌گذاری شده منتقل می‌شود.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## تأیید کنید که تاریخچه جلسه ۱ شامل هر دو نوبت است\n", + "\n", + "یک بار دیگر فراخوانی `show_history(session_1)` باید دو ورودی پرسش و پاسخ را نشان دهد. این با مرحله \"بازپخش حافظه\" آزمایشگاه Mem0 مطابقت دارد و ثابت می‌کند که نوبت‌های اضافی همان متن را گسترش می‌دهند.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## جلسه ۲: رشته بررسی طراحی — جلسه جدید\n", + "\n", + "برای نشان دادن جداسازی بین رشته‌ها، `design-review-session` را راه‌اندازی می‌کنیم و برای بررسی حوادث راهنمایی ثبت‌گزارش درخواست می‌کنیم. حتی با وجود اینکه پایگاه دانش اصلی یکسان است، شناسه جلسه جدید متن‌ها را جدا نگه می‌دارد.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## بررسی جلسه ۲ تاریخچه\n", + "\n", + "`show_history(session_2)` باید فقط جفت درخواست/پاسخ بررسی طراحی را فهرست کند. آن را با جلسه ۱ مقایسه کنید تا نشان دهید چگونه Cognee متن‌های مستقل را حفظ می‌کند در حالی که از نمودار دانش مشترک استفاده می‌کند.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## خلاصه\n", + "\n", + "تبریک می‌گوییم! شما به دستیار کدنویسی خود یک لایه حافظه بلندمدت واقعی با قدرت Cognee اضافه کردید.\n", + "\n", + "در این آموزش، محتوای خام توسعه‌دهنده (کد، مستندات، چت‌ها) را به یک گراف + حافظه برداری تبدیل کردید که عامل شما می‌تواند در آن جستجو کند، استدلال کند و به طور مداوم بهبود یابد.\n", + "\n", + "آنچه آموختید:\n", + "\n", + "1. **از متن خام تا حافظه هوش مصنوعی**: نحوه پردازش داده‌های غیرساختاری توسط Cognee و تبدیل آن‌ها به حافظه هوشمند و قابل جستجو با استفاده از معماری ترکیبی گراف دانش + بردار.\n", + "\n", + "2. **غنی‌سازی گراف با memify**: نحوه فراتر رفتن از ایجاد گراف پایه و استفاده از memify برای افزودن حقایق مشتق‌شده و روابط غنی‌تر به گراف موجود.\n", + "\n", + "3. **استراتژی‌های مختلف جستجو**: نحوه پرس‌وجو از حافظه با انواع مختلف جستجو (پرسش و پاسخ مبتنی بر گراف، تکمیل به سبک RAG، بینش‌ها، قطعات خام، جستجوی کد و غیره) بسته به نیاز عامل شما.\n", + "\n", + "4. **کاوش بصری**: نحوه بررسی و رفع اشکال آنچه Cognee ساخته است با استفاده از تصویری‌سازی گراف و رابط کاربری Cognee، تا بتوانید ساختار دانش را به صورت واقعی مشاهده کنید.\n", + "\n", + "5. **حافظه آگاه از جلسه**: نحوه ترکیب زمینه هر جلسه با حافظه معنایی پایدار تا عوامل بتوانند بین اجراها اطلاعات را به خاطر بسپارند بدون اینکه اطلاعات بین کاربران نشت کند.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## نکات کلیدی\n", + "1. حافظه به‌عنوان یک گراف دانش پشتیبانی‌شده توسط Embeddings\n", + "\n", + " - **درک ساختاری**: Cognee ترکیبی از یک ذخیره‌سازی برداری و یک ذخیره‌سازی گراف است، بنابراین داده‌های شما هم بر اساس معنا قابل جستجو هستند و هم از طریق روابط به هم متصل‌اند. به‌طور پیش‌فرض، Cognee از پایگاه‌های داده مبتنی بر فایل استفاده می‌کند (LanceDB برای ذخیره‌سازی برداری، Kuzu برای پایگاه داده گراف).\n", + "\n", + " - **بازیابی آگاه به روابط**: پاسخ‌ها نه تنها بر اساس \"متن مشابه\"، بلکه بر اساس نحوه ارتباط موجودیت‌ها نیز قابل ارائه هستند.\n", + "\n", + " - **حافظه زنده**: لایه حافظه تکامل می‌یابد، رشد می‌کند و به‌عنوان یک گراف متصل قابل جستجو باقی می‌ماند.\n", + "\n", + "2. حالت‌های جستجو و استدلال\n", + " - **بازیابی ترکیبی**: جستجو ترکیبی از شباهت برداری، ساختار گراف و استدلال LLM است، از جستجوی خام تا پاسخ‌دهی به سوالات آگاه به گراف.\n", + "\n", + " - **تناسب حالت با وظیفه**: از حالت‌های تکمیل‌محور زمانی استفاده کنید که پاسخ‌های زبان طبیعی می‌خواهید، و از حالت‌های chunk/خلاصه/گراف زمانی که عامل شما به زمینه خام یا هدایت استدلال خود نیاز دارد.\n", + "\n", + "3. عوامل شخصی‌سازی‌شده و آگاه به جلسه\n", + " - **زمینه جلسه + حافظه بلندمدت**: Cognee زمینه کوتاه‌مدت \"رشته\" را جدا از حافظه بلندمدت در سطح کاربر یا سازمان نگه می‌دارد.\n", + "\n", + "## کاربردهای واقعی\n", + "\n", + "1. **عوامل هوش مصنوعی عمودی**\n", + "\n", + " از الگوی این دفترچه یادداشت برای قدرت‌بخشی به دستیاران هوشمند حوزه‌ای که بر اساس Cognee به‌عنوان هسته بازیابی و استدلال خود عمل می‌کنند، استفاده کنید:\n", + "\n", + "- **دستیاران توسعه‌دهنده**: بررسی کد، تحلیل حادثه، و دستیاران معماری که کد، APIها، مستندات طراحی، و تیکت‌ها را به‌عنوان یک گراف حافظه واحد مرور می‌کنند.\n", + "\n", + "- **دستیاران مشتری‌محور**: عوامل پشتیبانی یا موفقیت که از مستندات محصول، سوالات متداول، یادداشت‌های CRM، و تیکت‌های گذشته با بازیابی آگاه به گراف و پاسخ‌های مستند استفاده می‌کنند.\n", + "\n", + "- **دستیاران متخصص داخلی**: دستیاران سیاست، حقوقی، یا امنیتی که بر اساس قوانین، دستورالعمل‌ها، و تصمیمات تاریخی مرتبط استدلال می‌کنند، نه فایل‌های PDF جداگانه.\n", + "\n", + " Cognee به‌طور خاص به‌عنوان حافظه پایدار و دقیق برای عوامل هوش مصنوعی موقعیت‌یابی شده است، و یک گراف دانش زنده ارائه می‌دهد که پشت عامل شما قرار می‌گیرد و جایگزین ترکیب‌های موقت ذخیره‌سازی برداری و کد گراف سفارشی می‌شود.\n", + "\n", + "2. **یکپارچه‌سازی سیلوهای داده به یک حافظه**\n", + "\n", + " همین رویکرد به شما کمک می‌کند یک لایه حافظه یکپارچه در میان منابع پراکنده بسازید:\n", + "\n", + "- **از سیلوها به یک گراف**: داده‌های ساختاریافته (مانند پایگاه‌های داده) و غیرساختاریافته (مانند مستندات، چت‌ها) را به یک گراف واحد پشتیبانی‌شده توسط Embeddings وارد کنید، به‌جای شاخص‌های جداگانه برای هر سیستم.\n", + "\n", + "- **استدلال بین‌منبعی با استناد**: استدلال چندمرحله‌ای را بر روی همه چیز اجرا کنید—\"اتصال\" لاگ‌ها، معیارها، و مستندات از طریق گراف—و همچنان پاسخ‌های مستند با منبع ارائه دهید.\n", + "\n", + "- **هاب‌های دانش**: برای حوزه‌هایی مانند بانکداری یا آموزش، Cognee قبلاً برای یکپارچه‌سازی فایل‌های PDF، سیستم‌های داخلی، و داده‌های اپلیکیشن به یک گراف دانش با بردارها استفاده شده است، تا عوامل بتوانند سوالات را با زمینه دقیق و مستند پاسخ دهند.\n", + "\n", + "## مراحل بعدی\n", + "\n", + "شما حلقه حافظه اصلی را پیاده‌سازی کرده‌اید. در اینجا گسترش‌های طبیعی وجود دارد که می‌توانید خودتان امتحان کنید (برای جزئیات به [مستندات Cognee](https://docs.cognee.ai/) مراجعه کنید):\n", + "\n", + "1. **آزمایش با آگاهی زمانی**: قابلیت cognify زمانی را فعال کنید تا رویدادها و زمان‌ها را از متن استخراج کنید.\n", + "\n", + "2. **معرفی استدلال مبتنی بر هستی‌شناسی**: یک هستی‌شناسی OWL برای حوزه خود تعریف کنید. از پشتیبانی هستی‌شناسی Cognee استفاده کنید تا موجودیت‌ها و روابط استخراج‌شده در آن طرح‌واره قرار گیرند، و کیفیت گراف و پاسخ‌های خاص حوزه را بهبود دهید.\n", + "\n", + "3. **افزودن حلقه بازخورد**: اجازه دهید Cognee وزن لبه‌های گراف را از بازخورد واقعی کاربران تنظیم کند، تا بازیابی به‌مرور زمان بهبود یابد و ثابت نماند.\n", + "\n", + "4. **تنظیم برای شخصی‌سازی و رفتار جلسه**: از شناسه‌های کاربر، مستاجرها، و مجموعه داده‌ها استفاده کنید تا هر فرد یا تیم نمای خود را بر روی موتور حافظه مشترک داشته باشد.\n", + "\n", + "5. **گسترش به عوامل پیچیده‌تر**: Cognee را به چارچوب‌های عامل متصل کنید تا سیستم‌های چندعاملی بسازید که همه از یک لایه حافظه مشترک استفاده کنند. *پلاگین Microsoft Agent Framework x Cognee به‌زودی ارائه می‌شود.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**سلب مسئولیت**: \nاین سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفه‌ای انسانی توصیه می‌شود. ما مسئولیتی در قبال سوء تفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:22:13+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "fa" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/fa/13-agent-memory/README.md b/translations/fa/13-agent-memory/README.md index 924a8c07b..7faf6451a 100644 --- a/translations/fa/13-agent-memory/README.md +++ b/translations/fa/13-agent-memory/README.md @@ -1,160 +1,179 @@ -# حافظه برای عوامل هوش مصنوعی +# حافظه برای عوامل هوش مصنوعی [![حافظه عامل](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.fa.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -هنگام بحث درباره مزایای منحصر به فرد ایجاد عوامل هوش مصنوعی، دو موضوع اصلی مطرح می‌شود: توانایی استفاده از ابزارها برای انجام وظایف و توانایی بهبود در طول زمان. حافظه اساس ایجاد عاملی است که بتواند خود را بهبود دهد و تجربه‌های بهتری برای کاربران ما ایجاد کند. +وقتی درباره مزایای منحصر به فرد ایجاد عوامل هوش مصنوعی صحبت می‌کنیم، دو موضوع اصلی مطرح می‌شود: توانایی استفاده از ابزارها برای انجام وظایف و توانایی بهبود در طول زمان. حافظه پایه‌ای برای ایجاد عاملی است که بتواند خود را بهبود دهد و تجربه‌های بهتری برای کاربران ما ایجاد کند. -در این درس، به بررسی مفهوم حافظه برای عوامل هوش مصنوعی و نحوه مدیریت و استفاده از آن برای بهبود برنامه‌های کاربردی خود خواهیم پرداخت. +در این درس، به بررسی مفهوم حافظه برای عوامل هوش مصنوعی و نحوه مدیریت و استفاده از آن برای بهبود برنامه‌های خود خواهیم پرداخت. -## مقدمه +## مقدمه -این درس شامل موارد زیر خواهد بود: +این درس شامل موارد زیر است: -• **درک حافظه عامل هوش مصنوعی**: حافظه چیست و چرا برای عوامل ضروری است. +• **درک حافظه عامل هوش مصنوعی**: حافظه چیست و چرا برای عوامل ضروری است. -• **پیاده‌سازی و ذخیره حافظه**: روش‌های عملی برای افزودن قابلیت‌های حافظه به عوامل هوش مصنوعی، با تمرکز بر حافظه کوتاه‌مدت و بلندمدت. +• **پیاده‌سازی و ذخیره حافظه**: روش‌های عملی برای افزودن قابلیت‌های حافظه به عوامل هوش مصنوعی، با تمرکز بر حافظه کوتاه‌مدت و بلندمدت. -• **ایجاد عوامل هوش مصنوعی خودبهبود**: چگونه حافظه به عوامل امکان می‌دهد از تعاملات گذشته یاد بگیرند و در طول زمان بهبود یابند. +• **ایجاد عوامل هوش مصنوعی خودبهبود**: چگونه حافظه به عوامل کمک می‌کند تا از تعاملات گذشته یاد بگیرند و در طول زمان بهبود یابند. -## اهداف یادگیری +## پیاده‌سازی‌های موجود -پس از اتمام این درس، شما قادر خواهید بود: +این درس شامل دو آموزش جامع در قالب دفترچه یادداشت است: -• **تفاوت بین انواع مختلف حافظه عامل هوش مصنوعی** را تشخیص دهید، از جمله حافظه کاری، کوتاه‌مدت، بلندمدت و انواع خاص مانند حافظه شخصیت و اپیزودیک. +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: پیاده‌سازی حافظه با استفاده از Mem0 و Azure AI Search در چارچوب Semantic Kernel -• **پیاده‌سازی و مدیریت حافظه کوتاه‌مدت و بلندمدت برای عوامل هوش مصنوعی** با استفاده از چارچوب Semantic Kernel، ابزارهایی مانند Mem0 و حافظه Whiteboard، و ادغام با Azure AI Search. +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: پیاده‌سازی حافظه ساختاریافته با استفاده از Cognee، ایجاد خودکار نمودار دانش با پشتیبانی از embeddings، نمایش نمودار و بازیابی هوشمند -• **درک اصول پشت عوامل هوش مصنوعی خودبهبود** و اینکه چگونه سیستم‌های مدیریت حافظه قوی به یادگیری و تطبیق مداوم کمک می‌کنند. +## اهداف یادگیری -## درک حافظه عامل هوش مصنوعی +پس از تکمیل این درس، شما قادر خواهید بود: -در اصل، **حافظه برای عوامل هوش مصنوعی به مکانیزم‌هایی اشاره دارد که به آنها امکان می‌دهد اطلاعات را حفظ و بازیابی کنند**. این اطلاعات می‌تواند جزئیات خاصی درباره یک مکالمه، ترجیحات کاربر، اقدامات گذشته یا حتی الگوهای یادگرفته شده باشد. +• **تفاوت بین انواع مختلف حافظه عامل هوش مصنوعی** را درک کنید، از جمله حافظه کاری، کوتاه‌مدت، بلندمدت و انواع تخصصی مانند حافظه شخصیت و اپیزودیک. -بدون حافظه، برنامه‌های هوش مصنوعی اغلب بدون حالت هستند، به این معنی که هر تعامل از ابتدا شروع می‌شود. این منجر به تجربه‌ای تکراری و ناامیدکننده برای کاربر می‌شود که در آن عامل "فراموش" می‌کند زمینه یا ترجیحات قبلی را. +• **پیاده‌سازی و مدیریت حافظه کوتاه‌مدت و بلندمدت برای عوامل هوش مصنوعی** با استفاده از چارچوب Semantic Kernel، بهره‌گیری از ابزارهایی مانند Mem0، Cognee، حافظه Whiteboard و ادغام با Azure AI Search. -### چرا حافظه مهم است؟ +• **اصول پشت عوامل هوش مصنوعی خودبهبود** را درک کنید و اینکه چگونه سیستم‌های مدیریت حافظه قوی به یادگیری و سازگاری مداوم کمک می‌کنند. -هوش یک عامل به شدت به توانایی آن در یادآوری و استفاده از اطلاعات گذشته وابسته است. حافظه به عوامل امکان می‌دهد: +## درک حافظه عامل هوش مصنوعی -• **بازتابی**: یادگیری از اقدامات و نتایج گذشته. +در اصل، **حافظه برای عوامل هوش مصنوعی به مکانیزم‌هایی اشاره دارد که به آن‌ها اجازه می‌دهد اطلاعات را حفظ و بازیابی کنند**. این اطلاعات می‌تواند جزئیات خاصی از یک مکالمه، ترجیحات کاربر، اقدامات گذشته یا حتی الگوهای یادگرفته شده باشد. -• **تعاملی**: حفظ زمینه در طول یک مکالمه مداوم. +بدون حافظه، برنامه‌های هوش مصنوعی اغلب بدون حالت هستند، به این معنی که هر تعامل از ابتدا شروع می‌شود. این منجر به تجربه‌ای تکراری و ناامیدکننده برای کاربران می‌شود که عامل "فراموش" می‌کند زمینه یا ترجیحات قبلی را. -• **پیش‌بینی‌کننده و واکنشی**: پیش‌بینی نیازها یا پاسخ مناسب بر اساس داده‌های تاریخی. +### چرا حافظه مهم است؟ -• **خودمختار**: عملکرد مستقل‌تر با استفاده از دانش ذخیره‌شده. +هوش یک عامل به شدت به توانایی آن در یادآوری و استفاده از اطلاعات گذشته وابسته است. حافظه به عوامل اجازه می‌دهد که: -هدف از پیاده‌سازی حافظه این است که عوامل را **قابل اعتمادتر و توانمندتر** کنیم. +• **بازتابی**: از اقدامات و نتایج گذشته یاد بگیرند. -### انواع حافظه +• **تعاملی**: زمینه را در طول یک مکالمه جاری حفظ کنند. -#### حافظه کاری +• **پیش‌بینی‌کننده و واکنشی**: نیازها را پیش‌بینی کنند یا بر اساس داده‌های تاریخی به درستی پاسخ دهند. -این نوع حافظه مانند یک کاغذ یادداشت است که عامل در طول یک وظیفه یا فرآیند تفکر جاری از آن استفاده می‌کند. اطلاعات فوری مورد نیاز برای محاسبه مرحله بعدی را نگه می‌دارد. +• **خودمختار**: با استفاده از دانش ذخیره‌شده به طور مستقل‌تر عمل کنند. -برای عوامل هوش مصنوعی، حافظه کاری اغلب اطلاعات مرتبط‌ترین بخش‌های یک مکالمه را ثبت می‌کند، حتی اگر تاریخچه کامل چت طولانی یا کوتاه شده باشد. این حافظه بر استخراج عناصر کلیدی مانند نیازها، پیشنهادات، تصمیمات و اقدامات تمرکز دارد. +هدف از پیاده‌سازی حافظه این است که عوامل را **قابل اعتمادتر و توانمندتر** کنیم. -**مثال حافظه کاری** +### انواع حافظه -در یک عامل رزرو سفر، حافظه کاری ممکن است درخواست فعلی کاربر را ثبت کند، مانند "می‌خواهم سفری به پاریس رزرو کنم". این نیاز خاص در زمینه فوری عامل نگه داشته می‌شود تا تعامل جاری را هدایت کند. +#### حافظه کاری -#### حافظه کوتاه‌مدت +این نوع حافظه مانند یک کاغذ یادداشت است که عامل در طول یک وظیفه یا فرآیند تفکر جاری از آن استفاده می‌کند. اطلاعات فوری مورد نیاز برای محاسبه مرحله بعدی را نگه می‌دارد. -این نوع حافظه اطلاعات را برای مدت زمان یک مکالمه یا جلسه حفظ می‌کند. این زمینه مکالمه جاری است که به عامل امکان می‌دهد به نوبت‌های قبلی در گفتگو ارجاع دهد. +برای عوامل هوش مصنوعی، حافظه کاری اغلب اطلاعات مرتبط‌ترین بخش‌های یک مکالمه را ثبت می‌کند، حتی اگر تاریخچه کامل چت طولانی یا کوتاه شده باشد. این حافظه بر استخراج عناصر کلیدی مانند نیازها، پیشنهادات، تصمیمات و اقدامات تمرکز دارد. -**مثال حافظه کوتاه‌مدت** +**مثال حافظه کاری** -اگر کاربر بپرسد، "هزینه پرواز به پاریس چقدر است؟" و سپس ادامه دهد، "اقامت در آنجا چطور؟"، حافظه کوتاه‌مدت تضمین می‌کند که عامل می‌داند "آنجا" به "پاریس" در همان مکالمه اشاره دارد. +در یک عامل رزرو سفر، حافظه کاری ممکن است درخواست فعلی کاربر را ثبت کند، مانند "می‌خواهم سفری به پاریس رزرو کنم". این نیاز خاص در زمینه فوری عامل نگه داشته می‌شود تا تعامل جاری را هدایت کند. -#### حافظه بلندمدت +#### حافظه کوتاه‌مدت -این نوع حافظه اطلاعاتی است که در طول چندین مکالمه یا جلسه باقی می‌ماند. این حافظه به عوامل امکان می‌دهد ترجیحات کاربر، تعاملات تاریخی یا دانش عمومی را در طول زمان‌های طولانی به یاد داشته باشند. این برای شخصی‌سازی مهم است. +این نوع حافظه اطلاعات را برای مدت زمان یک مکالمه یا جلسه حفظ می‌کند. این زمینه مکالمه جاری است که به عامل اجازه می‌دهد به نوبت‌های قبلی در گفتگو ارجاع دهد. -**مثال حافظه بلندمدت** +**مثال حافظه کوتاه‌مدت** -یک حافظه بلندمدت ممکن است ذخیره کند که "بن از اسکی و فعالیت‌های بیرون از خانه لذت می‌برد، قهوه با منظره کوه را دوست دارد و می‌خواهد از شیب‌های اسکی پیشرفته به دلیل یک آسیب قبلی اجتناب کند". این اطلاعات، که از تعاملات قبلی یاد گرفته شده است، توصیه‌ها را در جلسات برنامه‌ریزی سفر آینده بسیار شخصی‌سازی می‌کند. +اگر کاربر بپرسد، "هزینه پرواز به پاریس چقدر است؟" و سپس ادامه دهد، "هزینه اقامت در آنجا چطور؟"، حافظه کوتاه‌مدت تضمین می‌کند که عامل می‌داند "آنجا" به "پاریس" در همان مکالمه اشاره دارد. -#### حافظه شخصیت +#### حافظه بلندمدت -این نوع حافظه خاص به عامل کمک می‌کند یک "شخصیت" یا "نقش" ثابت ایجاد کند. این حافظه به عامل امکان می‌دهد جزئیات مربوط به خود یا نقش مورد نظرش را به یاد داشته باشد، و تعاملات را روان‌تر و متمرکزتر کند. +این اطلاعاتی است که در طول چندین مکالمه یا جلسه باقی می‌ماند. به عوامل اجازه می‌دهد ترجیحات کاربر، تعاملات تاریخی یا دانش عمومی را در طول زمان به یاد داشته باشند. این برای شخصی‌سازی مهم است. -**مثال حافظه شخصیت** +**مثال حافظه بلندمدت** -اگر عامل سفر طراحی شده باشد تا یک "برنامه‌ریز اسکی متخصص" باشد، حافظه شخصیت ممکن است این نقش را تقویت کند و پاسخ‌های آن را به گونه‌ای تنظیم کند که با لحن و دانش یک متخصص هماهنگ باشد. +یک حافظه بلندمدت ممکن است ذخیره کند که "بن از اسکی و فعالیت‌های بیرون لذت می‌برد، قهوه با منظره کوه را دوست دارد و می‌خواهد از شیب‌های اسکی پیشرفته به دلیل یک آسیب قبلی اجتناب کند". این اطلاعات که از تعاملات قبلی یاد گرفته شده است، توصیه‌ها را در جلسات برنامه‌ریزی سفر آینده بسیار شخصی‌سازی می‌کند. -#### حافظه اپیزودیک/جریان کاری +#### حافظه شخصیت -این حافظه دنباله‌ای از مراحل را که عامل در طول یک وظیفه پیچیده انجام می‌دهد، از جمله موفقیت‌ها و شکست‌ها، ذخیره می‌کند. این حافظه مانند یادآوری "اپیزودها" یا تجربیات گذشته برای یادگیری از آنها است. +این نوع حافظه تخصصی به عامل کمک می‌کند یک "شخصیت" یا "شخصیت" ثابت ایجاد کند. به عامل اجازه می‌دهد جزئیات مربوط به خود یا نقش مورد نظرش را به یاد داشته باشد، و تعاملات را روان‌تر و متمرکزتر کند. -**مثال حافظه اپیزودیک** +**مثال حافظه شخصیت** +اگر عامل سفر طراحی شده باشد تا یک "برنامه‌ریز اسکی متخصص" باشد، حافظه شخصیت ممکن است این نقش را تقویت کند و پاسخ‌های آن را به گونه‌ای تنظیم کند که با لحن و دانش یک متخصص هماهنگ باشد. -اگر عامل تلاش کند یک پرواز خاص را رزرو کند اما به دلیل عدم موجودی شکست بخورد، حافظه اپیزودیک می‌تواند این شکست را ثبت کند و به عامل امکان دهد پروازهای جایگزین را امتحان کند یا کاربر را در تلاش بعدی به طور آگاهانه‌تر از مشکل مطلع کند. +#### حافظه کاری/اپیزودیک -#### حافظه موجودیت +این حافظه دنباله‌ای از مراحل را که عامل در طول یک وظیفه پیچیده انجام می‌دهد، از جمله موفقیت‌ها و شکست‌ها ذخیره می‌کند. مانند به یاد آوردن "اپیزودها" یا تجربیات گذشته برای یادگیری از آن‌ها. -این حافظه شامل استخراج و به یادآوری موجودیت‌های خاص (مانند افراد، مکان‌ها یا اشیاء) و رویدادها از مکالمات است. این حافظه به عامل امکان می‌دهد درک ساختاری از عناصر کلیدی مورد بحث ایجاد کند. +**مثال حافظه اپیزودیک** -**مثال حافظه موجودیت** +اگر عامل تلاش کند یک پرواز خاص را رزرو کند اما به دلیل عدم موجودی شکست بخورد، حافظه اپیزودیک می‌تواند این شکست را ثبت کند و به عامل اجازه دهد پروازهای جایگزین را امتحان کند یا کاربر را در تلاش بعدی به طور آگاهانه‌تر از مشکل مطلع کند. -از یک مکالمه درباره یک سفر گذشته، عامل ممکن است "پاریس"، "برج ایفل"، و "شام در رستوران Le Chat Noir" را به عنوان موجودیت‌ها استخراج کند. در یک تعامل آینده، عامل می‌تواند "Le Chat Noir" را به یاد بیاورد و پیشنهاد دهد که یک رزرو جدید در آنجا انجام دهد. +#### حافظه موجودیت -#### RAG ساختاریافته (تولید تقویت‌شده با بازیابی) +این شامل استخراج و به یاد آوردن موجودیت‌های خاص (مانند افراد، مکان‌ها یا چیزها) و رویدادها از مکالمات است. به عامل اجازه می‌دهد درک ساختاری از عناصر کلیدی مورد بحث ایجاد کند. -در حالی که RAG یک تکنیک گسترده‌تر است، "RAG ساختاریافته" به عنوان یک فناوری حافظه قدرتمند برجسته شده است. این تکنیک اطلاعات متراکم و ساختاریافته را از منابع مختلف (مکالمات، ایمیل‌ها، تصاویر) استخراج می‌کند و از آن برای افزایش دقت، بازیابی و سرعت در پاسخ‌ها استفاده می‌کند. برخلاف RAG کلاسیک که تنها به شباهت معنایی متکی است، RAG ساختاریافته با ساختار ذاتی اطلاعات کار می‌کند. +**مثال حافظه موجودیت** -**مثال RAG ساختاریافته** +از یک مکالمه درباره یک سفر گذشته، عامل ممکن است "پاریس"، "برج ایفل" و "شام در رستوران Le Chat Noir" را به عنوان موجودیت‌ها استخراج کند. در یک تعامل آینده، عامل می‌تواند "Le Chat Noir" را به یاد آورد و پیشنهاد دهد که یک رزرو جدید در آنجا انجام دهد. -به جای تطبیق صرفاً کلمات کلیدی، RAG ساختاریافته می‌تواند جزئیات پرواز (مقصد، تاریخ، زمان، شرکت هواپیمایی) را از یک ایمیل استخراج کند و آنها را به صورت ساختاریافته ذخیره کند. این امکان پرسش‌های دقیق مانند "چه پروازی به پاریس در روز سه‌شنبه رزرو کردم؟" را فراهم می‌کند. +#### RAG ساختاریافته (تولید تقویت‌شده با بازیابی) -## پیاده‌سازی و ذخیره حافظه +در حالی که RAG یک تکنیک گسترده‌تر است، "RAG ساختاریافته" به عنوان یک فناوری حافظه قدرتمند برجسته شده است. این اطلاعات متراکم و ساختاریافته را از منابع مختلف (مکالمات، ایمیل‌ها، تصاویر) استخراج می‌کند و از آن برای افزایش دقت، بازیابی و سرعت در پاسخ‌ها استفاده می‌کند. برخلاف RAG کلاسیک که فقط به شباهت معنایی متکی است، RAG ساختاریافته با ساختار ذاتی اطلاعات کار می‌کند. -پیاده‌سازی حافظه برای عوامل هوش مصنوعی شامل یک فرآیند سیستماتیک **مدیریت حافظه** است که شامل تولید، ذخیره، بازیابی، ادغام، به‌روزرسانی و حتی "فراموش کردن" (یا حذف) اطلاعات می‌شود. بازیابی به‌ویژه جنبه‌ای حیاتی است. +**مثال RAG ساختاریافته** -### ابزارهای حافظه خاص +به جای فقط تطبیق کلمات کلیدی، RAG ساختاریافته می‌تواند جزئیات پرواز (مقصد، تاریخ، زمان، شرکت هواپیمایی) را از یک ایمیل تجزیه و ذخیره کند. این امکان پرسش‌های دقیق مانند "چه پروازی به پاریس در روز سه‌شنبه رزرو کردم؟" را فراهم می‌کند. -یکی از راه‌های ذخیره و مدیریت حافظه عامل استفاده از ابزارهای خاص مانند Mem0 است. Mem0 به عنوان یک لایه حافظه پایدار عمل می‌کند و به عوامل امکان می‌دهد تعاملات مرتبط را به یاد بیاورند، ترجیحات کاربر و زمینه‌های واقعی را ذخیره کنند و از موفقیت‌ها و شکست‌ها در طول زمان یاد بگیرند. ایده این است که عوامل بدون حالت به عوامل دارای حالت تبدیل شوند. +## پیاده‌سازی و ذخیره حافظه -این ابزار از طریق یک **خط لوله حافظه دو مرحله‌ای: استخراج و به‌روزرسانی** کار می‌کند. ابتدا، پیام‌هایی که به رشته عامل اضافه می‌شوند به سرویس Mem0 ارسال می‌شوند، که از یک مدل زبان بزرگ (LLM) برای خلاصه‌سازی تاریخچه مکالمه و استخراج حافظه‌های جدید استفاده می‌کند. سپس، یک مرحله به‌روزرسانی مبتنی بر LLM تعیین می‌کند که آیا این حافظه‌ها باید اضافه، اصلاح یا حذف شوند و آنها را در یک ذخیره داده ترکیبی که می‌تواند شامل پایگاه‌های داده برداری، گراف و کلید-مقدار باشد ذخیره می‌کند. این سیستم همچنین از انواع مختلف حافظه پشتیبانی می‌کند و می‌تواند حافظه گراف را برای مدیریت روابط بین موجودیت‌ها ادغام کند. +پیاده‌سازی حافظه برای عوامل هوش مصنوعی شامل فرآیند سیستماتیک **مدیریت حافظه** است که شامل تولید، ذخیره، بازیابی، ادغام، به‌روزرسانی و حتی "فراموش کردن" (یا حذف) اطلاعات می‌شود. بازیابی یک جنبه به‌ویژه حیاتی است. -### ذخیره حافظه با RAG +### ابزارهای تخصصی حافظه -فراتر از ابزارهای حافظه خاص مانند Mem0، می‌توانید از خدمات جستجوی قدرتمند مانند **Azure AI Search به عنوان بک‌اند برای ذخیره و بازیابی حافظه‌ها** استفاده کنید، به‌ویژه برای RAG ساختاریافته. +#### Mem0 -این امکان را فراهم می‌کند که پاسخ‌های عامل خود را با داده‌های خودتان پایه‌گذاری کنید و پاسخ‌های مرتبط‌تر و دقیق‌تری ارائه دهید. Azure AI Search می‌تواند برای ذخیره حافظه‌های سفر کاربر، کاتالوگ‌های محصول یا هر دانش خاص دامنه دیگر استفاده شود. +یکی از راه‌های ذخیره و مدیریت حافظه عامل استفاده از ابزارهای تخصصی مانند Mem0 است. Mem0 به عنوان یک لایه حافظه پایدار عمل می‌کند، به عوامل اجازه می‌دهد تعاملات مرتبط را به یاد آورند، ترجیحات کاربر و زمینه‌های واقعی را ذخیره کنند و از موفقیت‌ها و شکست‌ها در طول زمان یاد بگیرند. ایده اینجا این است که عوامل بدون حالت به عوامل دارای حالت تبدیل شوند. -Azure AI Search قابلیت‌هایی مانند **RAG ساختاریافته** را پشتیبانی می‌کند که در استخراج و بازیابی اطلاعات متراکم و ساختاریافته از مجموعه داده‌های بزرگ مانند تاریخچه مکالمات، ایمیل‌ها یا حتی تصاویر برتری دارد. این قابلیت "دقت و بازیابی فوق انسانی" را در مقایسه با روش‌های سنتی تقسیم متن و جاسازی فراهم می‌کند. +این ابزار از طریق یک **خط لوله حافظه دو مرحله‌ای: استخراج و به‌روزرسانی** کار می‌کند. ابتدا، پیام‌هایی که به رشته عامل اضافه می‌شوند به سرویس Mem0 ارسال می‌شوند، که از یک مدل زبان بزرگ (LLM) برای خلاصه کردن تاریخچه مکالمه و استخراج حافظه‌های جدید استفاده می‌کند. سپس، مرحله به‌روزرسانی مبتنی بر LLM تعیین می‌کند که آیا این حافظه‌ها باید اضافه، اصلاح یا حذف شوند و آن‌ها را در یک ذخیره داده ترکیبی که می‌تواند شامل پایگاه داده‌های برداری، نمودار و کلید-مقدار باشد ذخیره می‌کند. این سیستم همچنین از انواع مختلف حافظه پشتیبانی می‌کند و می‌تواند حافظه نموداری را برای مدیریت روابط بین موجودیت‌ها ادغام کند. -## ایجاد عوامل هوش مصنوعی خودبهبود +#### Cognee -یک الگوی رایج برای عوامل خودبهبود شامل معرفی یک **"عامل دانش"** است. این عامل جداگانه مکالمه اصلی بین کاربر و عامل اصلی را مشاهده می‌کند. نقش آن شامل موارد زیر است: +رویکرد قدرتمند دیگر استفاده از **Cognee** است، یک حافظه معنایی متن‌باز برای عوامل هوش مصنوعی که داده‌های ساختاریافته و غیرساختاریافته را به نمودارهای دانش قابل پرسش تبدیل می‌کند که با embeddings پشتیبانی می‌شوند. Cognee یک **معماری ذخیره دوگانه** ارائه می‌دهد که جستجوی شباهت برداری را با روابط نمودار ترکیب می‌کند، و به عوامل اجازه می‌دهد نه تنها اطلاعات مشابه را درک کنند، بلکه چگونه مفاهیم به یکدیگر مرتبط هستند. -1. **شناسایی اطلاعات ارزشمند**: تعیین اینکه آیا بخشی از مکالمه ارزش ذخیره به عنوان دانش عمومی یا ترجیح خاص کاربر را دارد. +این ابزار در **بازیابی ترکیبی** که شباهت برداری، ساختار نمودار و استدلال LLM را ترکیب می‌کند - از جستجوی خام تا پاسخ‌دهی به سوالات آگاه از نمودار - برتری دارد. سیستم حافظه **زنده** را حفظ می‌کند که تکامل می‌یابد و رشد می‌کند در حالی که به عنوان یک نمودار متصل قابل پرسش باقی می‌ماند، و از زمینه جلسه کوتاه‌مدت و حافظه پایدار بلندمدت پشتیبانی می‌کند. -2. **استخراج و خلاصه‌سازی**: استخراج یادگیری یا ترجیح ضروری از مکالمه. +آموزش دفترچه یادداشت Cognee ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) ایجاد این لایه حافظه یکپارچه را نشان می‌دهد، با مثال‌های عملی از وارد کردن منابع داده متنوع، نمایش نمودار دانش و پرسش با استراتژی‌های جستجوی مختلف متناسب با نیازهای خاص عامل. -3. **ذخیره در پایگاه دانش**: ذخیره این اطلاعات استخراج‌شده، اغلب در یک پایگاه داده برداری، به‌طوری که بتوان آن را بعداً بازیابی کرد. +### ذخیره حافظه با RAG -4. **تقویت پرسش‌های آینده**: هنگامی که کاربر یک پرسش جدید را آغاز می‌کند، عامل دانش اطلاعات ذخیره‌شده مرتبط را بازیابی کرده و آن را به درخواست کاربر اضافه می‌کند، زمینه‌ای حیاتی برای عامل اصلی فراهم می‌کند (مشابه RAG). +فراتر از ابزارهای تخصصی حافظه مانند Mem0، شما می‌توانید از خدمات جستجوی قدرتمند مانند **Azure AI Search به عنوان بک‌اند برای ذخیره و بازیابی حافظه‌ها** استفاده کنید، به‌ویژه برای RAG ساختاریافته. -### بهینه‌سازی‌ها برای حافظه +این امکان را فراهم می‌کند که پاسخ‌های عامل خود را با داده‌های خودتان پایه‌گذاری کنید، و اطمینان حاصل کنید که پاسخ‌ها مرتبط‌تر و دقیق‌تر هستند. Azure AI Search می‌تواند برای ذخیره حافظه‌های سفر کاربر، کاتالوگ‌های محصول یا هر دانش خاص دامنه دیگری استفاده شود. -• **مدیریت تأخیر**: برای جلوگیری از کند شدن تعاملات کاربر، می‌توان ابتدا از یک مدل ارزان‌تر و سریع‌تر استفاده کرد تا به سرعت بررسی کند که آیا اطلاعات ارزش ذخیره یا بازیابی را دارد، و فقط در صورت لزوم فرآیند استخراج/بازیابی پیچیده‌تر را فراخوانی کرد. +Azure AI Search از قابلیت‌هایی مانند **RAG ساختاریافته** پشتیبانی می‌کند، که در استخراج و بازیابی اطلاعات متراکم و ساختاریافته از مجموعه داده‌های بزرگ مانند تاریخچه مکالمات، ایمیل‌ها یا حتی تصاویر برتری دارد. این نسبت به روش‌های سنتی تقسیم متن و embedding "دقت و بازیابی فوق‌العاده انسانی" ارائه می‌دهد. -• **نگهداری پایگاه دانش**: برای یک پایگاه دانش در حال رشد، اطلاعاتی که کمتر استفاده می‌شوند می‌توانند به "ذخیره سرد" منتقل شوند تا هزینه‌ها مدیریت شوند. +## ایجاد عوامل هوش مصنوعی خودبهبود -## سوالات بیشتری درباره حافظه عامل دارید؟ +یک الگوی رایج برای عوامل خودبهبود شامل معرفی یک **"عامل دانش"** است. این عامل جداگانه مکالمه اصلی بین کاربر و عامل اصلی را مشاهده می‌کند. نقش آن این است که: -به [Discord Azure AI Foundry](https://aka.ms/ai-agents/discord) بپیوندید تا با دیگر یادگیرندگان ملاقات کنید، در ساعات اداری شرکت کنید و سوالات خود درباره عوامل هوش مصنوعی را پاسخ دهید. +1. **شناسایی اطلاعات ارزشمند**: تعیین کند که آیا بخشی از مکالمه ارزش ذخیره به عنوان دانش عمومی یا ترجیح خاص کاربر را دارد. + +2. **استخراج و خلاصه‌سازی**: اطلاعات ضروری یا ترجیح را از مکالمه استخراج کند. + +3. **ذخیره در پایگاه دانش**: این اطلاعات استخراج‌شده را ذخیره کند، اغلب در یک پایگاه داده برداری، تا بعداً قابل بازیابی باشد. + +4. **تقویت پرسش‌های آینده**: وقتی کاربر یک پرسش جدید را آغاز می‌کند، عامل دانش اطلاعات ذخیره‌شده مرتبط را بازیابی کرده و به درخواست کاربر اضافه می‌کند، و زمینه مهمی را به عامل اصلی ارائه می‌دهد (مشابه RAG). + +### بهینه‌سازی‌ها برای حافظه + +• **مدیریت تأخیر**: برای جلوگیری از کند شدن تعاملات کاربر، می‌توان ابتدا از یک مدل ارزان‌تر و سریع‌تر استفاده کرد تا سریعاً بررسی کند که آیا اطلاعات ارزش ذخیره یا بازیابی را دارد، و فقط فرآیند استخراج/بازیابی پیچیده‌تر را در صورت لزوم فراخوانی کند. + +• **نگهداری پایگاه دانش**: برای یک پایگاه دانش در حال رشد، اطلاعات کمتر استفاده‌شده می‌تواند به "ذخیره سرد" منتقل شود تا هزینه‌ها مدیریت شود. + +## سوالات بیشتری درباره حافظه عامل دارید؟ + +به [Discord Azure AI Foundry](https://aka.ms/ai-agents/discord) بپیوندید تا با دیگر یادگیرندگان ملاقات کنید، در ساعات اداری شرکت کنید و سوالات خود درباره عوامل هوش مصنوعی را پاسخ دهید. --- + **سلب مسئولیت**: -این سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما تلاش می‌کنیم ترجمه‌ها دقیق باشند، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه می‌شود از ترجمه انسانی حرفه‌ای استفاده کنید. ما هیچ مسئولیتی در قبال سوء تفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم. \ No newline at end of file +این سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما تلاش می‌کنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادرستی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفه‌ای انسانی توصیه می‌شود. ما مسئولیتی در قبال سوء تفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم. + \ No newline at end of file diff --git a/translations/fi/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/fi/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..28d99171d --- /dev/null +++ b/translations/fi/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Rakentamassa tekoälyagentteja pysyvällä muistilla käyttäen Cognee\n", + "\n", + "Tämä muistikirja esittelee, kuinka rakentaa älykkäitä tekoälyagentteja kehittyneillä muistitoiminnoilla käyttäen [**cognee**](https://www.cognee.ai/) - avoimen lähdekoodin tekoälymuistia, joka yhdistää tietämyskartat, semanttisen haun ja istunnonhallinnan luodakseen kontekstia ymmärtäviä tekoälyjärjestelmiä.\n", + "\n", + "## 🎯 Oppimistavoitteet\n", + "\n", + "Tämän opetusohjelman lopussa ymmärrät, kuinka:\n", + "- **Rakentaa tietämyskarttoja upotusten avulla**: Muuntaa jäsentämätön teksti rakenteelliseksi, kyseltäväksi tiedoksi\n", + "- **Toteuttaa istuntomuisti**: Luoda monivaiheisia keskusteluja automaattisella kontekstin säilytyksellä\n", + "- **Säilyttää keskusteluja**: Tallentaa tarvittaessa tärkeitä vuorovaikutuksia pitkäaikaiseen muistiin tulevaa käyttöä varten\n", + "- **Kysellä luonnollisella kielellä**: Käyttää ja hyödyntää historiallista kontekstia uusissa keskusteluissa\n", + "- **Visualisoida muisti**: Tutkia agenttisi tietämyskartan suhteita\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Mitä tulet rakentamaan\n", + "\n", + "Tässä opetusohjelmassa luomme **Koodausavustajan**, jolla on pysyvä muisti ja joka:\n", + "\n", + "### 1. **Tietopohjan rakentaminen**\n", + " - Ottaa vastaan kehittäjän profiili- ja asiantuntijatietoja\n", + " - Käsittelee Python-ohjelmoinnin periaatteita ja parhaita käytäntöjä\n", + " - Tallentaa historialliset keskustelut kehittäjien ja tekoälyavustajien välillä\n", + "\n", + "### 2. **Istuntokohtaiset keskustelut**\n", + " - Säilyttää kontekstin useiden kysymysten välillä samassa istunnossa\n", + " - Tallentaa automaattisesti jokaisen kysymys/vastaus-parin tehokasta hakua varten\n", + " - Tarjoaa johdonmukaisia ja kontekstuaalisia vastauksia keskusteluhistorian perusteella\n", + "\n", + "### 3. **Pitkäaikainen muisti**\n", + " - Tallentaa tärkeät keskustelut pitkäaikaiseen muistiin\n", + " - Hakee olennaisia muistoja tietopohjasta ja aiemmista istunnoista uusien vuorovaikutusten tueksi\n", + " - Rakentaa kasvavan tietopohjan, joka paranee ajan myötä\n", + "\n", + "### 4. **Älykäs muistinhaku**\n", + " - Käyttää graafitietoista semanttista hakua löytääkseen olennaista tietoa kaikesta tallennetusta tiedosta\n", + " - Suodattaa hakuja tietoryhmien mukaan (kehittäjätiedot vs. periaatteet)\n", + " - Yhdistää useita tietolähteitä tarjotakseen kattavia vastauksia\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Esivaatimukset ja asennus\n", + "\n", + "### Järjestelmävaatimukset\n", + "\n", + "Ennen aloittamista varmista, että sinulla on:\n", + "\n", + "1. **Python-ympäristö**\n", + " - Python 3.9 tai uudempi\n", + " - Virtuaalinen ympäristö (suositeltu)\n", + " \n", + "2. **Redis-välimuisti** (vaaditaan istunnon hallintaan)\n", + " - Paikallinen Redis: `docker run -d -p 6379:6379 redis`\n", + " - Tai käytä hallinnoitua Redis-palvelua\n", + " \n", + "3. **LLM API -pääsy**\n", + " - OpenAI API -avain tai muiden palveluntarjoajien avain (katso [dokumentaatio](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Tietokantakonfiguraatio**\n", + " - Oletuksena ei vaadita konfiguraatiota. Cognee käyttää tiedostopohjaisia tietokantoja (LanceDB ja Kuzu)\n", + " - Vaihtoehtoisesti voit ottaa käyttöön Azure AI Searchin vektorivarastona (katso [dokumentaatio](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Ympäristön konfigurointi\n", + "\n", + "Luo `.env`-tiedosto projektikansioosi seuraavilla muuttujilla:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Cogneen muistirakenteen ymmärtäminen\n", + "\n", + "### Miten Cognee toimii\n", + "\n", + "Cognee tarjoaa kehittyneen muistijärjestelmän, joka ylittää yksinkertaisen avain-arvo-tallennuksen:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Keskeiset komponentit:\n", + "\n", + "1. **Tietämyskartta**: Tallentaa entiteetit, suhteet ja semanttiset yhteydet\n", + "2. **Vektoriesitykset**: Mahdollistaa semanttisen haun kaikesta tallennetusta tiedosta\n", + "3. **Istuntovälimuisti**: Säilyttää keskustelukontekstin istuntojen sisällä ja välillä\n", + "4. **NodeSets**: Järjestää tiedot loogisiin kategorioihin kohdennettua hakua varten\n", + "\n", + "### Muistityypit tässä opetusohjelmassa:\n", + "\n", + "- **Pysyvä muisti**: Pitkäaikaistallennus tietämyskartassa\n", + "- **Istuntomuisti**: Väliaikainen keskustelukonteksti Redis-välimuistissa\n", + "- **Semanttinen muisti**: Vektoreihin perustuva samankaltaisuushaku kaikesta datasta\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Asenna tarvittavat paketit\n", + "\n", + "Asenna Cognee Redis-tuen kanssa istunnon hallintaa varten:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Alusta ympäristö ja lataa kirjastot\n", + "\n", + "Varmista, että:\n", + "1. Redis on käynnissä (esim. Dockerin kautta: `docker run -d -p 6379:6379 redis`)\n", + "2. Ympäristömuuttujat on asetettu ennen välimuistimoduulien tuontia\n", + "3. Jos tarpeen, käynnistä ydin uudelleen ja suorita solut järjestyksessä\n", + "\n", + "Seuraava solu:\n", + "1. Lataa ympäristömuuttujat tiedostosta `.env`\n", + "2. Määrittää Cogneen LLM-asetuksillasi\n", + "3. Ota välimuisti käyttöön istunnon hallintaa varten\n", + "4. Varmistaa, että kaikki komponentit ovat asianmukaisesti yhdistettyjä\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Määritä tallennuskansiot\n", + "\n", + "Cognee käyttää kahta erillistä hakemistoa toiminnassaan:\n", + "- **Data Root**: Tallentaa syötetyt dokumentit ja käsitellyn datan\n", + "- **System Root**: Sisältää tietämyskartan tietokannan ja järjestelmän metatiedot\n", + "\n", + "Luomme erilliset hakemistot tätä opasta varten seuraavasti:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Nollaa muistintila\n", + "\n", + "Ennen kuin aloitamme muistijärjestelmän rakentamisen, varmistetaan, että aloitamme puhtaalta pöydältä.\n", + "\n", + "> 💡 **Vinkki**: Voit ohittaa tämän vaiheen, jos haluat säilyttää aiemmista ajoista peräisin olevat muistot, kun käytät tätä muistikirjaa myöhemmin.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Osa 1: Tietopohjan rakentaminen\n", + "\n", + "### Tietolähteet kehittäjäavustajallemme\n", + "\n", + "Luodaksemme kattavan tietopohjan, hyödynnämme kolmenlaisia tietoja:\n", + "\n", + "1. **Kehittäjäprofiili**: Henkilökohtainen asiantuntemus ja tekninen tausta \n", + "2. **Pythonin parhaat käytännöt**: Pythonin Zen ja käytännön ohjeet \n", + "3. **Aiemmat keskustelut**: Kehittäjien ja tekoälyavustajien väliset kysymys-vastaus-sessiot \n", + "\n", + "Tämä monipuolinen tieto mahdollistaa agenttimme: \n", + "- Ymmärtää käyttäjän teknisen taustan \n", + "- Soveltaa parhaita käytäntöjä suosituksissaan \n", + "- Oppia aiemmista onnistuneista vuorovaikutuksista \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Muunna data tietämysgrafiksi\n", + "\n", + "Nyt muutamme raakatekstimme jäsennellyksi muistiksi. Tämä prosessi:\n", + "\n", + "1. **Lisää dataa NodeSeteihin**: Järjestää tiedot loogisiin kategorioihin\n", + " - `developer_data`: Kehittäjäprofiili ja keskustelut\n", + " - `principles_data`: Pythonin parhaat käytännöt ja ohjeet\n", + "\n", + "2. **Suorittaa Cognify Pipeline**: Erottaa entiteetit, suhteet ja luo upotuksia\n", + " - Tunnistaa keskeiset käsitteet\n", + " - Luo semanttisia yhteyksiä liittyvän tiedon välille\n", + " - Generoi vektoriupotuksia\n", + "\n", + "Tämä voi kestää hetken, kun LLM käsittelee tekstiä ja rakentaa graafirakenteen:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Visualisoi tietämyskartta\n", + "\n", + "Tutkitaan tietämyskarttamme rakennetta. Visualisointi näyttää:\n", + "- **Solmut**: Tekstistä poimitut entiteetit (käsitteet, teknologiat, henkilöt)\n", + "- **Reunat**: Entiteettien väliset suhteet ja yhteydet\n", + "- **Klusterit**: Semanttisen samankaltaisuuden perusteella ryhmitellyt liittyvät käsitteet\n", + "\n", + "Avaa luotu HTML-tiedosto selaimessasi tutkiaksesi karttaa interaktiivisesti:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Rikasta muistia Memify-toiminnolla\n", + "\n", + "`memify()`-funktio analysoi tietämyskartan ja luo älykkäitä sääntöjä datasta. Tämä prosessi:\n", + "- Tunnistaa kaavoja ja parhaita käytäntöjä\n", + "- Luo sisältöön perustuvia toimintaohjeita\n", + "- Määrittää yhteyksiä eri tietämysalueiden välillä\n", + "\n", + "Nämä säännöt auttavat agenttia tekemään paremmin perusteltuja päätöksiä kysymyksiin vastatessaan. Toisen visualisoinnin tallentaminen auttaa sinua vertaamaan, kuinka kartta tiivistyy rikastamisen jälkeen.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Osa 2: Älykäs tiedonhaku\n", + "\n", + "### Demonstraatio 1: Tiedon yhdistäminen eri dokumenteista\n", + "\n", + "Nyt kun tietämyskartta on luotu, testataan, miten Cognee yhdistää tietoa useista lähteistä vastatakseen monimutkaisiin kysymyksiin.\n", + "\n", + "Ensimmäinen kysely havainnollistaa:\n", + "- **Semanttinen ymmärrys**: Löytää olennaisia käsitteitä, vaikka niitä ei mainittaisi suoraan\n", + "- **Ristiinviittaus**: Yhdistää kehittäjäprofiilin Python-periaatteisiin\n", + "- **Kontekstuaalinen päättely**: Soveltaa parhaita käytäntöjä tiettyihin toteutuksiin\n", + "\n", + "### Demonstraatio 2: Suodatettu haku NodeSetsin avulla\n", + "\n", + "Toinen kysely näyttää, miten kohdistaa tietämyskartan tiettyihin osajoukkoihin:\n", + "- Käyttää `node_name`-parametria etsiäkseen vain `principles_data`-alueelta\n", + "- Tarjoaa keskittyneitä vastauksia tietystä tietämysalueesta\n", + "- Hyödyllinen, kun tarvitset alakohtaista tietoa\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Osa 3: Istunnon hallinnan asennus\n", + "\n", + "### Keskustelumuistin käyttöönotto\n", + "\n", + "Istunnon hallinta on tärkeää kontekstin säilyttämiseksi useiden vuorovaikutusten aikana. Tässä teemme seuraavat vaiheet:\n", + "\n", + "1. **Käyttäjäkontekstin alustaminen**: Luo tai hae käyttäjäprofiili istunnon seurantaa varten\n", + "2. **Välimuistimoottorin määrittäminen**: Yhdistä Redis-palvelimeen keskusteluhistorian tallentamista varten\n", + "3. **Istuntomuuttujien käyttöönotto**: Määritä kontekstimuuttujat, jotka säilyvät kyselyiden välillä\n", + "\n", + "> ⚠️ **Tärkeää**: Tämä edellyttää, että Redis on käynnissä ja ympäristössäsi on asetettu `CACHING=true`\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Apufunktio: Tarkastele istuntotietoja\n", + "\n", + "Tämä apufunktio mahdollistaa Redisissä tallennetun keskusteluhistorian tarkastelun. Se on hyödyllinen seuraaviin tarkoituksiin:\n", + "- Istunnon hallinnan virheiden selvittäminen\n", + "- Varmistaminen, että keskustelut tallentuvat välimuistiin\n", + "- Ymmärtäminen, mitä kontekstia agentille on saatavilla\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Istunto 1: Async Support Lab — Ensimmäinen kysymys\n", + "\n", + "Aloita `async-support-lab`-istunto kysymällä telemetria-ystävällisiä asyncio-malleja massiiviselle web-skraperille. Graafi tuntee jo asyncio:n, aiohttp:n ja seurantakäytännöt, joten vastauksen tulisi heijastaa aiempia keskusteluja samalla kun se mukautetaan uuteen kysymykseen.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Tarkastele istunnon 1 muistia ensimmäisen vaihdon jälkeen\n", + "\n", + "Komennon `show_history(session_1)` suorittaminen heti alkuperäisen kysymyksen jälkeen vahvistaa, että Cognee tallensi sekä kehotteen että vastauksen Redis-tietokantaan. Sinun pitäisi nähdä yksi merkintä, jossa on samanaikaisuuden ohjeistus.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Istunto 1: Jatkoa tietomalleihin\n", + "\n", + "Seuraavaksi kysymme: \"Milloin minun pitäisi valita dataclasses verrattuna Pydanticiin?\" käyttäen samaa istuntotunnusta. Cogneen tulisi yhdistää Pythonin periaatteet sekä aiemmat FastAPI-keskustelut tarjotakseen hienovaraista neuvontaa—osoittaen, että konteksti säilyy nimetyssä istunnossa.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Vahvista, että istunnon 1 historia sisältää molemmat vuorot\n", + "\n", + "Toinen `show_history(session_1)`-kutsu pitäisi näyttää kaksi kysymys-vastausmerkintää. Tämä vastaa Mem0-laboratorion \"muistin toisto\" -vaihetta ja todistaa, että lisävuorot laajentavat samaa keskusteluhistoriaa.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Istunto 2: Suunnittelukatsauksen ketju — Uusi istunto\n", + "\n", + "Näyttääksemme ketjujen eristyksen käynnistämme `design-review-session` ja pyydämme lokiohjeita tapauskatsauksia varten. Vaikka taustalla oleva tietopohja on sama, uusi istuntotunnus pitää keskustelut erillään.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Katsaus Istuntoon 2 Historia\n", + "\n", + "`show_history(session_2)` pitäisi näyttää vain suunnitteluarvion kehotteen/vastauksen parin. Vertaa sitä Istuntoon 1 korostaaksesi, kuinka Cognee pitää erilliset transkriptiot samalla hyödyntäen jaettua tietämyskarttaa.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Yhteenveto\n", + "\n", + "Onnittelut! Olet juuri antanut koodausavustajallesi pitkäaikaisen muistikerroksen Cogneen avulla.\n", + "\n", + "Tässä opetusohjelmassa otit raakaa kehittäjäsisältöä (koodia, dokumentaatiota, keskusteluja) ja muutit sen graafiksi + vektorimuistiksi, jota agenttisi voi hakea, käyttää päättelyyn ja parantaa jatkuvasti.\n", + "\n", + "Mitä olet oppinut\n", + "\n", + "1. **Raakatekstistä tekoälymuistiin**: Kuinka Cognee käsittelee jäsentämätöntä dataa ja muuttaa sen älykkääksi, haettavaksi muistiksi yhdistetyn vektori- ja tietograafiarkkitehtuurin avulla.\n", + "\n", + "2. **Graafin rikastaminen memifyllä**: Kuinka mennä perusgraafin luomisen yli ja käyttää memifyä lisättyjen faktojen ja rikkaampien suhteiden lisäämiseen olemassa olevaan graafiisi.\n", + "\n", + "3. **Useita hakustrategioita**: Kuinka tehdä hakuja muistista eri hakutyypeillä (graafitietoinen kysymys-vastaus, RAG-tyylinen täydennys, oivallukset, raakapalaset, koodihaku jne.) riippuen siitä, mitä agenttisi tarvitsee.\n", + "\n", + "4. **Visuaalinen tutkiminen**: Kuinka tarkastella ja debugata Cogneen luomaa sisältöä graafivisualisointien ja Cogneen käyttöliittymän avulla, jotta voit nähdä, miten tieto on jäsennelty.\n", + "\n", + "5. **Istuntokohtainen muisti**: Kuinka yhdistää istuntokohtainen konteksti pysyvään semanttiseen muistiin, jotta agentit voivat muistaa eri käyttökertojen välillä ilman, että tietoa vuotaa käyttäjien välillä.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Keskeiset huomiot\n", + "1. Muisti tietämyskarttana, jota tukevat upotukset\n", + "\n", + " - **Jäsennelty ymmärrys**: Cognee yhdistää vektorivaraston ja graafivaraston, joten tietosi ovat sekä merkityksen mukaan haettavissa että suhteiden kautta yhdistettyjä. Cognee käyttää oletuksena tiedostopohjaisia tietokantoja (LanceDB vektorivarastolle, Kuzu graafitietokannalle).\n", + "\n", + " - **Suhteet huomioiva haku**: Vastaukset voivat perustua paitsi \"samankaltaiseen tekstiin\", myös siihen, miten entiteetit liittyvät toisiinsa.\n", + "\n", + " - **Elävä muisti**: Muistikerros kehittyy, kasvaa ja pysyy kyseltävissä yhtenä yhdistettynä graafina.\n", + "\n", + "2. Haku- ja päättelytilat\n", + " - **Hybridi haku**: Haku yhdistää vektorien samankaltaisuuden, graafirakenteen ja LLM-päättelyn, alkaen raakadatapalojen hausta graafitietoiseen kysymysten vastaamiseen.\n", + "\n", + " - **Sovita tila tehtävään**: Käytä täydentämistyyppisiä tiloja, kun haluat luonnollisen kielen vastauksia, ja pala-/yhteenveto-/graafitiloja, kun agenttisi tarvitsee raakakontekstia tai haluaa ohjata omaa päättelyään.\n", + "\n", + "3. Henkilökohtaiset, istuntotietoiset agentit\n", + " - **Istuntokonteksti + pitkäaikainen muisti**: Cognee pitää lyhytaikaisen \"keskusteluketjun\" kontekstin erillään pitkäikäisestä, käyttäjä- tai organisaatiotason muistista.\n", + "\n", + "## Reaaliaikaiset sovellukset\n", + "\n", + "1. **Vertikaaliset tekoälyagentit**\n", + "\n", + " Käytä tämän muistikirjan mallia luodaksesi alakohtaisia älykkäitä apureita, jotka toimivat Cogneen hakujen ja päättelyn ytimenä:\n", + "\n", + "- **Kehittäjäapureita**: Koodin tarkastelu, tapausanalyysi ja arkkitehtuurin avustajat, jotka käyvät läpi koodia, API:ita, suunnitteludokumentteja ja tikettejä yhtenä muistigraafina.\n", + "\n", + "- **Asiakaskohtaiset apurit**: Tukipalvelu- tai menestysagentit, jotka hakevat tuotteen dokumenteista, usein kysytyistä kysymyksistä, CRM-muistiinpanoista ja aiemmista tiketeistä graafitietoisen haun ja viitattujen vastausten avulla.\n", + "\n", + "- **Sisäiset asiantuntija-apurit**: Politiikka-, laki- tai turvallisuusavustajat, jotka tekevät päättelyä toisiinsa liittyvien sääntöjen, ohjeiden ja historiallisten päätösten perusteella erillisten PDF-tiedostojen sijaan.\n", + "\n", + " Cognee on nimenomaan suunniteltu pysyväksi, tarkaksi muistiksi tekoälyagenteille, tarjoten elävän tietämyskartan, joka toimii agenttisi taustalla ja korvaa ad hoc -yhdistelmät vektorivarastoista ja mukautetusta graafikoodista.\n", + "\n", + "2. **Tietosiilojen yhdistäminen yhdeksi muistiksi**\n", + "\n", + " Sama lähestymistapa auttaa sinua rakentamaan yhtenäisen muistikerroksen hajallaan olevista lähteistä:\n", + "\n", + "- **Siiloista yhdeksi graafiksi**: Tuo jäsenneltyä (esim. tietokannat) ja jäsentämätöntä dataa (esim. dokumentit, keskustelut) yhteen graafiin, jota tukevat upotukset, sen sijaan että jokaiselle järjestelmälle olisi erilliset indeksit.\n", + "\n", + "- **Lähteiden välinen päättely viitteiden kanssa**: Suorita monivaiheista päättelyä kaiken datan yli—\"yhdistä\" lokit, mittarit ja dokumentit graafin kautta—ja palauta silti perustellut vastaukset lähteineen.\n", + "\n", + "- **Tietokeskukset**: Esimerkiksi pankki- tai koulutusalalla Cognee yhdistää jo PDF-tiedostoja, sisäisiä järjestelmiä ja sovellustietoja yhdeksi tietämyskartaksi vektoreilla, jotta agentit voivat vastata kysymyksiin tarkalla, viitatuilla kontekstilla.\n", + "\n", + "## Seuraavat askeleet\n", + "\n", + "Olet toteuttanut muistiloopin ytimen. Tässä on luonnollisia jatkotoimia, joita voit kokeilla itse (katso [Cogneen dokumentaatio](https://docs.cognee.ai/) saadaksesi lisätietoja):\n", + "\n", + "1. **Kokeile ajallista tietoisuutta**: Ota käyttöön ajallinen kognitio, jotta voit poimia tapahtumia ja aikaleimoja tekstistä.\n", + "\n", + "2. **Ota käyttöön ontologiaohjattu päättely**: Määrittele OWL-ontologia alallesi. Käytä Cogneen ontologiatukea, jotta poimitut entiteetit ja suhteet perustuvat kyseiseen skeemaan, parantaen graafin laatua ja alakohtaisia vastauksia.\n", + "\n", + "3. **Lisää palautesilmukka**: Anna Cogneen säätää graafin reunapainoja todellisen käyttäjäpalautteen perusteella, jotta haku paranee ajan myötä eikä pysy staattisena.\n", + "\n", + "4. **Hienosäädä henkilökohtaistamista ja istuntokäyttäytymistä**: Käytä käyttäjätunnuksia, vuokralaisia ja tietojoukkoja antaaksesi jokaiselle henkilölle tai tiimille oman näkymän jaetun muistimoottorin yli.\n", + "\n", + "5. **Laajenna monimutkaisempiin agenteihin**: Liitä Cognee agenttikehyksiin rakentaaksesi monen agentin järjestelmiä, jotka kaikki jakavat saman muistikerroksen. *Microsoft Agent Framework x Cognee -lisäosa on tulossa pian.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Vastuuvapauslauseke**: \nTämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäinen asiakirja sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:06:31+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "fi" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/fi/13-agent-memory/README.md b/translations/fi/13-agent-memory/README.md index bfd425551..a3992eeb9 100644 --- a/translations/fi/13-agent-memory/README.md +++ b/translations/fi/13-agent-memory/README.md @@ -1,54 +1,62 @@ -# Muisti AI-agentteja varten -[![Agenttimuisti](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.fi.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) +# Muisti tekoälyagenteille +[![Agentin muisti](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.fi.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Kun puhutaan AI-agenttien luomisen ainutlaatuisista eduista, kaksi asiaa nousee esiin: kyky käyttää työkaluja tehtävien suorittamiseen ja kyky parantua ajan myötä. Muisti on keskeinen osa itseään kehittävän agentin luomista, joka voi tarjota parempia kokemuksia käyttäjillemme. +Kun puhutaan tekoälyagenttien ainutlaatuisista eduista, kaksi asiaa nousee usein esiin: kyky käyttää työkaluja tehtävien suorittamiseen ja kyky parantaa itseään ajan myötä. Muisti on keskeisessä roolissa itseään parantavien agenttien luomisessa, jotka voivat tarjota parempia kokemuksia käyttäjillemme. -Tässä oppitunnissa tarkastelemme, mitä muisti tarkoittaa AI-agenteille ja kuinka voimme hallita ja hyödyntää sitä sovellustemme hyväksi. +Tässä oppitunnissa tarkastelemme, mitä muisti tarkoittaa tekoälyagenteille ja kuinka voimme hallita ja hyödyntää sitä sovellustemme hyväksi. ## Johdanto Tämä oppitunti kattaa: -• **AI-agenttien muistin ymmärtäminen**: Mitä muisti on ja miksi se on tärkeää agenteille. +• **Tekoälyagenttien muistin ymmärtäminen**: Mitä muisti on ja miksi se on tärkeää agenteille. -• **Muistin toteuttaminen ja tallentaminen**: Käytännön menetelmiä muistikapasiteetin lisäämiseksi AI-agenteille, keskittyen lyhyt- ja pitkäaikaiseen muistiin. +• **Muistin toteuttaminen ja tallentaminen**: Käytännön menetelmiä muistikapasiteetin lisäämiseksi tekoälyagenteille, keskittyen lyhyt- ja pitkäkestoiseen muistiin. -• **AI-agenttien itseparantaminen**: Kuinka muisti mahdollistaa oppimisen aiemmista vuorovaikutuksista ja parantumisen ajan myötä. +• **Tekoälyagenttien itseoppiminen**: Kuinka muisti mahdollistaa oppimisen aiemmista vuorovaikutuksista ja parantumisen ajan myötä. + +## Saatavilla olevat toteutukset + +Tämä oppitunti sisältää kaksi kattavaa notebook-opasta: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Toteuttaa muistin Mem0:n ja Azure AI Searchin avulla Semantic Kernel -kehyksessä. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Toteuttaa rakenteellisen muistin Cognee-työkalulla, luoden automaattisesti tietämyskartan upotusten avulla, visualisoiden kartan ja mahdollistaen älykkään haun. ## Oppimistavoitteet Oppitunnin jälkeen osaat: -• **Erotella AI-agenttien eri muistityypit**, kuten työmuisti, lyhyt- ja pitkäaikainen muisti sekä erikoistuneet muodot, kuten persoonamuisti ja episodinen muisti. +• **Erotella erilaiset tekoälyagenttien muistityypit**, kuten työmuisti, lyhytkestoinen ja pitkäkestoinen muisti sekä erikoistuneet muodot, kuten persoonamuisti ja episodinen muisti. -• **Toteuttaa ja hallita lyhyt- ja pitkäaikaista muistia AI-agenteille** käyttämällä Semantic Kernel -kehystä, hyödyntämällä työkaluja kuten Mem0 ja Whiteboard-muisti sekä integroimalla Azure AI Searchin kanssa. +• **Toteuttaa ja hallita lyhyt- ja pitkäkestoista muistia tekoälyagenteille** Semantic Kernel -kehyksen avulla, hyödyntäen työkaluja kuten Mem0, Cognee, Whiteboard-muisti ja integrointi Azure AI Searchin kanssa. -• **Ymmärtää itseään kehittävien AI-agenttien periaatteet** ja kuinka vahvat muistinhallintajärjestelmät edistävät jatkuvaa oppimista ja sopeutumista. +• **Ymmärtää itseään parantavien tekoälyagenttien periaatteet** ja kuinka vahvat muistinhallintajärjestelmät edistävät jatkuvaa oppimista ja sopeutumista. -## AI-agenttien muistin ymmärtäminen +## Tekoälyagenttien muistin ymmärtäminen -Pohjimmiltaan **muisti AI-agenteille tarkoittaa mekanismeja, jotka mahdollistavat tiedon säilyttämisen ja muistamisen**. Tämä tieto voi olla yksityiskohtia keskustelusta, käyttäjän mieltymyksiä, aiempia toimia tai jopa opittuja malleja. +Ytimeltään **tekoälyagenttien muisti viittaa mekanismeihin, jotka mahdollistavat tiedon säilyttämisen ja muistamisen**. Tämä tieto voi olla yksityiskohtia keskustelusta, käyttäjän mieltymyksiä, aiempia toimia tai jopa opittuja kaavoja. -Ilman muistia AI-sovellukset ovat usein tilattomia, mikä tarkoittaa, että jokainen vuorovaikutus alkaa alusta. Tämä johtaa toistuvaan ja turhauttavaan käyttäjäkokemukseen, jossa agentti "unohtaa" aiemman kontekstin tai mieltymykset. +Ilman muistia tekoälysovellukset ovat usein tilattomia, mikä tarkoittaa, että jokainen vuorovaikutus alkaa alusta. Tämä johtaa toistuvaan ja turhauttavaan käyttäjäkokemukseen, jossa agentti "unohtaa" aiemman kontekstin tai mieltymykset. ### Miksi muisti on tärkeää? -Agentin älykkyys liittyy vahvasti sen kykyyn muistaa ja hyödyntää aiempaa tietoa. Muisti mahdollistaa, että agentit voivat olla: +Agentin älykkyys on tiiviisti sidoksissa sen kykyyn muistaa ja hyödyntää aiempaa tietoa. Muisti mahdollistaa, että agentit voivat olla: • **Reflektiivisiä**: Oppia aiemmista toimista ja tuloksista. -• **Vuorovaikutteisia**: Säilyttää kontekstin jatkuvan keskustelun aikana. +• **Vuorovaikutteisia**: Säilyttää konteksti jatkuvan keskustelun aikana. -• **Proaktiivisia ja reaktiivisia**: Ennakoida tarpeita tai vastata asianmukaisesti historiallisten tietojen perusteella. +• **Proaktiivisia ja reaktiivisia**: Ennakoida tarpeita tai reagoida asianmukaisesti historiallisten tietojen perusteella. • **Autonomisia**: Toimia itsenäisemmin hyödyntämällä tallennettua tietoa. @@ -58,103 +66,115 @@ Muistin toteuttamisen tavoitteena on tehdä agenteista **luotettavampia ja kyken #### Työmuisti -Ajattele tätä kuin muistilappua, jota agentti käyttää yhden tehtävän tai ajatusprosessin aikana. Se sisältää välittömän tiedon, joka tarvitaan seuraavan askeleen laskemiseen. +Ajattele tätä kuin muistilappua, jota agentti käyttää yhden tehtävän tai ajatusprosessin aikana. Se sisältää välittömän tiedon, jota tarvitaan seuraavan askeleen laskemiseen. -AI-agenteille työmuisti usein tallentaa keskustelun olennaisimmat tiedot, vaikka koko keskusteluhistoria olisi pitkä tai katkaistu. Se keskittyy keskeisten elementtien, kuten vaatimusten, ehdotusten, päätösten ja toimien, poimimiseen. +Tekoälyagenteille työmuisti usein tallentaa keskustelun olennaisimmat tiedot, vaikka koko keskusteluhistoria olisi pitkä tai katkaistu. Se keskittyy keskeisten elementtien, kuten vaatimusten, ehdotusten, päätösten ja toimien, poimimiseen. **Työmuistin esimerkki** Matkavarausagentti voi tallentaa käyttäjän nykyisen pyynnön, kuten "Haluan varata matkan Pariisiin". Tämä erityinen vaatimus pidetään agentin välittömässä kontekstissa ohjaamaan nykyistä vuorovaikutusta. -#### Lyhytaikainen muisti +#### Lyhytkestoinen muisti -Tämä muistityyppi säilyttää tiedot yhden keskustelun tai istunnon ajan. Se on nykyisen keskustelun konteksti, joka mahdollistaa agentin viittaamisen aiempiin vuoropuhelun käänteisiin. +Tämä muistityyppi säilyttää tiedon yhden keskustelun tai istunnon ajan. Se on nykyisen keskustelun konteksti, jonka avulla agentti voi viitata aiempiin vuoropuhelun osiin. -**Lyhytaikaisen muistin esimerkki** +**Lyhytkestoisen muistin esimerkki** -Jos käyttäjä kysyy, "Paljonko lento Pariisiin maksaisi?" ja jatkaa "Entä majoitus siellä?", lyhytaikainen muisti varmistaa, että agentti tietää "siellä" viittaavan "Pariisiin" saman keskustelun aikana. +Jos käyttäjä kysyy, "Paljonko lento Pariisiin maksaisi?" ja jatkaa "Entä majoitus siellä?", lyhytkestoinen muisti varmistaa, että agentti tietää "siellä" viittaavan "Pariisiin" saman keskustelun aikana. -#### Pitkäaikainen muisti +#### Pitkäkestoinen muisti -Tämä on tietoa, joka säilyy useiden keskustelujen tai istuntojen ajan. Se mahdollistaa agenttien muistamaan käyttäjän mieltymykset, historialliset vuorovaikutukset tai yleisen tiedon pitkällä aikavälillä. Tämä on tärkeää personoinnin kannalta. +Tämä on tietoa, joka säilyy useiden keskustelujen tai istuntojen yli. Se mahdollistaa agenttien muistavan käyttäjän mieltymykset, historialliset vuorovaikutukset tai yleisen tiedon pitkällä aikavälillä. Tämä on tärkeää personoinnin kannalta. -**Pitkäaikaisen muistin esimerkki** +**Pitkäkestoisen muistin esimerkki** -Pitkäaikainen muisti voi tallentaa, että "Ben pitää laskettelusta ja ulkoilma-aktiviteeteista, nauttii kahvista vuoristonäkymällä ja haluaa välttää vaativia laskettelurinteitä aiemman loukkaantumisen vuoksi". Tämä tieto, joka on opittu aiemmista vuorovaikutuksista, vaikuttaa suosituksiin tulevissa matkasuunnittelusessioissa, tehden niistä erittäin personoituja. +Pitkäkestoinen muisti voi tallentaa, että "Ben pitää laskettelusta ja ulkoilusta, nauttii kahvista vuoristonäkymällä ja haluaa välttää vaativia laskettelurinteitä aiemman loukkaantumisen vuoksi". Tämä tieto, joka on opittu aiemmista vuorovaikutuksista, vaikuttaa tuleviin matkasuunnittelusuosituksiin, tehden niistä erittäin personoituja. #### Persoonamuisti -Tämä erikoistunut muistityyppi auttaa agenttia kehittämään johdonmukaisen "persoonallisuuden" tai "roolin". Se mahdollistaa agentin muistamaan yksityiskohtia itsestään tai tarkoitetusta roolistaan, tehden vuorovaikutuksesta sujuvampaa ja keskittyneempää. +Tämä erikoistunut muistityyppi auttaa agenttia kehittämään johdonmukaisen "persoonallisuuden" tai "roolin". Se mahdollistaa agentin muistavan yksityiskohtia itsestään tai tarkoitetusta roolistaan, tehden vuorovaikutuksesta sujuvampaa ja keskittyneempää. **Persoonamuistin esimerkki** -Jos matkavarausagentti on suunniteltu olemaan "laskettelusuunnittelun asiantuntija", persoonamuisti voi vahvistaa tätä roolia, vaikuttaen sen vastauksiin asiantuntijan sävyyn ja tietämykseen. +Jos matkavarausagentti on suunniteltu olemaan "asiantuntija laskettelusuunnittelija", persoonamuisti voi vahvistaa tätä roolia, vaikuttaen sen vastauksiin asiantuntijan sävyllä ja tiedolla. -#### Työnkulku-/episodinen muisti +#### Työprosessi-/episodinen muisti -Tämä muisti tallentaa agentin suorittamien monimutkaisten tehtävien vaiheiden järjestyksen, mukaan lukien onnistumiset ja epäonnistumiset. Se on kuin muistaisi erityisiä "episodeja" tai aiempia kokemuksia oppiakseen niistä. +Tämä muisti tallentaa agentin suorittamien monimutkaisten tehtävien vaiheet, mukaan lukien onnistumiset ja epäonnistumiset. Se on kuin muistaisi tiettyjä "episodeja" tai aiempia kokemuksia oppiakseen niistä. **Episodisen muistin esimerkki** -Jos agentti yritti varata tietyn lennon, mutta se epäonnistui saatavuuden puutteen vuoksi, episodinen muisti voisi tallentaa tämän epäonnistumisen, jolloin agentti voisi yrittää vaihtoehtoisia lentoja tai informoida käyttäjää ongelmasta paremmin seuraavalla yrityksellä. +Jos agentti yritti varata tietyn lennon, mutta se epäonnistui saatavuuden puutteen vuoksi, episodinen muisti voisi tallentaa tämän epäonnistumisen, jolloin agentti voisi kokeilla vaihtoehtoisia lentoja tai tiedottaa käyttäjälle ongelmasta paremmin seuraavalla kerralla. #### Entiteettimuisti -Tämä liittyy tiettyjen entiteettien (kuten ihmisten, paikkojen tai asioiden) ja tapahtumien poimimiseen ja muistamiseen keskusteluista. Se mahdollistaa agentin rakentamaan rakenteellisen ymmärryksen keskustelluista keskeisistä elementeistä. +Tämä liittyy tiettyjen entiteettien (kuten ihmisten, paikkojen tai asioiden) ja tapahtumien poimimiseen ja muistamiseen keskusteluista. Se mahdollistaa agentin rakentaa rakenteellisen ymmärryksen keskusteltavista keskeisistä elementeistä. **Entiteettimuistin esimerkki** -Keskustelusta aiemmasta matkasta agentti voisi poimia "Pariisi", "Eiffel-torni" ja "illallinen Le Chat Noir -ravintolassa" entiteetteinä. Tulevassa vuorovaikutuksessa agentti voisi muistaa "Le Chat Noir" ja tarjota uutta varausta sinne. +Keskustelusta aiemmasta matkasta agentti voisi poimia "Pariisi", "Eiffel-torni" ja "illallinen Le Chat Noir -ravintolassa" entiteetteinä. Tulevassa vuorovaikutuksessa agentti voisi muistaa "Le Chat Noir" ja tarjota tehdä uuden varauksen sinne. #### Rakenteellinen RAG (Retrieval Augmented Generation) -Vaikka RAG on laajempi tekniikka, "Rakenteellinen RAG" korostetaan tehokkaana muistiteknologiana. Se poimii tiheää, rakenteellista tietoa eri lähteistä (keskustelut, sähköpostit, kuvat) ja käyttää sitä tarkkuuden, muistamisen ja nopeuden parantamiseen vastauksissa. Toisin kuin klassinen RAG, joka perustuu pelkästään semanttiseen samankaltaisuuteen, Rakenteellinen RAG toimii tiedon sisäisen rakenteen kanssa. +Vaikka RAG on laajempi tekniikka, "Rakenteellinen RAG" korostuu tehokkaana muistiteknologiana. Se poimii tiivistä, rakenteellista tietoa eri lähteistä (keskustelut, sähköpostit, kuvat) ja käyttää sitä tarkkuuden, muistamisen ja nopeuden parantamiseen vastauksissa. Toisin kuin perinteinen RAG, joka perustuu pelkästään semanttiseen samankaltaisuuteen, Rakenteellinen RAG hyödyntää tiedon sisäistä rakennetta. **Rakenteellisen RAG:n esimerkki** -Sen sijaan, että vain etsisi avainsanoja, Rakenteellinen RAG voisi jäsentää lentotiedot (kohde, päivämäärä, aika, lentoyhtiö) sähköpostista ja tallentaa ne rakenteellisesti. Tämä mahdollistaa tarkat kyselyt, kuten "Minkä lennon varasin Pariisiin tiistaina?" +Sen sijaan, että vain etsisi avainsanoja, Rakenteellinen RAG voisi analysoida lentotiedot (kohde, päivämäärä, aika, lentoyhtiö) sähköpostista ja tallentaa ne rakenteellisesti. Tämä mahdollistaa tarkat kyselyt, kuten "Minkä lennon varasin Pariisiin tiistaina?" ## Muistin toteuttaminen ja tallentaminen -Muistin toteuttaminen AI-agenteille sisältää systemaattisen **muistinhallintaprosessin**, joka sisältää tiedon tuottamisen, tallentamisen, hakemisen, integroimisen, päivittämisen ja jopa "unohtamisen" (tai poistamisen). Hakeminen on erityisen tärkeä osa. +Muistin toteuttaminen tekoälyagenteille sisältää systemaattisen **muistinhallintaprosessin**, joka kattaa tiedon luomisen, tallentamisen, hakemisen, integroinnin, päivittämisen ja jopa "unohtamisen" (tai poistamisen). Hakeminen on erityisen tärkeä osa. ### Erikoistuneet muistityökalut -Yksi tapa tallentaa ja hallita agenttimuistia on käyttää erikoistuneita työkaluja, kuten Mem0. Mem0 toimii pysyvänä muistikerroksena, joka mahdollistaa agenttien muistamaan olennaiset vuorovaikutukset, tallentamaan käyttäjän mieltymykset ja faktuaalisen kontekstin sekä oppimaan onnistumisista ja epäonnistumisista ajan myötä. Ajatuksena on, että tilattomat agentit muuttuvat tilallisiksi. +#### Mem0 + +Yksi tapa tallentaa ja hallita agentin muistia on käyttää erikoistuneita työkaluja, kuten Mem0. Mem0 toimii pysyvänä muistikerroksena, joka mahdollistaa agenttien muistaa olennaiset vuorovaikutukset, tallentaa käyttäjän mieltymykset ja faktuaalisen kontekstin sekä oppia onnistumisista ja epäonnistumisista ajan myötä. Ajatuksena on, että tilattomat agentit muuttuvat tilallisiksi. + +Se toimii **kaksivaiheisella muistiputkella: poiminta ja päivitys**. Ensin agentin ketjuun lisätyt viestit lähetetään Mem0-palveluun, joka käyttää suurta kielimallia (LLM) keskusteluhistorian tiivistämiseen ja uusien muistojen poimimiseen. Tämän jälkeen LLM-vetoinen päivitysvaihe päättää, lisätäänkö, muokataanko vai poistetaanko nämä muistot, tallentaen ne hybriditietokantaan, joka voi sisältää vektori-, graafi- ja avain-arvotietokantoja. Tämä järjestelmä tukee myös erilaisia muistityyppejä ja voi sisältää graafimuistin entiteettien välisten suhteiden hallintaan. + +#### Cognee + +Toinen tehokas lähestymistapa on käyttää **Cognee-työkalua**, avointa semanttista muistia tekoälyagenteille, joka muuntaa rakenteellisen ja rakenteettoman datan kyseltäviksi tietämyskartoiksi upotusten avulla. Cognee tarjoaa **kaksoistallennusarkkitehtuurin**, joka yhdistää vektorisimilaarisuushaun ja graafisuhteet, mahdollistaen agenttien ymmärtää paitsi mikä tieto on samanlaista, myös miten käsitteet liittyvät toisiinsa. + +Se loistaa **hybridihakujen** avulla, jotka yhdistävät vektorisimilaarisuuden, graafirakenteen ja LLM-päättelyn – raakadatasta graafitietoiseen kysymysten ratkaisuun. Järjestelmä ylläpitää **elävää muistia**, joka kehittyy ja kasvaa pysyen samalla kyseltävissä yhtenäisenä graafina, tukien sekä lyhytaikaista istuntokontekstia että pitkäaikaista pysyvää muistia. -Se toimii **kaksivaiheisella muistiputkella: poiminta ja päivitys**. Ensin agentin ketjuun lisätyt viestit lähetetään Mem0-palveluun, joka käyttää suurta kielimallia (LLM) keskusteluhistorian tiivistämiseen ja uusien muistojen poimimiseen. Tämän jälkeen LLM-ohjattu päivitysvaihe päättää, lisätäänkö, muokataanko vai poistetaanko nämä muistot, tallentaen ne hybriditietokantaan, joka voi sisältää vektori-, graafi- ja avain-arvo-tietokantoja. Tämä järjestelmä tukee myös erilaisia muistityyppejä ja voi sisältää graafimuistia entiteettien välisten suhteiden hallintaan. +Cognee-notebook-opas ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) esittelee tämän yhtenäisen muistikerroksen rakentamisen käytännön esimerkein, kuten monipuolisten tietolähteiden syöttämisen, tietämyskartan visualisoinnin ja erilaisten hakustrategioiden hyödyntämisen agentin tarpeisiin. -### Muistin tallentaminen RAG:lla +### Muistin tallentaminen RAG:n avulla -Erikoistuneiden muistityökalujen, kuten Mem0:n, lisäksi voit hyödyntää tehokkaita hakupalveluita, kuten **Azure AI Searchia muistojen tallentamiseen ja hakemiseen**, erityisesti rakenteellista RAG:ta varten. +Erikoistuneiden muistityökalujen, kuten Mem0:n, lisäksi voit hyödyntää vankkoja hakupalveluita, kuten **Azure AI Searchia muistien tallentamiseen ja hakemiseen**, erityisesti rakenteellista RAG:ia varten. -Tämä mahdollistaa agentin vastausten perustamisen omaan dataasi, varmistaen relevantimmat ja tarkemmat vastaukset. Azure AI Searchia voidaan käyttää käyttäjäkohtaisen matkamuistin, tuotekatalogien tai minkä tahansa muun alakohtaisen tiedon tallentamiseen. +Tämä mahdollistaa agentin vastausten perustamisen omaan dataasi, varmistaen relevantimmat ja tarkemmat vastaukset. Azure AI Searchia voidaan käyttää tallentamaan käyttäjäkohtaisia matkamuistoja, tuotekatalogeja tai mitä tahansa muuta alakohtaista tietoa. -Azure AI Search tukee ominaisuuksia, kuten **Rakenteellinen RAG**, joka erottuu tiheän, rakenteellisen tiedon poimimisessa ja hakemisessa suurista tietoaineistoista, kuten keskusteluhistorioista, sähköposteista tai jopa kuvista. Tämä tarjoaa "yliluonnollista tarkkuutta ja muistamista" verrattuna perinteisiin tekstin pilkkomis- ja upotusmenetelmiin. +Azure AI Search tukee ominaisuuksia, kuten **Rakenteellinen RAG**, joka loistaa tiiviin, rakenteellisen tiedon poimimisessa ja hakemisessa suurista tietoaineistoista, kuten keskusteluhistorioista, sähköposteista tai jopa kuvista. Tämä tarjoaa "yliluonnollista tarkkuutta ja muistamista" verrattuna perinteisiin tekstin pilkkomis- ja upotusmenetelmiin. -## AI-agenttien itseparantaminen +## Tekoälyagenttien itseoppiminen -Yleinen kaava itseään kehittäville agenteille sisältää **"tietoagentin"** käyttöönoton. Tämä erillinen agentti tarkkailee pääkeskustelua käyttäjän ja ensisijaisen agentin välillä. Sen rooli on: +Yleinen kaava itseään parantaville agenteille sisältää **"tietoagentin"** käyttöönoton. Tämä erillinen agentti tarkkailee pääkeskustelua käyttäjän ja ensisijaisen agentin välillä. Sen rooli on: -1. **Tunnistaa arvokas tieto**: Päätellä, onko keskustelun osa tallentamisen arvoista yleisenä tietona tai käyttäjän mieltymyksenä. +1. **Tunnistaa arvokas tieto**: Päätellä, onko keskustelun osassa jotain, joka kannattaa tallentaa yleisenä tietona tai käyttäjän erityisenä mieltymyksenä. 2. **Poimia ja tiivistää**: Tislaa keskustelusta olennaiset opit tai mieltymykset. 3. **Tallentaa tietokantaan**: Säilyttää poimittu tieto, usein vektoripohjaisessa tietokannassa, jotta se voidaan hakea myöhemmin. -4. **Laajentaa tulevia kyselyitä**: Kun käyttäjä aloittaa uuden kyselyn, tietoagentti hakee relevantin tallennetun tiedon ja liittää sen käyttäjän kehotteeseen, tarjoten tärkeän kontekstin ensisijaiselle agentille (samanlainen kuin RAG). +4. **Laajentaa tulevia kyselyitä**: Kun käyttäjä aloittaa uuden kyselyn, tietoagentti hakee relevantin tallennetun tiedon ja liittää sen käyttäjän pyyntöön, tarjoten tärkeän kontekstin ensisijaiselle agentille (samanlainen kuin RAG). ### Muistin optimoinnit -• **Viiveen hallinta**: Välttääkseen käyttäjävuorovaikutusten hidastumista, aluksi voidaan käyttää halvempaa ja nopeampaa mallia nopeasti tarkistamaan, onko tieto arvokasta tallentaa tai hakea, ja käyttää monimutkaisempaa poiminta-/hakuprosessia vain tarvittaessa. +• **Viiveen hallinta**: Välttääkseen käyttäjävuorovaikutusten hidastumista, voidaan aluksi käyttää halvempaa ja nopeampaa mallia tarkistamaan nopeasti, onko tieto arvokasta tallennettavaksi tai haettavaksi, ja käyttää monimutkaisempaa poiminta-/hakuprosessia vain tarvittaessa. -• **Tietokannan ylläpito**: Kasvavalle tietokannalle harvemmin käytetty tieto voidaan siirtää "kylmäsäilytykseen" kustannusten hallitsemiseksi. +• **Tietokannan ylläpito**: Kasvavassa tietokannassa harvemmin käytetty tieto voidaan siirtää "kylmäsäilytykseen" kustannusten hallitsemiseksi. -## Onko sinulla lisää kysymyksiä agenttimuistista? +## Onko sinulla lisää kysymyksiä agentin muistista? -Liity [Azure AI Foundry Discordiin](https://aka.ms/ai-agents/discord) tapaamaan muita oppijoita, osallistumaan toimistoaikoihin ja saamaan vastauksia AI-agentteihin liittyviin kysymyksiisi. +Liity [Azure AI Foundry Discordiin](https://aka.ms/ai-agents/discord) tapaamaan muita oppijoita, osallistumaan toimistotunteihin ja saamaan vastauksia tekoälyagentteihin liittyviin kysymyksiisi. --- + **Vastuuvapauslauseke**: -Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäistä asiakirjaa sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä. \ No newline at end of file +Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäinen asiakirja sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Tärkeissä tiedoissa suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä. + \ No newline at end of file diff --git a/translations/fr/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/fr/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..ec3d3662b --- /dev/null +++ b/translations/fr/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Construire des agents IA avec une mémoire persistante en utilisant Cognee\n", + "\n", + "Ce notebook montre comment créer des agents IA intelligents avec des capacités de mémoire sophistiquées en utilisant [**cognee**](https://www.cognee.ai/) - une mémoire IA open source qui combine des graphes de connaissances, une recherche sémantique et une gestion de session pour créer des systèmes IA sensibles au contexte.\n", + "\n", + "## 🎯 Objectifs d'apprentissage\n", + "\n", + "À la fin de ce tutoriel, vous serez capable de :\n", + "- **Construire des graphes de connaissances basés sur des embeddings** : Transformer du texte non structuré en connaissances structurées et interrogeables\n", + "- **Mettre en œuvre une mémoire de session** : Créer des conversations multi-tours avec une rétention automatique du contexte\n", + "- **Conserver les conversations** : Stocker éventuellement des interactions importantes dans une mémoire à long terme pour une utilisation future\n", + "- **Interroger en langage naturel** : Accéder et exploiter le contexte historique dans de nouvelles conversations\n", + "- **Visualiser la mémoire** : Explorer les relations dans le graphe de connaissances de votre agent\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Ce que vous allez construire\n", + "\n", + "Dans ce tutoriel, nous allons créer un **Assistant de Codage** avec une mémoire persistante qui :\n", + "\n", + "### 1. **Construction d'une base de connaissances**\n", + " - Intègre les informations sur le profil et l'expertise des développeurs\n", + " - Traite les principes et les bonnes pratiques de programmation en Python\n", + " - Stocke les conversations historiques entre les développeurs et les assistants IA\n", + "\n", + "### 2. **Conversations conscientes du contexte**\n", + " - Maintient le contexte à travers plusieurs questions dans une même session\n", + " - Met automatiquement en cache chaque paire question/réponse pour une récupération efficace\n", + " - Fournit des réponses cohérentes et contextuelles basées sur l'historique de la conversation\n", + "\n", + "### 3. **Mémoire à long terme**\n", + " - Conserve les conversations importantes dans une mémoire à long terme\n", + " - Récupère des souvenirs pertinents de la base de connaissances et des sessions passées pour informer de nouvelles interactions\n", + " - Construit une base de connaissances évolutive qui s'améliore avec le temps\n", + "\n", + "### 4. **Récupération intelligente de la mémoire**\n", + " - Utilise une recherche sémantique basée sur les graphes pour trouver des informations pertinentes dans toutes les connaissances stockées\n", + " - Filtre les recherches par sous-groupes de données (informations sur les développeurs vs principes)\n", + " - Combine plusieurs sources de données pour fournir des réponses complètes\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Prérequis et Configuration\n", + "\n", + "### Configuration système\n", + "\n", + "Avant de commencer, assurez-vous d'avoir :\n", + "\n", + "1. **Environnement Python**\n", + " - Python 3.9 ou supérieur\n", + " - Environnement virtuel (recommandé)\n", + " \n", + "2. **Cache Redis** (Requis pour la gestion des sessions)\n", + " - Redis local : `docker run -d -p 6379:6379 redis`\n", + " - Ou utilisez un service Redis géré\n", + " \n", + "3. **Accès à l'API LLM**\n", + " - Clé API OpenAI ou autres fournisseurs (voir [documentation](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Configuration de la base de données**\n", + " - Aucune configuration requise par défaut. Cognee utilise des bases de données basées sur des fichiers (LanceDB et Kuzu)\n", + " - Optionnellement, vous pouvez configurer Azure AI Search comme magasin de vecteurs (voir [documentation](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Configuration de l'environnement\n", + "\n", + "Créez un fichier `.env` dans le répertoire de votre projet avec les variables suivantes :\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Comprendre l'Architecture Mémoire de Cognee\n", + "\n", + "### Comment fonctionne Cognee\n", + "\n", + "Cognee offre un système de mémoire sophistiqué qui va au-delà d'un simple stockage clé-valeur :\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Composants clés :\n", + "\n", + "1. **Graph de Connaissances** : Stocke les entités, les relations et les connexions sémantiques\n", + "2. **Embeddings Vectoriels** : Permet la recherche sémantique à travers toutes les informations stockées\n", + "3. **Cache de Session** : Conserve le contexte des conversations au sein et entre les sessions\n", + "4. **NodeSets** : Organise les données en catégories logiques pour une récupération ciblée\n", + "\n", + "### Types de mémoire dans ce tutoriel :\n", + "\n", + "- **Mémoire Persistante** : Stockage à long terme dans le graph de connaissances\n", + "- **Mémoire de Session** : Contexte temporaire des conversations dans le cache Redis\n", + "- **Mémoire Sémantique** : Recherche de similarité basée sur des vecteurs à travers toutes les données\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Installer les paquets requis\n", + "\n", + "Installez Cognee avec le support de Redis pour la gestion des sessions :\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Initialiser l'environnement et charger les bibliothèques\n", + "\n", + "Assurez-vous que :\n", + "1. Redis est en cours d'exécution (par exemple, via Docker : `docker run -d -p 6379:6379 redis`)\n", + "2. Les variables d'environnement sont définies avant d'importer les modules de cache\n", + "3. Si nécessaire, redémarrez le noyau et exécutez les cellules dans l'ordre\n", + "\n", + "La cellule suivante va :\n", + "1. Charger les variables d'environnement depuis `.env`\n", + "2. Configurer Cognee avec vos paramètres LLM\n", + "3. Activer la mise en cache pour la gestion des sessions\n", + "4. Valider que tous les composants sont correctement connectés\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Configurer les répertoires de stockage\n", + "\n", + "Cognee utilise deux répertoires distincts pour ses opérations :\n", + "- **Racine des données** : Stocke les documents ingérés et les données traitées\n", + "- **Racine système** : Contient la base de données du graphe de connaissances et les métadonnées du système\n", + "\n", + "Nous allons créer des répertoires isolés pour ce tutoriel comme suit :\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Réinitialiser l'état de la mémoire\n", + "\n", + "Avant de commencer à construire notre système de mémoire, assurons-nous de partir sur une base saine.\n", + "\n", + "> 💡 **Astuce** : Vous pouvez passer cette étape si vous souhaitez conserver les souvenirs existants de vos précédentes exécutions lorsque vous utiliserez ce notebook ultérieurement.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Partie 1 : Construire la base de connaissances\n", + "\n", + "### Sources de données pour notre assistant développeur\n", + "\n", + "Nous allons intégrer trois types de données pour créer une base de connaissances complète :\n", + "\n", + "1. **Profil du développeur** : Expertise personnelle et parcours technique \n", + "2. **Bonnes pratiques Python** : Le Zen de Python avec des directives pratiques \n", + "3. **Conversations historiques** : Sessions de questions-réponses passées entre développeurs et assistants IA \n", + "\n", + "Ces données variées permettent à notre agent de : \n", + "- Comprendre le contexte technique de l'utilisateur \n", + "- Appliquer les meilleures pratiques dans ses recommandations \n", + "- Apprendre des interactions réussies précédentes \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Transformer les données en graphe de connaissances\n", + "\n", + "Nous allons maintenant transformer notre texte brut en une mémoire structurée. Ce processus :\n", + "\n", + "1. **Ajoute des données aux NodeSets** : Organise les informations en catégories logiques\n", + " - `developer_data` : Profil du développeur et conversations\n", + " - `principles_data` : Bonnes pratiques et directives Python\n", + "\n", + "2. **Exécute le pipeline Cognify** : Extrait les entités, les relations et crée des embeddings\n", + " - Identifie les concepts clés\n", + " - Crée des connexions sémantiques entre les informations liées\n", + " - Génère des embeddings vectoriels\n", + "\n", + "Cela peut prendre quelques instants pendant que le LLM traite le texte et construit la structure du graphe :\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Visualiser le graphe de connaissances\n", + "\n", + "Explorons la structure de notre graphe de connaissances. La visualisation montre :\n", + "- **Nœuds** : Entités extraites du texte (concepts, technologies, personnes)\n", + "- **Arêtes** : Relations et connexions entre les entités\n", + "- **Clusters** : Concepts liés regroupés par similarité sémantique\n", + "\n", + "Ouvrez le fichier HTML généré dans votre navigateur pour explorer le graphe de manière interactive :\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Enrichir la mémoire avec Memify\n", + "\n", + "La fonction `memify()` analyse le graphe de connaissances et génère des règles intelligentes sur les données. Ce processus :\n", + "- Identifie des modèles et des bonnes pratiques\n", + "- Crée des directives exploitables basées sur le contenu\n", + "- Établit des relations entre différentes zones de connaissances\n", + "\n", + "Ces règles aident l'agent à prendre des décisions plus éclairées lorsqu'il répond aux questions. Capturer une deuxième visualisation vous permet de comparer comment le graphe se densifie une fois enrichi.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Partie 2 : Récupération intelligente de la mémoire\n", + "\n", + "### Démonstration 1 : Intégration des connaissances entre documents\n", + "\n", + "Maintenant que notre graphe de connaissances est construit, testons comment Cognee combine des informations provenant de plusieurs sources pour répondre à des questions complexes.\n", + "\n", + "La première requête démontre :\n", + "- **Compréhension sémantique** : Trouver des concepts pertinents même s'ils ne sont pas mentionnés explicitement\n", + "- **Référencement croisé** : Combiner le profil du développeur avec les principes de Python\n", + "- **Raisonnement contextuel** : Appliquer les meilleures pratiques à des implémentations spécifiques\n", + "\n", + "### Démonstration 2 : Recherche filtrée avec NodeSets\n", + "\n", + "La deuxième requête montre comment cibler des sous-ensembles spécifiques du graphe de connaissances :\n", + "- Utilise le paramètre `node_name` pour rechercher uniquement dans `principles_data`\n", + "- Fournit des réponses ciblées provenant d'un domaine de connaissances spécifique\n", + "- Utile lorsque vous avez besoin d'informations spécifiques à un domaine\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Partie 3 : Configuration de la gestion des sessions\n", + "\n", + "### Activer la mémoire des conversations\n", + "\n", + "La gestion des sessions est essentielle pour conserver le contexte au fil de plusieurs interactions. Ici, nous allons :\n", + "\n", + "1. **Initialiser le contexte utilisateur** : Créer ou récupérer un profil utilisateur pour le suivi des sessions\n", + "2. **Configurer le moteur de cache** : Se connecter à Redis pour stocker l'historique des conversations\n", + "3. **Activer les variables de session** : Configurer des variables de contexte qui persistent entre les requêtes\n", + "\n", + "> ⚠️ **Important** : Cela nécessite que Redis soit en cours d'exécution et que `CACHING=true` soit activé dans votre environnement\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Fonction d'aide : Voir l'historique de session\n", + "\n", + "Cette fonction utilitaire nous permet d'inspecter l'historique des conversations stocké dans Redis. Elle est utile pour :\n", + "- Déboguer la gestion des sessions\n", + "- Vérifier que les conversations sont mises en cache\n", + "- Comprendre quel contexte est disponible pour l'agent\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Session 1 : Laboratoire de support asynchrone — Première question\n", + "\n", + "Lancez la session `async-support-lab` en demandant des modèles asyncio adaptés à la télémétrie pour un énorme outil de scraping web. Le graphe connaît déjà asyncio, aiohttp et les pratiques de surveillance, donc la réponse devrait refléter les conversations précédentes tout en adaptant la réponse à cette nouvelle requête.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Inspecter la mémoire de la session 1 après le premier échange\n", + "\n", + "Exécuter `show_history(session_1)` immédiatement après la question initiale confirme que Cognee a enregistré à la fois l'invite et la réponse dans Redis. Vous devriez voir une entrée avec les indications de concurrence.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Session 1 : Suivi sur les modèles de données\n", + "\n", + "Ensuite, nous nous demandons : \"Quand devrais-je choisir dataclasses plutôt que Pydantic ?\" en utilisant le même identifiant de session. Cognee devrait rassembler les principes Python ainsi que les conversations précédentes sur FastAPI pour fournir des conseils nuancés—démontrant que le contexte se poursuit au sein d'une session nommée.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Confirmer que l'historique de la session 1 contient les deux échanges\n", + "\n", + "Un autre appel à `show_history(session_1)` devrait révéler deux entrées de questions-réponses. Cela correspond à l'étape de \"relecture de mémoire\" du laboratoire Mem0 et prouve que des échanges supplémentaires prolongent le même transcript.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Session 2 : Fil de discussion sur la revue de conception — Nouvelle session\n", + "\n", + "Pour montrer l'isolation entre les fils de discussion, nous lançons `design-review-session` et demandons des conseils de journalisation pour les revues d'incidents. Bien que la base de connaissances sous-jacente soit la même, le nouvel identifiant de session permet de garder les transcriptions séparées.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Révision de la session 2 : Histoire\n", + "\n", + "`show_history(session_2)` doit uniquement afficher le couple de question/réponse de la revue de conception. Comparez cela avec la Session 1 pour mettre en évidence comment Cognee conserve des transcriptions indépendantes tout en réutilisant le graphe de connaissances partagé.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Résumé\n", + "\n", + "Félicitations ! Vous venez d'offrir à votre assistant de codage une véritable couche de mémoire à long terme grâce à Cognee.\n", + "\n", + "Dans ce tutoriel, vous avez pris du contenu brut de développeur (code, documents, discussions) et l'avez transformé en une mémoire graphique + vectorielle que votre agent peut rechercher, analyser et améliorer en continu.\n", + "\n", + "Ce que vous avez appris :\n", + "\n", + "1. **Du texte brut à la mémoire IA** : Comment Cognee ingère des données non structurées et les transforme en une mémoire intelligente et consultable grâce à une architecture combinée de vecteurs + graphe de connaissances.\n", + "\n", + "2. **Enrichissement du graphe avec memify** : Comment aller au-delà de la création de graphe de base et utiliser memify pour ajouter des faits dérivés et des relations plus riches à votre graphe existant.\n", + "\n", + "3. **Stratégies de recherche multiples** : Comment interroger la mémoire avec différents types de recherche (Q&R avec conscience du graphe, complétion de style RAG, insights, fragments bruts, recherche de code, etc.) en fonction des besoins de votre agent.\n", + "\n", + "4. **Exploration visuelle** : Comment inspecter et déboguer ce que Cognee a construit en utilisant des visualisations de graphe et l'interface utilisateur de Cognee, afin de voir concrètement comment les connaissances sont structurées.\n", + "\n", + "5. **Mémoire sensible aux sessions** : Comment combiner le contexte par session avec une mémoire sémantique persistante pour que les agents puissent se souvenir d'une session à l'autre sans divulguer d'informations entre les utilisateurs.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Points Clés\n", + "1. Mémoire sous forme de Graphique de Connaissances soutenue par des Embeddings\n", + "\n", + " - **Compréhension structurée** : Cognee combine un magasin de vecteurs et un magasin de graphes pour que vos données soient à la fois recherchables par signification et connectées par des relations. Par défaut, Cognee utilise des bases de données basées sur des fichiers (LanceDB pour les vecteurs, Kuzu pour les bases de données graphiques).\n", + "\n", + " - **Récupération sensible aux relations** : Les réponses peuvent être basées non seulement sur du \"texte similaire\", mais aussi sur la manière dont les entités sont reliées.\n", + "\n", + " - **Mémoire vivante** : La couche mémoire évolue, grandit et reste interrogeable comme un graphique connecté unique.\n", + "\n", + "2. Modes de Recherche et de Raisonnement\n", + " - **Récupération hybride** : La recherche combine la similarité vectorielle, la structure du graphe et le raisonnement LLM, allant de la recherche brute de fragments à des réponses aux questions tenant compte du graphe.\n", + "\n", + " - **Adapter le mode à la tâche** : Utilisez les modes de type complétion lorsque vous souhaitez des réponses en langage naturel, et les modes fragment/résumé/graphe lorsque votre agent a besoin de contexte brut ou pour alimenter son propre raisonnement.\n", + "\n", + "3. Agents Personnalisés et Sensibles aux Sessions\n", + " - **Contexte de session + mémoire à long terme** : Cognee sépare le contexte à court terme des \"fils de discussion\" de la mémoire durable au niveau de l'utilisateur ou de l'organisation.\n", + "\n", + "## Applications Réelles\n", + "\n", + "1. **Agents IA Verticaux**\n", + "\n", + " Utilisez le modèle de ce notebook pour alimenter des copilotes intelligents dans leur domaine, reposant sur Cognee comme cœur de récupération et de raisonnement :\n", + "\n", + "- **Copilotes pour développeurs** : Assistance pour la revue de code, l'analyse d'incidents et l'architecture, traversant le code, les API, les documents de conception et les tickets comme un seul graphique mémoire.\n", + "\n", + "- **Copilotes orientés client** : Agents de support ou de succès qui puisent dans les documents produits, FAQ, notes CRM et tickets passés avec une récupération tenant compte des graphes et des réponses citées.\n", + "\n", + "- **Copilotes experts internes** : Assistants en politique, juridique ou sécurité qui raisonnent sur des règles, directives et décisions historiques interconnectées au lieu de PDF isolés.\n", + "\n", + " Cognee se positionne explicitement comme une mémoire persistante et précise pour les agents IA, fournissant un graphique de connaissances vivant qui s'intègre derrière votre agent et remplace les combinaisons ad hoc de magasins de vecteurs et de code graphique personnalisé.\n", + "\n", + "2. **Unifier les Silos de Données en une Mémoire Unique**\n", + "\n", + " La même approche vous aide également à construire une couche mémoire unifiée à partir de sources dispersées :\n", + "\n", + "- **Des silos à un seul graphe** : Intégrez des données structurées (par ex., bases de données) et non structurées (par ex., documents, discussions) dans un seul graphe soutenu par des embeddings, plutôt que des index séparés pour chaque système.\n", + "\n", + "- **Raisonnement inter-sources avec citations** : Effectuez un raisonnement en plusieurs étapes sur tout—\"joignez\" journaux, métriques et documents via le graphe—et retournez toujours des réponses fondées avec provenance.\n", + "\n", + "- **Hubs de connaissances** : Pour des domaines comme la banque ou l'éducation, Cognee est déjà utilisé pour unifier des PDF, des systèmes internes et des données d'applications en un seul graphique de connaissances avec des vecteurs, permettant aux agents de répondre à des questions avec un contexte précis et cité.\n", + "\n", + "## Prochaines Étapes\n", + "\n", + "Vous avez mis en œuvre la boucle mémoire principale. Voici des extensions naturelles que vous pouvez essayer par vous-même (voir la [documentation Cognee](https://docs.cognee.ai/) pour plus de détails) :\n", + "\n", + "1. **Expérimentez avec la conscience temporelle** : Activez la fonction de cognition temporelle pour extraire des événements et des horodatages à partir de texte.\n", + "\n", + "2. **Introduisez un raisonnement basé sur une ontologie** : Définissez une ontologie OWL pour votre domaine. Utilisez le support d'ontologie de Cognee pour que les entités et relations extraites soient ancrées dans ce schéma, améliorant la qualité du graphe et les réponses spécifiques au domaine.\n", + "\n", + "3. **Ajoutez une boucle de rétroaction** : Permettez à Cognee d'ajuster les poids des arêtes du graphe à partir des retours réels des utilisateurs, afin que la récupération s'améliore avec le temps au lieu de rester statique.\n", + "\n", + "4. **Optimisez pour la personnalisation et le comportement en session** : Utilisez des identifiants d'utilisateur, des locataires et des ensembles de données pour offrir à chaque personne ou équipe sa propre vue sur le moteur de mémoire partagé.\n", + "\n", + "5. **Étendez à des agents plus complexes** : Connectez Cognee à des frameworks d'agents pour construire des systèmes multi-agents partageant tous la même couche mémoire. *Le plugin Microsoft Agent Framework x Cognee arrive bientôt.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Avertissement** : \nCe document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de recourir à une traduction humaine professionnelle. Nous ne sommes pas responsables des malentendus ou des interprétations erronées résultant de l'utilisation de cette traduction.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:14:02+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "fr" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/fr/13-agent-memory/README.md b/translations/fr/13-agent-memory/README.md index 083c9bff4..e23925582 100644 --- a/translations/fr/13-agent-memory/README.md +++ b/translations/fr/13-agent-memory/README.md @@ -1,28 +1,36 @@ -# Mémoire pour les Agents IA +# Mémoire pour les Agents IA [![Mémoire des Agents](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.fr.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Lorsqu'on parle des avantages uniques de la création d'agents IA, deux aspects sont principalement abordés : la capacité à utiliser des outils pour accomplir des tâches et la capacité à s'améliorer avec le temps. La mémoire est au cœur de la création d'agents auto-améliorants capables d'offrir de meilleures expériences à nos utilisateurs. +Lorsqu'on parle des avantages uniques de la création d'Agents IA, deux aspects sont principalement abordés : la capacité d'utiliser des outils pour accomplir des tâches et la capacité de s'améliorer avec le temps. La mémoire est au cœur de la création d'agents auto-améliorants qui peuvent offrir de meilleures expériences à nos utilisateurs. -Dans cette leçon, nous examinerons ce qu'est la mémoire pour les agents IA, comment la gérer et l'utiliser pour améliorer nos applications. +Dans cette leçon, nous examinerons ce qu'est la mémoire pour les Agents IA, comment la gérer et l'utiliser pour améliorer nos applications. ## Introduction Cette leçon couvrira : -• **Comprendre la mémoire des agents IA** : Ce qu'est la mémoire et pourquoi elle est essentielle pour les agents. +• **Comprendre la mémoire des Agents IA** : Ce qu'est la mémoire et pourquoi elle est essentielle pour les agents. • **Implémenter et stocker la mémoire** : Méthodes pratiques pour ajouter des capacités de mémoire à vos agents IA, en se concentrant sur la mémoire à court et à long terme. -• **Rendre les agents IA auto-améliorants** : Comment la mémoire permet aux agents d'apprendre des interactions passées et de s'améliorer avec le temps. +• **Rendre les Agents IA auto-améliorants** : Comment la mémoire permet aux agents d'apprendre des interactions passées et de s'améliorer avec le temps. + +## Implémentations disponibles + +Cette leçon inclut deux tutoriels complets sous forme de notebooks : + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)** : Implémente la mémoire en utilisant Mem0 et Azure AI Search avec le framework Semantic Kernel. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)** : Implémente une mémoire structurée avec Cognee, construisant automatiquement un graphe de connaissances basé sur des embeddings, visualisant le graphe et permettant une récupération intelligente. ## Objectifs d'apprentissage @@ -30,24 +38,27 @@ Après avoir terminé cette leçon, vous saurez : • **Différencier les différents types de mémoire des agents IA**, y compris la mémoire de travail, à court terme, à long terme, ainsi que des formes spécialisées comme la mémoire de persona et épisodique. -• **Implémenter et gérer la mémoire à court et à long terme pour les agents IA** en utilisant le framework Semantic Kernel, en exploitant des outils comme Mem0 et Whiteboard memory, et en intégrant Azure AI Search. +• **Implémenter et gérer la mémoire à court et à long terme pour les agents IA** en utilisant le framework Semantic Kernel, en exploitant des outils comme Mem0, Cognee, la mémoire Whiteboard, et en intégrant Azure AI Search. • **Comprendre les principes des agents IA auto-améliorants** et comment des systèmes de gestion de mémoire robustes contribuent à l'apprentissage et à l'adaptation continus. -## Comprendre la mémoire des agents IA +## Comprendre la mémoire des Agents IA -Au cœur de tout, **la mémoire pour les agents IA fait référence aux mécanismes qui leur permettent de conserver et de rappeler des informations**. Ces informations peuvent inclure des détails spécifiques sur une conversation, les préférences des utilisateurs, des actions passées ou même des schémas appris. +Au cœur de tout cela, **la mémoire pour les agents IA fait référence aux mécanismes qui leur permettent de retenir et de rappeler des informations**. Ces informations peuvent inclure des détails spécifiques sur une conversation, les préférences des utilisateurs, des actions passées ou même des schémas appris. -Sans mémoire, les applications IA sont souvent sans état, ce qui signifie que chaque interaction commence à zéro. Cela conduit à une expérience utilisateur répétitive et frustrante où l'agent "oublie" le contexte ou les préférences précédents. +Sans mémoire, les applications IA sont souvent sans état, ce qui signifie que chaque interaction commence à zéro. Cela conduit à une expérience utilisateur répétitive et frustrante où l'agent "oublie" le contexte ou les préférences précédentes. ### Pourquoi la mémoire est-elle importante ? L'intelligence d'un agent est étroitement liée à sa capacité à se souvenir et à utiliser des informations passées. La mémoire permet aux agents d'être : -• **Réfléchis** : Apprendre des actions et résultats passés. -• **Interactifs** : Maintenir le contexte au cours d'une conversation en cours. -• **Proactifs et réactifs** : Anticiper les besoins ou répondre de manière appropriée en fonction des données historiques. -• **Autonomes** : Fonctionner de manière plus indépendante en s'appuyant sur des connaissances stockées. +• **Réfléchis** : Apprendre des actions et résultats passés. + +• **Interactifs** : Maintenir le contexte au cours d'une conversation en cours. + +• **Proactifs et réactifs** : Anticiper les besoins ou répondre de manière appropriée en fonction des données historiques. + +• **Autonomes** : Fonctionner de manière plus indépendante en s'appuyant sur des connaissances stockées. L'objectif de l'implémentation de la mémoire est de rendre les agents plus **fiables et compétents**. @@ -55,13 +66,13 @@ L'objectif de l'implémentation de la mémoire est de rendre les agents plus **f #### Mémoire de travail -Pensez à cela comme à un bout de papier brouillon qu'un agent utilise pendant une tâche ou un processus de réflexion en cours. Elle contient les informations immédiates nécessaires pour effectuer l'étape suivante. +Pensez à cela comme à une feuille de brouillon qu'un agent utilise pendant une tâche ou un processus de réflexion en cours. Elle contient les informations immédiates nécessaires pour calculer l'étape suivante. Pour les agents IA, la mémoire de travail capture souvent les informations les plus pertinentes d'une conversation, même si l'historique complet du chat est long ou tronqué. Elle se concentre sur l'extraction des éléments clés comme les exigences, les propositions, les décisions et les actions. **Exemple de mémoire de travail** -Dans un agent de réservation de voyages, la mémoire de travail pourrait capturer la demande actuelle de l'utilisateur, comme "Je veux réserver un voyage à Paris". Cette exigence spécifique est conservée dans le contexte immédiat de l'agent pour guider l'interaction en cours. +Dans un agent de réservation de voyage, la mémoire de travail pourrait capturer la demande actuelle de l'utilisateur, comme "Je veux réserver un voyage à Paris". Cette exigence spécifique est conservée dans le contexte immédiat de l'agent pour guider l'interaction en cours. #### Mémoire à court terme @@ -73,7 +84,7 @@ Si un utilisateur demande : "Combien coûterait un vol pour Paris ?" puis encha #### Mémoire à long terme -C'est une information qui persiste à travers plusieurs conversations ou sessions. Elle permet aux agents de se souvenir des préférences des utilisateurs, des interactions passées ou des connaissances générales sur de longues périodes. Cela est essentiel pour la personnalisation. +C'est une information qui persiste à travers plusieurs conversations ou sessions. Elle permet aux agents de se souvenir des préférences des utilisateurs, des interactions historiques ou des connaissances générales sur de longues périodes. Cela est important pour la personnalisation. **Exemple de mémoire à long terme** @@ -101,7 +112,7 @@ Cela implique d'extraire et de se souvenir d'entités spécifiques (comme des pe **Exemple de mémoire d'entité** -À partir d'une conversation sur un voyage passé, l'agent pourrait extraire "Paris", "Tour Eiffel" et "dîner au restaurant Le Chat Noir" comme entités. Lors d'une interaction future, l'agent pourrait se souvenir de "Le Chat Noir" et proposer d'y faire une nouvelle réservation. +À partir d'une conversation sur un voyage passé, l'agent pourrait extraire "Paris", "Tour Eiffel" et "dîner au restaurant Le Chat Noir" comme entités. Lors d'une interaction future, l'agent pourrait se souvenir de "Le Chat Noir" et proposer de faire une nouvelle réservation là-bas. #### RAG structuré (Retrieval Augmented Generation) @@ -113,33 +124,43 @@ Au lieu de simplement faire correspondre des mots-clés, le RAG structuré pourr ## Implémenter et stocker la mémoire -Implémenter la mémoire pour les agents IA implique un processus systématique de **gestion de la mémoire**, qui inclut la génération, le stockage, la récupération, l'intégration, la mise à jour et même "l'oubli" (ou la suppression) des informations. La récupération est un aspect particulièrement crucial. +Implémenter la mémoire pour les agents IA implique un processus systématique de **gestion de la mémoire**, qui inclut la génération, le stockage, la récupération, l'intégration, la mise à jour, et même "l'oubli" (ou la suppression) des informations. La récupération est un aspect particulièrement crucial. ### Outils spécialisés pour la mémoire -Une façon de stocker et de gérer la mémoire des agents est d'utiliser des outils spécialisés comme Mem0. Mem0 fonctionne comme une couche de mémoire persistante, permettant aux agents de se souvenir des interactions pertinentes, de stocker les préférences des utilisateurs et le contexte factuel, et d'apprendre des succès et des échecs au fil du temps. L'idée ici est que les agents sans état deviennent des agents avec état. +#### Mem0 + +Une façon de stocker et de gérer la mémoire des agents est d'utiliser des outils spécialisés comme Mem0. Mem0 fonctionne comme une couche de mémoire persistante, permettant aux agents de rappeler des interactions pertinentes, de stocker les préférences des utilisateurs et le contexte factuel, et d'apprendre des succès et des échecs au fil du temps. L'idée ici est que les agents sans état deviennent des agents avec état. + +Il fonctionne via un **pipeline de mémoire en deux phases : extraction et mise à jour**. Tout d'abord, les messages ajoutés au fil de discussion d'un agent sont envoyés au service Mem0, qui utilise un Large Language Model (LLM) pour résumer l'historique des conversations et extraire de nouveaux souvenirs. Ensuite, une phase de mise à jour pilotée par LLM détermine s'il faut ajouter, modifier ou supprimer ces souvenirs, en les stockant dans un magasin de données hybride qui peut inclure des bases de données vectorielles, graphiques et clé-valeur. Ce système prend également en charge divers types de mémoire et peut intégrer une mémoire graphique pour gérer les relations entre les entités. + +#### Cognee + +Une autre approche puissante consiste à utiliser **Cognee**, une mémoire sémantique open-source pour les agents IA qui transforme les données structurées et non structurées en graphes de connaissances interrogeables soutenus par des embeddings. Cognee offre une **architecture à double stockage** combinant la recherche par similarité vectorielle avec les relations graphiques, permettant aux agents de comprendre non seulement quelles informations sont similaires, mais aussi comment les concepts sont liés entre eux. + +Il excelle dans la **récupération hybride** qui mélange la similarité vectorielle, la structure graphique et le raisonnement LLM - depuis la recherche brute de morceaux jusqu'à des réponses aux questions tenant compte du graphe. Le système maintient une **mémoire vivante** qui évolue et grandit tout en restant interrogeable comme un graphe connecté, prenant en charge à la fois le contexte de session à court terme et la mémoire persistante à long terme. -Il fonctionne via un **pipeline de mémoire en deux phases : extraction et mise à jour**. Tout d'abord, les messages ajoutés au fil de discussion d'un agent sont envoyés au service Mem0, qui utilise un Large Language Model (LLM) pour résumer l'historique des conversations et extraire de nouveaux souvenirs. Ensuite, une phase de mise à jour pilotée par LLM détermine s'il faut ajouter, modifier ou supprimer ces souvenirs, en les stockant dans un système de données hybride qui peut inclure des bases de données vectorielles, graphiques et clé-valeur. Ce système prend également en charge divers types de mémoire et peut intégrer une mémoire graphique pour gérer les relations entre les entités. +Le tutoriel du notebook Cognee ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) démontre la construction de cette couche de mémoire unifiée, avec des exemples pratiques d'ingestion de diverses sources de données, de visualisation du graphe de connaissances et d'interrogation avec différentes stratégies de recherche adaptées aux besoins spécifiques des agents. ### Stocker la mémoire avec RAG Au-delà des outils spécialisés comme Mem0, vous pouvez exploiter des services de recherche robustes comme **Azure AI Search en tant que backend pour stocker et récupérer des souvenirs**, en particulier pour le RAG structuré. -Cela vous permet d'ancrer les réponses de votre agent dans vos propres données, garantissant des réponses plus pertinentes et précises. Azure AI Search peut être utilisé pour stocker des souvenirs de voyage spécifiques à l'utilisateur, des catalogues de produits ou toute autre connaissance spécifique à un domaine. +Cela vous permet d'ancrer les réponses de votre agent avec vos propres données, garantissant des réponses plus pertinentes et précises. Azure AI Search peut être utilisé pour stocker des souvenirs de voyage spécifiques à l'utilisateur, des catalogues de produits ou toute autre connaissance spécifique à un domaine. -Azure AI Search prend en charge des fonctionnalités comme le **RAG structuré**, qui excelle dans l'extraction et la récupération d'informations denses et structurées à partir de grands ensembles de données comme les historiques de conversation, les e-mails ou même les images. Cela offre une "précision et un rappel surhumains" par rapport aux approches traditionnelles de découpage de texte et d'intégration. +Azure AI Search prend en charge des fonctionnalités comme le **RAG structuré**, qui excelle à extraire et récupérer des informations denses et structurées à partir de grands ensembles de données comme les historiques de conversation, les e-mails ou même les images. Cela offre une "précision et un rappel surhumains" par rapport aux approches traditionnelles de découpage de texte et d'embedding. -## Rendre les agents IA auto-améliorants +## Rendre les Agents IA auto-améliorants -Un modèle courant pour les agents auto-améliorants consiste à introduire un **"agent de connaissance"**. Cet agent distinct observe la conversation principale entre l'utilisateur et l'agent principal. Son rôle est de : +Un modèle courant pour les agents auto-améliorants consiste à introduire un **"agent de connaissances"**. Cet agent distinct observe la conversation principale entre l'utilisateur et l'agent principal. Son rôle est de : 1. **Identifier les informations précieuses** : Déterminer si une partie de la conversation mérite d'être sauvegardée comme connaissance générale ou préférence spécifique de l'utilisateur. -2. **Extraire et résumer** : Dégager l'essentiel ou la préférence de la conversation. +2. **Extraire et résumer** : Distinguer l'apprentissage ou la préférence essentielle de la conversation. 3. **Stocker dans une base de connaissances** : Conserver ces informations extraites, souvent dans une base de données vectorielle, pour qu'elles puissent être récupérées plus tard. -4. **Augmenter les requêtes futures** : Lorsque l'utilisateur initie une nouvelle requête, l'agent de connaissance récupère les informations stockées pertinentes et les ajoute à l'invite de l'utilisateur, fournissant un contexte crucial à l'agent principal (similaire au RAG). +4. **Augmenter les requêtes futures** : Lorsque l'utilisateur initie une nouvelle requête, l'agent de connaissances récupère les informations stockées pertinentes et les ajoute à l'invite de l'utilisateur, fournissant un contexte crucial à l'agent principal (similaire au RAG). ### Optimisations pour la mémoire @@ -149,9 +170,11 @@ Un modèle courant pour les agents auto-améliorants consiste à introduire un * ## Vous avez d'autres questions sur la mémoire des agents ? -Rejoignez le [Discord Azure AI Foundry](https://aka.ms/ai-agents/discord) pour rencontrer d'autres apprenants, assister à des heures de bureau et obtenir des réponses à vos questions sur les agents IA. +Rejoignez le [Discord Azure AI Foundry](https://aka.ms/ai-agents/discord) pour rencontrer d'autres apprenants, assister à des heures de bureau et obtenir des réponses à vos questions sur les Agents IA. --- + **Avertissement** : -Ce document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatiques peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de recourir à une traduction humaine professionnelle. Nous ne sommes pas responsables des malentendus ou des interprétations erronées résultant de l'utilisation de cette traduction. \ No newline at end of file +Ce document a été traduit à l'aide du service de traduction automatique [Co-op Translator](https://github.com/Azure/co-op-translator). Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de recourir à une traduction humaine professionnelle. Nous ne sommes pas responsables des malentendus ou des interprétations erronées résultant de l'utilisation de cette traduction. + \ No newline at end of file diff --git a/translations/he/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/he/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..4ef4ec312 --- /dev/null +++ b/translations/he/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# בניית סוכני AI עם זיכרון מתמשך באמצעות Cognee\n", + "\n", + "מחברת זו מדגימה כיצד לבנות סוכני AI חכמים עם יכולות זיכרון מתקדמות באמצעות [**cognee**](https://www.cognee.ai/) - זיכרון AI בקוד פתוח שמשלב גרפים של ידע, חיפוש סמנטי וניהול סשנים ליצירת מערכות AI מודעות להקשר.\n", + "\n", + "## 🎯 מטרות למידה\n", + "\n", + "בסיום המדריך הזה, תבינו כיצד:\n", + "- **לבנות גרפי ידע המבוססים על Embeddings**: להפוך טקסט לא מובנה לידע מובנה שניתן לשאול עליו שאלות\n", + "- **ליישם זיכרון סשן**: ליצור שיחות מרובות שלבים עם שמירה אוטומטית של ההקשר\n", + "- **לשמר שיחות**: לשמור אינטראקציות חשובות בזיכרון לטווח ארוך לשימוש עתידי\n", + "- **לשאול שאלות בשפה טבעית**: לגשת ולהשתמש בהקשר היסטורי בשיחות חדשות\n", + "- **להמחיש את הזיכרון**: לחקור את הקשרים בגרף הידע של הסוכן שלכם\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ מה תבנו\n", + "\n", + "במדריך זה ניצור **עוזר קוד** עם זיכרון מתמשך ש:\n", + "\n", + "### 1. **בניית בסיס ידע**\n", + " - קולט מידע על פרופיל המפתח וההתמחות שלו\n", + " - מעבד עקרונות ותובנות של תכנות ב-Python\n", + " - שומר שיחות היסטוריות בין מפתחים לעוזרים מבוססי AI\n", + "\n", + "### 2. **שיחות מודעות להקשר**\n", + " - שומר על הקשר בין שאלות מרובות באותה סשן\n", + " - מאחסן אוטומטית כל זוג שאלה/תשובה לצורך שליפה יעילה\n", + " - מספק תגובות עקביות והקשריות בהתבסס על היסטוריית השיחה\n", + "\n", + "### 3. **זיכרון לטווח ארוך**\n", + " - שומר שיחות חשובות בזיכרון לטווח ארוך\n", + " - שולף זיכרונות רלוונטיים מבסיס הידע ומסשנים קודמים כדי להעשיר אינטראקציות חדשות\n", + " - בונה בסיס ידע מתפתח שמשתפר עם הזמן\n", + "\n", + "### 4. **שליפה חכמה של זיכרון**\n", + " - משתמש בחיפוש סמנטי מבוסס גרף כדי למצוא מידע רלוונטי בכל הידע המאוחסן\n", + " - מסנן חיפושים לפי תתי-קבוצות נתונים (מידע על מפתחים לעומת עקרונות)\n", + " - משלב מקורות נתונים מרובים כדי לספק תשובות מקיפות\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 דרישות מוקדמות והגדרות\n", + "\n", + "### דרישות מערכת\n", + "\n", + "לפני שמתחילים, ודאו שיש לכם:\n", + "\n", + "1. **סביבת פייתון**\n", + " - פייתון 3.9 או גרסה מתקדמת יותר\n", + " - סביבת עבודה וירטואלית (מומלץ)\n", + " \n", + "2. **מטמון Redis** (נדרש לניהול סשנים)\n", + " - Redis מקומי: `docker run -d -p 6379:6379 redis`\n", + " - או השתמשו בשירות Redis מנוהל\n", + " \n", + "3. **גישה ל-LLM API**\n", + " - מפתח API של OpenAI או ספקים אחרים (ראו [תיעוד](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **הגדרת מסד נתונים**\n", + " - אין צורך בהגדרה כברירת מחדל. Cognee משתמשת במסדי נתונים מבוססי קבצים (LanceDB ו-Kuzu)\n", + " - אופציונלי, ניתן להגדיר את Azure AI Search כמאגר וקטורים (ראו [תיעוד](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### הגדרת סביבה\n", + "\n", + "צרו קובץ `.env` בתיקיית הפרויקט שלכם עם המשתנים הבאים:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ הבנת ארכיטקטורת הזיכרון של Cognee\n", + "\n", + "### איך Cognee פועל\n", + "\n", + "Cognee מספקת מערכת זיכרון מתקדמת שעולה על אחסון פשוט של מפתח-ערך:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### רכיבים מרכזיים:\n", + "\n", + "1. **גרף ידע**: מאחסן ישויות, קשרים וחיבורים סמנטיים\n", + "2. **הטמעות וקטוריות**: מאפשרות חיפוש סמנטי על כל המידע המאוחסן\n", + "3. **מטמון שיחה**: שומר על הקשר השיחה בתוך ובין סשנים\n", + "4. **NodeSets**: מארגנים נתונים לקטגוריות לוגיות לצורך שליפה ממוקדת\n", + "\n", + "### סוגי זיכרון במדריך זה:\n", + "\n", + "- **זיכרון מתמשך**: אחסון לטווח ארוך בגרף הידע\n", + "- **זיכרון סשן**: הקשר שיחה זמני במטמון Redis\n", + "- **זיכרון סמנטי**: חיפוש מבוסס דמיון וקטורי על פני כל הנתונים\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 התקנת חבילות נדרשות\n", + "\n", + "התקן את Cognee עם תמיכה ב-Redis לניהול סשנים:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 אתחול סביבה וטעינת ספריות\n", + "\n", + "וודאו:\n", + "1. ש-Redis פועל (לדוגמה, באמצעות Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. שמשתני הסביבה מוגדרים לפני ייבוא מודולי המטמון\n", + "3. אם יש צורך, אתחלו את הליבה והריצו את התאים לפי הסדר\n", + "\n", + "התא הבא יבצע:\n", + "1. טעינת משתני סביבה מתוך `.env`\n", + "2. הגדרת Cognee עם הגדרות ה-LLM שלכם\n", + "3. הפעלת מטמון לניהול סשנים\n", + "4. אימות שכל הרכיבים מחוברים כראוי\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 הגדרת תיקיות אחסון\n", + "\n", + "Cognee משתמשת בשתי תיקיות נפרדות לפעולותיו:\n", + "- **Data Root**: מאחסן מסמכים שנקלטו ונתונים מעובדים\n", + "- **System Root**: מכיל את בסיס הנתונים של גרף הידע ומטא-נתונים של המערכת\n", + "\n", + "ניצור תיקיות מבודדות עבור מדריך זה כפי שמפורט:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 איפוס מצב הזיכרון\n", + "\n", + "לפני שנתחיל לבנות את מערכת הזיכרון שלנו, בואו נוודא שאנחנו מתחילים מחדש.\n", + "\n", + "> 💡 **טיפ**: ניתן לדלג על שלב זה אם ברצונכם לשמור על זיכרונות קיימים מהריצות הקודמות שלכם כאשר תשתמשו במחברת זו מאוחר יותר.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 חלק 1: בניית בסיס הידע\n", + "\n", + "### מקורות מידע עבור עוזר המפתחים שלנו\n", + "\n", + "נייבא שלושה סוגי נתונים כדי ליצור בסיס ידע מקיף:\n", + "\n", + "1. **פרופיל המפתח**: מומחיות אישית ורקע טכני \n", + "2. **שיטות עבודה מומלצות ב-Python**: עקרונות ה-Zen של Python עם הנחיות מעשיות \n", + "3. **שיחות היסטוריות**: סשנים קודמים של שאלות ותשובות בין מפתחים לעוזרי AI \n", + "\n", + "מגוון הנתונים הזה מאפשר לסוכן שלנו: \n", + "- להבין את ההקשר הטכני של המשתמש \n", + "- ליישם שיטות עבודה מומלצות בהמלצות \n", + "- ללמוד מאינטראקציות מוצלחות קודמות \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 עיבוד נתונים לגרף ידע\n", + "\n", + "עכשיו נהפוך את הטקסט הגולמי שלנו לזיכרון מובנה. תהליך זה:\n", + "\n", + "1. **מוסיף נתונים ל-NodeSets**: מארגן מידע לקטגוריות לוגיות\n", + " - `developer_data`: פרופיל מפתח ושיחות\n", + " - `principles_data`: עקרונות והנחיות לשימוש נכון ב-Python\n", + "\n", + "2. **מריץ את צינור Cognify**: מחלץ ישויות, קשרים ויוצר הטמעות\n", + " - מזהה מושגים מרכזיים\n", + " - יוצר קשרים סמנטיים בין מידע קשור\n", + " - מייצר הטמעות וקטוריות\n", + "\n", + "זה עשוי לקחת כמה רגעים בזמן שה-LLM מעבד את הטקסט ובונה את מבנה הגרף:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 ויזואליזציה של גרף הידע\n", + "\n", + "בואו נחקור את המבנה של גרף הידע שלנו. הוויזואליזציה מציגה:\n", + "- **צמתים**: ישויות שהופקו מהטקסט (מושגים, טכנולוגיות, אנשים)\n", + "- **קצוות**: קשרים וחיבורים בין ישויות\n", + "- **אשכולות**: מושגים קשורים שמקובצים לפי דמיון סמנטי\n", + "\n", + "פתחו את קובץ ה-HTML שנוצר בדפדפן שלכם כדי לחקור את הגרף בצורה אינטראקטיבית:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 להעשיר זיכרון עם Memify\n", + "\n", + "הפונקציה `memify()` מנתחת את גרף הידע ומייצרת חוקים חכמים על בסיס הנתונים. תהליך זה:\n", + "- מזהה דפוסים ושיטות עבודה מומלצות\n", + "- יוצר הנחיות מעשיות על בסיס התוכן\n", + "- מגדיר קשרים בין תחומי ידע שונים\n", + "\n", + "חוקים אלו מסייעים לסוכן לקבל החלטות מושכלות יותר בעת מענה על שאלות. לכידת ויזואליזציה שנייה מאפשרת לך להשוות כיצד הגרף מתעבה לאחר ההעשרה.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 חלק 2: שליפה חכמה של זיכרון\n", + "\n", + "### הדגמה 1: שילוב ידע בין מסמכים\n", + "\n", + "עכשיו, כשהגרף הידע שלנו בנוי, נבדוק איך Cognee משלב מידע ממקורות שונים כדי לענות על שאלות מורכבות.\n", + "\n", + "השאילתה הראשונה מדגימה:\n", + "- **הבנה סמנטית**: מציאת מושגים רלוונטיים גם אם לא הוזכרו במפורש\n", + "- **הצלבה בין מקורות**: שילוב פרופיל מפתח עם עקרונות Python\n", + "- **הסקה בהקשר**: יישום שיטות עבודה מומלצות על מימושים ספציפיים\n", + "\n", + "### הדגמה 2: חיפוש מסונן עם NodeSets\n", + "\n", + "השאילתה השנייה מראה כיצד למקד תת-קבוצות ספציפיות בגרף הידע:\n", + "- שימוש בפרמטר `node_name` לחיפוש רק בתוך `principles_data`\n", + "- מתן תשובות ממוקדות מתחום ידע מסוים\n", + "- שימושי כאשר נדרשת אינפורמציה ייחודית לתחום מסוים\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 חלק 3: הגדרת ניהול סשן\n", + "\n", + "### הפעלת זיכרון שיחה\n", + "\n", + "ניהול סשן הוא קריטי לשמירה על הקשר בין אינטראקציות מרובות. כאן נבצע:\n", + "\n", + "1. **אתחול הקשר משתמש**: יצירה או שליפה של פרופיל משתמש למעקב סשן \n", + "2. **הגדרת מנוע מטמון**: חיבור ל-Redis לאחסון היסטוריית השיחות \n", + "3. **הפעלת משתני סשן**: הגדרת משתני הקשר שנשמרים בין שאילתות \n", + "\n", + "> ⚠️ **חשוב**: נדרש ש-Redis יהיה פעיל ושהערך `CACHING=true` יוגדר בסביבת העבודה שלך\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ פונקציית עזר: צפייה בהיסטוריית השיחה\n", + "\n", + "פונקציה זו מאפשרת לנו לבדוק את היסטוריית השיחה המאוחסנת ב-Redis. היא שימושית עבור:\n", + "- ניפוי שגיאות בניהול סשנים\n", + "- אימות שהשיחות נשמרות במטמון\n", + "- הבנת ההקשר הזמין לסוכן\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## מפגש 1: מעבדה לתמיכה באסינכרוניות — שאלה ראשונה\n", + "\n", + "התחילו את מפגש ה-`async-support-lab` על ידי בקשה לדפוסי asyncio ידידותיים לטלמטריה עבור סורק רשת מאסיבי. הגרף כבר מכיר את asyncio, aiohttp ואת שיטות המעקב, ולכן התשובה צריכה לשקף שיחות קודמות תוך התאמה לשאלה החדשה.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## בדיקת זיכרון של Session 1 לאחר ההחלפה הראשונה\n", + "\n", + "הרצת `show_history(session_1)` מיד לאחר השאלה הראשונית מאשרת ש-Cognee כתבה גם את השאלה וגם את התשובה ל-Redis. אתם אמורים לראות רשומה אחת עם ההנחיה על התנהלות במקביל.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## מפגש 1: מעקב אחר מודלי נתונים\n", + "\n", + "כעת נשאל, \"מתי כדאי לבחור ב-dataclasses לעומת Pydantic?\" תוך שימוש באותו מזהה מפגש. Cognee אמורה לשלב את עקרונות ה-Python יחד עם שיחות FastAPI קודמות כדי לספק עצה מעמיקה—ולהראות שההקשר נשמר בתוך מפגש עם שם.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## ודא שהיסטוריית סשן 1 מכילה את שני הסבבים\n", + "\n", + "קריאה נוספת ל-`show_history(session_1)` אמורה להציג שני ערכי שאלות ותשובות. זה תואם את שלב \"שחזור הזיכרון\" במעבדת Mem0 ומוכיח שסבבים נוספים ממשיכים את אותו תמלול.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## מושב 2: שרשור סקירת עיצוב — מושב חדש\n", + "\n", + "כדי להראות בידוד בין השרשורים, אנו מפעילים `design-review-session` ומבקשים הנחיות רישום עבור סקירות תקריות. למרות שמאגר הידע הבסיסי זהה, מזהה המושב החדש שומר על תמלילים נפרדים.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## סקירת מפגש 2 היסטוריה\n", + "\n", + "`show_history(session_2)` צריך להציג רק את זוג השאלה-תשובה של סקירת העיצוב. השווה זאת עם מפגש 1 כדי להדגיש כיצד Cognee שומרת תמלילים נפרדים תוך שימוש חוזר בגרף הידע המשותף.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## סיכום\n", + "\n", + "ברכות! הרגע הענקת לעוזר הקוד שלך שכבת זיכרון ארוכת טווח המופעלת על ידי Cognee.\n", + "\n", + "במדריך הזה לקחת תוכן גולמי של מפתחים (קוד, מסמכים, שיחות) והפכת אותו לגרף + זיכרון וקטורי שהסוכן שלך יכול לחפש בו, להסיק ממנו ולשפר אותו באופן מתמשך.\n", + "\n", + "מה שלמדת\n", + "\n", + "1. **מטקסט גולמי לזיכרון AI**: איך Cognee קולט נתונים לא מובנים והופך אותם לזיכרון חכם וחיפוש באמצעות ארכיטקטורה משולבת של וקטור + גרף ידע.\n", + "\n", + "2. **העשרת גרף עם memify**: איך לעבור מעבר ליצירת גרף בסיסית ולהשתמש ב-memify כדי להוסיף עובדות נגזרות וקשרים עשירים לגרף הקיים שלך.\n", + "\n", + "3. **אסטרטגיות חיפוש מרובות**: איך לבצע שאילתות בזיכרון עם סוגי חיפוש שונים (שאלות ותשובות מודעות לגרף, השלמה בסגנון RAG, תובנות, קטעים גולמיים, חיפוש קוד וכו') בהתאם לצרכי הסוכן שלך.\n", + "\n", + "4. **חקירה חזותית**: איך לבדוק ולבצע דיבוג למה ש-Cognee בנה באמצעות ויזואליזציות גרף וממשק Cognee, כך שתוכל לראות בפועל איך הידע מובנה.\n", + "\n", + "5. **זיכרון מודע למפגשים**: איך לשלב הקשר של מפגש עם זיכרון סמנטי מתמשך כך שהסוכנים יוכלו לזכור בין הפעלות מבלי לדלוף מידע בין משתמשים.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## עיקרי הדברים\n", + "1. זיכרון כגרף ידע המבוסס על Embeddings\n", + "\n", + " - **הבנה מובנית**: Cognee משלבת מאגר וקטורים ומאגר גרפים כך שהנתונים שלך יהיו גם ניתנים לחיפוש לפי משמעות וגם מחוברים לפי קשרים. כברירת מחדל, Cognee משתמשת במסדי נתונים מבוססי קבצים (LanceDB עבור מאגר וקטורים, Kuzu עבור מאגר גרפים).\n", + "\n", + " - **שליפה מודעת לקשרים**: תשובות יכולות להתבסס לא רק על \"טקסט דומה\", אלא גם על האופן שבו ישויות קשורות זו לזו.\n", + "\n", + " - **זיכרון חי**: שכבת הזיכרון מתפתחת, גדלה ונשארת ניתנת לשאילתה כגרף מחובר אחד.\n", + "\n", + "2. מצבי חיפוש והסקה\n", + " - **שליפה היברידית**: החיפוש משלב דמיון וקטורי, מבנה גרפי והסקת LLM, החל מחיפוש גולמי ועד למענה על שאלות מודע לגרף.\n", + "\n", + " - **התאמת המצב למשימה**: השתמש במצבי השלמה כאשר אתה רוצה תשובות בשפה טבעית, ובמצבי קטעים/סיכום/גרף כאשר הסוכן שלך זקוק להקשר גולמי או להניע את ההסקה שלו.\n", + "\n", + "3. סוכנים מותאמים אישית ומודעים להקשר\n", + " - **הקשר שיחה + זיכרון לטווח ארוך**: Cognee שומרת על הקשר \"שיחה\" קצר טווח בנפרד מזיכרון ארוך טווח ברמת משתמש או ארגון.\n", + "\n", + "## יישומים בעולם האמיתי\n", + "\n", + "1. **סוכני AI אנכיים**\n", + "\n", + " השתמש בתבנית מהמחברת הזו כדי להפעיל עוזרים חכמים לתחום מסוים שמבוססים על Cognee כליבת השליפה וההסקה שלהם:\n", + "\n", + "- **עוזרי מפתחים**: סקירת קוד, ניתוח תקלות ועוזרי ארכיטקטורה שעוברים על קוד, APIs, מסמכי עיצוב וכרטיסים כגרף זיכרון אחד.\n", + "\n", + "- **עוזרים ללקוחות**: סוכני תמיכה או הצלחה שמושכים ממסמכי מוצר, שאלות נפוצות, הערות CRM וכרטיסים קודמים עם שליפה מודעת לגרף ותשובות מצוטטות.\n", + "\n", + "- **עוזרים מומחים פנימיים**: עוזרי מדיניות, משפט או אבטחה שמסיקים מתוך חוקים, הנחיות והחלטות היסטוריות מחוברות במקום מסמכי PDF מבודדים.\n", + "\n", + " Cognee ממוצבת במפורש כזיכרון מתמשך ומדויק עבור סוכני AI, ומספקת גרף ידע חי שמחליף שילובים מאולתרים של מאגרי וקטורים וקוד גרפים מותאם אישית.\n", + "\n", + "2. **איחוד מאגרי נתונים לזיכרון אחד**\n", + "\n", + " אותה גישה גם עוזרת לך לבנות שכבת זיכרון מאוחדת ממקורות מפוזרים:\n", + "\n", + "- **ממאגרי נתונים לגרף אחד**: קלוט נתונים מובנים (למשל, מסדי נתונים) ובלתי מובנים (למשל, מסמכים, שיחות) לגרף אחד המבוסס על Embeddings, במקום אינדקסים נפרדים לכל מערכת.\n", + "\n", + "- **הסקה בין מקורות עם ציטוטים**: בצע הסקה מרובת שלבים על הכל—\"חבר\" לוגים, מדדים ומסמכים דרך הגרף—ועדיין החזר תשובות מבוססות עם מקור.\n", + "\n", + "- **מרכזי ידע**: עבור תחומים כמו בנקאות או חינוך, Cognee כבר משמשת לאיחוד קובצי PDF, מערכות פנימיות ונתוני אפליקציות לגרף ידע אחד עם וקטורים, כך שסוכנים יכולים לענות על שאלות עם הקשר מדויק ומצוטט.\n", + "\n", + "## הצעדים הבאים\n", + "\n", + "יישמת את לולאת הזיכרון הבסיסית. הנה הרחבות טבעיות שתוכל לנסות בעצמך (ראה [תיעוד Cognee](https://docs.cognee.ai/) לפרטים):\n", + "\n", + "1. **התנסה במודעות לזמן**: הפעל Temporal Cognify כדי לחלץ אירועים וחותמות זמן מטקסט.\n", + "\n", + "2. **הכנס הסקה מונחית אונטולוגיה**: הגדר אונטולוגיית OWL עבור התחום שלך. השתמש בתמיכת האונטולוגיה של Cognee כך שהישויות והקשרים המופקים יתבססו על הסכמה הזו, מה שמשפר את איכות הגרף והתשובות הספציפיות לתחום.\n", + "\n", + "3. **הוסף לולאת משוב**: תן ל-Cognee להתאים את משקלי הקשרים בגרף על סמך משוב משתמשים אמיתי, כך שהשליפה תשתפר עם הזמן במקום להישאר סטטית.\n", + "\n", + "4. **כוונן להתאמה אישית והתנהגות שיחה**: השתמש במזהי משתמשים, דיירים ומאגרי נתונים כדי לתת לכל אדם או צוות תצוגה משלהם על מנוע הזיכרון המשותף.\n", + "\n", + "5. **הרחב לסוכנים מורכבים יותר**: חבר את Cognee למסגרות סוכנים כדי לבנות מערכות מרובות סוכנים שכולן חולקות את אותה שכבת זיכרון. *תוסף Microsoft Agent Framework x Cognee יגיע בקרוב.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**כתב ויתור**: \nמסמך זה תורגם באמצעות שירות תרגום AI [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. למידע קריטי, מומלץ להשתמש בתרגום מקצועי אנושי. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:10:37+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "he" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/he/13-agent-memory/README.md b/translations/he/13-agent-memory/README.md index 53a62d0cb..af7d4dddc 100644 --- a/translations/he/13-agent-memory/README.md +++ b/translations/he/13-agent-memory/README.md @@ -1,56 +1,64 @@ -# זיכרון עבור סוכני AI -[![זיכרון סוכן](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.he.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) +# זיכרון לסוכני AI +[![זיכרון לסוכנים](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.he.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) כשמדברים על היתרונות הייחודיים של יצירת סוכני AI, שני דברים עיקריים עולים לדיון: היכולת להשתמש בכלים לביצוע משימות והיכולת להשתפר עם הזמן. זיכרון הוא הבסיס ליצירת סוכן שמשתפר בעצמו ויכול להעניק חוויות טובות יותר למשתמשים שלנו. -בשיעור זה, נבחן מהו זיכרון עבור סוכני AI וכיצד ניתן לנהל אותו ולהשתמש בו לטובת היישומים שלנו. +בשיעור זה, נבחן מהו זיכרון עבור סוכני AI, כיצד ניתן לנהל אותו וכיצד להשתמש בו לטובת האפליקציות שלנו. -## הקדמה +## מבוא השיעור יעסוק ב: -• **הבנת זיכרון סוכני AI**: מהו זיכרון ולמה הוא חיוני עבור סוכנים. +• **הבנת זיכרון של סוכני AI**: מהו זיכרון ולמה הוא חיוני עבור סוכנים. • **יישום ואחסון זיכרון**: שיטות מעשיות להוספת יכולות זיכרון לסוכני AI, תוך התמקדות בזיכרון קצר טווח וארוך טווח. -• **הפיכת סוכני AI למשתפרים בעצמם**: כיצד זיכרון מאפשר לסוכנים ללמוד מאינטראקציות קודמות ולהשתפר עם הזמן. +• **הפיכת סוכני AI למשופרים בעצמם**: כיצד זיכרון מאפשר לסוכנים ללמוד מאינטראקציות קודמות ולהשתפר עם הזמן. + +## יישומים זמינים + +שיעור זה כולל שני מדריכים מפורטים בפורמט מחברת: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: מיישם זיכרון באמצעות Mem0 ו-Azure AI Search עם מסגרת Semantic Kernel. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: מיישם זיכרון מובנה באמצעות Cognee, בונה אוטומטית גרף ידע המבוסס על embeddings, מציג גרף ומבצע שליפה חכמה. ## מטרות למידה -לאחר סיום השיעור, תדעו כיצד: +לאחר השלמת השיעור, תדעו כיצד: -• **להבחין בין סוגי זיכרון שונים של סוכני AI**, כולל זיכרון עבודה, זיכרון קצר טווח, זיכרון ארוך טווח, וכן צורות מיוחדות כמו זיכרון פרסונה וזיכרון אפיזודי. +• **להבחין בין סוגי זיכרון שונים של סוכני AI**, כולל זיכרון עבודה, זיכרון קצר טווח, זיכרון ארוך טווח וצורות מיוחדות כמו זיכרון פרסונה וזיכרון אפיזודי. -• **ליישם ולנהל זיכרון קצר טווח וארוך טווח עבור סוכני AI** באמצעות מסגרת Semantic Kernel, תוך שימוש בכלים כמו Mem0 וזיכרון לוח מחיק, ושילוב עם Azure AI Search. +• **ליישם ולנהל זיכרון קצר טווח וארוך טווח עבור סוכני AI** באמצעות מסגרת Semantic Kernel, תוך שימוש בכלים כמו Mem0, Cognee, זיכרון Whiteboard ושילוב עם Azure AI Search. -• **להבין את העקרונות מאחורי סוכני AI שמשתפרים בעצמם** וכיצד מערכות ניהול זיכרון חזקות תורמות ללמידה מתמשכת ולהסתגלות. +• **להבין את העקרונות מאחורי סוכני AI שמשתפרים בעצמם** וכיצד מערכות ניהול זיכרון חזקות תורמות ללמידה והתאמה מתמשכת. -## הבנת זיכרון סוכני AI +## הבנת זיכרון של סוכני AI בבסיסו, **זיכרון עבור סוכני AI מתייחס למנגנונים שמאפשרים להם לשמור ולשלוף מידע**. מידע זה יכול להיות פרטים ספציפיים על שיחה, העדפות משתמש, פעולות קודמות או אפילו דפוסים שנלמדו. -ללא זיכרון, יישומי AI הם לרוב חסרי מצב, כלומר כל אינטראקציה מתחילה מאפס. זה מוביל לחוויית משתמש חוזרת ומתסכלת שבה הסוכן "שוכח" הקשר או העדפות קודמות. +ללא זיכרון, אפליקציות AI הן לרוב חסרות מצב, כלומר כל אינטראקציה מתחילה מאפס. זה מוביל לחוויית משתמש חוזרת ומתסכלת שבה הסוכן "שוכח" הקשר או העדפות קודמות. ### למה זיכרון חשוב? -האינטליגנציה של סוכן קשורה באופן עמוק ליכולתו לזכור ולהשתמש במידע מהעבר. זיכרון מאפשר לסוכנים להיות: +האינטליגנציה של סוכן קשורה עמוקות ליכולתו לזכור ולהשתמש במידע מהעבר. זיכרון מאפשר לסוכנים להיות: • **רפלקטיביים**: ללמוד מפעולות ותוצאות קודמות. • **אינטראקטיביים**: לשמור על הקשר במהלך שיחה מתמשכת. -• **פרואקטיביים וריאקטיביים**: לצפות צרכים או להגיב בצורה מתאימה על סמך נתונים היסטוריים. +• **פרואקטיביים וריאקטיביים**: לצפות צרכים או להגיב בהתאם על סמך נתונים היסטוריים. -• **אוטונומיים**: לפעול בצורה עצמאית יותר על ידי שימוש בידע שנשמר. +• **אוטונומיים**: לפעול באופן עצמאי יותר על ידי שימוש בידע שנשמר. המטרה של יישום זיכרון היא להפוך את הסוכנים ליותר **אמינים ומסוגלים**. @@ -58,29 +66,29 @@ CO_OP_TRANSLATOR_METADATA: #### זיכרון עבודה -חשבו על זה כמו דף טיוטה שהסוכן משתמש בו במהלך משימה או תהליך מחשבה אחד. הוא מחזיק מידע מיידי הדרוש לחישוב הצעד הבא. +חשבו על זה כמו דף טיוטה שהסוכן משתמש בו במהלך משימה או תהליך מחשבה יחיד. הוא מחזיק מידע מיידי הדרוש לחישוב הצעד הבא. -עבור סוכני AI, זיכרון עבודה לרוב לוכד את המידע הרלוונטי ביותר משיחה, גם אם היסטוריית הצ'אט המלאה ארוכה או מקוצרת. הוא מתמקד בהפקת אלמנטים מרכזיים כמו דרישות, הצעות, החלטות ופעולות. +עבור סוכני AI, זיכרון עבודה לרוב לוכד את המידע הרלוונטי ביותר משיחה, גם אם היסטוריית השיחה המלאה ארוכה או מקוצרת. הוא מתמקד בהפקת אלמנטים מרכזיים כמו דרישות, הצעות, החלטות ופעולות. **דוגמה לזיכרון עבודה** -בסוכן הזמנת נסיעות, זיכרון העבודה עשוי ללכוד את בקשת המשתמש הנוכחית, כמו "אני רוצה להזמין טיול לפריז". דרישה ספציפית זו נשמרת בהקשר המיידי של הסוכן כדי להנחות את האינטראקציה הנוכחית. +בסוכן להזמנת טיולים, זיכרון העבודה עשוי ללכוד את בקשת המשתמש הנוכחית, כמו "אני רוצה להזמין טיול לפריז". דרישה ספציפית זו נשמרת בהקשר המיידי של הסוכן כדי להנחות את האינטראקציה הנוכחית. #### זיכרון קצר טווח -סוג זה של זיכרון שומר מידע למשך שיחה או סשן אחד. זהו ההקשר של הצ'אט הנוכחי, שמאפשר לסוכן להתייחס חזרה לפניות קודמות בדיאלוג. +סוג זה של זיכרון שומר מידע למשך שיחה או סשן יחיד. זהו ההקשר של השיחה הנוכחית, המאפשר לסוכן להתייחס לפניות קודמות בדיאלוג. **דוגמה לזיכרון קצר טווח** -אם משתמש שואל, "כמה עולה טיסה לפריז?" ואז ממשיך עם "ומה לגבי לינה שם?", זיכרון קצר טווח מבטיח שהסוכן יודע ש"שם" מתייחס ל"פריז" בתוך אותה שיחה. +אם משתמש שואל, "כמה יעלה טיסה לפריז?" ואז ממשיך עם "ומה לגבי לינה שם?", זיכרון קצר הטווח מבטיח שהסוכן יודע ש"שם" מתייחס ל"פריז" באותה שיחה. #### זיכרון ארוך טווח -זהו מידע שנשמר לאורך מספר שיחות או סשנים. הוא מאפשר לסוכנים לזכור העדפות משתמש, אינטראקציות היסטוריות או ידע כללי לאורך תקופות ממושכות. זה חשוב להתאמה אישית. +זהו מידע שנשמר לאורך מספר שיחות או סשנים. הוא מאפשר לסוכנים לזכור העדפות משתמש, אינטראקציות היסטוריות או ידע כללי לאורך זמן. זה חשוב להתאמה אישית. **דוגמה לזיכרון ארוך טווח** -זיכרון ארוך טווח עשוי לשמור ש"בן אוהב סקי ופעילויות חוץ, אוהב קפה עם נוף הררי, ורוצה להימנע ממסלולי סקי מתקדמים בגלל פציעה קודמת". מידע זה, שנלמד מאינטראקציות קודמות, משפיע על המלצות בתכנון טיולים עתידיים, מה שהופך אותן לאישיות מאוד. +זיכרון ארוך טווח עשוי לשמור ש"בן אוהב סקי ופעילויות חוץ, אוהב קפה עם נוף הרים ורוצה להימנע ממסלולי סקי מתקדמים בגלל פציעה קודמת". מידע זה, שנלמד מאינטראקציות קודמות, משפיע על המלצות בתכנון טיולים עתידיים, מה שהופך אותם לאישיים מאוד. #### זיכרון פרסונה @@ -88,27 +96,27 @@ CO_OP_TRANSLATOR_METADATA: **דוגמה לזיכרון פרסונה** -אם סוכן הנסיעות מתוכנן להיות "מתכנן סקי מומחה", זיכרון הפרסונה עשוי לחזק את התפקיד הזה, ולהשפיע על תגובותיו כך שיתאימו לטון ולידע של מומחה. +אם הסוכן לתכנון טיולים נועד להיות "מומחה לתכנון סקי", זיכרון הפרסונה עשוי לחזק תפקיד זה, ולהשפיע על תגובותיו כך שיתאימו לטון ולידע של מומחה. -#### זיכרון אפיזודי/תהליכי עבודה +#### זיכרון אפיזודי/תהליכי -זיכרון זה שומר את רצף הצעדים שסוכן מבצע במהלך משימה מורכבת, כולל הצלחות וכישלונות. זה כמו לזכור "אפיזודות" ספציפיות או חוויות עבר כדי ללמוד מהן. +זיכרון זה שומר את רצף הצעדים שהסוכן נוקט במהלך משימה מורכבת, כולל הצלחות וכישלונות. זה כמו לזכור "פרקים" או חוויות קודמות כדי ללמוד מהם. **דוגמה לזיכרון אפיזודי** -אם הסוכן ניסה להזמין טיסה מסוימת אך נכשל בגלל חוסר זמינות, זיכרון אפיזודי יכול לתעד את הכישלון הזה, ולאפשר לסוכן לנסות טיסות חלופיות או ליידע את המשתמש על הבעיה בצורה מושכלת יותר בניסיון הבא. +אם הסוכן ניסה להזמין טיסה מסוימת אך נכשל בגלל חוסר זמינות, זיכרון אפיזודי יכול לתעד כישלון זה, ולאפשר לסוכן לנסות טיסות חלופיות או ליידע את המשתמש על הבעיה בצורה מושכלת יותר בניסיון הבא. #### זיכרון ישויות -זה כולל הפקת ושמירת ישויות ספציפיות (כמו אנשים, מקומות או דברים) ואירועים משיחות. זה מאפשר לסוכן לבנות הבנה מובנית של אלמנטים מרכזיים שנדונו. +זיכרון זה כולל חילוץ ושמירה של ישויות ספציפיות (כמו אנשים, מקומות או דברים) ואירועים משיחות. הוא מאפשר לסוכן לבנות הבנה מובנית של אלמנטים מרכזיים שנדונו. **דוגמה לזיכרון ישויות** -משיחה על טיול עבר, הסוכן עשוי להפיק "פריז", "מגדל אייפל" ו"ארוחת ערב במסעדת לה שאט נואר" כישויות. באינטראקציה עתידית, הסוכן יכול לזכור את "לה שאט נואר" ולהציע להזמין שם שוב. +משיחה על טיול קודם, הסוכן עשוי לחלץ "פריז", "מגדל אייפל" ו"ארוחת ערב במסעדת לה שאט נואר" כישויות. באינטראקציה עתידית, הסוכן יכול לזכור את "לה שאט נואר" ולהציע להזמין שם שוב. -#### RAG מובנה (הפקה מוגברת על ידי שליפה) +#### RAG מובנה (שליפה מוגברת) -בעוד ש-RAG היא טכניקה רחבה יותר, "RAG מובנה" מודגש כטכנולוגיית זיכרון חזקה. הוא מפיק מידע מובנה וצפוף ממקורות שונים (שיחות, מיילים, תמונות) ומשתמש בו לשיפור דיוק, שליפה ומהירות בתגובות. בניגוד ל-RAG קלאסי שמסתמך רק על דמיון סמנטי, RAG מובנה עובד עם המבנה הפנימי של המידע. +בעוד ש-RAG היא טכניקה רחבה יותר, "RAG מובנה" מודגש כטכנולוגיית זיכרון חזקה. הוא מחלץ מידע מובנה וצפוף ממקורות שונים (שיחות, מיילים, תמונות) ומשתמש בו לשיפור דיוק, שליפה ומהירות בתגובות. בניגוד ל-RAG קלאסי שמסתמך רק על דמיון סמנטי, RAG מובנה עובד עם המבנה הפנימי של המידע. **דוגמה ל-RAG מובנה** @@ -116,45 +124,57 @@ CO_OP_TRANSLATOR_METADATA: ## יישום ואחסון זיכרון -יישום זיכרון עבור סוכני AI כולל תהליך שיטתי של **ניהול זיכרון**, הכולל יצירה, אחסון, שליפה, שילוב, עדכון ואפילו "שכחה" (או מחיקה) של מידע. שליפה היא היבט קריטי במיוחד. +יישום זיכרון לסוכני AI כולל תהליך שיטתי של **ניהול זיכרון**, הכולל יצירה, אחסון, שליפה, שילוב, עדכון ואפילו "שכחה" (או מחיקה) של מידע. שליפה היא היבט קריטי במיוחד. + +### כלים מיוחדים לזיכרון + +#### Mem0 + +אחת הדרכים לאחסן ולנהל זיכרון סוכן היא באמצעות כלים מיוחדים כמו Mem0. Mem0 פועל כשכבת זיכרון מתמשכת, המאפשרת לסוכנים לשלוף אינטראקציות רלוונטיות, לאחסן העדפות משתמש והקשר עובדתי, וללמוד מהצלחות וכישלונות לאורך זמן. הרעיון כאן הוא שסוכנים חסרי מצב הופכים לבעלי מצב. + +הוא פועל באמצעות **צינור זיכרון דו-שלבי: חילוץ ועדכון**. תחילה, הודעות שנוספו לשרשור של הסוכן נשלחות לשירות Mem0, שמשתמש במודל שפה גדול (LLM) כדי לסכם את היסטוריית השיחה ולחלץ זיכרונות חדשים. לאחר מכן, שלב עדכון מונע LLM קובע האם להוסיף, לשנות או למחוק זיכרונות אלה, תוך אחסונם במאגר נתונים היברידי שיכול לכלול וקטורים, גרפים ומאגרי מפתח-ערך. מערכת זו תומכת גם בסוגי זיכרון שונים ויכולה לשלב זיכרון גרפי לניהול קשרים בין ישויות. + +#### Cognee -### כלים מיוחדים לניהול זיכרון +גישה חזקה נוספת היא שימוש ב-**Cognee**, זיכרון סמנטי בקוד פתוח לסוכני AI שממיר נתונים מובנים ולא מובנים לגרפי ידע ניתנים לשאילתה המבוססים על embeddings. Cognee מספקת **ארכיטקטורת אחסון כפולה** שמשלבת חיפוש דמיון וקטורי עם קשרי גרף, ומאפשרת לסוכנים להבין לא רק איזה מידע דומה, אלא גם כיצד מושגים קשורים זה לזה. -אחת הדרכים לאחסן ולנהל זיכרון סוכן היא באמצעות כלים מיוחדים כמו Mem0. Mem0 פועל כשכבת זיכרון מתמשכת, שמאפשרת לסוכנים לזכור אינטראקציות רלוונטיות, לאחסן העדפות משתמש והקשר עובדתי, וללמוד מהצלחות וכישלונות לאורך זמן. הרעיון כאן הוא שסוכנים חסרי מצב הופכים לבעלי מצב. +היא מצטיינת ב-**שליפה היברידית** שמשלבת דמיון וקטורי, מבנה גרף והסקת LLM - מחיפוש גולמי ועד מענה לשאלות מודעות לגרף. המערכת שומרת על **זיכרון חי** שמתפתח וצומח תוך שהוא נשאר ניתן לשאילתה כגרף מחובר אחד, ותומך גם בהקשר סשן קצר טווח וגם בזיכרון מתמשך ארוך טווח. -הוא פועל דרך **צינור זיכרון דו-שלבי: הפקה ועדכון**. תחילה, הודעות שנוספו לשרשור של סוכן נשלחות לשירות Mem0, שמשתמש במודל שפה גדול (LLM) כדי לסכם את היסטוריית השיחה ולהפיק זיכרונות חדשים. לאחר מכן, שלב עדכון מונע LLM קובע האם להוסיף, לשנות או למחוק את הזיכרונות הללו, ומאחסן אותם במאגר נתונים היברידי שיכול לכלול וקטור, גרף ומאגרי נתונים של מפתח-ערך. מערכת זו תומכת גם בסוגי זיכרון שונים ויכולה לשלב זיכרון גרפי לניהול קשרים בין ישויות. +מדריך המחברת של Cognee ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) מדגים בניית שכבת זיכרון מאוחדת זו, עם דוגמאות מעשיות של קליטת מקורות נתונים מגוונים, הצגת גרף הידע ושאילתות עם אסטרטגיות חיפוש שונות המותאמות לצרכי הסוכן. ### אחסון זיכרון עם RAG -מעבר לכלי זיכרון מיוחדים כמו Mem0, ניתן להשתמש בשירותי חיפוש מתקדמים כמו **Azure AI Search כבסיס אחסון ושליפה של זיכרונות**, במיוחד עבור RAG מובנה. +מעבר לכלי זיכרון מיוחדים כמו Mem0, ניתן לנצל שירותי חיפוש מתקדמים כמו **Azure AI Search כבסיס לאחסון ושליפת זיכרונות**, במיוחד עבור RAG מובנה. -זה מאפשר לבסס את תגובות הסוכן על הנתונים שלכם, ולהבטיח תשובות רלוונטיות ומדויקות יותר. ניתן להשתמש ב-Azure AI Search לאחסון זיכרונות נסיעה ספציפיים למשתמש, קטלוגי מוצרים או כל ידע ייחודי לתחום. +זה מאפשר לבסס את תגובות הסוכן על הנתונים שלכם, ולהבטיח תשובות רלוונטיות ומדויקות יותר. Azure AI Search יכול לשמש לאחסון זיכרונות נסיעות של משתמשים, קטלוגי מוצרים או כל ידע ייחודי אחר. -Azure AI Search תומך ביכולות כמו **RAG מובנה**, שמצטיין בהפקה ושליפה של מידע מובנה וצפוף ממאגרי נתונים גדולים כמו היסטוריות שיחה, מיילים או אפילו תמונות. זה מספק "דיוק ושליפה על-אנושיים" בהשוואה לגישות מסורתיות של חיתוך טקסט והטמעה. +Azure AI Search תומך ביכולות כמו **RAG מובנה**, שמצטיין בחילוץ ושליפת מידע מובנה וצפוף ממאגרי נתונים גדולים כמו היסטוריות שיחה, מיילים או אפילו תמונות. זה מספק "דיוק ושליפה על-אנושיים" בהשוואה לגישות מסורתיות של חיתוך טקסטים ויצירת embeddings. -## הפיכת סוכני AI למשתפרים בעצמם +## הפיכת סוכני AI למשופרים בעצמם -תבנית נפוצה עבור סוכנים שמשתפרים בעצמם כוללת הכנסת **"סוכן ידע"**. סוכן נפרד זה צופה בשיחה הראשית בין המשתמש לבין הסוכן הראשי. תפקידו הוא: +תבנית נפוצה לסוכנים שמשתפרים בעצמם כוללת הצגת **"סוכן ידע"**. סוכן זה צופה בשיחה הראשית בין המשתמש לסוכן הראשי. תפקידו הוא: 1. **לזהות מידע בעל ערך**: לקבוע אם חלק מהשיחה שווה לשמור כידע כללי או כהעדפת משתמש ספציפית. -2. **להפיק ולסכם**: לזקק את הלמידה או ההעדפה החשובה מהשיחה. +2. **לחלץ ולסכם**: לזקק את הלמידה או ההעדפה החשובה מהשיחה. -3. **לאחסן בבסיס ידע**: לשמר את המידע שהופק, לעיתים קרובות במאגר וקטורים, כך שניתן יהיה לשלוף אותו מאוחר יותר. +3. **לאחסן בבסיס ידע**: לשמר את המידע שהופק, לעיתים קרובות במאגר וקטורי, כך שניתן יהיה לשלוף אותו מאוחר יותר. -4. **להעשיר שאילתות עתידיות**: כאשר המשתמש מתחיל שאילתה חדשה, סוכן הידע שולף מידע רלוונטי שנשמר ומוסיף אותו להנחיית המשתמש, ומספק הקשר חשוב לסוכן הראשי (בדומה ל-RAG). +4. **להעשיר שאילתות עתידיות**: כאשר המשתמש יוזם שאילתה חדשה, סוכן הידע שולף מידע רלוונטי שנשמר ומוסיף אותו להנחיית המשתמש, ומספק הקשר חשוב לסוכן הראשי (בדומה ל-RAG). ### אופטימיזציות לזיכרון -• **ניהול זמן תגובה**: כדי להימנע מהאטת האינטראקציות עם המשתמש, ניתן להשתמש במודל זול ומהיר יותר בתחילה כדי לבדוק במהירות אם מידע שווה לשמור או לשלוף, ולהפעיל את תהליך ההפקה/שליפה המורכב יותר רק כשצריך. +• **ניהול השהיה**: כדי להימנע מהאטת אינטראקציות משתמש, ניתן להשתמש במודל זול ומהיר יותר בתחילה כדי לבדוק במהירות אם מידע שווה לשמור או לשלוף, ולהפעיל את תהליך החילוץ/שליפה המורכב יותר רק במידת הצורך. -• **תחזוקת בסיס הידע**: עבור בסיס ידע שגדל, מידע פחות בשימוש יכול לעבור ל"אחסון קר" כדי לנהל עלויות. +• **תחזוקת בסיס ידע**: עבור בסיס ידע שגדל, ניתן להעביר מידע פחות בשימוש ל"אחסון קר" כדי לנהל עלויות. -## יש לכם שאלות נוספות על זיכרון סוכנים? +## יש לכם עוד שאלות על זיכרון סוכנים? -הצטרפו ל-[Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) כדי לפגוש לומדים אחרים, להשתתף בשעות קבלה ולקבל תשובות לשאלות שלכם על סוכני AI. +הצטרפו ל-[Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) כדי לפגוש לומדים נוספים, להשתתף בשעות קבלה ולקבל תשובות לשאלות שלכם על סוכני AI. --- + **כתב ויתור**: -מסמך זה תורגם באמצעות שירות תרגום מבוסס AI [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה. \ No newline at end of file +מסמך זה תורגם באמצעות שירות תרגום AI [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי אנושי. איננו אחראים לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה. + \ No newline at end of file diff --git a/translations/hi/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/hi/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..bad8865f2 --- /dev/null +++ b/translations/hi/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Cognee का उपयोग करके स्थायी मेमोरी के साथ AI एजेंट बनाना\n", + "\n", + "यह नोटबुक दिखाता है कि कैसे [**cognee**](https://www.cognee.ai/) का उपयोग करके उन्नत मेमोरी क्षमताओं वाले बुद्धिमान AI एजेंट बनाए जा सकते हैं - एक ओपन सोर्स AI मेमोरी जो ज्ञान ग्राफ, सेमांटिक सर्च, और सत्र प्रबंधन को जोड़कर संदर्भ-सचेत AI सिस्टम बनाती है।\n", + "\n", + "## 🎯 सीखने के उद्देश्य\n", + "\n", + "इस ट्यूटोरियल के अंत तक, आप समझ जाएंगे कि कैसे:\n", + "- **एम्बेडिंग द्वारा समर्थित ज्ञान ग्राफ बनाएं**: असंरचित टेक्स्ट को संरचित, क्वेरी योग्य ज्ञान में बदलें\n", + "- **सत्र मेमोरी लागू करें**: स्वचालित संदर्भ प्रतिधारण के साथ बहु-मोड़ वार्तालाप बनाएं\n", + "- **वार्तालाप को स्थायी बनाएं**: भविष्य के संदर्भ के लिए महत्वपूर्ण इंटरैक्शन को दीर्घकालिक मेमोरी में वैकल्पिक रूप से संग्रहीत करें\n", + "- **प्राकृतिक भाषा का उपयोग करके क्वेरी करें**: नई वार्तालापों में ऐतिहासिक संदर्भ का उपयोग और लाभ उठाएं\n", + "- **मेमोरी को विज़ुअलाइज़ करें**: आपके एजेंट के ज्ञान ग्राफ में संबंधों का अन्वेषण करें\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ आप क्या बनाएंगे\n", + "\n", + "इस ट्यूटोरियल में, हम एक **Coding Assistant** बनाएंगे जिसमें स्थायी मेमोरी होगी, जो:\n", + "\n", + "### 1. **ज्ञान आधार निर्माण**\n", + " - डेवलपर प्रोफाइल और विशेषज्ञता की जानकारी को समाहित करता है\n", + " - Python प्रोग्रामिंग के सिद्धांत और सर्वोत्तम प्रथाओं को प्रोसेस करता है\n", + " - डेवलपर्स और AI असिस्टेंट के बीच हुई ऐतिहासिक बातचीत को संग्रहीत करता है\n", + "\n", + "### 2. **सत्र-जागरूक बातचीत**\n", + " - एक ही सत्र में कई सवालों के बीच संदर्भ बनाए रखता है\n", + " - प्रत्येक सवाल/जवाब जोड़ी को स्वचालित रूप से कैश करता है ताकि कुशलता से पुनः प्राप्त किया जा सके\n", + " - बातचीत के इतिहास के आधार पर सुसंगत और संदर्भित उत्तर प्रदान करता है\n", + "\n", + "### 3. **दीर्घकालिक मेमोरी**\n", + " - महत्वपूर्ण बातचीत को दीर्घकालिक मेमोरी में संग्रहीत करता है\n", + " - नए इंटरैक्शन को सूचित करने के लिए ज्ञान आधार और पिछले सत्रों से प्रासंगिक मेमोरी को पुनः प्राप्त करता है\n", + " - एक बढ़ती हुई ज्ञान आधार बनाता है जो समय के साथ बेहतर होती जाती है\n", + "\n", + "### 4. **बुद्धिमान मेमोरी पुनः प्राप्ति**\n", + " - ग्राफ-जागरूक सेमांटिक सर्च का उपयोग करके संग्रहीत सभी जानकारी में से प्रासंगिक जानकारी ढूंढता है\n", + " - डेटा उपसमूहों (डेवलपर जानकारी बनाम सिद्धांत) द्वारा सर्च को फ़िल्टर करता है\n", + " - व्यापक उत्तर प्रदान करने के लिए कई डेटा स्रोतों को संयोजित करता है\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 आवश्यकताएँ और सेटअप\n", + "\n", + "### सिस्टम आवश्यकताएँ\n", + "\n", + "शुरू करने से पहले, सुनिश्चित करें कि आपके पास निम्नलिखित हैं:\n", + "\n", + "1. **पायथन एनवायरनमेंट**\n", + " - पायथन 3.9 या उससे उच्च संस्करण\n", + " - वर्चुअल एनवायरनमेंट (अनुशंसित)\n", + "\n", + "2. **रेडिस कैश** (सेशन प्रबंधन के लिए आवश्यक)\n", + " - लोकल रेडिस: `docker run -d -p 6379:6379 redis`\n", + " - या एक प्रबंधित रेडिस सेवा का उपयोग करें\n", + "\n", + "3. **LLM API एक्सेस**\n", + " - OpenAI API कुंजी या अन्य प्रदाता (देखें [डॉक्यूमेंटेशन](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **डेटाबेस कॉन्फ़िगरेशन**\n", + " - डिफ़ॉल्ट रूप से कोई कॉन्फ़िगरेशन आवश्यक नहीं है। Cognee फाइल-आधारित डेटाबेस (LanceDB और Kuzu) का उपयोग करता है।\n", + " - वैकल्पिक रूप से, आप Azure AI Search को एक वेक्टर स्टोर के रूप में सेटअप कर सकते हैं (देखें [डॉक्यूमेंटेशन](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### एनवायरनमेंट कॉन्फ़िगरेशन\n", + "\n", + "अपने प्रोजेक्ट डायरेक्टरी में `.env` फाइल बनाएं और निम्नलिखित वेरिएबल्स जोड़ें:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ कॉग्नी की मेमोरी आर्किटेक्चर को समझना\n", + "\n", + "### कॉग्नी कैसे काम करता है\n", + "\n", + "कॉग्नी एक उन्नत मेमोरी सिस्टम प्रदान करता है जो साधारण की-वैल्यू स्टोरेज से परे है:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### मुख्य घटक:\n", + "\n", + "1. **नॉलेज ग्राफ**: संस्थाओं, संबंधों, और अर्थपूर्ण कनेक्शनों को संग्रहीत करता है\n", + "2. **वेक्टर एम्बेडिंग्स**: संग्रहीत जानकारी में अर्थपूर्ण खोज को सक्षम बनाता है\n", + "3. **सेशन कैश**: सत्रों के भीतर और उनके बीच बातचीत के संदर्भ को बनाए रखता है\n", + "4. **नोडसेट्स**: डेटा को तार्किक श्रेणियों में व्यवस्थित करता है ताकि लक्षित पुनर्प्राप्ति हो सके\n", + "\n", + "### इस ट्यूटोरियल में मेमोरी के प्रकार:\n", + "\n", + "- **स्थायी मेमोरी**: नॉलेज ग्राफ में दीर्घकालिक भंडारण\n", + "- **सेशन मेमोरी**: Redis कैश में अस्थायी बातचीत संदर्भ\n", + "- **अर्थपूर्ण मेमोरी**: सभी डेटा में वेक्टर-आधारित समानता खोज\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 आवश्यक पैकेज इंस्टॉल करें\n", + "\n", + "Redis समर्थन के साथ सत्र प्रबंधन के लिए Cognee इंस्टॉल करें:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 पर्यावरण को प्रारंभ करें और लाइब्रेरी लोड करें\n", + "\n", + "सुनिश्चित करें:\n", + "1. Redis चल रहा है (जैसे, Docker के माध्यम से: `docker run -d -p 6379:6379 redis`)\n", + "2. कैश मॉड्यूल आयात करने से पहले पर्यावरण वेरिएबल सेट किए गए हैं\n", + "3. यदि आवश्यक हो, तो कर्नेल को पुनः प्रारंभ करें और कोशिकाओं को क्रम में चलाएं\n", + "\n", + "निम्नलिखित सेल:\n", + "1. `.env` से पर्यावरण वेरिएबल लोड करेगा\n", + "2. आपके LLM सेटिंग्स के साथ Cognee को कॉन्फ़िगर करेगा\n", + "3. सत्र प्रबंधन के लिए कैशिंग सक्षम करेगा\n", + "4. सुनिश्चित करेगा कि सभी घटक सही तरीके से जुड़े हुए हैं\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 स्टोरेज डायरेक्टरी कॉन्फ़िगर करें\n", + "\n", + "Cognee अपने संचालन के लिए दो अलग-अलग डायरेक्टरी का उपयोग करता है:\n", + "- **डेटा रूट**: इसमें इनजेस्ट किए गए दस्तावेज़ और प्रोसेस्ड डेटा संग्रहीत होते हैं\n", + "- **सिस्टम रूट**: इसमें नॉलेज ग्राफ डेटाबेस और सिस्टम मेटाडेटा होता है\n", + "\n", + "हम इस ट्यूटोरियल के लिए अलग-अलग डायरेक्टरी बनाएंगे, जैसा कि नीचे दिया गया है:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 मेमोरी स्थिति रीसेट करें\n", + "\n", + "हमारे मेमोरी सिस्टम को बनाने से पहले, सुनिश्चित करें कि हम नई शुरुआत कर रहे हैं।\n", + "\n", + "> 💡 **टिप**: यदि आप इस नोटबुक को बाद में उपयोग करते समय अपने पिछले रन की मौजूदा यादों को संरक्षित करना चाहते हैं, तो आप इस चरण को छोड़ सकते हैं।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 भाग 1: ज्ञान आधार बनाना\n", + "\n", + "### हमारे डेवलपर सहायक के लिए डेटा स्रोत\n", + "\n", + "हम एक व्यापक ज्ञान आधार बनाने के लिए तीन प्रकार के डेटा को शामिल करेंगे:\n", + "\n", + "1. **डेवलपर प्रोफ़ाइल**: व्यक्तिगत विशेषज्ञता और तकनीकी पृष्ठभूमि \n", + "2. **पायथन सर्वोत्तम प्रथाएँ**: पायथन के ज़ेन के साथ व्यावहारिक दिशानिर्देश \n", + "3. **ऐतिहासिक बातचीत**: डेवलपर्स और एआई सहायकों के बीच पिछले प्रश्नोत्तर सत्र \n", + "\n", + "यह विविध डेटा हमारे एजेंट को सक्षम बनाता है:\n", + "- उपयोगकर्ता के तकनीकी संदर्भ को समझने में \n", + "- सिफारिशों में सर्वोत्तम प्रथाओं को लागू करने में \n", + "- पिछले सफल इंटरैक्शन से सीखने में \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 डेटा को नॉलेज ग्राफ में बदलें\n", + "\n", + "अब हम अपने कच्चे टेक्स्ट को एक संरचित मेमोरी में बदलेंगे। इस प्रक्रिया में:\n", + "\n", + "1. **डेटा को NodeSets में जोड़ना**: जानकारी को तार्किक श्रेणियों में व्यवस्थित करना\n", + " - `developer_data`: डेवलपर प्रोफाइल और बातचीत\n", + " - `principles_data`: Python के सर्वोत्तम अभ्यास और दिशानिर्देश\n", + "\n", + "2. **Cognify Pipeline चलाना**: संस्थाओं, संबंधों को निकालना और एम्बेडिंग बनाना\n", + " - मुख्य अवधारणाओं की पहचान करना\n", + " - संबंधित जानकारी के बीच अर्थपूर्ण कनेक्शन बनाना\n", + " - वेक्टर एम्बेडिंग जनरेट करना\n", + "\n", + "यह प्रक्रिया कुछ समय ले सकती है क्योंकि LLM टेक्स्ट को प्रोसेस करता है और ग्राफ संरचना बनाता है:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 ज्ञान ग्राफ़ का दृश्यांकन\n", + "\n", + "आइए अपने ज्ञान ग्राफ़ की संरचना का पता लगाएं। दृश्यांकन निम्नलिखित को दर्शाता है:\n", + "- **नोड्स**: पाठ से निकाली गई संस्थाएं (धारणाएं, तकनीकें, लोग)\n", + "- **एजेस**: संस्थाओं के बीच संबंध और कनेक्शन\n", + "- **क्लस्टर्स**: समानार्थक समानता के आधार पर समूहित संबंधित धारणाएं\n", + "\n", + "ग्राफ़ को इंटरैक्टिव रूप से एक्सप्लोर करने के लिए अपने ब्राउज़र में उत्पन्न HTML फ़ाइल खोलें:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 मेमोरी को समृद्ध करें मेमिफाई के साथ\n", + "\n", + "`memify()` फ़ंक्शन ज्ञान ग्राफ का विश्लेषण करता है और डेटा के बारे में बुद्धिमान नियम उत्पन्न करता है। यह प्रक्रिया:\n", + "- पैटर्न और सर्वोत्तम प्रथाओं की पहचान करती है\n", + "- सामग्री के आधार पर क्रियाशील दिशानिर्देश बनाती है\n", + "- विभिन्न ज्ञान क्षेत्रों के बीच संबंध स्थापित करती है\n", + "\n", + "ये नियम एजेंट को सवालों के जवाब देते समय अधिक सूचित निर्णय लेने में मदद करते हैं। एक दूसरा विज़ुअलाइज़ेशन कैप्चर करना आपको तुलना करने में मदद करता है कि ग्राफ़ समृद्ध होने के बाद कैसे सघन हो जाता है।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 भाग 2: बुद्धिमान मेमोरी पुनःप्राप्ति\n", + "\n", + "### प्रदर्शन 1: क्रॉस-डॉक्यूमेंट ज्ञान एकीकरण\n", + "\n", + "अब जब हमारा नॉलेज ग्राफ तैयार हो गया है, तो आइए देखें कि Cognee जटिल सवालों के जवाब देने के लिए कई स्रोतों से जानकारी को कैसे जोड़ता है।\n", + "\n", + "पहली क्वेरी यह दिखाती है:\n", + "- **सामान्य समझ**: प्रासंगिक अवधारणाओं को ढूंढना, भले ही वे स्पष्ट रूप से उल्लेखित न हों\n", + "- **क्रॉस-रेफरेंसिंग**: डेवलपर प्रोफाइल को Python सिद्धांतों के साथ जोड़ना\n", + "- **प्रासंगिक तर्क**: विशिष्ट कार्यान्वयन में सर्वोत्तम प्रथाओं को लागू करना\n", + "\n", + "### प्रदर्शन 2: NodeSets के साथ फ़िल्टर की गई खोज\n", + "\n", + "दूसरी क्वेरी यह दिखाती है कि नॉलेज ग्राफ के विशिष्ट उपसमूहों को कैसे लक्षित किया जाए:\n", + "- `node_name` पैरामीटर का उपयोग केवल `principles_data` के भीतर खोजने के लिए करता है\n", + "- एक विशिष्ट ज्ञान डोमेन से केंद्रित उत्तर प्रदान करता है\n", + "- तब उपयोगी जब आपको डोमेन-विशिष्ट जानकारी की आवश्यकता हो\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 भाग 3: सत्र प्रबंधन सेटअप\n", + "\n", + "### बातचीत की स्मृति सक्षम करना\n", + "\n", + "सत्र प्रबंधन कई इंटरैक्शन के दौरान संदर्भ बनाए रखने के लिए महत्वपूर्ण है। यहां हम करेंगे:\n", + "\n", + "1. **उपयोगकर्ता संदर्भ प्रारंभ करें**: सत्र ट्रैकिंग के लिए उपयोगकर्ता प्रोफ़ाइल बनाएं या पुनः प्राप्त करें\n", + "2. **कैश इंजन कॉन्फ़िगर करें**: बातचीत इतिहास को संग्रहीत करने के लिए Redis से कनेक्ट करें\n", + "3. **सत्र वेरिएबल सक्षम करें**: ऐसे संदर्भ वेरिएबल सेट करें जो क्वेरी के दौरान बने रहें\n", + "\n", + "> ⚠️ **महत्वपूर्ण**: इसके लिए Redis का चलना और आपके वातावरण में `CACHING=true` होना आवश्यक है\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ सहायक फ़ंक्शन: सत्र इतिहास देखें\n", + "\n", + "यह उपयोगिता फ़ंक्शन हमें Redis में संग्रहीत बातचीत के इतिहास का निरीक्षण करने की अनुमति देता है। यह उपयोगी है:\n", + "- सत्र प्रबंधन को डिबग करने के लिए\n", + "- यह सुनिश्चित करने के लिए कि बातचीत कैश की जा रही है\n", + "- यह समझने के लिए कि एजेंट के लिए कौन सा संदर्भ उपलब्ध है\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## सत्र 1: असिंक्रोनस सपोर्ट लैब — पहला प्रश्न\n", + "\n", + "`async-support-lab` सत्र की शुरुआत एक बड़े वेब स्क्रैपर के लिए टेलीमेट्री-अनुकूल asyncio पैटर्न पूछकर करें। ग्राफ पहले से asyncio, aiohttp, और मॉनिटरिंग प्रथाओं के बारे में जानता है, इसलिए प्रतिक्रिया को पहले की बातचीत को ध्यान में रखते हुए नए प्रश्न के अनुसार तैयार किया जाना चाहिए।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## सत्र 1 की मेमोरी को पहले आदान-प्रदान के बाद जांचें\n", + "\n", + "प्रारंभिक प्रश्न के तुरंत बाद `show_history(session_1)` चलाने से यह पुष्टि होती है कि Cognee ने प्रॉम्प्ट और उत्तर दोनों को Redis में लिखा है। आपको समवर्तीता मार्गदर्शन के साथ एक प्रविष्टि दिखाई देनी चाहिए।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## सत्र 1: डेटा मॉडल्स पर फॉलो-अप\n", + "\n", + "अब हम पूछते हैं, \"मुझे dataclasses और Pydantic में से किसे चुनना चाहिए?\" उसी सत्र आईडी का उपयोग करते हुए। Cognee को Python के सिद्धांतों और पिछले FastAPI वार्तालापों को जोड़कर सूक्ष्म सलाह देनी चाहिए—यह दिखाते हुए कि नामित सत्र के भीतर संदर्भ जारी रहता है।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## सत्र 1 का इतिहास दोनों टर्न्स को शामिल करता है\n", + "\n", + "एक और `show_history(session_1)` कॉल में दो प्रश्न-उत्तर प्रविष्टियां दिखाई देनी चाहिए। यह Mem0 लैब के \"मेमोरी रिप्ले\" चरण से मेल खाता है और यह साबित करता है कि अतिरिक्त टर्न्स उसी ट्रांसक्रिप्ट को बढ़ाते हैं।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## सत्र 2: डिज़ाइन समीक्षा थ्रेड — नया सत्र\n", + "\n", + "थ्रेड्स के बीच अलगाव दिखाने के लिए, हम `design-review-session` शुरू करते हैं और घटना समीक्षाओं के लिए लॉगिंग मार्गदर्शन मांगते हैं। भले ही आधारभूत ज्ञान आधार समान हो, नया सत्र आईडी ट्रांसक्रिप्ट्स को अलग रखता है।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## समीक्षा सत्र 2 इतिहास\n", + "\n", + "`show_history(session_2)` को केवल डिज़ाइन-समीक्षा प्रॉम्प्ट/प्रतिक्रिया जोड़ी को सूचीबद्ध करना चाहिए। इसे सत्र 1 के साथ तुलना करें ताकि यह दिखाया जा सके कि Cognee स्वतंत्र प्रतिलेख कैसे बनाए रखता है जबकि साझा ज्ञान ग्राफ़ का पुन: उपयोग करता है।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## सारांश\n", + "\n", + "बधाई हो! आपने अपने कोडिंग सहायक को Cognee द्वारा संचालित एक वास्तविक दीर्घकालिक मेमोरी लेयर प्रदान की है।\n", + "\n", + "इस ट्यूटोरियल में, आपने कच्चे डेवलपर कंटेंट (कोड, डॉक्यूमेंट्स, चैट्स) को एक ग्राफ + वेक्टर मेमोरी में बदल दिया, जिसे आपका एजेंट खोज सकता है, उस पर विचार कर सकता है, और लगातार सुधार कर सकता है।\n", + "\n", + "आपने क्या सीखा:\n", + "\n", + "1. **कच्चे टेक्स्ट से AI मेमोरी तक**: कैसे Cognee असंरचित डेटा को ग्रहण करता है और इसे एक बुद्धिमान, खोजने योग्य मेमोरी में बदलता है, जो संयुक्त वेक्टर + नॉलेज ग्राफ आर्किटेक्चर का उपयोग करता है।\n", + "\n", + "2. **मेमिफाई के साथ ग्राफ समृद्धि**: कैसे बुनियादी ग्राफ निर्माण से आगे बढ़कर मेमिफाई का उपयोग करके आपके मौजूदा ग्राफ पर व्युत्पन्न तथ्य और अधिक समृद्ध संबंध जोड़ सकते हैं।\n", + "\n", + "3. **कई खोज रणनीतियाँ**: कैसे मेमोरी को विभिन्न खोज प्रकारों (ग्राफ-अवेयर Q&A, RAG-स्टाइल कंप्लीशन, इनसाइट्स, कच्चे चंक्स, कोड सर्च आदि) के साथ क्वेरी करें, जो आपके एजेंट की आवश्यकता के अनुसार हो।\n", + "\n", + "4. **दृश्य अन्वेषण**: कैसे ग्राफ विज़ुअलाइज़ेशन और Cognee UI का उपयोग करके निरीक्षण और डिबग करें कि Cognee ने क्या बनाया है, ताकि आप वास्तव में देख सकें कि ज्ञान कैसे संरचित है।\n", + "\n", + "5. **सेशन-अवेयर मेमोरी**: कैसे प्रति-सेशन संदर्भ को स्थायी सेमांटिक मेमोरी के साथ जोड़ें ताकि एजेंट रन के बीच याद रख सकें, बिना उपयोगकर्ताओं के बीच जानकारी लीक किए।\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## मुख्य बातें\n", + "1. नॉलेज ग्राफ के रूप में मेमोरी, जो एम्बेडिंग्स द्वारा समर्थित है\n", + "\n", + " - **संरचित समझ**: Cognee एक वेक्टर स्टोर और एक ग्राफ स्टोर को जोड़ता है, जिससे आपका डेटा न केवल अर्थ के आधार पर खोजने योग्य होता है, बल्कि संबंधों द्वारा भी जुड़ा होता है। डिफ़ॉल्ट रूप से Cognee फाइल-आधारित डेटाबेस का उपयोग करता है (वेक्टर के लिए LanceDB, ग्राफ डेटाबेस के लिए Kuzu)।\n", + "\n", + " - **संबंध-सचेत पुनर्प्राप्ति**: उत्तर केवल \"समान टेक्स्ट\" पर आधारित नहीं होते, बल्कि यह भी कि इकाइयाँ कैसे संबंधित हैं।\n", + "\n", + " - **जीवंत मेमोरी**: मेमोरी लेयर विकसित होती है, बढ़ती है, और एक जुड़े हुए ग्राफ के रूप में क्वेरी करने योग्य रहती है।\n", + "\n", + "2. खोज और तर्क मोड\n", + " - **हाइब्रिड पुनर्प्राप्ति**: खोज वेक्टर समानता, ग्राफ संरचना, और LLM तर्क को मिलाती है, कच्चे चंक लुकअप से लेकर ग्राफ-सचेत प्रश्न उत्तर तक।\n", + "\n", + " - **काम के अनुसार मोड का चयन करें**: जब आपको प्राकृतिक भाषा में उत्तर चाहिए, तो completion-style मोड का उपयोग करें, और जब आपके एजेंट को कच्चा संदर्भ चाहिए या अपना तर्क चलाना हो, तो chunk/summary/graph मोड का उपयोग करें।\n", + "\n", + "3. व्यक्तिगत और सत्र-सचेत एजेंट\n", + " - **सत्र संदर्भ + दीर्घकालिक मेमोरी**: Cognee अल्पकालिक \"थ्रेड\" संदर्भ को दीर्घकालिक, उपयोगकर्ता- या संगठन-स्तरीय मेमोरी से अलग रखता है।\n", + "\n", + "## वास्तविक दुनिया में उपयोग\n", + "\n", + "1. **वर्टिकल एआई एजेंट्स**\n", + "\n", + " इस नोटबुक के पैटर्न का उपयोग करके डोमेन-स्मार्ट कोपायलट्स को शक्ति दें, जो Cognee को उनके पुनर्प्राप्ति और तर्क के मुख्य आधार के रूप में उपयोग करते हैं:\n", + "\n", + "- **डेवलपर कोपायलट्स**: कोड रिव्यू, घटना विश्लेषण, और आर्किटेक्चर सहायक, जो कोड, एपीआई, डिज़ाइन डॉक्यूमेंट्स, और टिकट्स को एकल मेमोरी ग्राफ के रूप में नेविगेट करते हैं।\n", + "\n", + "- **ग्राहक-सामना करने वाले कोपायलट्स**: सपोर्ट या सफलता एजेंट्स, जो प्रोडक्ट डॉक्यूमेंट्स, FAQs, CRM नोट्स, और पिछले टिकट्स से ग्राफ-सचेत पुनर्प्राप्ति और उद्धृत उत्तर प्रदान करते हैं।\n", + "\n", + "- **आंतरिक विशेषज्ञ कोपायलट्स**: नीति, कानूनी, या सुरक्षा सहायक, जो अलग-अलग PDFs के बजाय जुड़े हुए नियमों, दिशानिर्देशों, और ऐतिहासिक निर्णयों पर तर्क करते हैं।\n", + "\n", + " Cognee को एआई एजेंट्स के लिए सटीक और स्थायी मेमोरी के रूप में स्पष्ट रूप से स्थापित किया गया है, जो आपके एजेंट के पीछे एक जीवंत नॉलेज ग्राफ प्रदान करता है और वेक्टर स्टोर्स और कस्टम ग्राफ कोड के अस्थायी संयोजनों को बदल देता है।\n", + "\n", + "2. **डेटा साइलो को एक मेमोरी में एकीकृत करना**\n", + "\n", + " यही दृष्टिकोण आपको बिखरे हुए स्रोतों के बीच एकीकृत मेमोरी लेयर बनाने में भी मदद करता है:\n", + "\n", + "- **साइलो से एक ग्राफ तक**: संरचित (जैसे, डेटाबेस) और असंरचित डेटा (जैसे, डॉक्यूमेंट्स, चैट्स) को एकल ग्राफ में एम्बेडिंग्स द्वारा समर्थित करें, बजाय प्रत्येक सिस्टम के लिए अलग-अलग इंडेक्स बनाने के।\n", + "\n", + "- **उद्धरणों के साथ क्रॉस-सोर्स तर्क**: सब कुछ पर मल्टी-स्टेप तर्क चलाएं—ग्राफ के माध्यम से लॉग्स, मेट्रिक्स, और डॉक्यूमेंट्स को \"जोड़ें\"—और फिर भी प्रमाणित उत्तरों के साथ वापस लौटें।\n", + "\n", + "- **नॉलेज हब्स**: बैंकिंग या शिक्षा जैसे डोमेन के लिए, Cognee पहले से ही PDFs, आंतरिक सिस्टम्स, और ऐप डेटा को एक नॉलेज ग्राफ में एकीकृत करने के लिए उपयोग किया जाता है, ताकि एजेंट सटीक, उद्धृत संदर्भ के साथ प्रश्नों का उत्तर दे सकें।\n", + "\n", + "## अगले कदम\n", + "\n", + "आपने कोर मेमोरी लूप को लागू कर लिया है। यहां कुछ स्वाभाविक विस्तार दिए गए हैं जिन्हें आप स्वयं आज़मा सकते हैं (विवरण के लिए [Cognee दस्तावेज़](https://docs.cognee.ai/) देखें):\n", + "\n", + "1. **टेम्पोरल अवेयरनेस के साथ प्रयोग करें**: टेक्स्ट से घटनाओं और टाइमस्टैम्प्स को निकालने के लिए टेम्पोरल कॉग्निफाई चालू करें।\n", + "\n", + "2. **ऑन्टोलॉजी-ड्रिवन तर्क पेश करें**: अपने डोमेन के लिए एक OWL ऑन्टोलॉजी परिभाषित करें। Cognee के ऑन्टोलॉजी समर्थन का उपयोग करें ताकि निकाली गई इकाइयाँ और संबंध उस स्कीमा में आधारित हों, जिससे ग्राफ की गुणवत्ता और डोमेन-विशिष्ट उत्तर बेहतर हों।\n", + "\n", + "3. **फीडबैक लूप जोड़ें**: Cognee को वास्तविक उपयोगकर्ता फीडबैक से ग्राफ एज वेट्स को समायोजित करने दें, ताकि पुनर्प्राप्ति समय के साथ बेहतर हो जाए और स्थिर न रहे।\n", + "\n", + "4. **व्यक्तिगतकरण और सत्र व्यवहार के लिए ट्यून करें**: उपयोगकर्ता आईडी, टेनेंट्स, और डेटासेट्स का उपयोग करके प्रत्येक व्यक्ति या टीम को साझा मेमोरी इंजन पर अपनी खुद की व्यू दें।\n", + "\n", + "5. **अधिक जटिल एजेंट्स के लिए स्केल करें**: Cognee को एजेंट फ्रेमवर्क्स में प्लग करें ताकि मल्टी-एजेंट सिस्टम्स बनाए जा सकें, जो सभी एक ही मेमोरी लेयर साझा करते हों। *Microsoft Agent Framework x Cognee प्लगइन जल्द ही आ रहा है।*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**अस्वीकरण**: \nयह दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके अनुवादित किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवाद में त्रुटियां या अशुद्धियां हो सकती हैं। मूल भाषा में दस्तावेज़ को आधिकारिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं।\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:36:40+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "hi" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/hi/13-agent-memory/README.md b/translations/hi/13-agent-memory/README.md index 31fc6649e..1471fc1a4 100644 --- a/translations/hi/13-agent-memory/README.md +++ b/translations/hi/13-agent-memory/README.md @@ -1,16 +1,16 @@ -# एआई एजेंट्स के लिए मेमोरी +# एआई एजेंट्स के लिए मेमोरी [![एजेंट मेमोरी](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.hi.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -जब एआई एजेंट्स बनाने के अनूठे लाभों की बात होती है, तो मुख्य रूप से दो चीजों पर चर्चा होती है: टूल्स का उपयोग करके कार्यों को पूरा करने की क्षमता और समय के साथ सुधार करने की क्षमता। मेमोरी एक ऐसा आधार है जो आत्म-सुधार करने वाले एजेंट्स को बनाने में मदद करता है, जिससे हमारे उपयोगकर्ताओं के लिए बेहतर अनुभव तैयार किया जा सके। +जब एआई एजेंट्स बनाने के अनोखे लाभों की बात होती है, तो मुख्य रूप से दो चीजों पर चर्चा होती है: टूल्स का उपयोग करके कार्य पूरा करने की क्षमता और समय के साथ सुधार करने की क्षमता। मेमोरी एक ऐसा आधार है जो आत्म-सुधार करने वाले एजेंट्स को बनाने में मदद करता है, जिससे हमारे उपयोगकर्ताओं के लिए बेहतर अनुभव तैयार किया जा सके। इस पाठ में, हम देखेंगे कि एआई एजेंट्स के लिए मेमोरी क्या है और इसे कैसे प्रबंधित और उपयोग किया जा सकता है ताकि हमारे एप्लिकेशन को लाभ मिल सके। @@ -20,29 +20,37 @@ CO_OP_TRANSLATOR_METADATA: • **एआई एजेंट मेमोरी को समझना**: मेमोरी क्या है और एजेंट्स के लिए यह क्यों महत्वपूर्ण है। -• **मेमोरी को लागू करना और संग्रहीत करना**: आपके एआई एजेंट्स में मेमोरी क्षमताओं को जोड़ने के व्यावहारिक तरीके, जिसमें शॉर्ट-टर्म और लॉन्ग-टर्म मेमोरी पर ध्यान केंद्रित किया जाएगा। +• **मेमोरी को लागू करना और संग्रहीत करना**: आपके एआई एजेंट्स में मेमोरी क्षमताओं को जोड़ने के व्यावहारिक तरीके, जिसमें शॉर्ट-टर्म और लॉन्ग-टर्म मेमोरी पर ध्यान केंद्रित किया गया है। • **एआई एजेंट्स को आत्म-सुधार करने योग्य बनाना**: कैसे मेमोरी एजेंट्स को पिछले इंटरैक्शन से सीखने और समय के साथ सुधार करने में सक्षम बनाती है। +## उपलब्ध कार्यान्वयन + +इस पाठ में दो व्यापक नोटबुक ट्यूटोरियल शामिल हैं: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: मेमोरी को Mem0 और Azure AI Search के साथ Semantic Kernel फ्रेमवर्क का उपयोग करके लागू करता है। + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Cognee का उपयोग करके संरचित मेमोरी को लागू करता है, जो एम्बेडिंग द्वारा समर्थित ज्ञान ग्राफ को स्वचालित रूप से बनाता है, ग्राफ को विज़ुअलाइज़ करता है, और बुद्धिमान पुनर्प्राप्ति प्रदान करता है। + ## सीखने के लक्ष्य -इस पाठ को पूरा करने के बाद, आप जान पाएंगे कि: +इस पाठ को पूरा करने के बाद, आप जान पाएंगे: -• **एआई एजेंट मेमोरी के विभिन्न प्रकारों में अंतर करना**, जैसे वर्किंग, शॉर्ट-टर्म, और लॉन्ग-टर्म मेमोरी, साथ ही विशेष प्रकार जैसे पर्सोना और एपिसोडिक मेमोरी। +• **एआई एजेंट मेमोरी के विभिन्न प्रकारों में अंतर करना**, जिसमें वर्किंग, शॉर्ट-टर्म और लॉन्ग-टर्म मेमोरी शामिल हैं, साथ ही विशेष प्रकार जैसे पर्सोना और एपिसोडिक मेमोरी। -• **एआई एजेंट्स के लिए शॉर्ट-टर्म और लॉन्ग-टर्म मेमोरी को लागू और प्रबंधित करना** Semantic Kernel फ्रेमवर्क का उपयोग करके, Mem0 और Whiteboard मेमोरी जैसे टूल्स का लाभ उठाना, और Azure AI Search के साथ एकीकरण करना। +• **एआई एजेंट्स के लिए शॉर्ट-टर्म और लॉन्ग-टर्म मेमोरी को लागू और प्रबंधित करना** Semantic Kernel फ्रेमवर्क का उपयोग करके, Mem0, Cognee, Whiteboard मेमोरी जैसे टूल्स का लाभ उठाते हुए और Azure AI Search के साथ एकीकृत करते हुए। • **आत्म-सुधार करने वाले एआई एजेंट्स के पीछे के सिद्धांतों को समझना** और कैसे मजबूत मेमोरी प्रबंधन प्रणाली निरंतर सीखने और अनुकूलन में योगदान देती है। ## एआई एजेंट मेमोरी को समझना -मूल रूप से, **एआई एजेंट्स के लिए मेमोरी उन तंत्रों को संदर्भित करती है जो उन्हें जानकारी को बनाए रखने और पुनः प्राप्त करने की अनुमति देते हैं**। यह जानकारी बातचीत के विशिष्ट विवरण, उपयोगकर्ता की प्राथमिकताएं, पिछले कार्य, या सीखे गए पैटर्न हो सकती है। +मूल रूप से, **एआई एजेंट्स के लिए मेमोरी उन तंत्रों को संदर्भित करती है जो उन्हें जानकारी बनाए रखने और पुनः प्राप्त करने की अनुमति देते हैं**। यह जानकारी बातचीत के विशिष्ट विवरण, उपयोगकर्ता की प्राथमिकताएं, पिछले कार्य, या सीखे गए पैटर्न हो सकती है। -मेमोरी के बिना, एआई एप्लिकेशन अक्सर स्टेटलेस होते हैं, जिसका मतलब है कि हर इंटरैक्शन नए सिरे से शुरू होता है। इससे एक दोहरावदार और निराशाजनक उपयोगकर्ता अनुभव होता है, जहां एजेंट पिछले संदर्भ या प्राथमिकताओं को "भूल" जाता है। +मेमोरी के बिना, एआई एप्लिकेशन अक्सर स्टेटलेस होते हैं, जिसका मतलब है कि हर इंटरैक्शन नए सिरे से शुरू होता है। इससे एक दोहराव और निराशाजनक उपयोगकर्ता अनुभव होता है, जहां एजेंट पिछले संदर्भ या प्राथमिकताओं को "भूल" जाता है। ### मेमोरी क्यों महत्वपूर्ण है? -एजेंट की बुद्धिमत्ता उसकी पिछली जानकारी को याद करने और उपयोग करने की क्षमता से गहराई से जुड़ी होती है। मेमोरी एजेंट्स को निम्नलिखित बनाती है: +किसी एजेंट की बुद्धिमत्ता उसकी पिछली जानकारी को याद करने और उपयोग करने की क्षमता से गहराई से जुड़ी होती है। मेमोरी एजेंट्स को निम्नलिखित बनाती है: • **चिंतनशील**: पिछले कार्यों और परिणामों से सीखना। @@ -58,21 +66,21 @@ CO_OP_TRANSLATOR_METADATA: #### वर्किंग मेमोरी -इसे एक प्रकार के स्क्रैच पेपर के रूप में सोचें जिसे एजेंट एकल, चल रहे कार्य या विचार प्रक्रिया के दौरान उपयोग करता है। यह तुरंत आवश्यक जानकारी को अगले कदम की गणना के लिए रखता है। +इसे एक प्रकार के स्क्रैच पेपर के रूप में सोचें जिसे एजेंट एकल, चल रहे कार्य या विचार प्रक्रिया के दौरान उपयोग करता है। यह तत्काल जानकारी रखता है जो अगले कदम की गणना के लिए आवश्यक होती है। -एआई एजेंट्स के लिए, वर्किंग मेमोरी अक्सर बातचीत से सबसे प्रासंगिक जानकारी को कैप्चर करती है, भले ही पूरी चैट हिस्ट्री लंबी या ट्रंकेटेड हो। यह आवश्यक तत्वों जैसे आवश्यकताओं, प्रस्तावों, निर्णयों, और कार्यों को निकालने पर केंद्रित होती है। +एआई एजेंट्स के लिए, वर्किंग मेमोरी अक्सर बातचीत से सबसे प्रासंगिक जानकारी को कैप्चर करती है, भले ही पूरी चैट हिस्ट्री लंबी या ट्रंकेट हो। यह आवश्यक तत्वों जैसे आवश्यकताओं, प्रस्तावों, निर्णयों और कार्यों को निकालने पर केंद्रित होती है। **वर्किंग मेमोरी उदाहरण** -एक ट्रैवल बुकिंग एजेंट में, वर्किंग मेमोरी उपयोगकर्ता की वर्तमान अनुरोध को कैप्चर कर सकती है, जैसे "मैं पेरिस की यात्रा बुक करना चाहता हूं"। यह विशिष्ट आवश्यकता एजेंट के तत्काल संदर्भ में रखी जाती है ताकि वर्तमान इंटरैक्शन को निर्देशित किया जा सके। +एक ट्रैवल बुकिंग एजेंट में, वर्किंग मेमोरी उपयोगकर्ता की वर्तमान अनुरोध को कैप्चर कर सकती है, जैसे "मैं पेरिस की यात्रा बुक करना चाहता हूं"। यह विशिष्ट आवश्यकता एजेंट के तत्काल संदर्भ में रखी जाती है ताकि वर्तमान इंटरैक्शन को मार्गदर्शित किया जा सके। #### शॉर्ट टर्म मेमोरी -यह प्रकार की मेमोरी एकल बातचीत या सत्र की अवधि के लिए जानकारी को बनाए रखती है। यह वर्तमान चैट का संदर्भ है, जो एजेंट को संवाद में पिछले टर्न्स का संदर्भ देने की अनुमति देती है। +यह प्रकार की मेमोरी एकल बातचीत या सत्र की अवधि के लिए जानकारी बनाए रखती है। यह वर्तमान चैट का संदर्भ है, जो एजेंट को संवाद में पिछले टर्न्स का उल्लेख करने की अनुमति देता है। **शॉर्ट टर्म मेमोरी उदाहरण** -यदि उपयोगकर्ता पूछता है, "पेरिस के लिए फ्लाइट की कीमत कितनी होगी?" और फिर पूछता है, "वहां रहने की व्यवस्था के बारे में क्या?", शॉर्ट टर्म मेमोरी सुनिश्चित करती है कि एजेंट जानता है "वहां" का मतलब "पेरिस" है उसी बातचीत में। +यदि उपयोगकर्ता पूछता है, "पेरिस के लिए फ्लाइट की कीमत कितनी होगी?" और फिर पूछता है, "वहां रहने की व्यवस्था के बारे में क्या?", शॉर्ट टर्म मेमोरी सुनिश्चित करती है कि एजेंट जानता है कि "वहां" का मतलब "पेरिस" है उसी बातचीत के भीतर। #### लॉन्ग टर्म मेमोरी @@ -90,13 +98,13 @@ CO_OP_TRANSLATOR_METADATA: यदि ट्रैवल एजेंट को "एक्सपर्ट स्की प्लानर" के रूप में डिज़ाइन किया गया है, तो पर्सोना मेमोरी इस भूमिका को सुदृढ़ कर सकती है, जिससे उसकी प्रतिक्रियाएं एक विशेषज्ञ के स्वर और ज्ञान के साथ मेल खाती हैं। -#### वर्कफ्लो/एपिसोडिक मेमोरी +#### वर्कफ़्लो/एपिसोडिक मेमोरी -यह मेमोरी एक जटिल कार्य के दौरान एजेंट द्वारा उठाए गए कदमों की अनुक्रमिकता को संग्रहीत करती है, जिसमें सफलताएं और विफलताएं शामिल हैं। यह पिछले "एपिसोड" या अनुभवों को याद रखने जैसा है ताकि उनसे सीखा जा सके। +यह मेमोरी एक जटिल कार्य के दौरान एजेंट द्वारा उठाए गए कदमों की अनुक्रम को संग्रहीत करती है, जिसमें सफलताएं और असफलताएं शामिल हैं। यह पिछले "एपिसोड" या अनुभवों को याद करने जैसा है ताकि उनसे सीखा जा सके। **एपिसोडिक मेमोरी उदाहरण** -यदि एजेंट ने एक विशिष्ट फ्लाइट बुक करने का प्रयास किया लेकिन यह उपलब्धता के कारण विफल हो गया, तो एपिसोडिक मेमोरी इस विफलता को रिकॉर्ड कर सकती है, जिससे एजेंट वैकल्पिक फ्लाइट्स का प्रयास कर सके या अगले प्रयास में उपयोगकर्ता को अधिक सूचित तरीके से समस्या के बारे में बता सके। +यदि एजेंट ने एक विशिष्ट फ्लाइट बुक करने का प्रयास किया लेकिन यह उपलब्धता के कारण विफल हो गया, तो एपिसोडिक मेमोरी इस विफलता को रिकॉर्ड कर सकती है, जिससे एजेंट वैकल्पिक फ्लाइट्स का प्रयास कर सके या उपयोगकर्ता को अगले प्रयास के दौरान अधिक सूचित तरीके से समस्या के बारे में बता सके। #### एंटिटी मेमोरी @@ -104,57 +112,69 @@ CO_OP_TRANSLATOR_METADATA: **एंटिटी मेमोरी उदाहरण** -पिछली यात्रा के बारे में बातचीत से, एजेंट "पेरिस," "एफिल टॉवर," और "ले चैट नोयर रेस्तरां में डिनर" को एंटिटी के रूप में निकाल सकता है। भविष्य के इंटरैक्शन में, एजेंट "ले चैट नोयर" को याद कर सकता है और वहां एक नई बुकिंग की पेशकश कर सकता है। +पिछली यात्रा के बारे में बातचीत से, एजेंट "पेरिस," "एफिल टॉवर," और "ले चैट नोयर रेस्तरां में डिनर" जैसी एंटिटी निकाल सकता है। भविष्य के इंटरैक्शन में, एजेंट "ले चैट नोयर" को याद कर सकता है और वहां एक नई बुकिंग करने की पेशकश कर सकता है। -#### स्ट्रक्चर्ड RAG (रिट्रीवल ऑगमेंटेड जनरेशन) +#### संरचित RAG (रिट्रीवल ऑगमेंटेड जनरेशन) -हालांकि RAG एक व्यापक तकनीक है, "स्ट्रक्चर्ड RAG" को एक शक्तिशाली मेमोरी तकनीक के रूप में उजागर किया गया है। यह विभिन्न स्रोतों (जैसे बातचीत, ईमेल, छवियां) से घनी, संरचित जानकारी निकालता है और इसे प्रतिक्रियाओं में सटीकता, पुनः प्राप्ति, और गति बढ़ाने के लिए उपयोग करता है। क्लासिक RAG जो केवल सेमांटिक समानता पर निर्भर करता है, के विपरीत, स्ट्रक्चर्ड RAG जानकारी की अंतर्निहित संरचना के साथ काम करता है। +हालांकि RAG एक व्यापक तकनीक है, "संरचित RAG" को एक शक्तिशाली मेमोरी तकनीक के रूप में उजागर किया गया है। यह विभिन्न स्रोतों (बातचीत, ईमेल, छवियां) से घनी, संरचित जानकारी निकालता है और इसे प्रतिक्रियाओं में सटीकता, पुनर्प्राप्ति और गति बढ़ाने के लिए उपयोग करता है। क्लासिक RAG जो केवल सेमांटिक समानता पर निर्भर करता है, के विपरीत, संरचित RAG जानकारी की अंतर्निहित संरचना के साथ काम करता है। -**स्ट्रक्चर्ड RAG उदाहरण** +**संरचित RAG उदाहरण** -केवल कीवर्ड मिलान करने के बजाय, स्ट्रक्चर्ड RAG ईमेल से फ्लाइट विवरण (गंतव्य, तारीख, समय, एयरलाइन) को पार्स कर सकता है और इसे संरचित तरीके से संग्रहीत कर सकता है। यह सटीक क्वेरी जैसे "मैंने मंगलवार को पेरिस के लिए कौन सी फ्लाइट बुक की?" की अनुमति देता है। +केवल कीवर्ड मिलान करने के बजाय, संरचित RAG ईमेल से फ्लाइट विवरण (गंतव्य, तारीख, समय, एयरलाइन) को पार्स कर सकता है और इसे संरचित तरीके से संग्रहीत कर सकता है। यह सटीक प्रश्नों जैसे "मैंने मंगलवार को पेरिस के लिए कौन सी फ्लाइट बुक की?" का उत्तर देने की अनुमति देता है। ## मेमोरी को लागू करना और संग्रहीत करना -एआई एजेंट्स के लिए मेमोरी को लागू करना **मेमोरी प्रबंधन** की एक व्यवस्थित प्रक्रिया शामिल करता है, जिसमें जानकारी उत्पन्न करना, संग्रहीत करना, पुनः प्राप्त करना, एकीकृत करना, अपडेट करना, और यहां तक कि "भूलना" (या हटाना) शामिल है। पुनः प्राप्ति विशेष रूप से महत्वपूर्ण पहलू है। +एआई एजेंट्स के लिए मेमोरी को लागू करना **मेमोरी प्रबंधन** की एक व्यवस्थित प्रक्रिया शामिल करता है, जिसमें जानकारी उत्पन्न करना, संग्रहीत करना, पुनर्प्राप्त करना, एकीकृत करना, अपडेट करना, और यहां तक कि "भूलना" (या हटाना) शामिल है। पुनर्प्राप्ति विशेष रूप से महत्वपूर्ण पहलू है। ### विशेष मेमोरी टूल्स -एजेंट मेमोरी को संग्रहीत और प्रबंधित करने का एक तरीका विशेष टूल्स जैसे Mem0 का उपयोग करना है। Mem0 एक स्थायी मेमोरी लेयर के रूप में काम करता है, जिससे एजेंट्स को प्रासंगिक इंटरैक्शन को याद रखने, उपयोगकर्ता प्राथमिकताओं और तथ्यात्मक संदर्भ को संग्रहीत करने, और समय के साथ सफलताओं और विफलताओं से सीखने की अनुमति मिलती है। विचार यह है कि स्टेटलेस एजेंट्स को स्टेटफुल में बदल दिया जाए। +#### Mem0 + +एजेंट मेमोरी को संग्रहीत और प्रबंधित करने का एक तरीका विशेष टूल्स जैसे Mem0 का उपयोग करना है। Mem0 एक स्थायी मेमोरी लेयर के रूप में काम करता है, जिससे एजेंट्स को प्रासंगिक इंटरैक्शन याद रखने, उपयोगकर्ता प्राथमिकताओं और तथ्यात्मक संदर्भ संग्रहीत करने, और समय के साथ सफलताओं और विफलताओं से सीखने की अनुमति मिलती है। विचार यह है कि स्टेटलेस एजेंट्स को स्टेटफुल बनाया जाए। + +यह **दो-चरणीय मेमोरी पाइपलाइन: एक्सट्रैक्शन और अपडेट** के माध्यम से काम करता है। पहले, एजेंट के थ्रेड में जोड़े गए संदेशों को Mem0 सेवा में भेजा जाता है, जो बातचीत के इतिहास को सारांशित करने और नई मेमोरी निकालने के लिए एक बड़े भाषा मॉडल (LLM) का उपयोग करता है। इसके बाद, एक LLM-चालित अपडेट चरण यह निर्धारित करता है कि इन मेमोरी को जोड़ना, संशोधित करना, या हटाना है, और उन्हें एक हाइब्रिड डेटा स्टोर में संग्रहीत करता है जिसमें वेक्टर, ग्राफ, और की-वैल्यू डेटाबेस शामिल हो सकते हैं। यह प्रणाली विभिन्न मेमोरी प्रकारों का समर्थन करती है और एंटिटी के बीच संबंधों को प्रबंधित करने के लिए ग्राफ मेमोरी को शामिल कर सकती है। + +#### Cognee + +एक अन्य शक्तिशाली दृष्टिकोण **Cognee** का उपयोग करना है, जो एआई एजेंट्स के लिए एक ओपन-सोर्स सेमांटिक मेमोरी है जो संरचित और असंरचित डेटा को एम्बेडिंग द्वारा समर्थित क्वेरी योग्य ज्ञान ग्राफ में बदल देती है। Cognee एक **डुअल-स्टोर आर्किटेक्चर** प्रदान करता है जो वेक्टर समानता खोज को ग्राफ संबंधों के साथ जोड़ता है, जिससे एजेंट्स को न केवल यह समझने में मदद मिलती है कि कौन सी जानकारी समान है, बल्कि यह भी कि अवधारणाएं एक-दूसरे से कैसे संबंधित हैं। + +यह **हाइब्रिड पुनर्प्राप्ति** में उत्कृष्टता प्राप्त करता है जो वेक्टर समानता, ग्राफ संरचना, और LLM तर्क को मिलाता है - कच्चे चंक लुकअप से ग्राफ-अवेयर प्रश्न उत्तर तक। प्रणाली **लिविंग मेमोरी** बनाए रखती है जो विकसित और बढ़ती है जबकि एक जुड़े हुए ग्राफ के रूप में क्वेरी योग्य रहती है, जो शॉर्ट-टर्म सत्र संदर्भ और लॉन्ग-टर्म स्थायी मेमोरी दोनों का समर्थन करती है। -यह **दो-चरणीय मेमोरी पाइपलाइन: एक्सट्रैक्शन और अपडेट** के माध्यम से काम करता है। पहले, एजेंट के थ्रेड में जोड़े गए संदेशों को Mem0 सेवा में भेजा जाता है, जो एक बड़े भाषा मॉडल (LLM) का उपयोग करके बातचीत के इतिहास को सारांशित करता है और नई मेमोरी निकालता है। इसके बाद, एक LLM-चालित अपडेट चरण यह निर्धारित करता है कि इन मेमोरी को जोड़ना, संशोधित करना, या हटाना है, और उन्हें एक हाइब्रिड डेटा स्टोर में संग्रहीत करता है जिसमें वेक्टर, ग्राफ, और की-वैल्यू डेटाबेस शामिल हो सकते हैं। यह प्रणाली विभिन्न प्रकार की मेमोरी का समर्थन करती है और एंटिटी के बीच संबंधों को प्रबंधित करने के लिए ग्राफ मेमोरी को शामिल कर सकती है। +Cognee नोटबुक ट्यूटोरियल ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) इस एकीकृत मेमोरी लेयर को बनाने का प्रदर्शन करता है, जिसमें विविध डेटा स्रोतों को इनजेस्ट करने, ज्ञान ग्राफ को विज़ुअलाइज़ करने, और विभिन्न खोज रणनीतियों के साथ क्वेरी करने के व्यावहारिक उदाहरण शामिल हैं जो विशिष्ट एजेंट आवश्यकताओं के लिए अनुकूलित हैं। ### RAG के साथ मेमोरी संग्रहीत करना -विशेष मेमोरी टूल्स जैसे Mem0 के अलावा, आप **Azure AI Search** जैसी मजबूत सर्च सेवाओं का उपयोग करके मेमोरी को संग्रहीत और पुनः प्राप्त कर सकते हैं, विशेष रूप से स्ट्रक्चर्ड RAG के लिए। +विशेष मेमोरी टूल्स जैसे Mem0 के अलावा, आप **Azure AI Search जैसी मजबूत खोज सेवाओं का उपयोग करके मेमोरी संग्रहीत और पुनर्प्राप्त कर सकते हैं**, विशेष रूप से संरचित RAG के लिए। यह आपके एजेंट की प्रतिक्रियाओं को आपके अपने डेटा के साथ ग्राउंड करने की अनुमति देता है, जिससे अधिक प्रासंगिक और सटीक उत्तर सुनिश्चित होते हैं। Azure AI Search का उपयोग उपयोगकर्ता-विशिष्ट यात्रा मेमोरी, उत्पाद कैटलॉग, या किसी अन्य डोमेन-विशिष्ट ज्ञान को संग्रहीत करने के लिए किया जा सकता है। -Azure AI Search **स्ट्रक्चर्ड RAG** जैसी क्षमताओं का समर्थन करता है, जो बातचीत के इतिहास, ईमेल, या यहां तक कि छवियों जैसे बड़े डेटा सेट से घनी, संरचित जानकारी निकालने और पुनः प्राप्त करने में उत्कृष्ट है। यह पारंपरिक टेक्स्ट चंकिंग और एम्बेडिंग दृष्टिकोणों की तुलना में "सुपरह्यूमन सटीकता और पुनः प्राप्ति" प्रदान करता है। +Azure AI Search **संरचित RAG** जैसी क्षमताओं का समर्थन करता है, जो बातचीत के इतिहास, ईमेल, या यहां तक कि छवियों जैसे बड़े डेटासेट से घनी, संरचित जानकारी निकालने और पुनर्प्राप्त करने में उत्कृष्टता प्राप्त करता है। यह पारंपरिक टेक्स्ट चंकिंग और एम्बेडिंग दृष्टिकोणों की तुलना में "सुपरह्यूमन सटीकता और पुनर्प्राप्ति" प्रदान करता है। ## एआई एजेंट्स को आत्म-सुधार बनाना -आत्म-सुधार करने वाले एजेंट्स के लिए एक सामान्य पैटर्न **"नॉलेज एजेंट"** को पेश करना शामिल करता है। यह अलग एजेंट उपयोगकर्ता और प्राथमिक एजेंट के बीच मुख्य बातचीत का अवलोकन करता है। इसका कार्य है: +आत्म-सुधार करने वाले एजेंट्स के लिए एक सामान्य पैटर्न **"ज्ञान एजेंट"** को पेश करना शामिल है। यह अलग एजेंट उपयोगकर्ता और प्राथमिक एजेंट के बीच मुख्य बातचीत का अवलोकन करता है। इसका कार्य है: -1. **मूल्यवान जानकारी की पहचान करना**: यह निर्धारित करना कि बातचीत का कोई हिस्सा सामान्य ज्ञान या विशिष्ट उपयोगकर्ता प्राथमिकता के रूप में सहेजने योग्य है। +1. **मूल्यवान जानकारी की पहचान करना**: यह निर्धारित करना कि बातचीत का कोई हिस्सा सामान्य ज्ञान या विशिष्ट उपयोगकर्ता प्राथमिकता के रूप में संग्रहीत करने योग्य है। -2. **निकालना और सारांशित करना**: बातचीत से आवश्यक सीख या प्राथमिकता को संक्षेप में प्रस्तुत करना। +2. **निकालना और सारांशित करना**: बातचीत से आवश्यक सीख या प्राथमिकता को निकालना। -3. **ज्ञान आधार में संग्रहीत करना**: इस निकाली गई जानकारी को अक्सर एक वेक्टर डेटाबेस में संग्रहीत करना ताकि इसे बाद में पुनः प्राप्त किया जा सके। +3. **ज्ञान आधार में संग्रहीत करना**: इस निकाली गई जानकारी को अक्सर एक वेक्टर डेटाबेस में संग्रहीत करना ताकि इसे बाद में पुनर्प्राप्त किया जा सके। -4. **भविष्य की क्वेरी को बढ़ाना**: जब उपयोगकर्ता एक नई क्वेरी शुरू करता है, तो नॉलेज एजेंट प्रासंगिक संग्रहीत जानकारी को पुनः प्राप्त करता है और इसे उपयोगकर्ता के प्रॉम्प्ट में जोड़ता है, प्राथमिक एजेंट को महत्वपूर्ण संदर्भ प्रदान करता है (RAG के समान)। +4. **भविष्य की क्वेरी को बढ़ाना**: जब उपयोगकर्ता एक नई क्वेरी शुरू करता है, तो ज्ञान एजेंट संग्रहीत प्रासंगिक जानकारी को पुनर्प्राप्त करता है और इसे उपयोगकर्ता के प्रॉम्प्ट में जोड़ता है, प्राथमिक एजेंट को महत्वपूर्ण संदर्भ प्रदान करता है (RAG के समान)। ### मेमोरी के लिए अनुकूलन -• **लेटेंसी प्रबंधन**: उपयोगकर्ता इंटरैक्शन को धीमा करने से बचाने के लिए, एक सस्ता, तेज़ मॉडल का उपयोग शुरू में यह जल्दी जांचने के लिए किया जा सकता है कि जानकारी संग्रहीत या पुनः प्राप्त करने योग्य है या नहीं, केवल आवश्यक होने पर अधिक जटिल एक्सट्रैक्शन/रिट्रीवल प्रक्रिया को लागू करना। +• **लेटेंसी प्रबंधन**: उपयोगकर्ता इंटरैक्शन को धीमा करने से बचाने के लिए, सस्ते, तेज मॉडल का उपयोग शुरू में यह जल्दी जांचने के लिए किया जा सकता है कि जानकारी संग्रहीत या पुनर्प्राप्त करने योग्य है या नहीं, केवल आवश्यक होने पर अधिक जटिल एक्सट्रैक्शन/रिट्रीवल प्रक्रिया को लागू करना। • **ज्ञान आधार रखरखाव**: बढ़ते ज्ञान आधार के लिए, कम बार उपयोग की जाने वाली जानकारी को "कोल्ड स्टोरेज" में स्थानांतरित किया जा सकता है ताकि लागत का प्रबंधन किया जा सके। ## एजेंट मेमोरी के बारे में और सवाल हैं? -[Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) से जुड़ें ताकि अन्य शिक्षार्थियों से मिल सकें, ऑफिस आवर्स में भाग ले सकें, और अपने एआई एजेंट्स से संबंधित सवालों के जवाब पा सकें। +[Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) से जुड़ें, अन्य शिक्षार्थियों से मिलें, ऑफिस आवर्स में भाग लें और अपने एआई एजेंट्स से संबंधित सवालों के जवाब पाएं। --- + **अस्वीकरण**: -यह दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके अनुवादित किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवाद में त्रुटियां या अशुद्धियां हो सकती हैं। मूल भाषा में उपलब्ध मूल दस्तावेज़ को आधिकारिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं। \ No newline at end of file +यह दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके अनुवादित किया गया है। जबकि हम सटीकता के लिए प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवाद में त्रुटियां या अशुद्धियां हो सकती हैं। मूल भाषा में दस्तावेज़ को आधिकारिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं। + \ No newline at end of file diff --git a/translations/hk/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/hk/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..ceceb81bc --- /dev/null +++ b/translations/hk/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# 使用 Cognee 建立具持久記憶的 AI 智能代理\n", + "\n", + "此筆記本展示如何使用 [**cognee**](https://www.cognee.ai/) 建立具備高級記憶功能的智能 AI 代理。Cognee 是一個開源的 AI 記憶系統,結合知識圖譜、語義搜索及會話管理,打造具上下文感知能力的 AI 系統。\n", + "\n", + "## 🎯 學習目標\n", + "\n", + "完成本教程後,您將了解如何:\n", + "- **建立基於嵌入的知識圖譜**:將非結構化文本轉化為結構化、可查詢的知識\n", + "- **實現會話記憶**:創建多輪對話並自動保留上下文\n", + "- **持久化對話**:選擇性地將重要互動存儲於長期記憶中以供未來參考\n", + "- **使用自然語言查詢**:在新對話中訪問並利用歷史上下文\n", + "- **可視化記憶**:探索代理知識圖譜中的關係\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ 你將會建立什麼\n", + "\n", + "在這個教學中,我們會建立一個具有持久記憶的 **編程助手**,它能夠:\n", + "\n", + "### 1. **知識庫建構**\n", + " - 收集開發者的個人資料及專業資訊\n", + " - 處理 Python 編程原則及最佳實踐\n", + " - 儲存開發者與 AI 助手之間的歷史對話\n", + "\n", + "### 2. **會話感知功能**\n", + " - 在同一個會話中保持多個問題的上下文\n", + " - 自動緩存每個問題及答案以便高效檢索\n", + " - 根據對話歷史提供連貫且有上下文的回應\n", + "\n", + "### 3. **長期記憶**\n", + " - 將重要的對話保存到長期記憶中\n", + " - 從知識庫及過往會話中檢索相關記憶以輔助新的互動\n", + " - 建立一個隨時間增長的知識庫,持續改進\n", + "\n", + "### 4. **智能記憶檢索**\n", + " - 使用圖形感知語義搜索來尋找所有儲存知識中的相關資訊\n", + " - 按數據子組(例如開發者資訊 vs. 原則)篩選搜索結果\n", + " - 結合多個數據來源以提供全面的答案\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 先決條件及設定\n", + "\n", + "### 系統需求\n", + "\n", + "在開始之前,請確保你已準備好以下項目:\n", + "\n", + "1. **Python 環境**\n", + " - Python 3.9 或更高版本\n", + " - 建議使用虛擬環境\n", + "\n", + "2. **Redis 快取**(用於會話管理)\n", + " - 本地 Redis:`docker run -d -p 6379:6379 redis`\n", + " - 或使用托管的 Redis 服務\n", + "\n", + "3. **LLM API 訪問**\n", + " - OpenAI API 金鑰或其他供應商(請參閱[文件](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **資料庫配置**\n", + " - 預設情況下無需配置。Cognee 使用基於文件的資料庫(LanceDB 和 Kuzu)\n", + " - 可選地,你可以設置 Azure AI Search 作為向量存儲(請參閱[文件](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### 環境配置\n", + "\n", + "在你的項目目錄中建立 `.env` 文件,並包含以下變數:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Cognee 記憶架構的理解\n", + "\n", + "### Cognee 的運作方式\n", + "\n", + "Cognee 提供了一個超越簡單鍵值存儲的高級記憶系統:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### 主要組成部分:\n", + "\n", + "1. **知識圖譜**:存儲實體、關係及語義連結\n", + "2. **向量嵌入**:支持對所有存儲信息進行語義搜索\n", + "3. **會話緩存**:在會話內及跨會話維持對話上下文\n", + "4. **節點集**:將數據組織成邏輯分類以便於目標檢索\n", + "\n", + "### 本教程中的記憶類型:\n", + "\n", + "- **持久記憶**:知識圖譜中的長期存儲\n", + "- **會話記憶**:Redis 緩存中的臨時對話上下文\n", + "- **語義記憶**:基於向量的相似性搜索,涵蓋所有數據\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 安裝所需套件\n", + "\n", + "安裝 Cognee,並支援 Redis 作為會話管理:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 初始化環境及載入庫\n", + "\n", + "請確保:\n", + "1. Redis 已啟動(例如使用 Docker:`docker run -d -p 6379:6379 redis`)\n", + "2. 在導入快取模組之前已設定環境變數\n", + "3. 如有需要,重新啟動內核並按順序執行所有單元格\n", + "\n", + "以下單元格將會:\n", + "1. 從 `.env` 載入環境變數\n", + "2. 使用你的 LLM 設定配置 Cognee\n", + "3. 啟用快取以管理會話\n", + "4. 驗證所有元件是否已正確連接\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 配置存儲目錄\n", + "\n", + "Cognee 使用兩個獨立的目錄進行操作:\n", + "- **數據根目錄**:存儲已導入的文件和處理後的數據\n", + "- **系統根目錄**:包含知識圖譜數據庫和系統元數據\n", + "\n", + "我們將為本教程創建獨立的目錄,如下所示:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 重置記憶狀態\n", + "\n", + "在我們開始建立記憶系統之前,先確保我們從頭開始。\n", + "\n", + "> 💡 **提示**:如果你想在之後使用這個筆記本時保留之前運行的記憶,可以跳過這一步。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 第 1 部分:建立知識庫\n", + "\n", + "### 我們的開發者助手的數據來源\n", + "\n", + "我們將引入三種類型的數據來建立一個全面的知識庫:\n", + "\n", + "1. **開發者檔案**:個人的專業知識和技術背景 \n", + "2. **Python 最佳實踐**:Python 之禪及實用指引 \n", + "3. **歷史對話**:開發者與 AI 助手之間的過往問答記錄 \n", + "\n", + "這些多樣化的數據能讓我們的代理做到以下幾點: \n", + "- 理解用戶的技術背景 \n", + "- 在建議中應用最佳實踐 \n", + "- 從以往成功的互動中學習 \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 將數據轉化為知識圖譜\n", + "\n", + "現在我們將把原始文本轉化為結構化的記憶。這個過程包括:\n", + "\n", + "1. **將數據添加到 NodeSets**:將信息組織到邏輯分類中\n", + " - `developer_data`:開發者檔案和對話\n", + " - `principles_data`:Python 的最佳實踐和指引\n", + "\n", + "2. **運行 Cognify Pipeline**:提取實體、關係並創建嵌入\n", + " - 識別關鍵概念\n", + " - 在相關信息之間創建語義連接\n", + " - 生成向量嵌入\n", + "\n", + "這可能需要一些時間,因為 LLM 正在處理文本並構建圖譜結構:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 視覺化知識圖譜\n", + "\n", + "讓我們來探索知識圖譜的結構。視覺化內容顯示:\n", + "- **節點**:從文本中提取的實體(概念、技術、人員)\n", + "- **邊**:實體之間的關係和連接\n", + "- **群集**:按語義相似性分組的相關概念\n", + "\n", + "在瀏覽器中打開生成的 HTML 文件,互動式地探索圖譜:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 用 Memify 豐富記憶\n", + "\n", + "`memify()` 函數會分析知識圖譜,並針對數據生成智能規則。這個過程:\n", + "- 識別模式和最佳實踐\n", + "- 根據內容創建可行的指引\n", + "- 建立不同知識領域之間的關係\n", + "\n", + "這些規則幫助代理在回答問題時作出更明智的決定。捕捉第二次的可視化圖表,能幫助你比較圖譜在豐富後如何變得更密集。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 第 2 部分:智能記憶檢索\n", + "\n", + "### 示範 1:跨文件知識整合\n", + "\n", + "現在我們已經建立了知識圖譜,讓我們測試 Cognee 如何結合多個來源的資訊來回答複雜問題。\n", + "\n", + "第一個查詢展示了:\n", + "- **語義理解**:即使未明確提及,也能找到相關概念\n", + "- **交叉參照**:結合開發者檔案與 Python 原則\n", + "- **情境推理**:將最佳實踐應用於特定實現\n", + "\n", + "### 示範 2:使用 NodeSets 的篩選搜尋\n", + "\n", + "第二個查詢展示如何針對知識圖譜的特定子集進行搜尋:\n", + "- 使用 `node_name` 參數僅在 `principles_data` 中搜尋\n", + "- 提供來自特定知識領域的聚焦答案\n", + "- 適用於需要領域專屬資訊的情況\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 第三部分:會話管理設置\n", + "\n", + "### 啟用對話記憶\n", + "\n", + "會話管理對於在多次互動中保持上下文非常重要。在這裡我們會:\n", + "\n", + "1. **初始化用戶上下文**:創建或檢索用戶檔案以進行會話追蹤 \n", + "2. **配置緩存引擎**:連接到 Redis 以存儲對話歷史記錄 \n", + "3. **啟用會話變數**:設置在查詢間持續存在的上下文變數 \n", + "\n", + "> ⚠️ **重要**:這需要 Redis 正在運行,並且環境中設置了 `CACHING=true`\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ 輔助函數:查看會話歷史記錄\n", + "\n", + "此實用函數讓我們可以檢視儲存在 Redis 中的會話歷史記錄。這對以下情況非常有用:\n", + "- 偵錯會話管理\n", + "- 驗證會話是否已被緩存\n", + "- 瞭解代理可用的上下文\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## 第一節:非同步支援實驗室 — 第一個問題\n", + "\n", + "開始 `async-support-lab` 的環節,詢問適合大量網頁爬取的具備遙測友好的 asyncio 模式。圖表已經了解 asyncio、aiohttp 和監控方法,因此回應應該反映之前的對話,同時針對新問題進行調整。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## 檢查第一節記憶體在首次交流後的狀況\n", + "\n", + "在首次提問後立即執行 `show_history(session_1)`,可以確認 Cognee 已將提示和完成內容寫入 Redis。你應該會看到一個包含並行指導的記錄。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## 第 1 節:跟進數據模型\n", + "\n", + "接下來我們問:「什麼時候應該選擇 dataclasses 而不是 Pydantic?」使用相同的會話 ID。Cognee 應該結合 Python 的原則以及之前有關 FastAPI 的對話,提供細緻的建議——展示出在命名會話中,內容是可以延續的。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## 確認 Session 1 歷史記錄包含兩個回合\n", + "\n", + "再次執行 `show_history(session_1)` 應該會顯示兩個問答條目。這與 Mem0 實驗室的「記憶重播」步驟相符,並證明額外的回合會延續相同的對話記錄。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## 第2節:設計檢討討論串 — 新會話\n", + "\n", + "為了展示討論串之間的隔離,我們啟動了 `design-review-session`,並請求有關事件檢討的記錄指引。即使底層的知識庫相同,新的會話 ID 會將記錄分開。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## 檢討會議 2 歷史記錄\n", + "\n", + "`show_history(session_2)` 應該只列出設計檢討的提示/回應對比。將其與會議 1 比較,以突顯 Cognee 如何在重用共享知識圖譜的同時,保持獨立的會議記錄。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## 摘要\n", + "\n", + "恭喜你!你剛剛為你的編程助手添加了一個由 Cognee 驅動的真正長期記憶層。\n", + "\n", + "在這個教程中,你將原始的開發者內容(代碼、文檔、聊天)轉化為一個圖形 + 向量記憶,讓你的代理可以進行搜索、推理,並持續改進。\n", + "\n", + "你學到了什麼\n", + "\n", + "1. **從原始文本到 AI 記憶**:了解 Cognee 如何吸收非結構化數據,並通過結合向量 + 知識圖譜架構,將其轉化為智能、可搜索的記憶。\n", + "\n", + "2. **使用 memify 豐富圖譜**:學習如何超越基本的圖譜創建,使用 memify 在現有圖譜上添加衍生事實和更豐富的關係。\n", + "\n", + "3. **多種搜索策略**:了解如何根據代理的需求,使用不同的搜索類型(圖譜感知問答、RAG 風格補全、洞察、原始片段、代碼搜索等)來查詢記憶。\n", + "\n", + "4. **視覺化探索**:學習如何使用圖譜可視化和 Cognee UI 檢查和調試 Cognee 建立的內容,讓你能夠真正看到知識的結構。\n", + "\n", + "5. **會話感知記憶**:了解如何結合每次會話的上下文與持久的語義記憶,讓代理能夠在多次運行中記住內容,而不會在用戶之間洩漏信息。\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## 關鍵重點\n", + "1. 以嵌入支持的知識圖譜作為記憶\n", + "\n", + " - **結構化理解**:Cognee 結合了向量存儲和圖譜存儲,讓您的數據既可以按意義搜索,也可以按關係連接。Cognee 預設使用基於文件的數據庫(LanceDB 用於向量存儲,Kuzu 用於圖譜數據庫)。\n", + "\n", + " - **關係感知檢索**:答案不僅可以基於「相似文本」,還可以基於實體之間的關係。\n", + "\n", + " - **活記憶**:記憶層會隨著時間演變、增長,並保持作為一個連接的圖譜可供查詢。\n", + "\n", + "2. 搜索與推理模式\n", + " - **混合檢索**:搜索結合了向量相似性、圖譜結構和 LLM 推理,從原始片段查詢到基於圖譜的問題回答。\n", + "\n", + " - **根據需求選擇模式**:當需要自然語言答案時使用完成式模式,當代理需要原始上下文或進行自主推理時使用片段/摘要/圖譜模式。\n", + "\n", + "3. 個性化、會話感知的代理\n", + " - **會話上下文 + 長期記憶**:Cognee 將短期「線索」上下文與長期的用戶或組織層級記憶分開。\n", + "\n", + "## 真實世界應用\n", + "\n", + "1. **垂直 AI 代理**\n", + "\n", + " 使用此筆記本中的模式,為基於 Cognee 的檢索和推理核心的領域智能助手提供支持:\n", + "\n", + "- **開發者助手**:代碼審查、事件分析和架構助手,能夠遍歷代碼、API、設計文檔和票據,作為一個單一的記憶圖譜。\n", + "\n", + "- **面向客戶的助手**:支持或成功代理,能從產品文檔、常見問題解答、CRM 記錄和過去的票據中提取信息,並提供基於圖譜檢索的引用答案。\n", + "\n", + "- **內部專家助手**:政策、法律或安全助手,能夠基於互相關聯的規則、指南和歷史決策進行推理,而不是孤立的 PDF。\n", + "\n", + " Cognee 明確定位為 AI 代理的持久、準確記憶,提供一個活的知識圖譜,作為代理的後端,取代臨時組合的向量存儲和自定義圖譜代碼。\n", + "\n", + "2. **將數據孤島統一為一個記憶**\n", + "\n", + " 同樣的方法也能幫助您在分散的來源之間建立統一的記憶層:\n", + "\n", + "- **從孤島到一個圖譜**:將結構化(例如數據庫)和非結構化數據(例如文檔、聊天)導入一個由嵌入支持的單一圖譜,而不是為每個系統建立單獨的索引。\n", + "\n", + "- **跨來源推理並提供引用**:在所有數據上運行多步推理——通過圖譜「連接」日誌、指標和文檔——並仍然返回有根據的答案和來源。\n", + "\n", + "- **知識中心**:在銀行或教育等領域,Cognee 已被用於統一 PDF、內部系統和應用數據,形成一個帶有向量的知識圖譜,讓代理能夠以精確且有引用的上下文回答問題。\n", + "\n", + "## 下一步\n", + "\n", + "您已經實現了核心記憶循環。以下是您可以自行嘗試的自然擴展(詳情請參閱 [Cognee 文檔](https://docs.cognee.ai/)):\n", + "\n", + "1. **嘗試時間感知**:啟用時間認知功能,從文本中提取事件和時間戳。\n", + "\n", + "2. **引入基於本體的推理**:為您的領域定義 OWL 本體。使用 Cognee 的本體支持,讓提取的實體和關係基於該架構,提升圖譜質量和領域特定答案。\n", + "\n", + "3. **添加反饋循環**:讓 Cognee 根據真實用戶反饋調整圖譜邊緣權重,使檢索隨時間改進而非保持靜態。\n", + "\n", + "4. **調整個性化與會話行為**:使用用戶 ID、租戶和數據集,為每個人或團隊提供他們自己的共享記憶引擎視圖。\n", + "\n", + "5. **擴展到更複雜的代理**:將 Cognee 插入代理框架,構建共享同一記憶層的多代理系統。*Microsoft Agent Framework x Cognee 插件即將推出。*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**免責聲明**: \n此文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始語言的文件應被視為權威來源。對於重要資訊,建議使用專業的人手翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:29:36+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "hk" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/hk/13-agent-memory/README.md b/translations/hk/13-agent-memory/README.md index 71f147761..a1ff2cd78 100644 --- a/translations/hk/13-agent-memory/README.md +++ b/translations/hk/13-agent-memory/README.md @@ -1,42 +1,50 @@ -# AI代理的記憶 +# AI代理的記憶功能 [![代理記憶](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.hk.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -在討論創建AI代理的獨特優勢時,主要涉及兩個方面:調用工具完成任務的能力,以及隨時間改進的能力。記憶是創建能夠自我改進的代理的基礎,這些代理可以為用戶提供更好的體驗。 +在討論創建AI代理的獨特優勢時,主要集中於兩個方面:調用工具完成任務的能力,以及隨時間改進的能力。記憶是創建能自我改進的代理的基礎,能為用戶提供更好的體驗。 -在本課程中,我們將探討AI代理的記憶是什麼,以及如何管理和利用它來提升我們應用程式的效能。 +在這節課中,我們將探討AI代理的記憶是什麼,以及如何管理和利用它來提升應用程式的效能。 ## 簡介 -本課程將涵蓋: +這節課將涵蓋: • **理解AI代理的記憶**:什麼是記憶,以及它對代理的重要性。 -• **實現和存儲記憶**:為AI代理添加記憶功能的實用方法,重點關注短期和長期記憶。 +• **實現和存儲記憶**:為AI代理添加記憶功能的實用方法,重點在短期和長期記憶。 • **讓AI代理自我改進**:記憶如何幫助代理從過去的互動中學習並隨時間改進。 +## 可用的實現方式 + +這節課包括兩個全面的筆記本教程: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**:使用Mem0和Azure AI Search結合Semantic Kernel框架實現記憶功能。 + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**:使用Cognee實現結構化記憶,自動建立由嵌入支持的知識圖譜,並進行圖形可視化和智能檢索。 + ## 學習目標 -完成本課程後,您將能夠: +完成這節課後,您將能夠: • **區分AI代理的不同記憶類型**,包括工作記憶、短期記憶和長期記憶,以及專門的記憶形式如角色記憶和情節記憶。 -• **使用Semantic Kernel框架實現和管理AI代理的短期和長期記憶**,利用工具如Mem0和Whiteboard記憶,並與Azure AI Search集成。 +• **使用Semantic Kernel框架實現和管理AI代理的短期和長期記憶**,並利用工具如Mem0、Cognee、白板記憶,以及與Azure AI Search的整合。 -• **理解自我改進AI代理的原則**,以及穩健的記憶管理系統如何促進持續學習和適應。 +• **理解自我改進AI代理的原理**,以及穩健的記憶管理系統如何促進持續學習和適應。 ## 理解AI代理的記憶 -從本質上來說,**AI代理的記憶指的是使其能夠保留和回憶信息的機制**。這些信息可以是對話的具體細節、用戶偏好、過去的行動,甚至是學到的模式。 +從本質上來說,**AI代理的記憶指的是能讓代理保留和回憶信息的機制**。這些信息可以是對話中的具體細節、用戶偏好、過去的行動,甚至是學到的模式。 如果沒有記憶,AI應用通常是無狀態的,意味著每次互動都從零開始。這會導致重複且令人沮喪的用戶體驗,因為代理會“忘記”之前的上下文或偏好。 @@ -52,19 +60,19 @@ CO_OP_TRANSLATOR_METADATA: • **自主**:通過利用存儲的知識更獨立地運作。 -實現記憶的目的是使代理更加**可靠和有能力**。 +實現記憶的目的是讓代理更**可靠和有能力**。 ### 記憶的類型 #### 工作記憶 -可以將其視為代理在單一任務或思考過程中使用的一張便條紙。它保存完成下一步所需的即時信息。 +可以把它想像成代理在單一任務或思考過程中使用的一張便條紙。它保存完成下一步所需的即時信息。 -對於AI代理,工作記憶通常捕捉對話中最相關的信息,即使完整的聊天記錄很長或被截斷。它專注於提取關鍵元素,如需求、提議、決策和行動。 +對於AI代理,工作記憶通常捕捉對話中最相關的信息,即使完整的聊天記錄很長或被截斷。它專注於提取關鍵元素,如需求、提案、決策和行動。 **工作記憶範例** -在旅行預訂代理中,工作記憶可能捕捉用戶的當前需求,例如“我想預訂去巴黎的旅行”。這一具體需求保存在代理的即時上下文中,以指導當前的互動。 +在一個旅行預訂代理中,工作記憶可能會捕捉用戶的當前需求,例如“我想預訂去巴黎的旅行”。這個具體需求會保留在代理的即時上下文中,以指導當前的互動。 #### 短期記憶 @@ -76,27 +84,27 @@ CO_OP_TRANSLATOR_METADATA: #### 長期記憶 -這是跨多次對話或會話持續存在的信息。它使代理能夠記住用戶偏好、歷史互動或長期知識。這對個性化非常重要。 +這是跨多次對話或會話持續存在的信息。它使代理能夠記住用戶偏好、歷史互動或一般知識,並且能夠長期使用。這對個性化非常重要。 **長期記憶範例** -長期記憶可能存儲“Ben喜歡滑雪和戶外活動,喜歡在山景下喝咖啡,並希望避免高級滑雪坡道,因為過去的受傷”。這些信息從之前的互動中學到,影響未來旅行規劃中的推薦,使其高度個性化。 +長期記憶可能存儲“Ben喜歡滑雪和戶外活動,喜歡在山景下喝咖啡,並且因為過去的受傷而避免高級滑雪道”。這些信息是從之前的互動中學到的,能影響未來的旅行規劃建議,使其高度個性化。 #### 角色記憶 -這種專門的記憶類型幫助代理建立一致的“個性”或“角色”。它使代理能夠記住關於自身或其預定角色的細節,使互動更加流暢和專注。 +這種專門的記憶類型幫助代理建立一致的“個性”或“角色”。它使代理能記住關於自身或其預定角色的細節,讓互動更流暢和專注。 **角色記憶範例** -如果旅行代理被設計為“滑雪規劃專家”,角色記憶可能強化這一角色,影響其回應以符合專家的語氣和知識。 +如果旅行代理被設計成“滑雪規劃專家”,角色記憶可能會強化這個角色,影響其回應以符合專家的語氣和知識。 #### 工作流/情節記憶 -這種記憶存儲代理在執行複雜任務時的步驟序列,包括成功和失敗。它就像記住特定的“情節”或過去的經驗以便從中學習。 +這種記憶存儲代理在完成複雜任務時的步驟,包括成功和失敗。它就像記住特定的“情節”或過去的經驗,以便從中學習。 **情節記憶範例** -如果代理嘗試預訂特定航班但因不可用而失敗,情節記憶可以記錄這一失敗,使代理在後續嘗試中嘗試替代航班或更有信息地通知用戶問題。 +如果代理嘗試預訂特定航班但因不可用而失敗,情節記憶可以記錄這次失敗,讓代理在後續嘗試中選擇替代航班或更有信息地告知用戶問題。 #### 實體記憶 @@ -104,15 +112,15 @@ CO_OP_TRANSLATOR_METADATA: **實體記憶範例** -從關於過去旅行的對話中,代理可能提取“巴黎”、“艾菲爾鐵塔”和“在Le Chat Noir餐廳的晚餐”作為實體。在未來的互動中,代理可以回憶“Le Chat Noir”並提供再次預訂的選項。 +從關於過去旅行的對話中,代理可能提取“巴黎”、“艾菲爾鐵塔”和“在Le Chat Noir餐廳的晚餐”作為實體。在未來的互動中,代理可以回憶“Le Chat Noir”,並提供再次預訂那裡的選項。 #### 結構化RAG(檢索增強生成) -雖然RAG是一種更廣泛的技術,“結構化RAG”被突出為一種強大的記憶技術。它從各種來源(對話、電子郵件、圖片)中提取密集的結構化信息,並用於提高回應的精確性、召回率和速度。與僅依賴語義相似性的經典RAG不同,結構化RAG利用信息的內在結構。 +雖然RAG是一種更廣泛的技術,“結構化RAG”被強調為一種強大的記憶技術。它從各種來源(對話、電子郵件、圖片)中提取密集的結構化信息,並用於提高回應的精確性、召回率和速度。與僅依賴語義相似性的經典RAG不同,結構化RAG利用信息的內在結構。 **結構化RAG範例** -結構化RAG不僅僅匹配關鍵字,它可以解析電子郵件中的航班細節(目的地、日期、時間、航空公司)並以結構化方式存儲。這使得精確查詢如“我星期二預訂的去巴黎的航班是什麼?”成為可能。 +結構化RAG不僅匹配關鍵字,還能解析電子郵件中的航班細節(目的地、日期、時間、航空公司),並以結構化方式存儲。這使得精確查詢如“我星期二預訂去巴黎的航班是什麼?”成為可能。 ## 實現和存儲記憶 @@ -120,41 +128,53 @@ CO_OP_TRANSLATOR_METADATA: ### 專門的記憶工具 -存儲和管理代理記憶的一種方法是使用專門的工具,如Mem0。Mem0作為持久記憶層,允許代理回憶相關互動、存儲用戶偏好和事實上下文,並隨時間從成功和失敗中學習。其理念是將無狀態代理轉變為有狀態代理。 +#### Mem0 + +一種存儲和管理代理記憶的方法是使用像Mem0這樣的專門工具。Mem0作為持久記憶層,允許代理回憶相關互動、存儲用戶偏好和事實上下文,並隨時間從成功和失敗中學習。其理念是將無狀態代理轉變為有狀態代理。 + +它通過**兩階段記憶管道:提取和更新**運作。首先,添加到代理線程的消息被發送到Mem0服務,該服務使用大型語言模型(LLM)總結對話歷史並提取新記憶。隨後,LLM驅動的更新階段決定是否添加、修改或刪除這些記憶,並將其存儲在混合數據存儲中,包括向量、圖形和鍵值數據庫。該系統還支持各種記憶類型,並可整合圖形記憶以管理實體之間的關係。 + +#### Cognee + +另一種強大的方法是使用**Cognee**,一種開源的語義記憶工具,能將結構化和非結構化數據轉化為可查詢的知識圖譜,由嵌入支持。Cognee提供**雙存儲架構**,結合向量相似性搜索和圖形關係,使代理不僅理解信息的相似性,還理解概念之間的關係。 + +它擅長**混合檢索**,融合向量相似性、圖形結構和LLM推理——從原始片段查找到基於圖形的問題回答。該系統維持**活記憶**,隨著時間推移不斷演變和增長,同時保持作為一個連接的圖譜可查詢,支持短期會話上下文和長期持久記憶。 -它通過**兩階段記憶管道:提取和更新**運作。首先,添加到代理線程的消息被發送到Mem0服務,該服務使用大型語言模型(LLM)總結對話歷史並提取新記憶。隨後,LLM驅動的更新階段決定是否添加、修改或刪除這些記憶,並將其存儲在混合數據存儲中,包括向量、圖形和鍵值數據庫。該系統還支持各種記憶類型,並可以整合圖形記憶以管理實體之間的關係。 +Cognee筆記本教程([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb))展示了構建這個統一記憶層的實際例子,包括吸收多樣化數據源、可視化知識圖譜,以及使用不同搜索策略進行查詢以滿足特定代理需求。 ### 使用RAG存儲記憶 -除了像Mem0這樣的專門記憶工具,您還可以利用強大的搜索服務,如**Azure AI Search作為存儲和檢索記憶的後端**,特別是針對結構化RAG。 +除了像Mem0這樣的專門記憶工具,您還可以利用像**Azure AI Search**這樣的強大搜索服務作為存儲和檢索記憶的後端,特別是針對結構化RAG。 這使您能夠用自己的數據來支持代理的回應,確保更相關和準確的答案。Azure AI Search可以用於存儲用戶特定的旅行記憶、產品目錄或任何其他領域特定的知識。 -Azure AI Search支持如**結構化RAG**的功能,該功能擅長從大型數據集(如對話歷史、電子郵件或圖片)中提取和檢索密集的結構化信息。相比於傳統的文本分塊和嵌入方法,這提供了“超人級的精確性和召回率”。 +Azure AI Search支持像**結構化RAG**這樣的功能,擅長從大型數據集(如對話歷史、電子郵件或甚至圖片)中提取和檢索密集的結構化信息。相比於傳統的文本分塊和嵌入方法,這提供了“超人級的精確性和召回率”。 ## 讓AI代理自我改進 自我改進代理的一個常見模式是引入**“知識代理”**。這個獨立的代理觀察用戶與主要代理之間的對話。其角色是: -1. **識別有價值的信息**:判斷對話中的任何部分是否值得保存為一般知識或特定的用戶偏好。 +1. **識別有價值的信息**:判斷對話中的哪部分值得保存為一般知識或特定用戶偏好。 2. **提取和總結**:從對話中提煉出重要的學習或偏好。 -3. **存儲到知識庫**:將提取的信息持久化,通常存儲在向量數據庫中,以便稍後檢索。 +3. **存儲到知識庫**:將提取的信息持久化,通常存儲在向量數據庫中,以便後續檢索。 4. **增強未來查詢**:當用戶發起新查詢時,知識代理檢索相關的存儲信息並將其附加到用戶的提示中,為主要代理提供重要的上下文(類似於RAG)。 ### 記憶的優化 -• **延遲管理**:為避免減慢用戶互動,可以初步使用更便宜、更快的模型快速檢查信息是否值得存儲或檢索,僅在必要時調用更複雜的提取/檢索過程。 +• **延遲管理**:為避免減慢用戶互動,可以先使用更便宜、更快的模型快速檢查信息是否值得存儲或檢索,僅在必要時調用更複雜的提取/檢索過程。 • **知識庫維護**:對於不斷增長的知識庫,使用頻率較低的信息可以移至“冷存儲”以管理成本。 -## 還有更多關於代理記憶的問題嗎? +## 對代理記憶有更多疑問? -加入[Azure AI Foundry Discord](https://aka.ms/ai-agents/discord),與其他學習者交流,參加辦公時間並解答您的AI代理相關問題。 +加入[Azure AI Foundry Discord](https://aka.ms/ai-agents/discord),與其他學習者交流,參加辦公時間,並解答您的AI代理相關問題。 --- + **免責聲明**: -本文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。 \ No newline at end of file +此文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要信息,建議使用專業的人類翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。 + \ No newline at end of file diff --git a/translations/hr/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/hr/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..9af80efe6 --- /dev/null +++ b/translations/hr/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Izrada AI agenata s trajnom memorijom koristeći Cognee\n", + "\n", + "Ovaj notebook pokazuje kako izraditi inteligentne AI agente s naprednim mogućnostima memorije koristeći [**cognee**](https://www.cognee.ai/) - otvoreni izvor AI memorije koji kombinira grafove znanja, semantičko pretraživanje i upravljanje sesijama za stvaranje AI sustava svjesnih konteksta.\n", + "\n", + "## 🎯 Ciljevi učenja\n", + "\n", + "Na kraju ovog vodiča, razumjet ćete kako:\n", + "- **Izraditi grafove znanja podržane ugrađenim podacima**: Pretvoriti nestrukturirani tekst u strukturirano, upitno znanje\n", + "- **Implementirati memoriju sesije**: Stvoriti višestruke razgovore s automatskim zadržavanjem konteksta\n", + "- **Pohraniti razgovore**: Opcionalno spremiti važne interakcije u dugoročnu memoriju za buduću upotrebu\n", + "- **Postavljati upite koristeći prirodni jezik**: Pristupiti i koristiti povijesni kontekst u novim razgovorima\n", + "- **Vizualizirati memoriju**: Istražiti odnose u grafu znanja vašeg agenta\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Što ćete izraditi\n", + "\n", + "U ovom vodiču, stvorit ćemo **Asistenta za kodiranje** s trajnom memorijom koji:\n", + "\n", + "### 1. **Izgradnja baze znanja**\n", + " - Uključuje informacije o profilu i stručnosti programera\n", + " - Obrađuje principe i najbolje prakse programiranja u Pythonu\n", + " - Pohranjuje povijesne razgovore između programera i AI asistenata\n", + "\n", + "### 2. **Razgovori svjesni sesije**\n", + " - Održava kontekst kroz više pitanja u istoj sesiji\n", + " - Automatski sprema svaki par pitanja/odgovora za učinkovito dohvaćanje\n", + " - Pruža koherentne, kontekstualne odgovore na temelju povijesti razgovora\n", + "\n", + "### 3. **Dugoročna memorija**\n", + " - Pohranjuje važne razgovore u dugoročnu memoriju\n", + " - Dohvaća relevantne uspomene iz baze znanja i prošlih sesija kako bi informirao nove interakcije\n", + " - Gradi rastuću bazu znanja koja se s vremenom poboljšava\n", + "\n", + "### 4. **Inteligentno dohvaćanje memorije**\n", + " - Koristi semantičko pretraživanje svjesno grafa za pronalaženje relevantnih informacija u pohranjenoj bazi znanja\n", + " - Filtrira pretraživanja prema podskupinama podataka (informacije o programeru vs. principi)\n", + " - Kombinira više izvora podataka kako bi pružio sveobuhvatne odgovore\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Preduvjeti i postavljanje\n", + "\n", + "### Sistemski zahtjevi\n", + "\n", + "Prije početka, osigurajte da imate:\n", + "\n", + "1. **Python okruženje**\n", + " - Python 3.9 ili noviji\n", + " - Virtualno okruženje (preporučeno)\n", + " \n", + "2. **Redis Cache** (Potrebno za upravljanje sesijama)\n", + " - Lokalni Redis: `docker run -d -p 6379:6379 redis`\n", + " - Ili koristite upravljanu Redis uslugu\n", + " \n", + "3. **Pristup LLM API-ju**\n", + " - OpenAI API ključ ili drugi pružatelji usluga (pogledajte [dokumentaciju](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Konfiguracija baze podataka**\n", + " - Nema potrebne konfiguracije prema zadanim postavkama. Cognee koristi baze podataka temeljene na datotekama (LanceDB i Kuzu)\n", + " - Opcionalno, možete postaviti Azure AI Search kao spremište vektora (pogledajte [dokumentaciju](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Konfiguracija okruženja\n", + "\n", + "Kreirajte `.env` datoteku u direktoriju vašeg projekta s sljedećim varijablama:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Razumijevanje Cogneejeve memorijske arhitekture\n", + "\n", + "### Kako Cognee funkcionira\n", + "\n", + "Cognee pruža sofisticirani memorijski sustav koji nadilazi jednostavno pohranjivanje ključ-vrijednost:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Ključne komponente:\n", + "\n", + "1. **Graf znanja**: Pohranjuje entitete, odnose i semantičke veze\n", + "2. **Vektorski ugrađaji**: Omogućuju semantičko pretraživanje kroz sve pohranjene informacije\n", + "3. **Predmemorija sesije**: Održava kontekst razgovora unutar i između sesija\n", + "4. **NodeSets**: Organiziraju podatke u logičke kategorije za ciljani dohvat\n", + "\n", + "### Vrste memorije u ovom vodiču:\n", + "\n", + "- **Trajna memorija**: Dugoročno pohranjivanje u grafu znanja\n", + "- **Memorija sesije**: Privremeni kontekst razgovora u Redis predmemoriji\n", + "- **Semantička memorija**: Pretraživanje temeljeno na sličnosti vektora kroz sve podatke\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Instalirajte potrebne pakete\n", + "\n", + "Instalirajte Cognee s podrškom za Redis za upravljanje sesijama:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Inicijalizirajte okruženje i učitajte biblioteke\n", + "\n", + "Provjerite:\n", + "1. Redis je pokrenut (npr. putem Dockera: `docker run -d -p 6379:6379 redis`)\n", + "2. Varijable okruženja su postavljene prije uvoza modula za predmemoriju\n", + "3. Ako je potrebno, ponovno pokrenite kernel i izvršite ćelije redoslijedom\n", + "\n", + "Sljedeća ćelija će:\n", + "1. Učitati varijable okruženja iz `.env`\n", + "2. Konfigurirati Cognee s vašim LLM postavkama\n", + "3. Omogućiti predmemoriju za upravljanje sesijama\n", + "4. Provjeriti jesu li svi dijelovi ispravno povezani\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Konfiguriranje direktorija za pohranu\n", + "\n", + "Cognee koristi dva odvojena direktorija za svoje operacije:\n", + "- **Korijenski direktorij podataka**: Pohranjuje unesene dokumente i obrađene podatke\n", + "- **Korijenski direktorij sustava**: Sadrži bazu podataka grafova znanja i sistemske metapodatke\n", + "\n", + "Za ovaj vodič ćemo kreirati odvojene direktorije na sljedeći način:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Resetiranje stanja memorije\n", + "\n", + "Prije nego što počnemo graditi naš sustav memorije, osigurajmo da počinjemo od nule.\n", + "\n", + "> 💡 **Savjet**: Možete preskočiti ovaj korak ako želite sačuvati postojeće memorije iz prethodnih pokretanja kada kasnije koristite ovu bilježnicu.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Dio 1: Izgradnja baze znanja\n", + "\n", + "### Izvori podataka za našeg asistenta za programere\n", + "\n", + "Koristit ćemo tri vrste podataka kako bismo stvorili sveobuhvatnu bazu znanja:\n", + "\n", + "1. **Profil programera**: Osobna stručnost i tehnička pozadina\n", + "2. **Najbolje prakse za Python**: Zen of Python s praktičnim smjernicama\n", + "3. **Povijesni razgovori**: Prošli Q&A razgovori između programera i AI asistenata\n", + "\n", + "Ova raznolika baza podataka omogućuje našem agentu da:\n", + "- Razumije tehnički kontekst korisnika\n", + "- Primjenjuje najbolje prakse u preporukama\n", + "- Uči iz prethodnih uspješnih interakcija\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Pretvorba podataka u graf znanja\n", + "\n", + "Sada ćemo naš sirovi tekst pretvoriti u strukturiranu memoriju. Ovaj proces:\n", + "\n", + "1. **Dodaje podatke u NodeSets**: Organiziranje informacija u logične kategorije\n", + " - `developer_data`: Profil programera i razgovori\n", + " - `principles_data`: Najbolje prakse i smjernice za Python\n", + "\n", + "2. **Pokreće Cognify Pipeline**: Izvlači entitete, odnose i stvara ugrađivanja\n", + " - Prepoznaje ključne pojmove\n", + " - Stvara semantičke veze između povezanih informacija\n", + " - Generira vektorska ugrađivanja\n", + "\n", + "Ovo može potrajati nekoliko trenutaka dok LLM obrađuje tekst i gradi strukturu grafa:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Vizualizirajte graf znanja\n", + "\n", + "Istražimo strukturu našeg grafa znanja. Vizualizacija prikazuje:\n", + "- **Čvorove**: Entiteti izdvojeni iz teksta (pojmovi, tehnologije, osobe)\n", + "- **Rubove**: Odnosi i poveznice između entiteta\n", + "- **Klastere**: Povezani pojmovi grupirani prema semantičkoj sličnosti\n", + "\n", + "Otvorite generiranu HTML datoteku u svom pregledniku kako biste interaktivno istražili graf:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Obogatite memoriju s Memify\n", + "\n", + "Funkcija `memify()` analizira graf znanja i generira inteligentna pravila o podacima. Ovaj proces:\n", + "- Prepoznaje obrasce i najbolje prakse\n", + "- Stvara praktične smjernice na temelju sadržaja\n", + "- Uspostavlja odnose između različitih područja znanja\n", + "\n", + "Ova pravila pomažu agentu da donosi bolje informirane odluke prilikom odgovaranja na pitanja. Snimanje druge vizualizacije omogućuje vam usporedbu kako se graf zgušnjava nakon obogaćivanja.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Dio 2: Inteligentno dohvaćanje memorije\n", + "\n", + "### Demonstracija 1: Integracija znanja iz više dokumenata\n", + "\n", + "Sada kada je naš graf znanja izgrađen, testirajmo kako Cognee kombinira informacije iz više izvora kako bi odgovorio na složena pitanja.\n", + "\n", + "Prvi upit pokazuje:\n", + "- **Semantičko razumijevanje**: Pronalaženje relevantnih pojmova čak i kada nisu izričito spomenuti\n", + "- **Križno referenciranje**: Kombiniranje profila programera s principima Pythona\n", + "- **Kontekstualno zaključivanje**: Primjena najboljih praksi na specifične implementacije\n", + "\n", + "### Demonstracija 2: Filtrirano pretraživanje pomoću NodeSets\n", + "\n", + "Drugi upit pokazuje kako ciljati određene podskupove grafa znanja:\n", + "- Koristi parametar `node_name` za pretraživanje samo unutar `principles_data`\n", + "- Pruža fokusirane odgovore iz specifičnog područja znanja\n", + "- Korisno kada trebate informacije specifične za određenu domenu\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Dio 3: Postavljanje upravljanja sesijama\n", + "\n", + "### Omogućavanje memorije razgovora\n", + "\n", + "Upravljanje sesijama ključno je za održavanje konteksta tijekom više interakcija. Ovdje ćemo:\n", + "\n", + "1. **Inicijalizirati korisnički kontekst**: Stvoriti ili dohvatiti korisnički profil za praćenje sesije\n", + "2. **Konfigurirati mehanizam predmemorije**: Povezati se s Redisom za pohranu povijesti razgovora\n", + "3. **Omogućiti varijable sesije**: Postaviti kontekstualne varijable koje ostaju postojane tijekom upita\n", + "\n", + "> ⚠️ **Važno**: Ovo zahtijeva da Redis radi i da je `CACHING=true` postavljeno u vašem okruženju\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Pomoćna funkcija: Pregled povijesti sesije\n", + "\n", + "Ova pomoćna funkcija omogućuje nam pregled povijesti razgovora pohranjene u Redis-u. Korisna je za:\n", + "- Otklanjanje pogrešaka u upravljanju sesijama\n", + "- Provjeru da li se razgovori spremaju u predmemoriju\n", + "- Razumijevanje konteksta koji je dostupan agentu\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Sesija 1: Laboratorij za podršku asinkronom radu — Prvo pitanje\n", + "\n", + "Započnite sesiju `async-support-lab` postavljanjem pitanja o obrascima asyncio prilagođenim telemetriji za masivni web scraper. Graf već poznaje asyncio, aiohttp i prakse praćenja, pa bi odgovor trebao odražavati prethodne razgovore dok prilagođava odgovor novom upitu.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Pregled memorije sesije 1 nakon prve razmjene\n", + "\n", + "Pokretanjem `show_history(session_1)` odmah nakon početnog pitanja potvrđuje se da je Cognee zapisao i upit i odgovor u Redis. Trebali biste vidjeti jedan unos s uputama za istovremeni rad.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Sesija 1: Praćenje modela podataka\n", + "\n", + "Zatim se pitamo: \"Kada bih trebao odabrati dataclasses umjesto Pydantic?\" koristeći isti ID sesije. Cognee bi trebao povezati Python principe s prethodnim razgovorima o FastAPI-ju kako bi pružio nijansirane savjete—pokazujući da se kontekst prenosi unutar imenovane sesije.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Potvrdite da Povijest Sesije 1 Sadrži Oba Kruga\n", + "\n", + "Još jedan poziv `show_history(session_1)` trebao bi prikazati dva unosa pitanja i odgovora. Ovo odgovara koraku \"reprodukcije memorije\" u Mem0 laboratoriju i dokazuje da dodatni krugovi proširuju isti transkript.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Sesija 2: Pregled dizajna — Nova sesija\n", + "\n", + "Kako bismo pokazali izolaciju između niti, pokrećemo `design-review-session` i tražimo smjernice za bilježenje pregleda incidenata. Iako je osnovna baza znanja ista, novi ID sesije drži transkripte odvojenima.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Pregled Sesije 2 Povijest\n", + "\n", + "`show_history(session_2)` treba prikazati samo par upita/odgovora za dizajnersku recenziju. Usporedite to sa Sesijom 1 kako biste istaknuli kako Cognee održava neovisne transkripte dok ponovno koristi zajednički graf znanja.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Sažetak\n", + "\n", + "Čestitamo! Upravo ste svom pomoćniku za kodiranje dodali pravi sloj dugoročne memorije koji pokreće Cognee.\n", + "\n", + "U ovom vodiču uzeli ste sirovi sadržaj za razvoj (kod, dokumentaciju, razgovore) i pretvorili ga u graf + vektorsku memoriju koju vaš agent može pretraživati, analizirati i kontinuirano poboljšavati.\n", + "\n", + "Što ste naučili\n", + "\n", + "1. **Od sirovog teksta do AI memorije**: Kako Cognee unosi nestrukturirane podatke i pretvara ih u inteligentnu, pretraživu memoriju koristeći kombiniranu arhitekturu vektora + graf znanja.\n", + "\n", + "2. **Obogaćivanje grafa pomoću memify**: Kako nadmašiti osnovno stvaranje grafa i koristiti memify za dodavanje izvedenih činjenica i bogatijih odnosa na vaš postojeći graf.\n", + "\n", + "3. **Višestruke strategije pretraživanja**: Kako pretraživati memoriju koristeći različite vrste pretraživanja (Q&A svjesno grafa, RAG-stil dovršavanja, uvidi, sirovi dijelovi, pretraživanje koda itd.) ovisno o potrebama vašeg agenta.\n", + "\n", + "4. **Vizualno istraživanje**: Kako pregledati i otkloniti pogreške u onome što je Cognee izgradio koristeći vizualizacije grafa i Cognee UI, tako da možete vidjeti kako je znanje strukturirano.\n", + "\n", + "5. **Memorija svjesna sesije**: Kako kombinirati kontekst po sesiji s trajnom semantičkom memorijom kako bi agenti mogli pamtiti kroz različite pokretanja bez curenja informacija između korisnika.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Ključne točke\n", + "1. Memorija kao graf znanja podržan ugradnjama\n", + "\n", + " - **Strukturirano razumijevanje**: Cognee kombinira spremište vektora i graf spremište kako bi vaši podaci bili pretraživi po značenju i povezani odnosima. Cognee koristi baze podataka temeljene na datotekama prema zadanim postavkama (LanceDB za vektore, Kuzu za graf baze podataka).\n", + "\n", + " - **Pretraživanje svjesno odnosa**: Odgovori se mogu temeljiti ne samo na \"sličnom tekstu\", već i na tome kako su entiteti povezani.\n", + "\n", + " - **Živa memorija**: Sloj memorije se razvija, raste i ostaje pretraživ kao jedan povezani graf.\n", + "\n", + "2. Načini pretraživanja i zaključivanja\n", + " - **Hibridno pretraživanje**: pretraživanje kombinira sličnost vektora, strukturu grafa i zaključivanje LLM-a, od pretraživanja sirovih dijelova do odgovaranja na pitanja svjesnih grafa.\n", + "\n", + " - **Prilagodite način zadatku**: Koristite načine u stilu dovršavanja kada želite odgovore u prirodnom jeziku, a načine za dijelove/sažetke/grafove kada vaš agent treba sirovi kontekst ili za vlastito zaključivanje.\n", + "\n", + "3. Personalizirani agenti svjesni sesije\n", + " - **Kontekst sesije + dugoročna memorija**: Cognee drži kratkoročni kontekst \"niti\" odvojen od dugoročne memorije na razini korisnika ili organizacije.\n", + "\n", + "## Primjene u stvarnom svijetu\n", + "\n", + "1. **Vertikalni AI agenti**\n", + "\n", + " Koristite uzorak iz ove bilježnice za pokretanje domenski pametnih kopilota koji se oslanjaju na Cognee kao jezgru za pretraživanje i zaključivanje:\n", + "\n", + "- **Kopiloti za programere**: Pregled koda, analiza incidenata i asistenti za arhitekturu koji prolaze kroz kod, API-je, dizajnerske dokumente i tikete kao jedan graf memorije.\n", + "\n", + "- **Kopiloti usmjereni na korisnike**: Agenti za podršku ili uspjeh koji koriste dokumentaciju proizvoda, često postavljana pitanja, CRM bilješke i prošle tikete s pretraživanjem svjesnim grafa i citiranim odgovorima.\n", + "\n", + "- **Interni stručni kopiloti**: Asistenti za politiku, pravne ili sigurnosne poslove koji zaključuju na temelju međusobno povezanih pravila, smjernica i povijesnih odluka umjesto izoliranih PDF-ova.\n", + "\n", + " Cognee je izričito pozicioniran kao trajna, točna memorija za AI agente, pružajući živi graf znanja koji se integrira iza vašeg agenta i zamjenjuje ad-hoc kombinacije spremišta vektora i prilagođenog koda za grafove.\n", + "\n", + "2. **Ujedinjavanje podataka iz silosa u jednu memoriju**\n", + "\n", + " Isti pristup također vam pomaže izgraditi sloj ujedinjene memorije preko raspršenih izvora:\n", + "\n", + "- **Od silosa do jednog grafa**: Učitajte strukturirane (npr. baze podataka) i nestrukturirane podatke (npr. dokumente, razgovore) u jedan graf podržan ugradnjama, umjesto odvojenih indeksa za svaki sustav.\n", + "\n", + "- **Zaključivanje preko izvora s citatima**: Provedite višekorakno zaključivanje nad svime—\"spojite\" dnevnike, metrike i dokumente putem grafa—i još uvijek vratite utemeljene odgovore s dokazima.\n", + "\n", + "- **Čvorišta znanja**: Za domene poput bankarstva ili obrazovanja, Cognee se već koristi za ujedinjavanje PDF-ova, internih sustava i podataka aplikacija u jedan graf znanja s vektorima kako bi agenti mogli odgovarati na pitanja s preciznim, citiranim kontekstom.\n", + "\n", + "## Sljedeći koraci\n", + "\n", + "Implementirali ste osnovnu petlju memorije. Evo prirodnih proširenja koja možete isprobati sami (pogledajte [Cognee dokumentaciju](https://docs.cognee.ai/) za detalje):\n", + "\n", + "1. **Eksperimentirajte s vremenskom sviješću**: Uključite vremensku funkciju kako biste izdvojili događaje i vremenske oznake iz teksta.\n", + "\n", + "2. **Uvedite zaključivanje vođeno ontologijom**: Definirajte OWL ontologiju za svoju domenu. Koristite Cognee-ovu podršku za ontologiju kako bi izdvojeni entiteti i odnosi bili utemeljeni u toj shemi, poboljšavajući kvalitetu grafa i odgovore specifične za domenu.\n", + "\n", + "3. **Dodajte povratnu petlju**: Dopustite Cognee-u da prilagodi težine rubova grafa na temelju stvarnih povratnih informacija korisnika, tako da se pretraživanje s vremenom poboljšava umjesto da ostane statično.\n", + "\n", + "4. **Prilagodite za personalizaciju i ponašanje sesije**: Koristite korisničke ID-ove, stanare i skupove podataka kako biste svakom korisniku ili timu dali vlastiti pogled na zajednički motor memorije.\n", + "\n", + "5. **Proširite na složenije agente**: Povežite Cognee s okvirima za agente kako biste izgradili sustave s više agenata koji svi dijele isti sloj memorije. *Microsoft Agent Framework x Cognee dodatak dolazi uskoro.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Odricanje od odgovornosti**: \nOvaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne preuzimamo odgovornost za nesporazume ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:36:28+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "hr" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/hr/13-agent-memory/README.md b/translations/hr/13-agent-memory/README.md index d6320c576..aa3c50b9c 100644 --- a/translations/hr/13-agent-memory/README.md +++ b/translations/hr/13-agent-memory/README.md @@ -1,8 +1,8 @@ +**Odricanje od odgovornosti**: +Ovaj dokument je preveden pomoću AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati autoritativnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane čovjeka. Ne odgovaramo za nesporazume ili pogrešna tumačenja koja proizlaze iz korištenja ovog prijevoda. + \ No newline at end of file diff --git a/translations/hu/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/hu/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..2e8f0c060 --- /dev/null +++ b/translations/hu/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# AI ügynökök építése tartós memóriával a Cognee segítségével\n", + "\n", + "Ez a jegyzetfüzet bemutatja, hogyan lehet intelligens AI ügynököket létrehozni kifinomult memóriafunkciókkal a [**cognee**](https://www.cognee.ai/) használatával - egy nyílt forráskódú AI memória, amely ötvözi a tudásgrafikonokat, szemantikus keresést és munkamenet-kezelést, hogy kontextusérzékeny AI rendszereket hozzon létre.\n", + "\n", + "## 🎯 Tanulási célok\n", + "\n", + "A bemutató végére megérted, hogyan kell:\n", + "- **Tudásgrafikonokat építeni beágyazásokkal támogatva**: Átalakítani a strukturálatlan szöveget strukturált, lekérdezhető tudássá\n", + "- **Munkamenet-memóriát megvalósítani**: Többfordulós beszélgetéseket létrehozni automatikus kontextusmegőrzéssel\n", + "- **Beszélgetéseket tartósítani**: Opcionálisan tárolni fontos interakciókat hosszú távú memóriában későbbi hivatkozás céljából\n", + "- **Természetes nyelvű lekérdezést használni**: Hozzáférni és kihasználni a történelmi kontextust új beszélgetésekben\n", + "- **Memóriát vizualizálni**: Felfedezni az ügynök tudásgrafikonjának kapcsolatait\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Mit fogsz építeni\n", + "\n", + "Ebben az útmutatóban egy **Kódolási Asszisztenst** hozunk létre tartós memóriával, amely:\n", + "\n", + "### 1. **Tudásbázis létrehozása**\n", + " - Fejlesztői profil és szakértelem információkat dolgoz fel\n", + " - Feldolgozza a Python programozási alapelveket és legjobb gyakorlatokat\n", + " - Tárolja a fejlesztők és AI asszisztensek közötti korábbi beszélgetéseket\n", + "\n", + "### 2. **Munkamenet-tudatos beszélgetések**\n", + " - Fenntartja a kontextust ugyanazon munkamenet több kérdése között\n", + " - Automatikusan gyorsítótárazza az egyes kérdés/válasz párokat a hatékony visszakeresés érdekében\n", + " - Koherens, kontextusfüggő válaszokat ad a beszélgetési előzmények alapján\n", + "\n", + "### 3. **Hosszú távú memória**\n", + " - Fontos beszélgetéseket tartós memóriába ment\n", + " - Releváns emlékeket hív elő a tudásbázisból és korábbi munkamenetekből az új interakciókhoz\n", + " - Egyre bővülő tudásbázist épít, amely idővel javul\n", + "\n", + "### 4. **Intelligens memória-visszakeresés**\n", + " - Grafikon-tudatos szemantikus keresést használ a tárolt tudás releváns információinak megtalálásához\n", + " - Szűri a kereséseket adatalcsoportok szerint (fejlesztői információk vs. alapelvek)\n", + " - Több adatforrást kombinál, hogy átfogó válaszokat nyújtson\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Előfeltételek és beállítás\n", + "\n", + "### Rendszerkövetelmények\n", + "\n", + "Mielőtt elkezdenéd, győződj meg arról, hogy rendelkezel az alábbiakkal:\n", + "\n", + "1. **Python környezet**\n", + " - Python 3.9 vagy újabb\n", + " - Virtuális környezet (ajánlott)\n", + " \n", + "2. **Redis Cache** (Szükséges a munkamenet-kezeléshez)\n", + " - Helyi Redis: `docker run -d -p 6379:6379 redis`\n", + " - Vagy használj egy kezelt Redis szolgáltatást\n", + " \n", + "3. **LLM API hozzáférés**\n", + " - OpenAI API kulcs vagy más szolgáltatók (lásd a [dokumentációt](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Adatbázis konfiguráció**\n", + " - Alapértelmezés szerint nincs szükség konfigurációra. A Cognee fájlalapú adatbázisokat használ (LanceDB és Kuzu)\n", + " - Opcionálisan beállíthatod az Azure AI Search-t vektortárolóként (lásd a [dokumentációt](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Környezeti konfiguráció\n", + "\n", + "Hozz létre egy `.env` fájlt a projektkönyvtáradban az alábbi változókkal:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Cognee memóriaarchitektúrájának megértése\n", + "\n", + "### Hogyan működik a Cognee\n", + "\n", + "A Cognee egy kifinomult memória rendszert biztosít, amely túlmutat az egyszerű kulcs-érték tároláson:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Főbb összetevők:\n", + "\n", + "1. **Tudásgráf**: Entitásokat, kapcsolatokat és szemantikai összefüggéseket tárol\n", + "2. **Vektorembeddingek**: Lehetővé teszik a szemantikai keresést az összes tárolt információ között\n", + "3. **Munkamenet gyorsítótár**: Fenntartja a beszélgetési kontextust a munkamenetek során és között\n", + "4. **NodeSets**: Az adatokat logikai kategóriákba szervezi a célzott visszakeresés érdekében\n", + "\n", + "### Memóriatípusok ebben az útmutatóban:\n", + "\n", + "- **Tartós memória**: Hosszú távú tárolás a tudásgráfban\n", + "- **Munkamenet memória**: Ideiglenes beszélgetési kontextus a Redis gyorsítótárban\n", + "- **Szemantikai memória**: Vektor-alapú hasonlósági keresés az összes adat között\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Szükséges csomagok telepítése\n", + "\n", + "Telepítsd a Cognee-t Redis támogatással a munkamenet-kezeléshez:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Környezet inicializálása és könyvtárak betöltése\n", + "\n", + "Győződjön meg róla, hogy:\n", + "1. A Redis fut (pl. Dockerrel: `docker run -d -p 6379:6379 redis`)\n", + "2. A környezeti változók be vannak állítva, mielőtt a cache modulokat importálná\n", + "3. Ha szükséges, indítsa újra a kernelt, és futtassa a cellákat sorrendben\n", + "\n", + "A következő cella:\n", + "1. Betölti a környezeti változókat a `.env` fájlból\n", + "2. Beállítja a Cognee-t az LLM beállításaival\n", + "3. Engedélyezi a gyorsítótárazást a munkamenet-kezeléshez\n", + "4. Ellenőrzi, hogy minden komponens megfelelően csatlakozik-e\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Tárhely könyvtárak konfigurálása\n", + "\n", + "A Cognee két külön könyvtárat használ a működéséhez:\n", + "- **Adatgyökér**: Az importált dokumentumokat és a feldolgozott adatokat tárolja\n", + "- **Rendszergyökér**: A tudásgráf adatbázist és a rendszer metaadatait tartalmazza\n", + "\n", + "Ebben az útmutatóban elkülönített könyvtárakat fogunk létrehozni az alábbiak szerint:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Memóriaállapot visszaállítása\n", + "\n", + "Mielőtt elkezdenénk a memória rendszerünk kiépítését, győződjünk meg róla, hogy tiszta lappal indulunk.\n", + "\n", + "> 💡 **Tipp**: Ezt a lépést kihagyhatod, ha meg szeretnéd őrizni a korábbi futtatásokból származó meglévő emlékeket, amikor később használod ezt a jegyzetfüzetet.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 1. rész: A tudásbázis felépítése\n", + "\n", + "### Adatforrások a fejlesztői asszisztensünkhöz\n", + "\n", + "Háromféle adatot fogunk feldolgozni, hogy átfogó tudásbázist hozzunk létre:\n", + "\n", + "1. **Fejlesztői profil**: Személyes szakértelem és technikai háttér\n", + "2. **Python legjobb gyakorlatok**: A Python filozófiája gyakorlati iránymutatásokkal\n", + "3. **Korábbi beszélgetések**: Fejlesztők és AI asszisztensek közötti korábbi kérdés-válasz ülések\n", + "\n", + "Ez a sokszínű adat lehetővé teszi, hogy az ügynökünk:\n", + "- Megértse a felhasználó technikai kontextusát\n", + "- Alkalmazza a legjobb gyakorlatokat az ajánlásokban\n", + "- Tanuljon a korábbi sikeres interakciókból\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Adatok feldolgozása tudásgráffá\n", + "\n", + "Most a nyers szöveget strukturált memóriává alakítjuk. Ez a folyamat:\n", + "\n", + "1. **Adatok hozzáadása a NodeSetekhez**: Az információk logikai kategóriákba rendezése\n", + " - `developer_data`: Fejlesztői profil és beszélgetések\n", + " - `principles_data`: Python legjobb gyakorlatok és irányelvek\n", + "\n", + "2. **Cognify Pipeline futtatása**: Entitások és kapcsolatok kinyerése, valamint beágyazások létrehozása\n", + " - Kulcsfogalmak azonosítása\n", + " - Szemantikus kapcsolatok létrehozása az összefüggő információk között\n", + " - Vektoros beágyazások generálása\n", + "\n", + "Ez néhány pillanatot igénybe vehet, mivel az LLM feldolgozza a szöveget és felépíti a gráfstruktúrát:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Vizualizáljuk a Tudásgráfot\n", + "\n", + "Fedezzük fel a tudásgráfunk szerkezetét. A vizualizáció a következőket mutatja:\n", + "- **Csomópontok**: A szövegből kinyert entitások (fogalmak, technológiák, személyek)\n", + "- **Élek**: Kapcsolatok és összefüggések az entitások között\n", + "- **Klaszterek**: Kapcsolódó fogalmak csoportosítva szemantikai hasonlóság alapján\n", + "\n", + "Nyisd meg a generált HTML fájlt a böngésződben, hogy interaktívan felfedezhesd a gráfot:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Memória gazdagítása a Memify segítségével\n", + "\n", + "A `memify()` függvény elemzi a tudásgráfot, és intelligens szabályokat generál az adatokkal kapcsolatban. Ez a folyamat:\n", + "- Azonosítja a mintákat és a bevált gyakorlatokat\n", + "- Cselekvésre alkalmas irányelveket hoz létre a tartalom alapján\n", + "- Kapcsolatokat alakít ki a különböző tudásterületek között\n", + "\n", + "Ezek a szabályok segítik az ügynököt abban, hogy megalapozottabb döntéseket hozzon a kérdések megválaszolásakor. Egy második vizualizáció rögzítése segít összehasonlítani, hogyan sűrűsödik a gráf a gazdagítás után.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 2. rész: Intelligens memória-visszakeresés\n", + "\n", + "### 1. bemutató: Tudás integrálása több dokumentumból\n", + "\n", + "Most, hogy elkészült a tudásgráfunk, teszteljük, hogyan kombinálja a Cognee az információkat több forrásból, hogy összetett kérdésekre válaszoljon.\n", + "\n", + "Az első lekérdezés bemutatja:\n", + "- **Szemantikai megértés**: Releváns fogalmak megtalálása akkor is, ha azok nincsenek kifejezetten megemlítve\n", + "- **Kereszthivatkozás**: Fejlesztői profil és Python alapelvek kombinálása\n", + "- **Kontekstuális érvelés**: Legjobb gyakorlatok alkalmazása konkrét megvalósításokra\n", + "\n", + "### 2. bemutató: Szűrt keresés NodeSetekkel\n", + "\n", + "A második lekérdezés megmutatja, hogyan célozhatunk meg a tudásgráf specifikus részhalmazait:\n", + "- A `node_name` paramétert használja, hogy csak a `principles_data`-ban keressen\n", + "- Koncentrált válaszokat ad egy adott tudásterületről\n", + "- Hasznos, ha területspecifikus információra van szükség\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 3. rész: Munkamenet-kezelés beállítása\n", + "\n", + "### Beszélgetési memória engedélyezése\n", + "\n", + "A munkamenet-kezelés kulcsfontosságú a kontextus fenntartásához több interakció során. Itt a következőket fogjuk elvégezni:\n", + "\n", + "1. **Felhasználói kontextus inicializálása**: Hozzon létre vagy hívjon elő egy felhasználói profilt a munkamenet nyomon követéséhez\n", + "2. **Gyorsítótár-motor konfigurálása**: Csatlakozzon a Redis-hez a beszélgetési előzmények tárolásához\n", + "3. **Munkamenet-változók engedélyezése**: Állítson be olyan kontextusváltozókat, amelyek megmaradnak a lekérdezések között\n", + "\n", + "> ⚠️ **Fontos**: Ehhez szükséges, hogy a Redis fusson, és a környezetben a `CACHING=true` legyen beállítva\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Segítő funkció: Munkamenet előzményeinek megtekintése\n", + "\n", + "Ez a segédfunkció lehetővé teszi, hogy megvizsgáljuk a Redis-ben tárolt beszélgetési előzményeket. Hasznos a következőkre:\n", + "- Munkamenet-kezelés hibakeresése\n", + "- Annak ellenőrzése, hogy a beszélgetések tárolva vannak-e\n", + "- Annak megértése, hogy milyen kontextus áll rendelkezésre az ügynök számára\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## 1. szekció: Async Support Lab — Első kérdés\n", + "\n", + "Indítsd el az `async-support-lab` szekciót azzal, hogy megkérdezed, milyen telemetria-barát asyncio minták alkalmazhatók egy hatalmas webes adatgyűjtőhöz. A grafikon már ismeri az asyncio-t, az aiohttp-t és a monitorozási gyakorlatokat, így a válasznak tükröznie kell a korábbi beszélgetéseket, miközben az új kérdéshez igazodik.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Az 1. munkamenet memóriájának ellenőrzése az első csere után\n", + "\n", + "A `show_history(session_1)` futtatása közvetlenül az első kérdés után megerősíti, hogy a Cognee mind a promptot, mind a választ beírta a Redisbe. Egy bejegyzést kell látnod a párhuzamossági útmutatóval.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## 1. szekció: Adatmodellek nyomon követése\n", + "\n", + "Ezután azt kérdezzük: \"Mikor válasszak dataclasses-t a Pydantic helyett?\" ugyanazzal a munkamenet azonosítóval. A Cognee-nek össze kell kapcsolnia a Python alapelveket és a korábbi FastAPI beszélgetéseket, hogy árnyalt tanácsot adjon—bemutatva, hogy a kontextus áthúzódik egy megnevezett munkameneten belül.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Ellenőrizze, hogy az 1. munkamenet előzményei tartalmazzák-e mindkét fordulót\n", + "\n", + "Egy újabb `show_history(session_1)` hívásnak két kérdés-válasz bejegyzést kell mutatnia. Ez megfelel a Mem0 labor \"memória visszajátszás\" lépésének, és bizonyítja, hogy a további fordulók ugyanahhoz a jegyzőkönyvhöz kapcsolódnak.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## 2. szekció: Tervezési áttekintő szál — Új szekció\n", + "\n", + "Annak érdekében, hogy elkülönítsük a szálakat, elindítjuk a `design-review-session`-t, és naplózási útmutatást kérünk az incidensek áttekintéséhez. Bár az alapul szolgáló tudásbázis ugyanaz, az új szekcióazonosító külön tartja a jegyzőkönyveket.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## 2. munkamenet áttekintése - Történelem\n", + "\n", + "A `show_history(session_2)` csak a tervezési áttekintéshez tartozó kérdés-válasz párost kell, hogy megjelenítse. Hasonlítsd össze az 1. munkamenettel, hogy kiemeld, hogyan tartja a Cognee az önálló átiratokat, miközben újrahasznosítja a megosztott tudásgráfot.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Összefoglaló\n", + "\n", + "Gratulálunk! Mostantól a kódolási asszisztensed egy valódi hosszú távú memória réteggel rendelkezik, amelyet a Cognee biztosít.\n", + "\n", + "Ebben az útmutatóban nyers fejlesztői tartalmat (kód, dokumentációk, csevegések) alakítottál át egy gráf + vektormemóriává, amelyet az ügynököd kereshet, elemezhet és folyamatosan fejleszthet.\n", + "\n", + "Amit megtanultál:\n", + "\n", + "1. **Nyers szövegből AI memóriává**: Hogyan dolgozza fel a Cognee a strukturálatlan adatokat, és alakítja intelligens, kereshető memóriává egy kombinált vektor + tudásgráf architektúra segítségével.\n", + "\n", + "2. **Gráf gazdagítása memify-val**: Hogyan léphetsz túl az alapvető gráf létrehozáson, és használhatod a memify-t származtatott tények és gazdagabb kapcsolatok hozzáadására a meglévő gráfhoz.\n", + "\n", + "3. **Többféle keresési stratégia**: Hogyan lehet memóriát lekérdezni különböző keresési típusokkal (gráf-tudatos kérdezz-felelek, RAG-stílusú kiegészítés, betekintések, nyers szövegrészletek, kódkeresés stb.) az ügynök igényei szerint.\n", + "\n", + "4. **Vizualizációs felfedezés**: Hogyan lehet ellenőrizni és hibakeresni, amit a Cognee létrehozott gráf vizualizációk és a Cognee UI segítségével, hogy ténylegesen láthasd, hogyan van strukturálva a tudás.\n", + "\n", + "5. **Munkamenet-tudatos memória**: Hogyan lehet kombinálni a munkamenetenkénti kontextust a tartós szemantikai memóriával, hogy az ügynökök emlékezni tudjanak a futások között anélkül, hogy információt szivárogtatnának a felhasználók között.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Főbb tanulságok\n", + "1. Memória mint Tudásgráf beágyazásokkal támogatva\n", + "\n", + " - **Strukturált megértés**: A Cognee egyesíti a vektortárat és a gráftárat, így az adataid nemcsak jelentés alapján kereshetők, hanem kapcsolatok által is összekötöttek. A Cognee alapértelmezés szerint fájlalapú adatbázisokat használ (LanceDB a vektortárhoz, Kuzu a gráfadatbázishoz).\n", + "\n", + " - **Kapcsolat-tudatos visszakeresés**: A válaszok nemcsak „hasonló szövegeken” alapulhatnak, hanem azon is, hogy az entitások hogyan kapcsolódnak egymáshoz.\n", + "\n", + " - **Élő memória**: A memóriaréteg fejlődik, növekszik, és egy összekapcsolt gráfként lekérdezhető marad.\n", + "\n", + "2. Keresési és érvelési módok\n", + " - **Hibrid visszakeresés**: A keresés ötvözi a vektorszerű hasonlóságot, a gráfstruktúrát és az LLM érvelést, a nyers szövegrészletek keresésétől a gráf-tudatos kérdésmegoldásig.\n", + "\n", + " - **Illeszd a módot a feladathoz**: Használj kiegészítés-stílusú módokat, ha természetes nyelvű válaszokat szeretnél, és részlet/összefoglaló/gráf módokat, ha az ügynöködnek nyers kontextusra van szüksége vagy saját érvelését kell irányítania.\n", + "\n", + "3. Személyre szabott, munkamenet-tudatos ügynökök\n", + " - **Munkamenet-kontektsztus + hosszú távú memória**: A Cognee külön kezeli a rövid távú „szál” kontextust és a hosszú távú, felhasználói vagy szervezeti szintű memóriát.\n", + "\n", + "## Valós alkalmazások\n", + "\n", + "1. **Vertikális AI ügynökök**\n", + "\n", + " Használd ennek a jegyzetfüzetnek a mintáját, hogy domain-specifikus copilotákat hozz létre, amelyek a Cognee-t használják visszakeresési és érvelési magként:\n", + "\n", + "- **Fejlesztői copilóták**: Kódellenőrzés, incidenselemzés és architektúra-asszisztensek, amelyek a kódot, API-kat, tervezési dokumentumokat és jegyeket egyetlen memóriagráfként kezelik.\n", + "\n", + "- **Ügyfélközpontú copilóták**: Támogatási vagy sikerügynökök, amelyek termékdokumentumokból, GYIK-ből, CRM jegyzetekből és korábbi jegyekből merítenek gráf-tudatos visszakereséssel és hivatkozott válaszokkal.\n", + "\n", + "- **Belső szakértői copilóták**: Politikai, jogi vagy biztonsági asszisztensek, amelyek összekapcsolt szabályok, irányelvek és történelmi döntések alapján érvelnek, nem pedig elszigetelt PDF-ek alapján.\n", + "\n", + " A Cognee kifejezetten tartós, pontos memóriaként van pozícionálva AI ügynökök számára, egy élő tudásgráfot biztosítva, amely az ügynök mögé illeszkedik, és helyettesíti az ad-hoc vektortárakat és egyedi gráfkódokat.\n", + "\n", + "2. **Adatsilók egyesítése egy memóriává**\n", + "\n", + " Ugyanez a megközelítés segít egy egységes memóriaréteg létrehozásában szétszórt források között:\n", + "\n", + "- **Silókból egy gráfba**: Strukturált (pl. adatbázisok) és strukturálatlan adatok (pl. dokumentumok, csevegések) betöltése egyetlen gráfba, amelyet beágyazások támogatnak, ahelyett, hogy minden rendszerhez külön indexeket használnánk.\n", + "\n", + "- **Források közötti érvelés hivatkozásokkal**: Többlépéses érvelés futtatása minden felett—„csatlakoztasd” a naplókat, metrikákat és dokumentumokat a gráfon keresztül—és mégis megalapozott válaszokat adj vissza forrásmegjelöléssel.\n", + "\n", + "- **Tudásközpontok**: Olyan területeken, mint a banki szektor vagy az oktatás, a Cognee már használatban van PDF-ek, belső rendszerek és alkalmazásadatok egyesítésére egy tudásgráfba vektorokkal, hogy az ügynökök pontos, hivatkozott kontextussal válaszolhassanak a kérdésekre.\n", + "\n", + "## Következő lépések\n", + "\n", + "Már megvalósítottad az alapvető memóriaciklust. Íme néhány természetes kiterjesztés, amelyet önállóan kipróbálhatsz (részletekért lásd a [Cognee dokumentációt](https://docs.cognee.ai/)):\n", + "\n", + "1. **Kísérletezz az időbeli tudatossággal**: Kapcsold be az időbeli cognify-t, hogy eseményeket és időbélyegeket vonj ki a szövegből.\n", + "\n", + "2. **Vezess be ontológia-alapú érvelést**: Határozz meg egy OWL ontológiát a területedhez. Használd a Cognee ontológia támogatását, hogy a kinyert entitások és kapcsolatok ebben a sémában legyenek rögzítve, javítva a gráf minőségét és a terület-specifikus válaszokat.\n", + "\n", + "3. **Adj hozzá egy visszacsatolási hurkot**: Hagyd, hogy a Cognee a valós felhasználói visszajelzések alapján állítsa be a gráf élsúlyait, így a visszakeresés idővel javul, nem marad statikus.\n", + "\n", + "4. **Finomhangolás személyre szabásra és munkamenet-viselkedésre**: Használj felhasználói azonosítókat, bérlőket és adatállományokat, hogy minden személy vagy csapat saját nézetet kapjon a megosztott memóriamotor felett.\n", + "\n", + "5. **Skálázás összetettebb ügynökökre**: Csatlakoztasd a Cognee-t ügynökkeretrendszerekhez, hogy több ügynökből álló rendszereket építs, amelyek mind ugyanazt a memóriaréteget osztják meg. *Microsoft Agent Framework x Cognee plugin hamarosan érkezik.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Felelősség kizárása**: \nEz a dokumentum az [Co-op Translator](https://github.com/Azure/co-op-translator) AI fordítási szolgáltatás segítségével lett lefordítva. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Fontos információk esetén javasolt professzionális emberi fordítást igénybe venni. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely a fordítás használatából eredhet.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:23:46+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "hu" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/hu/13-agent-memory/README.md b/translations/hu/13-agent-memory/README.md index 57a95fd72..1f7c5cc87 100644 --- a/translations/hu/13-agent-memory/README.md +++ b/translations/hu/13-agent-memory/README.md @@ -1,16 +1,16 @@ -# Memória az AI ügynökök számára +# Memória AI ügynökök számára [![Ügynök memória](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.hu.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Az AI ügynökök létrehozásának egyedi előnyeiről szóló beszélgetések során két fő dolog kerül előtérbe: az eszközök használatának képessége a feladatok elvégzéséhez, valamint az idővel történő fejlődés képessége. A memória az alapja annak, hogy önfejlesztő ügynököket hozzunk létre, amelyek jobb élményeket nyújthatnak a felhasználóink számára. +Amikor az AI ügynökök létrehozásának egyedi előnyeiről beszélünk, két fő dolog kerül előtérbe: az eszközök használatának képessége a feladatok elvégzéséhez, valamint az idővel történő fejlődés képessége. A memória az alapja annak, hogy önfejlesztő ügynököket hozzunk létre, amelyek jobb élményeket nyújthatnak a felhasználóink számára. Ebben a leckében megvizsgáljuk, mi is az AI ügynökök memóriája, hogyan kezelhetjük és használhatjuk azt alkalmazásaink javára. @@ -20,23 +20,31 @@ Ez a lecke az alábbiakat fogja tárgyalni: • **Az AI ügynök memória megértése**: Mi a memória, és miért elengedhetetlen az ügynökök számára. -• **Memória megvalósítása és tárolása**: Gyakorlati módszerek az AI ügynökök memória képességeinek hozzáadására, különös tekintettel a rövid távú és hosszú távú memóriára. +• **Memória megvalósítása és tárolása**: Gyakorlati módszerek az AI ügynökök memória képességeinek hozzáadására, különös tekintettel a rövid és hosszú távú memóriára. • **Önfejlesztő AI ügynökök létrehozása**: Hogyan teszi lehetővé a memória az ügynökök számára, hogy tanuljanak a korábbi interakciókból és idővel fejlődjenek. +## Elérhető megvalósítások + +Ez a lecke két átfogó notebook oktatóanyagot tartalmaz: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Memóriát valósít meg a Mem0 és az Azure AI Search segítségével a Semantic Kernel keretrendszerben. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Strukturált memóriát valósít meg a Cognee segítségével, automatikusan tudásgrafikonokat épít beágyazásokkal, grafikonokat vizualizál, és intelligens visszakeresést végez. + ## Tanulási célok A lecke elvégzése után képes leszel: -• **Megkülönböztetni az AI ügynök memória különböző típusait**, beleértve a munkamemóriát, rövid távú és hosszú távú memóriát, valamint a speciális formákat, mint például a személyiség- és epizodikus memória. +• **Megkülönböztetni az AI ügynök memória különböző típusait**, beleértve a munkamemóriát, rövid és hosszú távú memóriát, valamint a specializált formákat, mint például a személyiség és epizodikus memória. -• **Rövid távú és hosszú távú memória megvalósítása és kezelése AI ügynökök számára** a Semantic Kernel keretrendszer segítségével, olyan eszközök használatával, mint a Mem0 és a Whiteboard memória, valamint az Azure AI Search integrálásával. +• **Rövid és hosszú távú memória megvalósítása és kezelése AI ügynökök számára** a Semantic Kernel keretrendszer segítségével, olyan eszközök használatával, mint a Mem0, Cognee, Whiteboard memória, és az Azure AI Search integrációja. -• **Az önfejlesztő AI ügynökök mögötti elvek megértése**, és hogyan járulnak hozzá a robusztus memória-kezelési rendszerek a folyamatos tanuláshoz és alkalmazkodáshoz. +• **Megérteni az önfejlesztő AI ügynökök mögötti elveket**, és hogy a robusztus memória kezelési rendszerek hogyan járulnak hozzá a folyamatos tanuláshoz és alkalmazkodáshoz. ## Az AI ügynök memória megértése -Alapvetően **az AI ügynökök memóriája azokat a mechanizmusokat jelenti, amelyek lehetővé teszik számukra az információk megőrzését és visszahívását**. Ezek az információk lehetnek konkrét részletek egy beszélgetésről, felhasználói preferenciák, korábbi cselekvések vagy akár tanult minták. +Alapvetően **az AI ügynökök memóriája azokat a mechanizmusokat jelenti, amelyek lehetővé teszik számukra az információk megőrzését és visszahívását**. Ez az információ lehet konkrét részlet egy beszélgetésről, felhasználói preferenciák, korábbi cselekvések vagy akár tanult minták. Memória nélkül az AI alkalmazások gyakran állapotmentesek, ami azt jelenti, hogy minden interakció nulláról indul. Ez ismétlődő és frusztráló felhasználói élményhez vezet, ahol az ügynök "elfelejti" a korábbi kontextust vagy preferenciákat. @@ -48,51 +56,51 @@ Az ügynök intelligenciája szorosan összefügg azzal, hogy képes-e visszahí • **Interaktívak legyenek**: Fenntartsák a kontextust egy folyamatban lévő beszélgetés során. -• **Proaktívak és reaktívak legyenek**: Előre jelezzék az igényeket vagy megfelelően reagáljanak a történeti adatok alapján. +• **Proaktívak és reaktívak legyenek**: Előre jelezzék az igényeket vagy megfelelően reagáljanak a történelmi adatok alapján. • **Autonómak legyenek**: Függetlenebbül működjenek a tárolt tudás felhasználásával. A memória megvalósításának célja, hogy az ügynökök megbízhatóbbak és képesebbek legyenek. -### Memóriatípusok +### Memória típusai #### Munkamemória Gondolj rá úgy, mint egy darab jegyzetpapírra, amelyet az ügynök egyetlen, folyamatban lévő feladat vagy gondolatmenet során használ. Ez tartalmazza az azonnali információkat, amelyek szükségesek a következő lépés kiszámításához. -Az AI ügynökök esetében a munkamemória gyakran a beszélgetés legrelevánsabb információit rögzíti, még akkor is, ha a teljes csevegési előzmény hosszú vagy csonkolt. A kulcselemek, mint például követelmények, javaslatok, döntések és cselekvések kivonására összpontosít. +Az AI ügynökök esetében a munkamemória gyakran a beszélgetés legrelevánsabb információit rögzíti, még akkor is, ha a teljes csevegési előzmény hosszú vagy rövidített. A kulcselemek, mint például követelmények, javaslatok, döntések és cselekvések kiemelésére összpontosít. **Munkamemória példa** -Egy utazási foglalási ügynök esetében a munkamemória rögzítheti a felhasználó aktuális kérését, például: "Szeretnék egy utat foglalni Párizsba." Ez a konkrét követelmény az ügynök azonnali kontextusában marad, hogy irányítsa a jelenlegi interakciót. +Egy utazási foglalási ügynök esetében a munkamemória rögzítheti a felhasználó aktuális kérését, például "Szeretnék egy utat foglalni Párizsba". Ez a konkrét követelmény az ügynök azonnali kontextusában marad, hogy irányítsa a jelenlegi interakciót. #### Rövid távú memória -Ez a memória egyetlen beszélgetés vagy munkamenet idejére őrzi meg az információkat. Ez a jelenlegi csevegés kontextusa, amely lehetővé teszi az ügynök számára, hogy visszautaljon a párbeszéd korábbi fordulataira. +Ez a memória típus egyetlen beszélgetés vagy munkamenet idejére őrzi meg az információkat. Ez a jelenlegi csevegés kontextusa, amely lehetővé teszi az ügynök számára, hogy visszautaljon a párbeszéd korábbi fordulataira. **Rövid távú memória példa** -Ha egy felhasználó megkérdezi: "Mennyibe kerülne egy repülőjegy Párizsba?" majd folytatja: "Mi a helyzet az ottani szállással?", a rövid távú memória biztosítja, hogy az ügynök tudja, hogy az "ott" Párizsra utal ugyanazon beszélgetésen belül. +Ha egy felhasználó megkérdezi: "Mennyibe kerülne egy repülőjegy Párizsba?" majd folytatja: "Mi a helyzet a szállással ott?", a rövid távú memória biztosítja, hogy az ügynök tudja, hogy "ott" Párizsra utal az adott beszélgetésen belül. #### Hosszú távú memória -Ez az információ több beszélgetésen vagy munkameneten keresztül fennmarad. Lehetővé teszi az ügynökök számára, hogy emlékezzenek a felhasználói preferenciákra, történeti interakciókra vagy általános tudásra hosszabb időszakon keresztül. Ez fontos a személyre szabás szempontjából. +Ez az információ több beszélgetésen vagy munkameneten keresztül fennmarad. Lehetővé teszi az ügynökök számára, hogy emlékezzenek a felhasználói preferenciákra, történelmi interakciókra vagy általános tudásra hosszabb időszakokon keresztül. Ez fontos a személyre szabás szempontjából. **Hosszú távú memória példa** -A hosszú távú memória tárolhatja, hogy "Ben szeret síelni és szabadtéri tevékenységeket végezni, szereti a kávét hegyi kilátással, és el akarja kerülni a haladó sípályákat egy korábbi sérülés miatt". Ez az információ, amelyet korábbi interakciókból tanult, befolyásolja a javaslatokat a jövőbeli utazástervezési munkamenetek során, rendkívül személyre szabottá téve azokat. +A hosszú távú memória tárolhatja, hogy "Ben szeret síelni és szabadtéri tevékenységeket, szereti a kávét hegyi kilátással, és el akarja kerülni a haladó sípályákat egy korábbi sérülés miatt". Ez az információ, amelyet korábbi interakciókból tanult, befolyásolja a javaslatokat a jövőbeli utazástervezési munkamenetek során, rendkívül személyre szabottá téve azokat. #### Személyiség memória -Ez a speciális memória típus segít az ügynöknek egy következetes "személyiség" vagy "szerep" kialakításában. Lehetővé teszi az ügynök számára, hogy emlékezzen önmagára vagy a szándékolt szerepére, így az interakciók gördülékenyebbek és fókuszáltabbak lesznek. +Ez a specializált memória típus segít az ügynöknek egy következetes "személyiség" vagy "szerep" kialakításában. Lehetővé teszi az ügynök számára, hogy emlékezzen önmagára vagy a szándékolt szerepére, így az interakciók gördülékenyebbek és fókuszáltabbak lesznek. **Személyiség memória példa** -Ha az utazási ügynököt "síelési szakértőként" tervezték meg, a személyiség memória megerősítheti ezt a szerepet, befolyásolva a válaszait, hogy azok egy szakértő hangneméhez és tudásához igazodjanak. +Ha az utazási ügynököt "síelési szakértőként" tervezték, a személyiség memória megerősítheti ezt a szerepet, befolyásolva a válaszait, hogy azok egy szakértő hangneméhez és tudásához igazodjanak. #### Munkafolyamat/Epizodikus memória -Ez a memória tárolja az ügynök által egy összetett feladat során végrehajtott lépések sorozatát, beleértve a sikereket és kudarcokat. Olyan, mintha az ügynök "epizódokat" vagy korábbi tapasztalatokat emlékezne meg, hogy tanuljon belőlük. +Ez a memória tárolja az ügynök által végrehajtott lépések sorozatát egy összetett feladat során, beleértve a sikereket és kudarcokat. Olyan, mintha az ügynök "epizódokat" vagy korábbi tapasztalatokat emlékezne meg, hogy tanuljon belőlük. **Epizodikus memória példa** @@ -100,7 +108,7 @@ Ha az ügynök megpróbált lefoglalni egy konkrét járatot, de az nem sikerül #### Entitás memória -Ez magában foglalja konkrét entitások (például emberek, helyek vagy dolgok) és események kivonását és megjegyzését a beszélgetésekből. Lehetővé teszi az ügynök számára, hogy strukturált megértést építsen ki a megbeszélt kulcselemekről. +Ez magában foglalja konkrét entitások (például emberek, helyek vagy dolgok) és események kivonását és megjegyzését a beszélgetésekből. Lehetővé teszi az ügynök számára, hogy strukturált megértést építsen a megbeszélt kulcselemekről. **Entitás memória példa** @@ -108,53 +116,55 @@ Egy korábbi utazásról szóló beszélgetésből az ügynök kivonhatja "Pári #### Strukturált RAG (Retrieval Augmented Generation) -Míg a RAG egy általános technika, a "Strukturált RAG" kiemelkedik, mint egy erőteljes memória technológia. Sűrű, strukturált információkat von ki különböző forrásokból (beszélgetések, e-mailek, képek), és ezeket használja a válaszok pontosságának, visszahívásának és sebességének növelésére. A klasszikus RAG-tól eltérően, amely kizárólag szemantikai hasonlóságra támaszkodik, a Strukturált RAG az információk belső struktúrájával dolgozik. +Bár a RAG egy általános technika, a "Strukturált RAG" kiemelkedik, mint egy erőteljes memória technológia. Sűrű, strukturált információkat von ki különböző forrásokból (beszélgetések, e-mailek, képek), és használja a pontosság, visszahívás és válaszsebesség javítására. A klasszikus RAG-tól eltérően, amely kizárólag szemantikai hasonlóságra támaszkodik, a Strukturált RAG az információk belső struktúrájával dolgozik. **Strukturált RAG példa** -Ahelyett, hogy csak kulcsszavakat párosítana, a Strukturált RAG képes lenne repülési részleteket (célállomás, dátum, idő, légitársaság) elemezni egy e-mailből, és strukturált módon tárolni azokat. Ez lehetővé teszi a pontos lekérdezéseket, például: "Melyik járatot foglaltam Párizsba kedden?" +Ahelyett, hogy csak kulcsszavakat párosítana, a Strukturált RAG képes lenne elemezni repülési részleteket (célállomás, dátum, idő, légitársaság) egy e-mailből, és strukturált módon tárolni azokat. Ez lehetővé teszi a pontos lekérdezéseket, például "Melyik járatot foglaltam Párizsba kedden?" ## Memória megvalósítása és tárolása Az AI ügynökök memóriájának megvalósítása egy **memóriakezelési** folyamatot foglal magában, amely magában foglalja az információk generálását, tárolását, visszakeresését, integrálását, frissítését, sőt "elfelejtését" (vagy törlését). A visszakeresés különösen kritikus szempont. -### Speciális memória eszközök +### Specializált memória eszközök -Az ügynök memória tárolásának és kezelésének egyik módja speciális eszközök, például a Mem0 használata. A Mem0 egy tartós memória rétegként működik, amely lehetővé teszi az ügynökök számára, hogy releváns interakciókat hívjanak vissza, felhasználói preferenciákat és ténybeli kontextust tároljanak, valamint tanuljanak a sikerekből és kudarcokból az idő múlásával. Az ötlet az, hogy az állapotmentes ügynökök állapotossá váljanak. +#### Mem0 -Ez egy **kétfázisú memóriafolyamaton** keresztül működik: kivonás és frissítés. Először az ügynök szálához hozzáadott üzeneteket elküldik a Mem0 szolgáltatásnak, amely egy Nagy Nyelvi Modell (LLM) segítségével összefoglalja a beszélgetési előzményeket és új emlékeket von ki. Ezt követően egy LLM-alapú frissítési fázis határozza meg, hogy hozzáadja, módosítja vagy törli ezeket az emlékeket, és hibrid adatbázisban tárolja őket, amely tartalmazhat vektor-, gráf- és kulcs-érték adatbázisokat. Ez a rendszer különböző memória típusokat is támogat, és integrálhat gráf memóriát az entitások közötti kapcsolatok kezelésére. +Az ügynök memória tárolásának és kezelésének egyik módja a specializált eszközök, például a Mem0 használata. A Mem0 egy tartós memória rétegként működik, lehetővé téve az ügynökök számára, hogy releváns interakciókat hívjanak vissza, felhasználói preferenciákat és tényszerű kontextust tároljanak, valamint tanuljanak a sikerekből és kudarcokból az idő múlásával. Az ötlet az, hogy az állapotmentes ügynökök állapotossá váljanak. -### Memória tárolása RAG segítségével +Ez egy **kétfázisú memória csővezetéken keresztül működik: kivonás és frissítés**. Először az ügynök szálához hozzáadott üzeneteket elküldik a Mem0 szolgáltatásnak, amely egy Nagy Nyelvi Modell (LLM) segítségével összefoglalja a beszélgetési előzményeket és új emlékeket von ki. Ezt követően egy LLM-alapú frissítési fázis határozza meg, hogy hozzáadja, módosítja vagy törli ezeket az emlékeket, és hibrid adatbázisban tárolja őket, amely tartalmazhat vektor, grafikon és kulcs-érték adatbázisokat. Ez a rendszer különböző memória típusokat is támogat, és beépítheti a grafikon memóriát az entitások közötti kapcsolatok kezelésére. -A Mem0-hoz hasonló speciális memória eszközökön túl robusztus keresési szolgáltatásokat is használhatsz, például **Azure AI Search-t a memória tárolására és visszakeresésére**, különösen a strukturált RAG esetében. +#### Cognee -Ez lehetővé teszi, hogy az ügynök válaszait a saját adataiddal alapozd meg, biztosítva a relevánsabb és pontosabb válaszokat. Az Azure AI Search használható felhasználóspecifikus utazási emlékek, termékkatalógusok vagy bármilyen más domain-specifikus tudás tárolására. +Egy másik hatékony megközelítés a **Cognee** használata, egy nyílt forráskódú szemantikai memória AI ügynökök számára, amely strukturált és strukturálatlan adatokat alakít át lekérdezhető tudásgrafikonokká, beágyazásokkal támogatva. A Cognee egy **kettős tároló architektúrát** kínál, amely ötvözi a vektor hasonlósági keresést a grafikon kapcsolatokkal, lehetővé téve az ügynökök számára, hogy ne csak azt értsék meg, milyen információk hasonlóak, hanem azt is, hogyan kapcsolódnak egymáshoz a fogalmak. -Az Azure AI Search támogatja a **Strukturált RAG** képességeit, amely kiválóan alkalmas sűrű, strukturált információk kivonására és visszakeresésére nagy adathalmazokból, például beszélgetési előzményekből, e-mailekből vagy akár képekből. Ez "emberfeletti pontosságot és visszahívást" biztosít a hagyományos szövegdarabolási és beágyazási megközelítésekhez képest. +Kiemelkedik a **hibrid visszakeresésben**, amely ötvözi a vektor hasonlóságot, grafikon struktúrát és LLM érvelést - a nyers darabok keresésétől a grafikon-tudatos kérdés megválaszolásig. A rendszer **élő memóriát** tart fenn, amely fejlődik és növekszik, miközben egyetlen összekapcsolt grafikonként lekérdezhető marad, támogatva mind a rövid távú munkamenet kontextust, mind a hosszú távú tartós memóriát. -## Az AI ügynökök önfejlesztése +A Cognee notebook oktatóanyag ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) bemutatja ennek az egységes memória rétegnek az építését, gyakorlati példákkal a különféle adatforrások bevitelére, a tudásgrafikon vizualizálására és különböző keresési stratégiák alkalmazására, amelyek az ügynökök specifikus igényeihez igazodnak. -Az önfejlesztő ügynökök gyakori mintája egy **"tudás ügynök"** bevezetése. Ez a különálló ügynök megfigyeli a fő beszélgetést a felhasználó és az elsődleges ügynök között. Feladata: +### Memória tárolása RAG segítségével -1. **Értékes információk azonosítása**: Meghatározza, hogy a beszélgetés mely része érdemes általános tudásként vagy konkrét felhasználói preferenciaként megőrizni. +A Mem0-hoz hasonló specializált memória eszközökön túl robusztus keresési szolgáltatásokat is használhatsz, például **Azure AI Search-t a memóriák tárolására és visszakeresésére**, különösen a strukturált RAG esetében. -2. **Kivonás és összegzés**: A beszélgetésből származó lényeges tanulság vagy preferencia kivonása. +Ez lehetővé teszi, hogy az ügynök válaszait a saját adataiddal alapozd meg, biztosítva a relevánsabb és pontosabb válaszokat. Az Azure AI Search használható felhasználó-specifikus utazási emlékek, termékkatalógusok vagy bármilyen más domain-specifikus tudás tárolására. -3. **Tárolás egy tudásbázisban**: Az így kivont információk tartósítása, gyakran egy vektor adatbázisban, hogy később visszakereshetők legyenek. +Az Azure AI Search támogatja a **Strukturált RAG** képességeket, amelyek kiválóan alkalmasak sűrű, strukturált információk kinyerésére és visszakeresésére nagy adatállományokból, például beszélgetési előzményekből, e-mailekből vagy akár képekből. Ez "emberfeletti pontosságot és visszahívást" biztosít a hagyományos szövegdarabolási és beágyazási megközelítésekhez képest. -4. **Jövőbeli lekérdezések kiegészítése**: Amikor a felhasználó új lekérdezést indít, a tudás ügynök visszakeresi a releváns tárolt információkat, és hozzáfűzi a felhasználó kéréséhez, kritikus kontextust biztosítva az elsődleges ügynök számára (hasonlóan a RAG-hoz). +## AI ügynökök önfejlesztése -### Memória optimalizálása +Az önfejlesztő ügynökök gyakori mintája egy **"tudás ügynök"** bevezetése. Ez a különálló ügynök megfigyeli a fő beszélgetést a felhasználó és az elsődleges ügynök között. Feladata: -• **Késleltetés kezelése**: A felhasználói interakciók lassulásának elkerülése érdekében egy olcsóbb, gyorsabb modell használható kezdetben annak gyors ellenőrzésére, hogy az információ érdemes-e tárolni vagy visszakeresni, csak akkor alkalmazva a bonyolultabb kivonási/visszakeresési folyamatot, ha szükséges. +1. **Értékes információk azonosítása**: Meghatározza, hogy a beszélgetés mely része érdemes általános tudásként vagy konkrét felhasználói preferenciaként megőrizni. -• **Tudásbázis karbantartása**: Egy növekvő tudásbázis esetében a ritkábban használt információk "hideg tárolásba" helyezhetők a költségek kezelése érdekében. +2. **Kivonás és összefoglalás**: A beszélgetésből származó lényeges tanulás vagy preferencia kivonása. -## További kérdéseid vannak az ügynök memóriával kapcsolatban? +3. **Tárolás egy tudásbázisban**: Az így kivont információk tartósítása, gyakran egy vektor adatbázisban, hogy később visszakereshető legyen. -Csatlakozz az [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) közösséghez, hogy találkozz más tanulókkal, részt vegyél fogadóórákon, és választ kapj az AI ügynökökkel kapcsolatos kérdéseidre. +4. **Jövőbeli lekérdezések kiegészítése**: Amikor a felhasználó új lek --- + **Felelősség kizárása**: -Ezt a dokumentumot az [Co-op Translator](https://github.com/Azure/co-op-translator) AI fordítási szolgáltatás segítségével fordították le. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Kritikus információk esetén javasolt professzionális emberi fordítást igénybe venni. Nem vállalunk felelősséget a fordítás használatából eredő félreértésekért vagy téves értelmezésekért. \ No newline at end of file +Ez a dokumentum az [Co-op Translator](https://github.com/Azure/co-op-translator) AI fordítási szolgáltatás segítségével lett lefordítva. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Fontos információk esetén javasolt professzionális emberi fordítást igénybe venni. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely a fordítás használatából eredhet. + \ No newline at end of file diff --git a/translations/id/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/id/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..b6b2adac8 --- /dev/null +++ b/translations/id/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Membangun Agen AI dengan Memori Persisten menggunakan Cognee\n", + "\n", + "Notebook ini menunjukkan cara membangun agen AI cerdas dengan kemampuan memori yang canggih menggunakan [**cognee**](https://www.cognee.ai/) - memori AI open source yang menggabungkan grafik pengetahuan, pencarian semantik, dan manajemen sesi untuk menciptakan sistem AI yang sadar konteks.\n", + "\n", + "## 🎯 Tujuan Pembelajaran\n", + "\n", + "Di akhir tutorial ini, Anda akan memahami cara:\n", + "- **Membangun Grafik Pengetahuan yang Didukung oleh Embedding**: Mengubah teks tidak terstruktur menjadi pengetahuan yang terstruktur dan dapat di-query\n", + "- **Mengimplementasikan Memori Sesi**: Membuat percakapan multi-putaran dengan retensi konteks otomatis\n", + "- **Menyimpan Percakapan**: Secara opsional menyimpan interaksi penting dalam memori jangka panjang untuk referensi di masa depan\n", + "- **Melakukan Query Menggunakan Bahasa Alami**: Mengakses dan memanfaatkan konteks historis dalam percakapan baru\n", + "- **Memvisualisasikan Memori**: Mengeksplorasi hubungan dalam grafik pengetahuan agen Anda\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Apa yang Akan Anda Bangun\n", + "\n", + "Dalam tutorial ini, kita akan membuat **Asisten Koding** dengan memori yang persisten yang:\n", + "\n", + "### 1. **Konstruksi Basis Pengetahuan**\n", + " - Mengambil informasi profil dan keahlian pengembang\n", + " - Memproses prinsip dan praktik terbaik pemrograman Python\n", + " - Menyimpan percakapan historis antara pengembang dan asisten AI\n", + "\n", + "### 2. **Percakapan yang Sadar Konteks**\n", + " - Mempertahankan konteks di antara beberapa pertanyaan dalam sesi yang sama\n", + " - Secara otomatis menyimpan setiap pasangan pertanyaan/jawaban untuk pengambilan yang efisien\n", + " - Memberikan respons yang koheren dan kontekstual berdasarkan riwayat percakapan\n", + "\n", + "### 3. **Memori Jangka Panjang**\n", + " - Menyimpan percakapan penting ke dalam memori jangka panjang\n", + " - Mengambil memori yang relevan dari basis pengetahuan dan sesi sebelumnya untuk menginformasikan interaksi baru\n", + " - Membangun basis pengetahuan yang terus berkembang dan semakin baik seiring waktu\n", + "\n", + "### 4. **Pengambilan Memori yang Cerdas**\n", + " - Menggunakan pencarian semantik berbasis graf untuk menemukan informasi relevan di seluruh pengetahuan yang tersimpan\n", + " - Menyaring pencarian berdasarkan subkelompok data (informasi pengembang vs. prinsip)\n", + " - Menggabungkan berbagai sumber data untuk memberikan jawaban yang komprehensif\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Prasyarat & Pengaturan\n", + "\n", + "### Persyaratan Sistem\n", + "\n", + "Sebelum memulai, pastikan Anda memiliki:\n", + "\n", + "1. **Lingkungan Python**\n", + " - Python 3.9 atau lebih tinggi\n", + " - Lingkungan virtual (disarankan)\n", + " \n", + "2. **Redis Cache** (Diperlukan untuk Manajemen Sesi)\n", + " - Redis Lokal: `docker run -d -p 6379:6379 redis`\n", + " - Atau gunakan layanan Redis yang dikelola\n", + " \n", + "3. **Akses API LLM**\n", + " - Kunci API OpenAI atau penyedia lainnya (lihat [dokumentasi](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Konfigurasi Basis Data**\n", + " - Tidak diperlukan konfigurasi secara default. Cognee menggunakan basis data berbasis file (LanceDB dan Kuzu)\n", + " - Opsional, Anda dapat mengatur Azure AI Search sebagai penyimpanan vektor (lihat [dokumentasi](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Konfigurasi Lingkungan\n", + "\n", + "Buat file `.env` di direktori proyek Anda dengan variabel berikut:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Memahami Arsitektur Memori Cognee\n", + "\n", + "### Cara Kerja Cognee\n", + "\n", + "Cognee menyediakan sistem memori canggih yang melampaui penyimpanan key-value sederhana:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Komponen Utama:\n", + "\n", + "1. **Knowledge Graph**: Menyimpan entitas, hubungan, dan koneksi semantik\n", + "2. **Vector Embeddings**: Memungkinkan pencarian semantik di seluruh informasi yang disimpan\n", + "3. **Session Cache**: Mempertahankan konteks percakapan dalam dan antar sesi\n", + "4. **NodeSets**: Mengorganisasi data ke dalam kategori logis untuk pengambilan data yang terarah\n", + "\n", + "### Jenis Memori dalam Tutorial Ini:\n", + "\n", + "- **Persistent Memory**: Penyimpanan jangka panjang dalam knowledge graph\n", + "- **Session Memory**: Konteks percakapan sementara dalam cache Redis\n", + "- **Semantic Memory**: Pencarian berbasis kesamaan vektor di seluruh data\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Pasang Paket yang Diperlukan\n", + "\n", + "Pasang Cognee dengan dukungan Redis untuk pengelolaan sesi:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Inisialisasi Lingkungan dan Muat Library\n", + "\n", + "Pastikan:\n", + "1. Redis sedang berjalan (misalnya, melalui Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Variabel lingkungan telah diatur sebelum mengimpor modul cache\n", + "3. Jika diperlukan, restart kernel dan jalankan sel secara berurutan\n", + "\n", + "Sel berikut akan:\n", + "1. Memuat variabel lingkungan dari `.env`\n", + "2. Mengonfigurasi Cognee dengan pengaturan LLM Anda\n", + "3. Mengaktifkan caching untuk manajemen sesi\n", + "4. Memvalidasi semua komponen terhubung dengan benar\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Konfigurasi Direktori Penyimpanan\n", + "\n", + "Cognee menggunakan dua direktori terpisah untuk operasinya:\n", + "- **Data Root**: Menyimpan dokumen yang diunggah dan data yang telah diproses\n", + "- **System Root**: Berisi basis data grafik pengetahuan dan metadata sistem\n", + "\n", + "Kita akan membuat direktori terpisah untuk tutorial ini sebagai berikut:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Atur Ulang Status Memori\n", + "\n", + "Sebelum kita mulai membangun sistem memori, mari pastikan kita memulai dari awal.\n", + "\n", + "> 💡 **Tip**: Anda dapat melewati langkah ini jika ingin mempertahankan memori yang ada dari penggunaan notebook sebelumnya.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Bagian 1: Membangun Basis Pengetahuan\n", + "\n", + "### Sumber Data untuk Asisten Pengembang Kami\n", + "\n", + "Kami akan mengumpulkan tiga jenis data untuk membuat basis pengetahuan yang komprehensif:\n", + "\n", + "1. **Profil Pengembang**: Keahlian pribadi dan latar belakang teknis\n", + "2. **Praktik Terbaik Python**: Zen of Python dengan panduan praktis\n", + "3. **Percakapan Historis**: Sesi tanya jawab sebelumnya antara pengembang dan asisten AI\n", + "\n", + "Data yang beragam ini memungkinkan agen kami untuk:\n", + "- Memahami konteks teknis pengguna\n", + "- Menerapkan praktik terbaik dalam rekomendasi\n", + "- Belajar dari interaksi sukses sebelumnya\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Proses Data menjadi Knowledge Graph\n", + "\n", + "Sekarang kita akan mengubah teks mentah menjadi memori yang terstruktur. Proses ini:\n", + "\n", + "1. **Menambahkan data ke NodeSets**: Mengorganisasi informasi ke dalam kategori logis\n", + " - `developer_data`: Profil pengembang dan percakapan\n", + " - `principles_data`: Praktik terbaik dan panduan Python\n", + "\n", + "2. **Menjalankan Cognify Pipeline**: Mengekstrak entitas, hubungan, dan membuat embeddings\n", + " - Mengidentifikasi konsep utama\n", + " - Membuat koneksi semantik antara informasi yang terkait\n", + " - Menghasilkan vector embeddings\n", + "\n", + "Proses ini mungkin memerlukan beberapa saat karena LLM memproses teks dan membangun struktur graf:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Visualisasikan Grafik Pengetahuan\n", + "\n", + "Mari kita jelajahi struktur grafik pengetahuan kita. Visualisasi ini menunjukkan:\n", + "- **Node**: Entitas yang diekstrak dari teks (konsep, teknologi, orang)\n", + "- **Edge**: Hubungan dan koneksi antar entitas\n", + "- **Cluster**: Konsep terkait yang dikelompokkan berdasarkan kesamaan semantik\n", + "\n", + "Buka file HTML yang dihasilkan di browser Anda untuk menjelajahi grafik secara interaktif:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Perkaya Memori dengan Memify\n", + "\n", + "Fungsi `memify()` menganalisis grafik pengetahuan dan menghasilkan aturan cerdas tentang data. Proses ini:\n", + "- Mengidentifikasi pola dan praktik terbaik\n", + "- Membuat panduan yang dapat diterapkan berdasarkan konten\n", + "- Menetapkan hubungan antara berbagai area pengetahuan\n", + "\n", + "Aturan-aturan ini membantu agen membuat keputusan yang lebih terinformasi saat menjawab pertanyaan. Menangkap visualisasi kedua membantu Anda membandingkan bagaimana grafik menjadi lebih padat setelah diperkaya.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Bagian 2: Pengambilan Memori Cerdas\n", + "\n", + "### Demonstrasi 1: Integrasi Pengetahuan Antar-Dokumen\n", + "\n", + "Sekarang grafik pengetahuan kita telah dibuat, mari kita uji bagaimana Cognee menggabungkan informasi dari berbagai sumber untuk menjawab pertanyaan yang kompleks.\n", + "\n", + "Pertanyaan pertama menunjukkan:\n", + "- **Pemahaman semantik**: Menemukan konsep yang relevan meskipun tidak disebutkan secara eksplisit\n", + "- **Referensi silang**: Menggabungkan profil pengembang dengan prinsip Python\n", + "- **Penalaran kontekstual**: Menerapkan praktik terbaik pada implementasi tertentu\n", + "\n", + "### Demonstrasi 2: Pencarian Tersaring dengan NodeSets\n", + "\n", + "Pertanyaan kedua menunjukkan cara menargetkan subset tertentu dari grafik pengetahuan:\n", + "- Menggunakan parameter `node_name` untuk mencari hanya dalam `principles_data`\n", + "- Memberikan jawaban yang terfokus dari domain pengetahuan tertentu\n", + "- Berguna saat Anda membutuhkan informasi spesifik domain\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Bagian 3: Pengaturan Manajemen Sesi\n", + "\n", + "### Mengaktifkan Memori Percakapan\n", + "\n", + "Manajemen sesi sangat penting untuk menjaga konteks di antara beberapa interaksi. Di sini kita akan:\n", + "\n", + "1. **Inisialisasi Konteks Pengguna**: Membuat atau mengambil profil pengguna untuk pelacakan sesi\n", + "2. **Konfigurasi Mesin Cache**: Terhubung ke Redis untuk menyimpan riwayat percakapan\n", + "3. **Mengaktifkan Variabel Sesi**: Menyiapkan variabel konteks yang bertahan di antara kueri\n", + "\n", + "> ⚠️ **Penting**: Ini membutuhkan Redis berjalan dan `CACHING=true` di lingkungan Anda\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Fungsi Pembantu: Melihat Riwayat Sesi\n", + "\n", + "Fungsi utilitas ini memungkinkan kita untuk memeriksa riwayat percakapan yang disimpan di Redis. Ini berguna untuk:\n", + "- Debugging pengelolaan sesi\n", + "- Memastikan bahwa percakapan disimpan dalam cache\n", + "- Memahami konteks apa yang tersedia untuk agen\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Sesi 1: Lab Dukungan Async — Pertanyaan Pertama\n", + "\n", + "Mulai sesi `async-support-lab` dengan menanyakan pola asyncio yang ramah telemetri untuk sebuah web scraper besar. Grafik sudah mengetahui tentang asyncio, aiohttp, dan praktik pemantauan, jadi responsnya harus mencerminkan percakapan sebelumnya sambil menyesuaikan jawaban dengan pertanyaan baru.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Periksa Memori Sesi 1 Setelah Pertukaran Pertama\n", + "\n", + "Menjalankan `show_history(session_1)` segera setelah pertanyaan awal mengonfirmasi bahwa Cognee menulis baik prompt maupun penyelesaian ke Redis. Anda seharusnya melihat satu entri dengan panduan konkuren.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Sesi 1: Tindak Lanjut pada Model Data\n", + "\n", + "Selanjutnya kita bertanya, \"Kapan saya harus memilih dataclasses dibandingkan Pydantic?\" menggunakan ID sesi yang sama. Cognee seharusnya menggabungkan prinsip-prinsip Python ditambah percakapan FastAPI sebelumnya untuk memberikan saran yang mendalam—menunjukkan bahwa konteks tetap berlanjut dalam sesi yang diberi nama.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Konfirmasi Riwayat Sesi 1 Berisi Kedua Giliran\n", + "\n", + "Panggilan `show_history(session_1)` lainnya seharusnya menunjukkan dua entri Tanya Jawab. Ini sesuai dengan langkah \"pemutaran ulang memori\" di lab Mem0 dan membuktikan bahwa giliran tambahan memperpanjang transkrip yang sama.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Sesi 2: Thread Tinjauan Desain — Sesi Baru\n", + "\n", + "Untuk menunjukkan isolasi antara thread, kami memulai `design-review-session` dan meminta panduan pencatatan untuk tinjauan insiden. Meskipun basis pengetahuan dasarnya sama, ID sesi yang baru menjaga transkrip tetap terpisah.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Tinjauan Sesi 2 Sejarah\n", + "\n", + "`show_history(session_2)` seharusnya hanya mencantumkan pasangan prompt/respons tinjauan desain. Bandingkan dengan Sesi 1 untuk menyoroti bagaimana Cognee menjaga transkrip independen sambil menggunakan kembali grafik pengetahuan bersama.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Ringkasan\n", + "\n", + "Selamat! Anda baru saja memberikan asisten pemrograman Anda lapisan memori jangka panjang yang didukung oleh Cognee.\n", + "\n", + "Dalam tutorial ini, Anda mengambil konten pengembang mentah (kode, dokumen, obrolan) dan mengubahnya menjadi grafik + memori vektor yang dapat dicari, dianalisis, dan terus ditingkatkan oleh agen Anda.\n", + "\n", + "Apa yang Telah Anda Pelajari\n", + "\n", + "1. **Dari teks mentah ke memori AI**: Bagaimana Cognee mengolah data tidak terstruktur dan mengubahnya menjadi memori cerdas yang dapat dicari menggunakan arsitektur gabungan vektor + grafik pengetahuan.\n", + "\n", + "2. **Peningkatan grafik dengan memify**: Bagaimana melampaui pembuatan grafik dasar dan menggunakan memify untuk menambahkan fakta turunan dan hubungan yang lebih kaya di atas grafik yang sudah ada.\n", + "\n", + "3. **Berbagai strategi pencarian**: Bagaimana melakukan pencarian memori dengan berbagai jenis pencarian (Q&A berbasis grafik, penyelesaian gaya RAG, wawasan, potongan mentah, pencarian kode, dll.) tergantung pada kebutuhan agen Anda.\n", + "\n", + "4. **Eksplorasi visual**: Bagaimana memeriksa dan memperbaiki apa yang dibangun Cognee menggunakan visualisasi grafik dan UI Cognee, sehingga Anda benar-benar dapat melihat bagaimana pengetahuan disusun.\n", + "\n", + "5. **Memori yang sadar sesi**: Bagaimana menggabungkan konteks per sesi dengan memori semantik yang persisten sehingga agen dapat mengingat antar sesi tanpa membocorkan informasi antar pengguna.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Poin Penting\n", + "1. Memori sebagai Knowledge Graph yang didukung oleh Embeddings\n", + "\n", + " - **Pemahaman terstruktur**: Cognee menggabungkan penyimpanan vektor dan penyimpanan graf sehingga data Anda dapat dicari berdasarkan makna dan terhubung melalui hubungan. Secara default, Cognee menggunakan database berbasis file (LanceDB untuk penyimpanan vektor, Kuzu untuk database graf).\n", + "\n", + " - **Pengambilan yang sadar hubungan**: Jawaban tidak hanya didasarkan pada \"teks serupa,\" tetapi juga pada bagaimana entitas saling berhubungan.\n", + "\n", + " - **Memori yang hidup**: Lapisan memori berkembang, tumbuh, dan tetap dapat diakses sebagai satu graf yang terhubung.\n", + "\n", + "2. Mode Pencarian & Penalaran\n", + " - **Pengambilan hibrida**: Pencarian menggabungkan kesamaan vektor, struktur graf, dan penalaran LLM, mulai dari pencarian potongan mentah hingga jawaban pertanyaan yang sadar graf.\n", + "\n", + " - **Sesuaikan mode dengan tugas**: Gunakan mode gaya penyelesaian ketika Anda menginginkan jawaban dalam bahasa alami, dan mode potongan/ringkasan/graf ketika agen Anda membutuhkan konteks mentah atau untuk mendorong penalarannya sendiri.\n", + "\n", + "3. Agen yang Dipersonalisasi dan Sadar Sesi\n", + " - **Konteks sesi + memori jangka panjang**: Cognee memisahkan konteks \"thread\" jangka pendek dari memori jangka panjang yang berfokus pada pengguna atau organisasi.\n", + "\n", + "## Aplikasi Dunia Nyata\n", + "\n", + "1. **Agen AI Vertikal**\n", + "\n", + " Gunakan pola dari notebook ini untuk mendukung co-pilot cerdas domain yang berada di atas Cognee sebagai inti pengambilan dan penalarannya:\n", + "\n", + "- **Co-pilot pengembang**: Tinjauan kode, analisis insiden, dan asisten arsitektur yang menjelajahi kode, API, dokumen desain, dan tiket sebagai satu graf memori.\n", + "\n", + "- **Co-pilot untuk pelanggan**: Agen dukungan atau keberhasilan yang menarik dari dokumen produk, FAQ, catatan CRM, dan tiket sebelumnya dengan pengambilan yang sadar graf dan jawaban yang dikutip.\n", + "\n", + "- **Co-pilot ahli internal**: Asisten kebijakan, hukum, atau keamanan yang menalar berdasarkan aturan, pedoman, dan keputusan historis yang saling terhubung, bukan PDF yang terisolasi.\n", + "\n", + " Cognee secara eksplisit diposisikan sebagai memori yang persisten dan akurat untuk agen AI, menyediakan knowledge graph yang hidup yang mendukung agen Anda dan menggantikan kombinasi ad-hoc dari penyimpanan vektor dan kode graf khusus.\n", + "\n", + "2. **Menyatukan Data Silo menjadi Satu Memori**\n", + "\n", + " Pendekatan yang sama juga membantu Anda membangun lapisan memori terpadu di berbagai sumber yang tersebar:\n", + "\n", + "- **Dari silo ke satu graf**: Masukkan data terstruktur (misalnya, database) dan tidak terstruktur (misalnya, dokumen, obrolan) ke dalam satu graf yang didukung oleh embeddings, daripada indeks terpisah untuk setiap sistem.\n", + "\n", + "- **Penalaran lintas sumber dengan kutipan**: Jalankan penalaran multi-langkah di atas semuanya—“gabungkan” log, metrik, dan dokumen melalui graf—dan tetap kembalikan jawaban yang didasarkan dengan asal-usul yang jelas.\n", + "\n", + "- **Pusat pengetahuan**: Untuk domain seperti perbankan atau pendidikan, Cognee sudah digunakan untuk menyatukan PDF, sistem internal, dan data aplikasi ke dalam satu knowledge graph dengan vektor sehingga agen dapat menjawab pertanyaan dengan konteks yang tepat dan dikutip.\n", + "\n", + "## Langkah Selanjutnya\n", + "\n", + "Anda telah mengimplementasikan loop memori inti. Berikut adalah pengembangan alami yang dapat Anda coba sendiri (lihat [dokumentasi Cognee](https://docs.cognee.ai/) untuk detailnya):\n", + "\n", + "1. **Bereksperimen dengan kesadaran temporal**: Aktifkan temporal cognify untuk mengekstrak peristiwa dan stempel waktu dari teks.\n", + "\n", + "2. **Perkenalkan penalaran berbasis ontologi**: Definisikan ontologi OWL untuk domain Anda. Gunakan dukungan ontologi Cognee sehingga entitas dan hubungan yang diekstraksi didasarkan pada skema tersebut, meningkatkan kualitas graf dan jawaban spesifik domain.\n", + "\n", + "3. **Tambahkan loop umpan balik**: Biarkan Cognee menyesuaikan bobot tepi graf dari umpan balik pengguna nyata, sehingga pengambilan data meningkat seiring waktu daripada tetap statis.\n", + "\n", + "4. **Sesuaikan untuk personalisasi & perilaku sesi**: Gunakan ID pengguna, penyewa, dan dataset untuk memberikan setiap orang atau tim pandangan mereka sendiri atas mesin memori bersama.\n", + "\n", + "5. **Skalakan ke agen yang lebih kompleks**: Hubungkan Cognee ke kerangka kerja agen untuk membangun sistem multi-agen yang semuanya berbagi lapisan memori yang sama. *Microsoft Agent Framework x plugin Cognee akan segera hadir.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diperhatikan bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang timbul dari penggunaan terjemahan ini.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:14:13+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "id" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/id/13-agent-memory/README.md b/translations/id/13-agent-memory/README.md index aee4c89b2..22aea4dc0 100644 --- a/translations/id/13-agent-memory/README.md +++ b/translations/id/13-agent-memory/README.md @@ -1,42 +1,50 @@ -# Memori untuk Agen AI +# Memori untuk Agen AI [![Memori Agen](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.id.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Saat membahas manfaat unik dari menciptakan Agen AI, dua hal utama sering dibicarakan: kemampuan untuk memanggil alat guna menyelesaikan tugas dan kemampuan untuk berkembang seiring waktu. Memori adalah dasar dalam menciptakan agen yang dapat meningkatkan diri sendiri untuk memberikan pengalaman yang lebih baik bagi pengguna kita. +Saat membahas manfaat unik dari menciptakan Agen AI, dua hal utama yang sering dibahas adalah kemampuan untuk menggunakan alat guna menyelesaikan tugas dan kemampuan untuk berkembang seiring waktu. Memori menjadi dasar dalam menciptakan agen yang dapat meningkatkan diri sendiri untuk memberikan pengalaman yang lebih baik bagi pengguna. Dalam pelajaran ini, kita akan melihat apa itu memori untuk Agen AI, bagaimana kita dapat mengelolanya, dan menggunakannya untuk keuntungan aplikasi kita. -## Pendahuluan +## Pengantar Pelajaran ini akan mencakup: -• **Memahami Memori Agen AI**: Apa itu memori dan mengapa itu penting bagi agen. +• **Memahami Memori Agen AI**: Apa itu memori dan mengapa penting bagi agen. • **Mengimplementasikan dan Menyimpan Memori**: Metode praktis untuk menambahkan kemampuan memori pada agen AI Anda, dengan fokus pada memori jangka pendek dan jangka panjang. • **Membuat Agen AI yang Meningkatkan Diri Sendiri**: Bagaimana memori memungkinkan agen untuk belajar dari interaksi sebelumnya dan berkembang seiring waktu. +## Implementasi yang Tersedia + +Pelajaran ini mencakup dua tutorial notebook yang komprehensif: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Mengimplementasikan memori menggunakan Mem0 dan Azure AI Search dengan kerangka kerja Semantic Kernel. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Mengimplementasikan memori terstruktur menggunakan Cognee, secara otomatis membangun grafik pengetahuan yang didukung oleh embeddings, memvisualisasikan grafik, dan pencarian cerdas. + ## Tujuan Pembelajaran Setelah menyelesaikan pelajaran ini, Anda akan mengetahui cara: • **Membedakan berbagai jenis memori agen AI**, termasuk memori kerja, jangka pendek, dan jangka panjang, serta bentuk khusus seperti memori persona dan episodik. -• **Mengimplementasikan dan mengelola memori jangka pendek dan jangka panjang untuk agen AI** menggunakan kerangka kerja Semantic Kernel, memanfaatkan alat seperti Mem0 dan memori Whiteboard, serta mengintegrasikan dengan Azure AI Search. +• **Mengimplementasikan dan mengelola memori jangka pendek dan jangka panjang untuk agen AI** menggunakan kerangka kerja Semantic Kernel, memanfaatkan alat seperti Mem0, Cognee, memori Whiteboard, dan integrasi dengan Azure AI Search. • **Memahami prinsip di balik agen AI yang meningkatkan diri sendiri** dan bagaimana sistem manajemen memori yang kuat berkontribusi pada pembelajaran dan adaptasi yang berkelanjutan. ## Memahami Memori Agen AI -Pada intinya, **memori untuk agen AI mengacu pada mekanisme yang memungkinkan mereka untuk menyimpan dan mengingat informasi**. Informasi ini bisa berupa detail spesifik tentang percakapan, preferensi pengguna, tindakan sebelumnya, atau bahkan pola yang dipelajari. +Pada intinya, **memori untuk agen AI mengacu pada mekanisme yang memungkinkan mereka untuk menyimpan dan mengingat informasi**. Informasi ini dapat berupa detail spesifik tentang percakapan, preferensi pengguna, tindakan sebelumnya, atau bahkan pola yang dipelajari. Tanpa memori, aplikasi AI sering kali bersifat stateless, artinya setiap interaksi dimulai dari awal. Hal ini menyebabkan pengalaman pengguna yang berulang dan membuat frustrasi, di mana agen "melupakan" konteks atau preferensi sebelumnya. @@ -58,9 +66,9 @@ Tujuan dari implementasi memori adalah membuat agen lebih **andal dan mampu**. #### Memori Kerja -Anggap ini sebagai selembar kertas coretan yang digunakan agen selama satu tugas atau proses pemikiran yang sedang berlangsung. Memori ini menyimpan informasi langsung yang diperlukan untuk menghitung langkah berikutnya. +Anggap ini sebagai selembar kertas catatan yang digunakan agen selama satu tugas atau proses pemikiran yang sedang berlangsung. Memori ini menyimpan informasi langsung yang diperlukan untuk menghitung langkah berikutnya. -Untuk agen AI, memori kerja sering kali menangkap informasi paling relevan dari percakapan, bahkan jika riwayat obrolan penuh panjang atau terpotong. Memori ini berfokus pada pengambilan elemen kunci seperti persyaratan, proposal, keputusan, dan tindakan. +Untuk agen AI, memori kerja sering kali menangkap informasi paling relevan dari percakapan, bahkan jika riwayat obrolan penuh panjang atau terpotong. Memori ini berfokus pada elemen-elemen penting seperti persyaratan, proposal, keputusan, dan tindakan. **Contoh Memori Kerja** @@ -72,7 +80,7 @@ Jenis memori ini menyimpan informasi selama satu percakapan atau sesi. Ini adala **Contoh Memori Jangka Pendek** -Jika seorang pengguna bertanya, "Berapa biaya penerbangan ke Paris?" dan kemudian melanjutkan dengan "Bagaimana dengan akomodasi di sana?", memori jangka pendek memastikan agen tahu bahwa "di sana" merujuk ke "Paris" dalam percakapan yang sama. +Jika pengguna bertanya, "Berapa biaya penerbangan ke Paris?" lalu melanjutkan dengan "Bagaimana dengan akomodasi di sana?", memori jangka pendek memastikan agen tahu bahwa "di sana" merujuk ke "Paris" dalam percakapan yang sama. #### Memori Jangka Panjang @@ -84,10 +92,9 @@ Memori jangka panjang mungkin menyimpan bahwa "Ben menyukai ski dan aktivitas lu #### Memori Persona -Jenis memori khusus ini membantu agen mengembangkan "kepribadian" atau "persona" yang konsisten. Memori ini memungkinkan agen untuk mengingat detail tentang dirinya sendiri atau perannya yang dimaksudkan, sehingga interaksi menjadi lebih lancar dan terfokus. +Jenis memori khusus ini membantu agen mengembangkan "kepribadian" atau "persona" yang konsisten. Memori ini memungkinkan agen untuk mengingat detail tentang dirinya sendiri atau perannya yang dimaksudkan, membuat interaksi lebih lancar dan terfokus. **Contoh Memori Persona** - Jika agen perjalanan dirancang sebagai "perencana ski ahli", memori persona mungkin memperkuat peran ini, memengaruhi responsnya agar selaras dengan nada dan pengetahuan seorang ahli. #### Memori Alur Kerja/Episodik @@ -100,37 +107,47 @@ Jika agen mencoba memesan penerbangan tertentu tetapi gagal karena tidak tersedi #### Memori Entitas -Memori ini melibatkan pengambilan dan pengingatan entitas spesifik (seperti orang, tempat, atau benda) dan peristiwa dari percakapan. Memori ini memungkinkan agen untuk membangun pemahaman terstruktur tentang elemen kunci yang dibahas. +Memori ini melibatkan ekstraksi dan penyimpanan entitas spesifik (seperti orang, tempat, atau benda) dan peristiwa dari percakapan. Memori ini memungkinkan agen untuk membangun pemahaman terstruktur tentang elemen-elemen penting yang dibahas. **Contoh Memori Entitas** -Dari percakapan tentang perjalanan sebelumnya, agen mungkin mengambil "Paris," "Menara Eiffel," dan "makan malam di restoran Le Chat Noir" sebagai entitas. Dalam interaksi di masa depan, agen dapat mengingat "Le Chat Noir" dan menawarkan untuk membuat reservasi baru di sana. +Dari percakapan tentang perjalanan sebelumnya, agen mungkin mengekstrak "Paris," "Menara Eiffel," dan "makan malam di restoran Le Chat Noir" sebagai entitas. Dalam interaksi di masa depan, agen dapat mengingat "Le Chat Noir" dan menawarkan untuk membuat reservasi baru di sana. #### RAG Terstruktur (Retrieval Augmented Generation) -Meskipun RAG adalah teknik yang lebih luas, "RAG Terstruktur" disorot sebagai teknologi memori yang kuat. Memori ini mengekstrak informasi yang padat dan terstruktur dari berbagai sumber (percakapan, email, gambar) dan menggunakannya untuk meningkatkan presisi, pengingatan, dan kecepatan dalam respons. Berbeda dengan RAG klasik yang hanya mengandalkan kesamaan semantik, RAG Terstruktur bekerja dengan struktur bawaan informasi. +Meskipun RAG adalah teknik yang lebih luas, "RAG Terstruktur" disorot sebagai teknologi memori yang kuat. Memori ini mengekstrak informasi padat dan terstruktur dari berbagai sumber (percakapan, email, gambar) dan menggunakannya untuk meningkatkan presisi, pengingatan, dan kecepatan dalam respons. Berbeda dengan RAG klasik yang hanya mengandalkan kesamaan semantik, RAG Terstruktur bekerja dengan struktur bawaan dari informasi. **Contoh RAG Terstruktur** -Alih-alih hanya mencocokkan kata kunci, RAG Terstruktur dapat memparsing detail penerbangan (tujuan, tanggal, waktu, maskapai) dari email dan menyimpannya dengan cara yang terstruktur. Hal ini memungkinkan kueri yang presisi seperti "Penerbangan apa yang saya pesan ke Paris pada hari Selasa?" +Alih-alih hanya mencocokkan kata kunci, RAG Terstruktur dapat memparsing detail penerbangan (tujuan, tanggal, waktu, maskapai) dari email dan menyimpannya dengan cara yang terstruktur. Hal ini memungkinkan kueri yang tepat seperti "Penerbangan apa yang saya pesan ke Paris pada hari Selasa?" ## Mengimplementasikan dan Menyimpan Memori -Mengimplementasikan memori untuk agen AI melibatkan proses sistematis **manajemen memori**, yang mencakup menghasilkan, menyimpan, mengambil, mengintegrasikan, memperbarui, dan bahkan "melupakan" (atau menghapus) informasi. Pengambilan adalah aspek yang sangat penting. +Mengimplementasikan memori untuk agen AI melibatkan proses sistematis **manajemen memori**, yang mencakup menghasilkan, menyimpan, mengambil, mengintegrasikan, memperbarui, dan bahkan "melupakan" (atau menghapus) informasi. Pengambilan memori adalah aspek yang sangat penting. ### Alat Memori Khusus +#### Mem0 + Salah satu cara untuk menyimpan dan mengelola memori agen adalah dengan menggunakan alat khusus seperti Mem0. Mem0 berfungsi sebagai lapisan memori yang persisten, memungkinkan agen untuk mengingat interaksi yang relevan, menyimpan preferensi pengguna dan konteks faktual, serta belajar dari keberhasilan dan kegagalan seiring waktu. Ide di sini adalah bahwa agen yang stateless berubah menjadi stateful. -Mem0 bekerja melalui **pipeline memori dua fase: ekstraksi dan pembaruan**. Pertama, pesan yang ditambahkan ke thread agen dikirim ke layanan Mem0, yang menggunakan Large Language Model (LLM) untuk merangkum riwayat percakapan dan mengekstrak memori baru. Selanjutnya, fase pembaruan yang didorong oleh LLM menentukan apakah memori ini perlu ditambahkan, dimodifikasi, atau dihapus, menyimpannya dalam penyimpanan data hibrida yang dapat mencakup basis data vektor, graf, dan key-value. Sistem ini juga mendukung berbagai jenis memori dan dapat mengintegrasikan memori graf untuk mengelola hubungan antar entitas. +Mem0 bekerja melalui **pipeline memori dua fase: ekstraksi dan pembaruan**. Pertama, pesan yang ditambahkan ke thread agen dikirim ke layanan Mem0, yang menggunakan Large Language Model (LLM) untuk merangkum riwayat percakapan dan mengekstrak memori baru. Selanjutnya, fase pembaruan yang didorong oleh LLM menentukan apakah memori tersebut perlu ditambahkan, dimodifikasi, atau dihapus, menyimpannya dalam penyimpanan data hibrida yang dapat mencakup basis data vektor, grafik, dan key-value. Sistem ini juga mendukung berbagai jenis memori dan dapat mengintegrasikan memori grafik untuk mengelola hubungan antar entitas. + +#### Cognee + +Pendekatan kuat lainnya adalah menggunakan **Cognee**, memori semantik open-source untuk agen AI yang mengubah data terstruktur dan tidak terstruktur menjadi grafik pengetahuan yang dapat di-query dan didukung oleh embeddings. Cognee menyediakan **arsitektur penyimpanan ganda** yang menggabungkan pencarian kesamaan vektor dengan hubungan grafik, memungkinkan agen untuk memahami tidak hanya informasi apa yang serupa, tetapi bagaimana konsep saling berhubungan. + +Cognee unggul dalam **pencarian hibrida** yang menggabungkan kesamaan vektor, struktur grafik, dan penalaran LLM - mulai dari pencarian chunk mentah hingga tanya jawab yang sadar grafik. Sistem ini mempertahankan **memori hidup** yang berkembang dan tumbuh sambil tetap dapat di-query sebagai satu grafik yang terhubung, mendukung konteks sesi jangka pendek dan memori persisten jangka panjang. + +Tutorial notebook Cognee ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) menunjukkan cara membangun lapisan memori terpadu ini, dengan contoh praktis tentang mengolah berbagai sumber data, memvisualisasikan grafik pengetahuan, dan melakukan kueri dengan strategi pencarian yang berbeda yang disesuaikan dengan kebutuhan agen tertentu. ### Menyimpan Memori dengan RAG -Selain alat memori khusus seperti Mem0, Anda dapat memanfaatkan layanan pencarian yang kuat seperti **Azure AI Search sebagai backend untuk menyimpan dan mengambil memori**, terutama untuk RAG Terstruktur. +Selain alat memori khusus seperti Mem0, Anda dapat memanfaatkan layanan pencarian yang kuat seperti **Azure AI Search sebagai backend untuk menyimpan dan mengambil memori**, terutama untuk RAG terstruktur. -Hal ini memungkinkan Anda untuk mendasarkan respons agen pada data Anda sendiri, memastikan jawaban yang lebih relevan dan akurat. Azure AI Search dapat digunakan untuk menyimpan memori perjalanan spesifik pengguna, katalog produk, atau pengetahuan domain lainnya. +Hal ini memungkinkan Anda untuk mendasarkan respons agen pada data Anda sendiri, memastikan jawaban yang lebih relevan dan akurat. Azure AI Search dapat digunakan untuk menyimpan memori perjalanan pengguna, katalog produk, atau pengetahuan khusus domain lainnya. -Azure AI Search mendukung kemampuan seperti **RAG Terstruktur**, yang unggul dalam mengekstrak dan mengambil informasi yang padat dan terstruktur dari dataset besar seperti riwayat percakapan, email, atau bahkan gambar. Hal ini memberikan "presisi dan pengingatan superhuman" dibandingkan pendekatan tradisional seperti chunking teks dan embedding. +Azure AI Search mendukung kemampuan seperti **RAG Terstruktur**, yang unggul dalam mengekstrak dan mengambil informasi padat dan terstruktur dari dataset besar seperti riwayat percakapan, email, atau bahkan gambar. Hal ini memberikan "presisi dan pengingatan superhuman" dibandingkan pendekatan chunking teks dan embedding tradisional. ## Membuat Agen AI Meningkatkan Diri Sendiri @@ -138,23 +155,25 @@ Pola umum untuk agen yang meningkatkan diri sendiri melibatkan pengenalan **"age 1. **Mengidentifikasi informasi berharga**: Menentukan apakah ada bagian dari percakapan yang layak disimpan sebagai pengetahuan umum atau preferensi pengguna tertentu. -2. **Mengekstrak dan merangkum**: Mengambil pembelajaran atau preferensi penting dari percakapan. +2. **Ekstraksi dan ringkasan**: Menyaring pembelajaran atau preferensi penting dari percakapan. -3. **Menyimpan dalam basis pengetahuan**: Menyimpan informasi yang diekstraksi ini, sering kali dalam basis data vektor, sehingga dapat diambil nanti. +3. **Menyimpan dalam basis pengetahuan**: Menyimpan informasi yang diekstraksi, sering kali dalam basis data vektor, sehingga dapat diambil nanti. -4. **Menambah kueri di masa depan**: Ketika pengguna memulai kueri baru, agen pengetahuan mengambil informasi yang relevan yang tersimpan dan menambahkannya ke prompt pengguna, memberikan konteks penting kepada agen utama (mirip dengan RAG). +4. **Menambah kueri di masa depan**: Ketika pengguna memulai kueri baru, agen pengetahuan mengambil informasi yang tersimpan yang relevan dan menambahkannya ke prompt pengguna, memberikan konteks penting kepada agen utama (mirip dengan RAG). ### Optimasi untuk Memori -• **Manajemen Latensi**: Untuk menghindari memperlambat interaksi pengguna, model yang lebih murah dan lebih cepat dapat digunakan terlebih dahulu untuk dengan cepat memeriksa apakah informasi layak disimpan atau diambil, hanya memanggil proses ekstraksi/pengambilan yang lebih kompleks jika diperlukan. +• **Manajemen Latensi**: Untuk menghindari memperlambat interaksi pengguna, model yang lebih murah dan cepat dapat digunakan terlebih dahulu untuk dengan cepat memeriksa apakah informasi berharga untuk disimpan atau diambil, hanya menggunakan proses ekstraksi/pengambilan yang lebih kompleks jika diperlukan. • **Pemeliharaan Basis Pengetahuan**: Untuk basis pengetahuan yang terus berkembang, informasi yang jarang digunakan dapat dipindahkan ke "penyimpanan dingin" untuk mengelola biaya. -## Punya Pertanyaan Lebih Lanjut Tentang Memori Agen? +## Ada Pertanyaan Lebih Lanjut Tentang Memori Agen? -Bergabunglah dengan [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) untuk bertemu dengan pelajar lainnya, menghadiri jam kantor, dan mendapatkan jawaban atas pertanyaan Anda tentang Agen AI. +Bergabunglah dengan [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) untuk bertemu dengan pelajar lainnya, menghadiri jam kantor, dan mendapatkan jawaban atas pertanyaan Anda tentang Agen AI. --- + **Penafian**: -Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diketahui bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini. \ No newline at end of file +Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berupaya untuk memberikan hasil yang akurat, harap diketahui bahwa terjemahan otomatis dapat mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang penting, disarankan menggunakan jasa penerjemahan manusia profesional. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang timbul dari penggunaan terjemahan ini. + \ No newline at end of file diff --git a/translations/it/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/it/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..4f13af399 --- /dev/null +++ b/translations/it/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Costruire agenti AI con memoria persistente usando Cognee\n", + "\n", + "Questo notebook dimostra come creare agenti AI intelligenti con capacità di memoria sofisticate utilizzando [**cognee**](https://www.cognee.ai/) - una memoria AI open source che combina grafi di conoscenza, ricerca semantica e gestione delle sessioni per creare sistemi AI consapevoli del contesto.\n", + "\n", + "## 🎯 Obiettivi di apprendimento\n", + "\n", + "Alla fine di questo tutorial, comprenderai come:\n", + "- **Costruire grafi di conoscenza supportati da embeddings**: Trasformare testo non strutturato in conoscenza strutturata e interrogabile\n", + "- **Implementare memoria di sessione**: Creare conversazioni multi-turno con conservazione automatica del contesto\n", + "- **Conservare conversazioni**: Memorizzare opzionalmente interazioni importanti nella memoria a lungo termine per riferimenti futuri\n", + "- **Interrogare usando il linguaggio naturale**: Accedere e sfruttare il contesto storico in nuove conversazioni\n", + "- **Visualizzare la memoria**: Esplorare le relazioni nel grafo di conoscenza del tuo agente\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Cosa Costruirai\n", + "\n", + "In questo tutorial, creeremo un **Assistente di Programmazione** con memoria persistente che:\n", + "\n", + "### 1. **Costruzione della Base di Conoscenza**\n", + " - Assimila informazioni sul profilo e le competenze del programmatore\n", + " - Elabora i principi e le migliori pratiche della programmazione in Python\n", + " - Archivia le conversazioni storiche tra sviluppatori e assistenti AI\n", + "\n", + "### 2. **Conversazioni Consapevoli della Sessione**\n", + " - Mantiene il contesto tra più domande nella stessa sessione\n", + " - Memorizza automaticamente ogni coppia domanda/risposta per un recupero efficiente\n", + " - Fornisce risposte coerenti e contestuali basate sulla cronologia della conversazione\n", + "\n", + "### 3. **Memoria a Lungo Termine**\n", + " - Conserva conversazioni importanti in una memoria a lungo termine\n", + " - Recupera ricordi rilevanti dalla base di conoscenza e dalle sessioni passate per informare nuove interazioni\n", + " - Costruisce una base di conoscenza in crescita che migliora nel tempo\n", + "\n", + "### 4. **Recupero Intelligente della Memoria**\n", + " - Utilizza una ricerca semantica basata su grafi per trovare informazioni rilevanti in tutta la conoscenza archiviata\n", + " - Filtra le ricerche per sottogruppi di dati (informazioni sul programmatore vs. principi)\n", + " - Combina più fonti di dati per fornire risposte complete\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Prerequisiti e Configurazione\n", + "\n", + "### Requisiti di Sistema\n", + "\n", + "Prima di iniziare, assicurati di avere:\n", + "\n", + "1. **Ambiente Python**\n", + " - Python 3.9 o superiore\n", + " - Ambiente virtuale (consigliato)\n", + " \n", + "2. **Cache Redis** (Richiesto per la Gestione delle Sessioni)\n", + " - Redis locale: `docker run -d -p 6379:6379 redis`\n", + " - Oppure utilizza un servizio Redis gestito\n", + " \n", + "3. **Accesso API LLM**\n", + " - Chiave API OpenAI o altri provider (vedi [documentazione](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Configurazione del Database**\n", + " - Nessuna configurazione richiesta di default. Cognee utilizza database basati su file (LanceDB e Kuzu)\n", + " - Facoltativamente, puoi configurare Azure AI Search come archivio vettoriale (vedi [documentazione](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Configurazione dell'Ambiente\n", + "\n", + "Crea un file `.env` nella directory del tuo progetto con le seguenti variabili:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Comprendere l'architettura della memoria di Cognee\n", + "\n", + "### Come funziona Cognee\n", + "\n", + "Cognee offre un sistema di memoria sofisticato che va oltre il semplice storage chiave-valore:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Componenti principali:\n", + "\n", + "1. **Knowledge Graph**: Archivia entità, relazioni e connessioni semantiche\n", + "2. **Vector Embeddings**: Consente la ricerca semantica su tutte le informazioni archiviate\n", + "3. **Session Cache**: Mantiene il contesto della conversazione all'interno e tra le sessioni\n", + "4. **NodeSets**: Organizza i dati in categorie logiche per un recupero mirato\n", + "\n", + "### Tipi di memoria in questo tutorial:\n", + "\n", + "- **Memoria Persistente**: Archiviazione a lungo termine nel knowledge graph\n", + "- **Memoria di Sessione**: Contesto temporaneo della conversazione nella cache Redis\n", + "- **Memoria Semantica**: Ricerca basata sulla somiglianza vettoriale su tutti i dati\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Installa i pacchetti richiesti\n", + "\n", + "Installa Cognee con supporto Redis per la gestione delle sessioni:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Inizializza l'Ambiente e Carica le Librerie\n", + "\n", + "Assicurati che:\n", + "1. Redis sia in esecuzione (ad esempio, tramite Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Le variabili d'ambiente siano impostate prima di importare i moduli di cache\n", + "3. Se necessario, riavvia il kernel ed esegui le celle in ordine\n", + "\n", + "La cella seguente:\n", + "1. Caricherà le variabili d'ambiente da `.env`\n", + "2. Configurerà Cognee con le impostazioni del tuo LLM\n", + "3. Abiliterà la cache per la gestione della sessione\n", + "4. Verificherà che tutti i componenti siano correttamente connessi\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Configurare le Directory di Archiviazione\n", + "\n", + "Cognee utilizza due directory separate per le sue operazioni:\n", + "- **Data Root**: Memorizza i documenti acquisiti e i dati elaborati\n", + "- **System Root**: Contiene il database del grafo della conoscenza e i metadati di sistema\n", + "\n", + "Creeremo directory isolate per questo tutorial come segue:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Reimposta Stato della Memoria\n", + "\n", + "Prima di iniziare a costruire il nostro sistema di memoria, assicuriamoci di partire da zero.\n", + "\n", + "> 💡 **Suggerimento**: Puoi saltare questo passaggio se desideri conservare le memorie esistenti dai tuoi utilizzi precedenti di questo notebook.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Parte 1: Creare la Base di Conoscenza\n", + "\n", + "### Fonti di Dati per il Nostro Assistente per Sviluppatori\n", + "\n", + "Utilizzeremo tre tipi di dati per creare una base di conoscenza completa:\n", + "\n", + "1. **Profilo dello Sviluppatore**: Competenze personali e background tecnico\n", + "2. **Migliori Pratiche Python**: Lo Zen di Python con linee guida pratiche\n", + "3. **Conversazioni Storiche**: Sessioni di domande e risposte passate tra sviluppatori e assistenti AI\n", + "\n", + "Questi dati diversificati permettono al nostro agente di:\n", + "- Comprendere il contesto tecnico dell'utente\n", + "- Applicare le migliori pratiche nelle raccomandazioni\n", + "- Imparare dalle interazioni di successo precedenti\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Trasforma i dati in un grafo di conoscenza\n", + "\n", + "Ora trasformeremo il nostro testo grezzo in una memoria strutturata. Questo processo:\n", + "\n", + "1. **Aggiunge dati ai NodeSets**: Organizza le informazioni in categorie logiche\n", + " - `developer_data`: Profilo dello sviluppatore e conversazioni\n", + " - `principles_data`: Migliori pratiche e linee guida per Python\n", + "\n", + "2. **Esegue il Cognify Pipeline**: Estrae entità, relazioni e crea embeddings\n", + " - Identifica i concetti chiave\n", + " - Crea connessioni semantiche tra informazioni correlate\n", + " - Genera embeddings vettoriali\n", + "\n", + "Questo potrebbe richiedere qualche momento mentre l'LLM elabora il testo e costruisce la struttura del grafo:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Visualizza il Grafo della Conoscenza\n", + "\n", + "Esploriamo la struttura del nostro grafo della conoscenza. La visualizzazione mostra:\n", + "- **Nodi**: Entità estratte dal testo (concetti, tecnologie, persone)\n", + "- **Archi**: Relazioni e connessioni tra le entità\n", + "- **Cluster**: Concetti correlati raggruppati per somiglianza semantica\n", + "\n", + "Apri il file HTML generato nel tuo browser per esplorare interattivamente il grafo:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Arricchisci la memoria con Memify\n", + "\n", + "La funzione `memify()` analizza il grafo della conoscenza e genera regole intelligenti sui dati. Questo processo:\n", + "- Identifica schemi e migliori pratiche\n", + "- Crea linee guida pratiche basate sul contenuto\n", + "- Stabilisce relazioni tra diverse aree di conoscenza\n", + "\n", + "Queste regole aiutano l'agente a prendere decisioni più informate quando risponde alle domande. Catturare una seconda visualizzazione ti permette di confrontare come il grafo si densifica una volta arricchito.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Parte 2: Recupero Intelligente della Memoria\n", + "\n", + "### Dimostrazione 1: Integrazione della Conoscenza tra Documenti\n", + "\n", + "Ora che il nostro grafo della conoscenza è stato costruito, testiamo come Cognee combina informazioni da più fonti per rispondere a domande complesse.\n", + "\n", + "La prima query dimostra:\n", + "- **Comprensione semantica**: Trovare concetti rilevanti anche quando non sono esplicitamente menzionati\n", + "- **Riferimenti incrociati**: Combinare il profilo dello sviluppatore con i principi di Python\n", + "- **Ragionamento contestuale**: Applicare le migliori pratiche a implementazioni specifiche\n", + "\n", + "### Dimostrazione 2: Ricerca Filtrata con NodeSets\n", + "\n", + "La seconda query mostra come indirizzare specifici sottoinsiemi del grafo della conoscenza:\n", + "- Utilizza il parametro `node_name` per cercare solo all'interno di `principles_data`\n", + "- Fornisce risposte mirate da un dominio di conoscenza specifico\n", + "- Utile quando hai bisogno di informazioni specifiche per un determinato ambito\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Parte 3: Configurazione della gestione delle sessioni\n", + "\n", + "### Abilitare la memoria delle conversazioni\n", + "\n", + "La gestione delle sessioni è fondamentale per mantenere il contesto tra più interazioni. Qui faremo:\n", + "\n", + "1. **Inizializzare il contesto utente**: Creare o recuperare un profilo utente per il tracciamento della sessione\n", + "2. **Configurare il motore di cache**: Collegarsi a Redis per memorizzare la cronologia delle conversazioni\n", + "3. **Abilitare le variabili di sessione**: Configurare variabili di contesto che persistono tra le query\n", + "\n", + "> ⚠️ **Importante**: Questo richiede che Redis sia in esecuzione e `CACHING=true` nel tuo ambiente\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Funzione di supporto: Visualizza la cronologia delle sessioni\n", + "\n", + "Questa funzione di utilità ci consente di esaminare la cronologia delle conversazioni memorizzata in Redis. È utile per:\n", + "- Debugging della gestione delle sessioni\n", + "- Verificare che le conversazioni vengano memorizzate nella cache\n", + "- Comprendere quale contesto è disponibile per l'agente\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Sessione 1: Laboratorio di Supporto Async — Prima Domanda\n", + "\n", + "Inizia la sessione `async-support-lab` chiedendo dei modelli asyncio adatti alla telemetria per un web scraper di grandi dimensioni. Il grafico conosce già asyncio, aiohttp e le pratiche di monitoraggio, quindi la risposta dovrebbe rispecchiare le conversazioni precedenti adattandosi alla nuova domanda.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Ispeziona la memoria della Sessione 1 dopo il primo scambio\n", + "\n", + "Eseguendo `show_history(session_1)` subito dopo la domanda iniziale, si conferma che Cognee ha scritto sia il prompt che la risposta in Redis. Dovresti vedere un'unica voce con le indicazioni sulla concorrenza.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Sessione 1: Approfondimento sui Modelli di Dati\n", + "\n", + "Ora ci chiediamo: \"Quando dovrei scegliere dataclasses rispetto a Pydantic?\" utilizzando lo stesso ID di sessione. Cognee dovrebbe combinare i principi di Python con le precedenti conversazioni su FastAPI per fornire consigli più dettagliati, dimostrando che il contesto viene mantenuto all'interno di una sessione nominata.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Conferma che la cronologia della Sessione 1 contiene entrambi i turni\n", + "\n", + "Un'altra chiamata a `show_history(session_1)` dovrebbe mostrare due voci di domande e risposte. Questo corrisponde alla fase di \"riproduzione della memoria\" del laboratorio Mem0 e dimostra che i turni aggiuntivi estendono la stessa trascrizione.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Sessione 2: Thread di Revisione del Design — Nuova Sessione\n", + "\n", + "Per mostrare l'isolamento tra i thread, avviamo `design-review-session` e chiediamo indicazioni per la registrazione delle revisioni degli incidenti. Anche se la base di conoscenza sottostante è la stessa, il nuovo ID di sessione mantiene i trascritti separati.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Revisione Sessione 2 Storia\n", + "\n", + "`show_history(session_2)` dovrebbe elencare solo la coppia di prompt/risposta della revisione del design. Confrontalo con la Sessione 1 per evidenziare come Cognee mantenga trascrizioni indipendenti pur riutilizzando il grafo di conoscenza condiviso.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Riassunto\n", + "\n", + "Congratulazioni! Hai appena dotato il tuo assistente di codifica di un vero strato di memoria a lungo termine alimentato da Cognee.\n", + "\n", + "In questo tutorial hai preso contenuti grezzi per sviluppatori (codice, documentazione, chat) e li hai trasformati in una memoria grafica + vettoriale che il tuo agente può cercare, analizzare e migliorare continuamente.\n", + "\n", + "Cosa Hai Imparato\n", + "\n", + "1. **Dal testo grezzo alla memoria AI**: Come Cognee acquisisce dati non strutturati e li trasforma in una memoria intelligente e ricercabile utilizzando un'architettura combinata di grafico vettoriale + knowledge graph.\n", + "\n", + "2. **Arricchimento del grafico con memify**: Come andare oltre la semplice creazione di un grafico e utilizzare memify per aggiungere fatti derivati e relazioni più ricche al tuo grafico esistente.\n", + "\n", + "3. **Strategie di ricerca multiple**: Come interrogare la memoria con diversi tipi di ricerca (Q&A consapevole del grafico, completamento in stile RAG, approfondimenti, frammenti grezzi, ricerca di codice, ecc.) a seconda delle necessità del tuo agente.\n", + "\n", + "4. **Esplorazione visiva**: Come ispezionare e fare debug di ciò che Cognee ha costruito utilizzando visualizzazioni grafiche e l'interfaccia utente di Cognee, per vedere effettivamente come è strutturata la conoscenza.\n", + "\n", + "5. **Memoria consapevole della sessione**: Come combinare il contesto per sessione con una memoria semantica persistente, in modo che gli agenti possano ricordare tra diverse esecuzioni senza far trapelare informazioni tra gli utenti.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Punti Chiave\n", + "1. Memoria come un Grafo di Conoscenza supportato da Embeddings\n", + "\n", + " - **Comprensione strutturata**: Cognee combina un archivio vettoriale e un archivio grafico, rendendo i tuoi dati sia ricercabili per significato che connessi da relazioni. Cognee utilizza database basati su file di default (LanceDB per il database vettoriale, Kuzu per il database grafico).\n", + "\n", + " - **Recupero consapevole delle relazioni**: Le risposte possono essere basate non solo su \"testo simile\", ma anche su come le entità sono correlate.\n", + "\n", + " - **Memoria vivente**: Il livello di memoria si evolve, cresce e rimane interrogabile come un grafo connesso.\n", + "\n", + "2. Modalità di Ricerca e Ragionamento\n", + " - **Recupero ibrido**: La ricerca combina somiglianza vettoriale, struttura del grafo e ragionamento LLM, passando dalla ricerca di frammenti grezzi alla risposta a domande consapevoli del grafo.\n", + "\n", + " - **Adatta la modalità al compito**: Usa modalità di completamento quando desideri risposte in linguaggio naturale, e modalità di frammento/riassunto/grafo quando il tuo agente ha bisogno di contesto grezzo o di guidare il proprio ragionamento.\n", + "\n", + "3. Agenti Personalizzati e Consapevoli della Sessione\n", + " - **Contesto della sessione + memoria a lungo termine**: Cognee mantiene separato il contesto \"temporaneo\" della conversazione dalla memoria a lungo termine a livello di utente o organizzazione.\n", + "\n", + "## Applicazioni nel Mondo Reale\n", + "\n", + "1. **Agenti AI Verticali**\n", + "\n", + " Usa il modello di questo notebook per alimentare copiloti intelligenti per domini specifici che si basano su Cognee come nucleo per il recupero e il ragionamento:\n", + "\n", + "- **Copiloti per sviluppatori**: Assistenti per revisione del codice, analisi degli incidenti e architettura che attraversano codice, API, documenti di design e ticket come un unico grafo di memoria.\n", + "\n", + "- **Copiloti per clienti**: Agenti di supporto o successo che attingono da documenti di prodotto, FAQ, note CRM e ticket passati con recupero consapevole del grafo e risposte citate.\n", + "\n", + "- **Copiloti esperti interni**: Assistenti per politiche, leggi o sicurezza che ragionano su regole interconnesse, linee guida e decisioni storiche invece che su PDF isolati.\n", + "\n", + " Cognee è esplicitamente posizionato come memoria persistente e accurata per agenti AI, fornendo un grafo di conoscenza vivente che si integra dietro il tuo agente e sostituisce combinazioni ad hoc di archivi vettoriali e codice grafico personalizzato.\n", + "\n", + "2. **Unificare i Silos di Dati in un'unica Memoria**\n", + "\n", + " Lo stesso approccio ti aiuta a costruire un livello di memoria unificato attraverso fonti disperse:\n", + "\n", + "- **Da silos a un unico grafo**: Inserisci dati strutturati (ad esempio, database) e non strutturati (ad esempio, documenti, chat) in un unico grafo supportato da embeddings, invece di indici separati per ogni sistema.\n", + "\n", + "- **Ragionamento trasversale con citazioni**: Esegui ragionamenti multi-step su tutto—\"unisci\" log, metriche e documenti tramite il grafo—e restituisci comunque risposte fondate con provenienza.\n", + "\n", + "- **Hub di conoscenza**: Per domini come il settore bancario o l'istruzione, Cognee è già utilizzato per unificare PDF, sistemi interni e dati delle app in un unico grafo di conoscenza con vettori, così gli agenti possono rispondere a domande con contesto preciso e citato.\n", + "\n", + "## Prossimi Passi\n", + "\n", + "Hai implementato il ciclo di memoria principale. Ecco alcune estensioni naturali che puoi provare autonomamente (vedi [documentazione di Cognee](https://docs.cognee.ai/) per i dettagli):\n", + "\n", + "1. **Sperimenta con la consapevolezza temporale**: Attiva la funzione di cognizione temporale per estrarre eventi e timestamp dal testo.\n", + "\n", + "2. **Introduci il ragionamento basato su ontologie**: Definisci un'ontologia OWL per il tuo dominio. Usa il supporto per ontologie di Cognee affinché le entità e le relazioni estratte siano basate su quello schema, migliorando la qualità del grafo e le risposte specifiche del dominio.\n", + "\n", + "3. **Aggiungi un ciclo di feedback**: Permetti a Cognee di regolare i pesi dei bordi del grafo in base al feedback reale degli utenti, così il recupero migliora nel tempo invece di rimanere statico.\n", + "\n", + "4. **Ottimizza per personalizzazione e comportamento della sessione**: Usa ID utente, tenant e dataset per dare a ogni persona o team la propria visione sul motore di memoria condiviso.\n", + "\n", + "5. **Espandi verso agenti più complessi**: Collega Cognee a framework per agenti per costruire sistemi multi-agente che condividono tutti lo stesso livello di memoria. *Microsoft Agent Framework x plugin Cognee in arrivo presto.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Disclaimer**: \nQuesto documento è stato tradotto utilizzando il servizio di traduzione AI [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale umana. Non siamo responsabili per eventuali incomprensioni o interpretazioni errate derivanti dall'uso di questa traduzione.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:50:06+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "it" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/it/13-agent-memory/README.md b/translations/it/13-agent-memory/README.md index 192d2658e..1c62aed2b 100644 --- a/translations/it/13-agent-memory/README.md +++ b/translations/it/13-agent-memory/README.md @@ -1,16 +1,16 @@ -# Memoria per Agenti AI +# Memoria per Agenti AI [![Memoria Agente](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.it.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Quando si discutono i vantaggi unici della creazione di Agenti AI, si parla principalmente di due aspetti: la capacità di utilizzare strumenti per completare compiti e la capacità di migliorare nel tempo. La memoria è alla base della creazione di agenti auto-miglioranti che possono offrire esperienze migliori agli utenti. +Quando si parla dei vantaggi unici della creazione di Agenti AI, si discutono principalmente due aspetti: la capacità di utilizzare strumenti per completare compiti e la capacità di migliorare nel tempo. La memoria è alla base della creazione di agenti auto-miglioranti che possono offrire esperienze migliori ai nostri utenti. In questa lezione, esamineremo cos'è la memoria per gli Agenti AI e come possiamo gestirla e utilizzarla a beneficio delle nostre applicazioni. @@ -20,23 +20,31 @@ Questa lezione coprirà: • **Comprendere la Memoria degli Agenti AI**: Cos'è la memoria e perché è essenziale per gli agenti. -• **Implementare e Archiviare la Memoria**: Metodi pratici per aggiungere capacità di memoria ai tuoi agenti AI, concentrandosi su memoria a breve e lungo termine. +• **Implementare e Archiviare la Memoria**: Metodi pratici per aggiungere capacità di memoria ai tuoi agenti AI, concentrandosi sulla memoria a breve e lungo termine. • **Rendere gli Agenti AI Auto-Miglioranti**: Come la memoria consente agli agenti di apprendere dalle interazioni passate e migliorare nel tempo. +## Implementazioni Disponibili + +Questa lezione include due tutorial completi in notebook: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Implementa la memoria utilizzando Mem0 e Azure AI Search con il framework Semantic Kernel. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Implementa la memoria strutturata utilizzando Cognee, costruendo automaticamente un grafo di conoscenza supportato da embeddings, visualizzando il grafo e recuperando informazioni in modo intelligente. + ## Obiettivi di Apprendimento Dopo aver completato questa lezione, saprai come: -• **Distinguere tra i diversi tipi di memoria degli agenti AI**, inclusa la memoria di lavoro, a breve termine e a lungo termine, oltre a forme specializzate come memoria di persona e memoria episodica. +• **Distinguere tra i vari tipi di memoria degli agenti AI**, inclusa la memoria di lavoro, a breve termine e a lungo termine, oltre a forme specializzate come la memoria di persona e episodica. -• **Implementare e gestire memoria a breve e lungo termine per gli agenti AI** utilizzando il framework Semantic Kernel, sfruttando strumenti come Mem0 e memoria Whiteboard, e integrandoli con Azure AI Search. +• **Implementare e gestire la memoria a breve e lungo termine per gli agenti AI** utilizzando il framework Semantic Kernel, sfruttando strumenti come Mem0, Cognee, memoria Whiteboard e integrandosi con Azure AI Search. -• **Comprendere i principi alla base degli agenti AI auto-miglioranti** e come sistemi di gestione della memoria robusti contribuiscano all'apprendimento continuo e all'adattamento. +• **Comprendere i principi alla base degli agenti AI auto-miglioranti** e come sistemi di gestione della memoria robusti contribuiscano all'apprendimento e all'adattamento continuo. ## Comprendere la Memoria degli Agenti AI -Alla base, **la memoria per gli agenti AI si riferisce ai meccanismi che consentono loro di conservare e richiamare informazioni**. Queste informazioni possono includere dettagli specifici di una conversazione, preferenze dell'utente, azioni passate o persino schemi appresi. +Alla base, **la memoria per gli agenti AI si riferisce ai meccanismi che consentono loro di conservare e richiamare informazioni**. Queste informazioni possono includere dettagli specifici su una conversazione, preferenze dell'utente, azioni passate o persino schemi appresi. Senza memoria, le applicazioni AI sono spesso senza stato, il che significa che ogni interazione inizia da zero. Questo porta a un'esperienza utente ripetitiva e frustrante, in cui l'agente "dimentica" il contesto o le preferenze precedenti. @@ -60,7 +68,7 @@ L'obiettivo dell'implementazione della memoria è rendere gli agenti più **affi Pensala come un foglio di carta che un agente utilizza durante un singolo compito o processo di pensiero in corso. Contiene informazioni immediate necessarie per calcolare il passo successivo. -Per gli agenti AI, la memoria di lavoro spesso cattura le informazioni più rilevanti di una conversazione, anche se la cronologia completa della chat è lunga o troncata. Si concentra sull'estrazione di elementi chiave come requisiti, proposte, decisioni e azioni. +Per gli agenti AI, la memoria di lavoro spesso cattura le informazioni più rilevanti da una conversazione, anche se la cronologia completa della chat è lunga o troncata. Si concentra sull'estrazione di elementi chiave come requisiti, proposte, decisioni e azioni. **Esempio di Memoria di Lavoro** @@ -68,7 +76,7 @@ In un agente di prenotazione viaggi, la memoria di lavoro potrebbe catturare la #### Memoria a Breve Termine -Questo tipo di memoria conserva informazioni per la durata di una singola conversazione o sessione. È il contesto della chat corrente, che consente all'agente di fare riferimento ai turni precedenti nel dialogo. +Questo tipo di memoria conserva informazioni per la durata di una singola conversazione o sessione. È il contesto della chat attuale, permettendo all'agente di fare riferimento ai turni precedenti nel dialogo. **Esempio di Memoria a Breve Termine** @@ -76,7 +84,7 @@ Se un utente chiede, "Quanto costerebbe un volo per Parigi?" e poi segue con "E #### Memoria a Lungo Termine -Questa è l'informazione che persiste attraverso più conversazioni o sessioni. Consente agli agenti di ricordare preferenze dell'utente, interazioni storiche o conoscenze generali per periodi prolungati. Questo è importante per la personalizzazione. +Questa è l'informazione che persiste attraverso più conversazioni o sessioni. Permette agli agenti di ricordare preferenze dell'utente, interazioni storiche o conoscenze generali per periodi prolungati. Questo è importante per la personalizzazione. **Esempio di Memoria a Lungo Termine** @@ -84,31 +92,30 @@ Una memoria a lungo termine potrebbe conservare che "Ben ama sciare e le attivit #### Memoria di Persona -Questo tipo di memoria specializzata aiuta un agente a sviluppare una "personalità" o "persona" coerente. Consente all'agente di ricordare dettagli su se stesso o sul suo ruolo previsto, rendendo le interazioni più fluide e mirate. +Questo tipo di memoria specializzata aiuta un agente a sviluppare una "personalità" o "persona" coerente. Permette all'agente di ricordare dettagli su se stesso o sul suo ruolo previsto, rendendo le interazioni più fluide e mirate. **Esempio di Memoria di Persona** - Se l'agente di viaggio è progettato per essere un "esperto di pianificazione sciistica", la memoria di persona potrebbe rafforzare questo ruolo, influenzando le sue risposte per allinearsi al tono e alla conoscenza di un esperto. -#### Memoria Episodica/di Flusso di Lavoro +#### Memoria di Flusso/Episodica Questa memoria conserva la sequenza di passaggi che un agente compie durante un compito complesso, inclusi successi e fallimenti. È come ricordare specifici "episodi" o esperienze passate per apprendere da essi. **Esempio di Memoria Episodica** -Se l'agente ha tentato di prenotare un volo specifico ma ha fallito a causa di indisponibilità, la memoria episodica potrebbe registrare questo fallimento, consentendo all'agente di provare voli alternativi o informare l'utente del problema in modo più informato durante un tentativo successivo. +Se l'agente ha tentato di prenotare un volo specifico ma è fallito a causa di indisponibilità, la memoria episodica potrebbe registrare questo fallimento, permettendo all'agente di provare voli alternativi o informare l'utente del problema in modo più informato durante un tentativo successivo. #### Memoria di Entità -Questa memoria riguarda l'estrazione e il ricordo di entità specifiche (come persone, luoghi o cose) ed eventi dalle conversazioni. Consente all'agente di costruire una comprensione strutturata degli elementi chiave discussi. +Questa memoria riguarda l'estrazione e il ricordo di entità specifiche (come persone, luoghi o cose) ed eventi dalle conversazioni. Permette all'agente di costruire una comprensione strutturata degli elementi chiave discussi. **Esempio di Memoria di Entità** -Da una conversazione su un viaggio passato, l'agente potrebbe estrarre "Parigi", "Torre Eiffel" e "cena al ristorante Le Chat Noir" come entità. In una futura interazione, l'agente potrebbe ricordare "Le Chat Noir" e offrire di effettuare una nuova prenotazione lì. +Da una conversazione su un viaggio passato, l'agente potrebbe estrarre "Parigi", "Torre Eiffel" e "cena al ristorante Le Chat Noir" come entità. In una futura interazione, l'agente potrebbe ricordare "Le Chat Noir" e offrire di prenotare nuovamente lì. -#### RAG Strutturato (Generazione Augmentata da Recupero) +#### RAG Strutturato (Generazione Augmentata dal Recupero) -Mentre RAG è una tecnica più ampia, il "RAG Strutturato" viene evidenziato come una tecnologia di memoria potente. Estrae informazioni dense e strutturate da varie fonti (conversazioni, email, immagini) e le utilizza per migliorare precisione, richiamo e velocità nelle risposte. A differenza del RAG classico che si basa esclusivamente sulla somiglianza semantica, il RAG Strutturato lavora con la struttura intrinseca delle informazioni. +Mentre RAG è una tecnica più ampia, il "RAG Strutturato" è evidenziato come una tecnologia di memoria potente. Estrae informazioni dense e strutturate da varie fonti (conversazioni, email, immagini) e le utilizza per migliorare precisione, richiamo e velocità nelle risposte. A differenza del RAG classico che si basa esclusivamente sulla somiglianza semantica, il RAG Strutturato lavora con la struttura intrinseca delle informazioni. **Esempio di RAG Strutturato** @@ -120,41 +127,53 @@ Implementare la memoria per gli agenti AI implica un processo sistematico di **g ### Strumenti Specializzati per la Memoria -Un modo per archiviare e gestire la memoria degli agenti è utilizzare strumenti specializzati come Mem0. Mem0 funziona come uno strato di memoria persistente, consentendo agli agenti di richiamare interazioni rilevanti, archiviare preferenze dell'utente e contesti fattuali, e apprendere da successi e fallimenti nel tempo. L'idea qui è che gli agenti senza stato si trasformino in agenti con stato. +#### Mem0 + +Un modo per archiviare e gestire la memoria degli agenti è utilizzare strumenti specializzati come Mem0. Mem0 funziona come uno strato di memoria persistente, permettendo agli agenti di richiamare interazioni rilevanti, archiviare preferenze dell'utente e contesto fattuale, e apprendere da successi e fallimenti nel tempo. L'idea qui è che gli agenti senza stato si trasformano in agenti con stato. + +Funziona attraverso una **pipeline di memoria a due fasi: estrazione e aggiornamento**. Prima, i messaggi aggiunti al thread di un agente vengono inviati al servizio Mem0, che utilizza un Large Language Model (LLM) per riassumere la cronologia delle conversazioni ed estrarre nuove memorie. Successivamente, una fase di aggiornamento guidata da LLM determina se aggiungere, modificare o eliminare queste memorie, archiviandole in un archivio dati ibrido che può includere database vettoriali, grafici e chiave-valore. Questo sistema supporta anche vari tipi di memoria e può incorporare memoria grafica per gestire le relazioni tra entità. + +#### Cognee + +Un altro approccio potente è utilizzare **Cognee**, una memoria semantica open-source per agenti AI che trasforma dati strutturati e non strutturati in grafi di conoscenza interrogabili supportati da embeddings. Cognee fornisce un'**architettura a doppio archivio** che combina la ricerca per somiglianza vettoriale con le relazioni grafiche, permettendo agli agenti di comprendere non solo quali informazioni sono simili, ma come i concetti si relazionano tra loro. + +Eccelle nel **recupero ibrido** che combina somiglianza vettoriale, struttura del grafo e ragionamento LLM - dalla ricerca di chunk grezzi alla risposta a domande consapevoli del grafo. Il sistema mantiene una **memoria vivente** che evolve e cresce rimanendo interrogabile come un unico grafo connesso, supportando sia il contesto della sessione a breve termine che la memoria persistente a lungo termine. -Funziona attraverso una **pipeline di memoria a due fasi: estrazione e aggiornamento**. Innanzitutto, i messaggi aggiunti al thread di un agente vengono inviati al servizio Mem0, che utilizza un Large Language Model (LLM) per riassumere la cronologia delle conversazioni ed estrarre nuove memorie. Successivamente, una fase di aggiornamento guidata da LLM determina se aggiungere, modificare o eliminare queste memorie, archiviandole in un archivio dati ibrido che può includere database vettoriali, grafici e chiave-valore. Questo sistema supporta anche vari tipi di memoria e può incorporare memoria grafica per gestire le relazioni tra entità. +Il tutorial in notebook Cognee ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) dimostra la costruzione di questo strato di memoria unificato, con esempi pratici di ingestione di fonti di dati diverse, visualizzazione del grafo di conoscenza e interrogazione con diverse strategie di ricerca adattate alle esigenze specifiche dell'agente. ### Archiviare la Memoria con RAG Oltre agli strumenti di memoria specializzati come Mem0, puoi sfruttare servizi di ricerca robusti come **Azure AI Search come backend per archiviare e recuperare memorie**, specialmente per RAG strutturato. -Questo ti consente di basare le risposte del tuo agente sui tuoi dati, garantendo risposte più pertinenti e accurate. Azure AI Search può essere utilizzato per archiviare memorie di viaggio specifiche dell'utente, cataloghi di prodotti o qualsiasi altra conoscenza specifica del dominio. +Questo ti permette di basare le risposte del tuo agente sui tuoi dati, garantendo risposte più pertinenti e accurate. Azure AI Search può essere utilizzato per archiviare memorie di viaggio specifiche dell'utente, cataloghi di prodotti o qualsiasi altra conoscenza specifica del dominio. -Azure AI Search supporta funzionalità come **RAG Strutturato**, che eccelle nell'estrazione e nel recupero di informazioni dense e strutturate da grandi dataset come cronologie di conversazioni, email o persino immagini. Questo offre "precisione e richiamo sovrumani" rispetto agli approcci tradizionali di suddivisione del testo e embedding. +Azure AI Search supporta funzionalità come **RAG Strutturato**, che eccelle nell'estrazione e nel recupero di informazioni dense e strutturate da grandi dataset come cronologie di conversazioni, email o persino immagini. Questo fornisce "precisione e richiamo superumani" rispetto agli approcci tradizionali di suddivisione del testo e embedding. ## Rendere gli Agenti AI Auto-Miglioranti Un modello comune per gli agenti auto-miglioranti prevede l'introduzione di un **"agente di conoscenza"**. Questo agente separato osserva la conversazione principale tra l'utente e l'agente primario. Il suo ruolo è: -1. **Identificare informazioni preziose**: Determinare se una parte della conversazione vale la pena di essere salvata come conoscenza generale o preferenza specifica dell'utente. +1. **Identificare informazioni preziose**: Determinare se qualche parte della conversazione vale la pena di essere salvata come conoscenza generale o preferenza specifica dell'utente. -2. **Estrarre e riassumere**: Distillare l'apprendimento o la preferenza essenziale dalla conversazione. +2. **Estrarre e riassumere**: Distillare l'apprendimento essenziale o la preferenza dalla conversazione. 3. **Archiviare in una base di conoscenza**: Conservare queste informazioni estratte, spesso in un database vettoriale, in modo che possano essere recuperate in seguito. -4. **Arricchire le query future**: Quando l'utente avvia una nuova query, l'agente di conoscenza recupera le informazioni archiviate rilevanti e le aggiunge al prompt dell'utente, fornendo un contesto cruciale all'agente primario (simile a RAG). +4. **Arricchire le query future**: Quando l'utente avvia una nuova query, l'agente di conoscenza recupera informazioni archiviate rilevanti e le aggiunge al prompt dell'utente, fornendo un contesto cruciale all'agente primario (simile a RAG). ### Ottimizzazioni per la Memoria -• **Gestione della Latenza**: Per evitare di rallentare le interazioni con l'utente, può essere utilizzato inizialmente un modello più economico e veloce per verificare rapidamente se le informazioni sono preziose da archiviare o recuperare, invocando solo il processo di estrazione/recupero più complesso quando necessario. +• **Gestione della Latenza**: Per evitare di rallentare le interazioni con l'utente, un modello più economico e veloce può essere utilizzato inizialmente per verificare rapidamente se le informazioni sono preziose da archiviare o recuperare, invocando solo il processo di estrazione/recupero più complesso quando necessario. -• **Manutenzione della Base di Conoscenza**: Per una base di conoscenza in crescita, le informazioni meno utilizzate possono essere spostate in "archiviazione fredda" per gestire i costi. +• **Manutenzione della Base di Conoscenza**: Per una base di conoscenza in crescita, le informazioni meno utilizzate possono essere spostate in "archiviazione a freddo" per gestire i costi. ## Hai Altre Domande sulla Memoria degli Agenti? -Unisciti al [Discord di Azure AI Foundry](https://aka.ms/ai-agents/discord) per incontrare altri studenti, partecipare agli orari d'ufficio e ottenere risposte alle tue domande sugli Agenti AI. +Unisciti al [Discord di Azure AI Foundry](https://aka.ms/ai-agents/discord) per incontrare altri studenti, partecipare agli orari di ricevimento e ottenere risposte alle tue domande sugli Agenti AI. --- + **Disclaimer**: -Questo documento è stato tradotto utilizzando il servizio di traduzione automatica [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un traduttore umano. Non siamo responsabili per eventuali incomprensioni o interpretazioni errate derivanti dall'uso di questa traduzione. \ No newline at end of file +Questo documento è stato tradotto utilizzando il servizio di traduzione AI [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche potrebbero contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si consiglia una traduzione professionale umana. Non siamo responsabili per eventuali incomprensioni o interpretazioni errate derivanti dall'uso di questa traduzione. + \ No newline at end of file diff --git a/translations/ja/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/ja/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..d46f318a2 --- /dev/null +++ b/translations/ja/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Cogneeを使った永続メモリを持つAIエージェントの構築\n", + "\n", + "このノートブックでは、[**cognee**](https://www.cognee.ai/) を使用して、高度なメモリ機能を備えたインテリジェントなAIエージェントを構築する方法を示します。[cognee]は、ナレッジグラフ、セマンティック検索、セッション管理を組み合わせて、コンテキスト認識型のAIシステムを作成するオープンソースのAIメモリです。\n", + "\n", + "## 🎯 学習目標\n", + "\n", + "このチュートリアルの終わりまでに、以下のことを理解できるようになります:\n", + "- **埋め込みを活用したナレッジグラフの構築**: 非構造化テキストを構造化されたクエリ可能な知識に変換する\n", + "- **セッションメモリの実装**: 自動的にコンテキストを保持するマルチターンの会話を作成する\n", + "- **会話の永続化**: 重要なやり取りを長期記憶に保存し、将来参照できるようにする\n", + "- **自然言語でのクエリ**: 新しい会話で過去のコンテキストを活用する\n", + "- **メモリの可視化**: エージェントのナレッジグラフ内の関係を探索する\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ 作成するもの\n", + "\n", + "このチュートリアルでは、以下の機能を持つ**コーディングアシスタント**を作成します。特徴として、持続的な記憶を備えています。\n", + "\n", + "### 1. **ナレッジベースの構築**\n", + " - 開発者のプロフィールや専門知識情報を取り込む\n", + " - Pythonのプログラミング原則やベストプラクティスを処理する\n", + " - 開発者とAIアシスタント間の過去の会話を保存する\n", + "\n", + "### 2. **セッション対応の会話**\n", + " - 同じセッション内で複数の質問にわたる文脈を維持する\n", + " - 各質問と回答のペアを自動的にキャッシュして効率的に取得する\n", + " - 会話履歴に基づいて一貫性のある文脈的な応答を提供する\n", + "\n", + "### 3. **長期記憶**\n", + " - 重要な会話を長期記憶に保存する\n", + " - ナレッジベースや過去のセッションから関連する記憶を取得し、新しいやり取りに活用する\n", + " - 時間とともに成長するナレッジベースを構築する\n", + "\n", + "### 4. **インテリジェントな記憶検索**\n", + " - グラフ対応のセマンティック検索を使用して、保存されたすべての知識から関連情報を見つける\n", + " - データのサブグループ(開発者情報 vs. 原則)で検索をフィルタリングする\n", + " - 複数のデータソースを組み合わせて包括的な回答を提供する\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 前提条件とセットアップ\n", + "\n", + "### システム要件\n", + "\n", + "開始する前に、以下を確認してください:\n", + "\n", + "1. **Python環境**\n", + " - Python 3.9以上\n", + " - 仮想環境(推奨)\n", + "\n", + "2. **Redisキャッシュ**(セッション管理に必要)\n", + " - ローカルRedis: `docker run -d -p 6379:6379 redis`\n", + " - または、マネージドRedisサービスを使用\n", + "\n", + "3. **LLM APIアクセス**\n", + " - OpenAI APIキーまたは他のプロバイダー([ドキュメント](https://docs.cognee.ai/setup-configuration/llm-providers)を参照)\n", + "\n", + "4. **データベース構成**\n", + " - デフォルトでは構成不要。Cogneeはファイルベースのデータベース(LanceDBとKuzu)を使用\n", + " - オプションで、Azure AI Searchをベクトルストアとして設定可能([ドキュメント](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch)を参照)\n", + "\n", + "### 環境設定\n", + "\n", + "プロジェクトディレクトリに `.env` ファイルを作成し、以下の変数を記述してください:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Cogneeのメモリアーキテクチャを理解する\n", + "\n", + "### Cogneeの仕組み\n", + "\n", + "Cogneeは、単純なキーと値のストレージを超えた高度なメモリシステムを提供します:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### 主な構成要素:\n", + "\n", + "1. **ナレッジグラフ**: エンティティ、関係、意味的な接続を保存\n", + "2. **ベクトル埋め込み**: 保存されたすべての情報に対する意味検索を可能にする\n", + "3. **セッションキャッシュ**: セッション内およびセッション間で会話の文脈を保持\n", + "4. **NodeSets**: データを論理的なカテゴリに整理し、ターゲットを絞った取得を可能にする\n", + "\n", + "### このチュートリアルでのメモリタイプ:\n", + "\n", + "- **永続メモリ**: ナレッジグラフ内の長期保存\n", + "- **セッションメモリ**: Redisキャッシュ内の一時的な会話文脈\n", + "- **セマンティックメモリ**: すべてのデータにわたるベースの類似性検索\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 必要なパッケージをインストール\n", + "\n", + "セッション管理のためにRedisサポート付きのCogneeをインストールします:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 環境の初期化とライブラリの読み込み\n", + "\n", + "以下を確認してください:\n", + "1. Redisが稼働していること(例: Dockerを使用する場合 `docker run -d -p 6379:6379 redis`)\n", + "2. 環境変数がキャッシュモジュールをインポートする前に設定されていること\n", + "3. 必要に応じてカーネルを再起動し、セルを順番に実行すること\n", + "\n", + "以下のセルでは以下を行います:\n", + "1. `.env`から環境変数を読み込む\n", + "2. CogneeをLLM設定で構成する\n", + "3. セッション管理のためのキャッシュを有効化する\n", + "4. すべてのコンポーネントが正しく接続されていることを検証する\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 ストレージディレクトリの設定\n", + "\n", + "Cogneeはその操作のために2つの異なるディレクトリを使用します:\n", + "- **データルート**: 取り込まれたドキュメントや処理済みデータを保存\n", + "- **システムルート**: ナレッジグラフデータベースとシステムメタデータを含む\n", + "\n", + "このチュートリアルでは、以下のように分離されたディレクトリを作成します:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 メモリ状態のリセット\n", + "\n", + "メモリシステムを構築する前に、まずは新しい状態から始めるようにしましょう。\n", + "\n", + "> 💡 **ヒント**: このノートブックを後で使用する際に、以前の実行からの既存のメモリを保持したい場合は、このステップをスキップすることができます。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 パート1: ナレッジベースの構築\n", + "\n", + "### 開発者アシスタントのためのデータソース\n", + "\n", + "包括的なナレッジベースを作成するために、以下の3種類のデータを取り込みます:\n", + "\n", + "1. **開発者プロフィール**: 個人の専門知識や技術的な背景 \n", + "2. **Pythonのベストプラクティス**: Pythonの哲学(The Zen of Python)と実践的なガイドライン \n", + "3. **過去の会話履歴**: 開発者とAIアシスタント間の過去のQ&Aセッション \n", + "\n", + "この多様なデータにより、エージェントは以下を実現できます:\n", + "- ユーザーの技術的な背景を理解する \n", + "- 推奨事項にベストプラクティスを適用する \n", + "- 過去の成功したやり取りから学ぶ \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 データをナレッジグラフに変換\n", + "\n", + "ここでは、生のテキストを構造化された記憶に変換します。このプロセスでは以下を行います:\n", + "\n", + "1. **データをNodeSetsに追加**: 情報を論理的なカテゴリに整理\n", + " - `developer_data`: 開発者のプロフィールと会話\n", + " - `principles_data`: Pythonのベストプラクティスとガイドライン\n", + "\n", + "2. **Cognify Pipelineを実行**: エンティティや関係を抽出し、埋め込みを作成\n", + " - 重要な概念を特定\n", + " - 関連情報間のセマンティックなつながりを作成\n", + " - ベクトル埋め込みを生成\n", + "\n", + "LLMがテキストを処理し、グラフ構造を構築するため、少し時間がかかる場合があります:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 ナレッジグラフの可視化\n", + "\n", + "ナレッジグラフの構造を見てみましょう。この可視化では以下を示しています:\n", + "- **ノード**: テキストから抽出されたエンティティ(概念、技術、人など)\n", + "- **エッジ**: エンティティ間の関係や接続\n", + "- **クラスター**: 意味的な類似性によってグループ化された関連する概念\n", + "\n", + "生成されたHTMLファイルをブラウザで開いて、グラフをインタラクティブに探索してください:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Memifyで記憶を強化\n", + "\n", + "`memify()`関数は、ナレッジグラフを分析し、データに関する知的なルールを生成します。このプロセスでは以下を行います:\n", + "- パターンやベストプラクティスを特定\n", + "- コンテンツに基づいた実行可能なガイドラインを作成\n", + "- 異なる知識領域間の関係を確立\n", + "\n", + "これらのルールは、エージェントが質問に答える際に、より情報に基づいた意思決定を行うのに役立ちます。2回目のビジュアライゼーションをキャプチャすることで、グラフが強化された後にどのように密度が増したかを比較できます。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 パート2: インテリジェントなメモリ検索\n", + "\n", + "### デモンストレーション1: 複数ドキュメントの知識統合\n", + "\n", + "知識グラフが構築されたので、Cogneeが複数の情報源から情報を組み合わせて複雑な質問に答える方法をテストしてみましょう。\n", + "\n", + "最初のクエリでは以下を示します:\n", + "- **セマンティック理解**: 明示的に言及されていなくても関連する概念を見つける\n", + "- **クロスリファレンス**: 開発者のプロフィールとPythonの原則を組み合わせる\n", + "- **文脈的推論**: ベストプラクティスを特定の実装に適用する\n", + "\n", + "### デモンストレーション2: NodeSetsを使ったフィルタ検索\n", + "\n", + "2つ目のクエリでは、知識グラフの特定のサブセットをターゲットにする方法を示します:\n", + "- `node_name`パラメータを使用して`principles_data`内のみを検索\n", + "- 特定の知識分野から焦点を絞った回答を提供\n", + "- 分野特化の情報が必要な場合に便利\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 パート3: セッション管理のセットアップ\n", + "\n", + "### 会話メモリの有効化\n", + "\n", + "セッション管理は、複数のやり取りにおいてコンテキストを維持するために重要です。ここでは以下を行います:\n", + "\n", + "1. **ユーザーコンテキストの初期化**: セッション追跡のためにユーザープロファイルを作成または取得します\n", + "2. **キャッシュエンジンの設定**: 会話履歴を保存するためにRedisに接続します\n", + "3. **セッション変数の有効化**: クエリ間で持続するコンテキスト変数を設定します\n", + "\n", + "> ⚠️ **重要**: Redisが稼働しており、環境で`CACHING=true`が設定されている必要があります\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ ヘルパー関数: セッション履歴の表示\n", + "\n", + "このユーティリティ関数は、Redisに保存されている会話履歴を確認するためのものです。以下の用途に役立ちます:\n", + "- セッション管理のデバッグ\n", + "- 会話がキャッシュされていることの確認\n", + "- エージェントが利用可能なコンテキストの把握\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## セッション1: 非同期サポートラボ — 最初の質問\n", + "\n", + "`async-support-lab`セッションを開始し、大規模なウェブスクレイパー向けのテレメトリ対応のasyncioパターンについて質問してください。グラフはすでにasyncio、aiohttp、モニタリングの実践について知っているので、回答は以前の会話を反映しつつ、新しい質問に合わせた内容になるべきです。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## セッション1のメモリを最初のやり取り後に確認する\n", + "\n", + "最初の質問の直後に `show_history(session_1)` を実行すると、Cogneeがプロンプトと応答の両方をRedisに書き込んだことが確認できます。同時実行ガイダンスを含む1つのエントリが表示されるはずです。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## セッション1: データモデルのフォローアップ\n", + "\n", + "次に、「dataclassesとPydanticのどちらを選ぶべきかはいつか?」という質問をします。同じセッションIDを使用します。CogneeはPythonの原則と以前のFastAPIの会話を組み合わせて、文脈が名前付きセッション内で引き継がれることを示しながら、詳細なアドバイスを提供する必要があります。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## セッション1の履歴に両方のターンが含まれていることを確認\n", + "\n", + "もう一度 `show_history(session_1)` を呼び出すと、2つのQ&Aエントリが表示されるはずです。これはMem0ラボの「メモリ再生」ステップと一致し、追加のターンが同じトランスクリプトを拡張することを証明します。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## セッション 2: デザインレビューのスレッド — 新しいセッション\n", + "\n", + "スレッド間の分離を示すために、`design-review-session` を起動し、インシデントレビューのためのログガイダンスを求めます。基礎となる知識ベースは同じですが、新しいセッションIDによってトランスクリプトが分離されます。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## レビューセッション2の履歴\n", + "\n", + "`show_history(session_2)` は、デザインレビューのプロンプト/レスポンスペアのみをリストする必要があります。セッション1と比較して、Cogneeが共有ナレッジグラフを再利用しながら、独立したトランスクリプトをどのように保持しているかを強調してください。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## 概要\n", + "\n", + "おめでとうございます!あなたのコーディングアシスタントに、Cogneeによる本格的な長期記憶レイヤーを追加しました。\n", + "\n", + "このチュートリアルでは、開発者向けの生データ(コード、ドキュメント、チャット)をグラフ+ベクトルメモリに変換し、エージェントが検索、推論、そして継続的に改善できるようにする方法を学びました。\n", + "\n", + "学んだこと\n", + "\n", + "1. **生テキストからAIメモリへ**: Cogneeが非構造化データを取り込み、ベクトル+知識グラフアーキテクチャを使用してインテリジェントで検索可能なメモリに変換する方法。\n", + "\n", + "2. **memifyによるグラフの強化**: 基本的なグラフ作成を超えて、memifyを使用して既存のグラフに派生した事実やより豊かな関係を追加する方法。\n", + "\n", + "3. **複数の検索戦略**: エージェントのニーズに応じて、異なる検索タイプ(グラフ対応のQ&A、RAGスタイルの補完、インサイト、生データのチャンク、コード検索など)を使用してメモリをクエリする方法。\n", + "\n", + "4. **視覚的な探索**: グラフの可視化やCognee UIを使用して、Cogneeが構築した内容を検査・デバッグし、知識がどのように構造化されているかを実際に確認する方法。\n", + "\n", + "5. **セッション対応のメモリ**: セッションごとのコンテキストを永続的なセマンティックメモリと組み合わせることで、エージェントがユーザー間で情報を漏らすことなく、複数回の実行にわたって記憶できるようにする方法。\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## 重要なポイント\n", + "1. 埋め込みを活用した知識グラフとしてのメモリ\n", + "\n", + " - **構造化された理解**: Cogneeはベクトルストアとグラフストアを組み合わせることで、データを意味で検索可能にし、関係性で接続します。Cogneeはデフォルトでファイルベースのデータベースを使用します(ベクトルにはLanceDB、グラフデータベースにはKuzu)。\n", + "\n", + " - **関係性を考慮した検索**: 回答は「類似したテキスト」だけでなく、エンティティ間の関係性に基づいて導き出されます。\n", + "\n", + " - **進化するメモリ**: メモリ層は進化し、成長し、1つの接続されたグラフとして常にクエリ可能な状態を維持します。\n", + "\n", + "2. 検索と推論モード\n", + " - **ハイブリッド検索**: 検索はベクトル類似性、グラフ構造、LLM推論を組み合わせ、生のチャンク検索からグラフを考慮した質問応答まで対応します。\n", + "\n", + " - **目的に応じたモード選択**: 自然言語での回答が必要な場合は補完型モードを使用し、エージェントが生のコンテキストを必要とする場合や独自の推論を行う場合はチャンク/要約/グラフモードを使用します。\n", + "\n", + "3. 個別化されたセッション対応エージェント\n", + " - **セッションコンテキスト + 長期メモリ**: Cogneeは短期的な「スレッド」コンテキストを、長期的なユーザーや組織レベルのメモリから分離して保持します。\n", + "\n", + "## 実際の応用例\n", + "\n", + "1. **特定分野向けAIエージェント**\n", + "\n", + " このノートブックのパターンを使用して、Cogneeを検索と推論のコアとして活用する分野特化型のコパイロットを構築できます:\n", + "\n", + "- **開発者向けコパイロット**: コードレビュー、インシデント分析、アーキテクチャ支援を行い、コード、API、設計文書、チケットを1つのメモリグラフとして横断します。\n", + "\n", + "- **顧客対応コパイロット**: 製品文書、FAQ、CRMノート、過去のチケットをグラフ対応検索で引き出し、引用付きの回答を提供します。\n", + "\n", + "- **内部専門家向けコパイロット**: ポリシー、法務、セキュリティ支援を行い、孤立したPDFではなく、相互に関連するルール、ガイドライン、過去の決定を基に推論します。\n", + "\n", + " CogneeはAIエージェントのための永続的で正確なメモリとして明確に位置付けられており、エージェントの背後にある生きた知識グラフを提供し、ベクトルストアやカスタムグラフコードのアドホックな組み合わせを置き換えます。\n", + "\n", + "2. **データサイロを統一して1つのメモリに**\n", + "\n", + " 同じアプローチで、分散したソースを統一したメモリ層に構築することも可能です:\n", + "\n", + "- **サイロから1つのグラフへ**: 構造化データ(例: データベース)や非構造化データ(例: 文書、チャット)を埋め込みに基づいた単一のグラフに取り込み、各システムごとのインデックスを分離する代わりに統合します。\n", + "\n", + "- **引用付きのクロスソース推論**: ログ、メトリクス、文書をグラフを介して「結合」し、すべてにわたる多段階推論を実行しながら、根拠のある回答を返します。\n", + "\n", + "- **知識ハブ**: 銀行や教育のような分野では、CogneeはすでにPDF、内部システム、アプリデータを統一し、ベクトルを活用した知識グラフを構築しており、エージェントが正確で引用付きのコンテキストで質問に答えることができます。\n", + "\n", + "## 次のステップ\n", + "\n", + "コアメモリループを実装しました。以下は独自に試せる自然な拡張案です(詳細は[Cogneeのドキュメント](https://docs.cognee.ai/)をご覧ください):\n", + "\n", + "1. **時間認識の実験**: 時間認識をオンにして、テキストからイベントやタイムスタンプを抽出します。\n", + "\n", + "2. **オントロジー駆動型推論の導入**: 自分の分野に合わせたOWLオントロジーを定義します。Cogneeのオントロジーサポートを活用して、抽出されたエンティティや関係をそのスキーマに基づいて整理し、グラフの品質や分野特化型の回答を向上させます。\n", + "\n", + "3. **フィードバックループの追加**: 実際のユーザーフィードバックからCogneeがグラフのエッジウェイトを調整できるようにし、検索が静的ではなく時間とともに改善されるようにします。\n", + "\n", + "4. **個別化とセッション動作の調整**: ユーザーID、テナント、データセットを使用して、共有メモリエンジン上で各個人やチームに独自のビューを提供します。\n", + "\n", + "5. **より複雑なエージェントへの拡張**: Cogneeをエージェントフレームワークに接続し、同じメモリ層を共有するマルチエージェントシステムを構築します。*Microsoft Agent Framework x Cogneeプラグインが近日公開予定です。*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**免責事項**: \nこの文書はAI翻訳サービス[Co-op Translator](https://github.com/Azure/co-op-translator)を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があります。元の言語で記載された文書が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤解について、当社は責任を負いません。\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:33:14+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "ja" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/ja/13-agent-memory/README.md b/translations/ja/13-agent-memory/README.md index 064e02065..40e93cac5 100644 --- a/translations/ja/13-agent-memory/README.md +++ b/translations/ja/13-agent-memory/README.md @@ -1,8 +1,8 @@ **免責事項**: -この文書は、AI翻訳サービス[Co-op Translator](https://github.com/Azure/co-op-translator)を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知ください。元の言語で記載された文書が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤解について、当社は責任を負いません。 +この文書はAI翻訳サービス[Co-op Translator](https://github.com/Azure/co-op-translator)を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があります。元の言語で記載された文書を正式な情報源としてご参照ください。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤認について、当社は一切の責任を負いません。 + \ No newline at end of file diff --git a/translations/kn/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/kn/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..58f403a53 --- /dev/null +++ b/translations/kn/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Cognee ಬಳಸಿ ಶಾಶ್ವತ ಮೆಮೊರಿಯೊಂದಿಗೆ AI ಏಜೆಂಟ್‌ಗಳನ್ನು ನಿರ್ಮಿಸುವುದು\n", + "\n", + "ಈ ನೋಟ್ಬುಕ್ [**cognee**](https://www.cognee.ai/) - ಜ್ಞಾನ ಗ್ರಾಫ್‌ಗಳು, ಅರ್ಥಪೂರ್ಣ ಹುಡುಕಾಟ, ಮತ್ತು ಸೆಷನ್ ನಿರ್ವಹಣೆಯನ್ನು ಸಂಯೋಜಿಸುವ ಓಪನ್ ಸೋರ್ಸ್ AI ಮೆಮೊರಿಯನ್ನು ಬಳಸಿಕೊಂಡು, ಸನ್ನಿವೇಶ-ಜಾಗೃತ AI ವ್ಯವಸ್ಥೆಗಳನ್ನು ನಿರ್ಮಿಸಲು ಬುದ್ಧಿವಂತ AI ಏಜೆಂಟ್‌ಗಳನ್ನು ಹೇಗೆ ನಿರ್ಮಿಸಬಹುದು ಎಂಬುದನ್ನು ತೋರಿಸುತ್ತದೆ.\n", + "\n", + "## 🎯 ಕಲಿಕೆಯ ಉದ್ದೇಶಗಳು\n", + "\n", + "ಈ ಟ್ಯುಟೋರಿಯಲ್ ಮುಗಿಸುವ ವೇಳೆಗೆ, ನೀವು ಈ ವಿಷಯಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುತ್ತೀರಿ:\n", + "- **ಎಂಬೆಡಿಂಗ್‌ಗಳ ಬೆಂಬಲದೊಂದಿಗೆ ಜ್ಞಾನ ಗ್ರಾಫ್‌ಗಳನ್ನು ನಿರ್ಮಿಸುವುದು**: ಅಸಂರಚಿತ ಪಠ್ಯವನ್ನು ರಚಿತ, ಪ್ರಶ್ನಿಸಬಹುದಾದ ಜ್ಞಾನದಲ್ಲಿ ಪರಿವರ್ತಿಸಲು\n", + "- **ಸೆಷನ್ ಮೆಮೊರಿಯನ್ನು ಅನುಷ್ಠಾನಗೊಳಿಸುವುದು**: ಸ್ವಯಂಚಾಲಿತ ಸನ್ನಿವೇಶ ಸಂರಕ್ಷಣೆಯೊಂದಿಗೆ ಬಹು-ತಿರುಗು ಸಂಭಾಷಣೆಗಳನ್ನು ರಚಿಸಲು\n", + "- **ಸಂಭಾಷಣೆಗಳನ್ನು ಶಾಶ್ವತವಾಗಿ ಉಳಿಸುವುದು**: ಭವಿಷ್ಯದ ಉಲ್ಲೇಖಕ್ಕಾಗಿ ಪ್ರಮುಖ ಸಂವಹನಗಳನ್ನು ದೀರ್ಘಕಾಲದ ಮೆಮೊರಿಯಲ್ಲಿ ಸಂಗ್ರಹಿಸಲು\n", + "- **ನೈಸರ್ಗಿಕ ಭಾಷೆಯನ್ನು ಬಳಸಿಕೊಂಡು ಪ್ರಶ್ನೆ ಮಾಡುವುದು**: ಹೊಸ ಸಂಭಾಷಣೆಯಲ್ಲಿ ಐತಿಹಾಸಿಕ ಸನ್ನಿವೇಶವನ್ನು ಪ್ರವೇಶಿಸಿ ಬಳಸಲು\n", + "- **ಮೆಮೊರಿಯನ್ನು ದೃಶ್ಯೀಕರಿಸುವುದು**: ನಿಮ್ಮ ಏಜೆಂಟ್‌ನ ಜ್ಞಾನ ಗ್ರಾಫ್‌ನಲ್ಲಿ ಸಂಬಂಧಗಳನ್ನು ಅನ್ವೇಷಿಸಲು\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ ನೀವು ಏನು ನಿರ್ಮಿಸುತ್ತೀರಿ\n", + "\n", + "ಈ ಪಾಠದಲ್ಲಿ, ನಾವು ಶಾಶ್ವತ ಮೆಮೊರಿಯೊಂದಿಗೆ **ಕೋಡಿಂಗ್ ಸಹಾಯಕನನ್ನು** ರಚಿಸುತ್ತೇವೆ, ಇದು:\n", + "\n", + "### 1. **ಜ್ಞಾನ ಆಧಾರ ನಿರ್ಮಾಣ**\n", + " - ಡೆವಲಪರ್ ಪ್ರೊಫೈಲ್ ಮತ್ತು ಪರಿಣತಿ ಮಾಹಿತಿಯನ್ನು ಅಳವಡಿಸುತ್ತದೆ\n", + " - ಪೈಥಾನ್ ಪ್ರೋಗ್ರಾಮಿಂಗ್ ತತ್ವಗಳು ಮತ್ತು ಉತ್ತಮ ಅಭ್ಯಾಸಗಳನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುತ್ತದೆ\n", + " - ಡೆವಲಪರ್‌ಗಳು ಮತ್ತು AI ಸಹಾಯಕರ ನಡುವಿನ ಇತಿಹಾಸ ಸಂಭಾಷಣೆಯನ್ನು ಸಂಗ್ರಹಿಸುತ್ತದೆ\n", + "\n", + "### 2. **ಸೆಷನ್-ಜಾಗೃತ ಸಂಭಾಷಣೆಗಳು**\n", + " - ಅದೇ ಸೆಷನ್‌ನಲ್ಲಿ ಹಲವಾರು ಪ್ರಶ್ನೆಗಳ ನಡುವೆ ಸಂದರ್ಭವನ್ನು ಕಾಪಾಡುತ್ತದೆ\n", + " - ಪ್ರತಿ ಪ್ರಶ್ನೆ/ಉತ್ತರ ಜೋಡಿಯನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕ್ಯಾಶ್ ಮಾಡುತ್ತದೆ, ಪರಿಣಾಮಕಾರಿ ಹಿಂಪಡೆಯಲು\n", + " - ಸಂಭಾಷಣಾ ಇತಿಹಾಸದ ಆಧಾರದ ಮೇಲೆ ಸಮ್ಮತ, ಸಂದರ್ಭಾತ್ಮಕ ಉತ್ತರಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ\n", + "\n", + "### 3. **ದೀರ್ಘಕಾಲದ ಮೆಮೊರಿ**\n", + " - ಪ್ರಮುಖ ಸಂಭಾಷಣೆಯನ್ನು ದೀರ್ಘಕಾಲದ ಮೆಮೊರಿಯಲ್ಲಿಗೆ ಉಳಿಸುತ್ತದೆ\n", + " - ಹೊಸ ಸಂಭಾಷಣೆಗೆ ಮಾಹಿತಿ ನೀಡಲು ಜ್ಞಾನ ಆಧಾರ ಮತ್ತು ಹಳೆಯ ಸೆಷನ್‌ಗಳಿಂದ ಸಂಬಂಧಿತ ಮೆಮೊರಿಗಳನ್ನು ಹಿಂಪಡೆಯುತ್ತದೆ\n", + " - ಸಮಯದೊಂದಿಗೆ ಸುಧಾರಿಸುವ ಬೆಳೆಯುವ ಜ್ಞಾನ ಆಧಾರವನ್ನು ನಿರ್ಮಿಸುತ್ತದೆ\n", + "\n", + "### 4. **ಬುದ್ಧಿವಂತ ಮೆಮೊರಿ ಹಿಂಪಡೆಯುವುದು**\n", + " - ಸಂಗ್ರಹಿತ ಜ್ಞಾನದಲ್ಲಿ ಸಂಬಂಧಿತ ಮಾಹಿತಿಯನ್ನು ಹುಡುಕಲು ಗ್ರಾಫ್-ಜಾಗೃತ ಅರ್ಥಪೂರ್ಣ ಶೋಧವನ್ನು ಬಳಸುತ್ತದೆ\n", + " - ಡೇಟಾ ಉಪಗುಂಪುಗಳ ಮೂಲಕ ಶೋಧಗಳನ್ನು ಫಿಲ್ಟರ್ ಮಾಡುತ್ತದೆ (ಡೆವಲಪರ್ ಮಾಹಿತಿ ವಿರುದ್ಧ ತತ್ವಗಳು)\n", + " - ಸಮಗ್ರ ಉತ್ತರಗಳನ್ನು ಒದಗಿಸಲು ಹಲವಾರು ಡೇಟಾ ಮೂಲಗಳನ್ನು ಸಂಯೋಜಿಸುತ್ತದೆ\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 ಪೂರ್ವಶರತ್ತುಗಳು ಮತ್ತು ಸೆಟಪ್\n", + "\n", + "### ಸಿಸ್ಟಮ್ ಅಗತ್ಯತೆಗಳು\n", + "\n", + "ಪ್ರಾರಂಭಿಸುವ ಮೊದಲು, ನೀವು ಹೊಂದಿರಬೇಕಾದವು:\n", + "\n", + "1. **ಪೈಥಾನ್ ಪರಿಸರ**\n", + " - Python 3.9 ಅಥವಾ ಹೆಚ್ಚಿನ ಆವೃತ್ತಿ\n", + " - ವರ್ಚುವಲ್ ಎನ್ವಿರಾನ್‌ಮೆಂಟ್ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)\n", + " \n", + "2. **Redis ಕ್ಯಾಶೆ** (ಸೆಷನ್ ನಿರ್ವಹಣೆಗೆ ಅಗತ್ಯ)\n", + " - ಸ್ಥಳೀಯ Redis: `docker run -d -p 6379:6379 redis`\n", + " - ಅಥವಾ ನಿರ್ವಹಿತ Redis ಸೇವೆಯನ್ನು ಬಳಸಿ\n", + " \n", + "3. **LLM API ಪ್ರವೇಶ**\n", + " - OpenAI API ಕೀ ಅಥವಾ ಇತರ ಪೂರೈಕೆದಾರರು (ಇಲ್ಲಿ [ದಾಖಲೆ](https://docs.cognee.ai/setup-configuration/llm-providers) ನೋಡಿ)\n", + "\n", + "4. **ಡೇಟಾಬೇಸ್ ಸಂರಚನೆ**\n", + " - ಡೀಫಾಲ್ಟ್‌ನಂತೆ ಯಾವುದೇ ಸಂರಚನೆ ಅಗತ್ಯವಿಲ್ಲ. Cognee ಫೈಲ್ ಆಧಾರಿತ ಡೇಟಾಬೇಸ್‌ಗಳನ್ನು (LanceDB ಮತ್ತು Kuzu) ಬಳಸುತ್ತದೆ\n", + " - ಐಚ್ಛಿಕವಾಗಿ, ನೀವು Azure AI Search ಅನ್ನು ವೆಕ್ಟರ್ ಸ್ಟೋರ್ ಆಗಿ ಸೆಟಪ್ ಮಾಡಬಹುದು (ಇಲ್ಲಿ [ದಾಖಲೆ](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch) ನೋಡಿ)\n", + "\n", + "### ಪರಿಸರ ಸಂರಚನೆ\n", + "\n", + "ನಿಮ್ಮ ಪ್ರಾಜೆಕ್ಟ್ ಡೈರೆಕ್ಟರಿಯಲ್ಲಿ `.env` ಫೈಲ್ ಅನ್ನು ಈ ಕೆಳಗಿನ ವ್ಯತ್ಯಯಗಳೊಂದಿಗೆ ರಚಿಸಿ:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ ಕಾಗ್ನೀಯ ಮೆಮೊರಿ ಆರ್ಕಿಟೆಕ್ಚರ್ ಅನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವುದು\n", + "\n", + "### ಕಾಗ್ನೀ ಹೇಗೆ ಕೆಲಸ ಮಾಡುತ್ತದೆ\n", + "\n", + "ಕಾಗ್ನೀ ಸರಳ ಕೀ-ಮೌಲ್ಯ ಸಂಗ್ರಹಣೆಯನ್ನು ಮೀರಿ ಸುಧಾರಿತ ಮೆಮೊರಿ ವ್ಯವಸ್ಥೆಯನ್ನು ಒದಗಿಸುತ್ತದೆ:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### ಮುಖ್ಯ ಘಟಕಗಳು:\n", + "\n", + "1. **ನಾಲೆಜ್ ಗ್ರಾಫ್**: ಘಟಕಗಳು, ಸಂಬಂಧಗಳು ಮತ್ತು ಅರ್ಥಪೂರ್ಣ ಸಂಪರ್ಕಗಳನ್ನು ಸಂಗ್ರಹಿಸುತ್ತದೆ\n", + "2. **ವೆಕ್ಟರ್ ಎಂಬೆಡಿಂಗ್ಸ್**: ಸಂಗ್ರಹಿತ ಮಾಹಿತಿಯ ಮೇಲೆ ಅರ್ಥಪೂರ್ಣ ಹುಡುಕಾಟವನ್ನು ಸಾಧ್ಯವಾಗಿಸುತ್ತದೆ\n", + "3. **ಸೆಷನ್ ಕ್ಯಾಶ್**: ಸಂಭಾಷಣೆಯ ಸಂದರ್ಭವನ್ನು ಸೆಷನ್‌ಗಳಲ್ಲಿ ಮತ್ತು ಸೆಷನ್‌ಗಳ ನಡುವೆ ನಿರ್ವಹಿಸುತ್ತದೆ\n", + "4. **ನೋಡ್‌ಸೆಟ್‌ಗಳು**: ಗುರಿಯಾದ ಪುನಃಪ್ರಾಪ್ತಿಗಾಗಿ ಡೇಟಾವನ್ನು ತಾರ್ಕಿಕ ವರ್ಗಗಳಲ್ಲಿ ಸಂಘಟಿಸುತ್ತದೆ\n", + "\n", + "### ಈ ಟ್ಯುಟೋರಿಯಲ್‌ನಲ್ಲಿನ ಮೆಮೊರಿ ಪ್ರಕಾರಗಳು:\n", + "\n", + "- **ಪರ್ಸಿಸ್ಟೆಂಟ್ ಮೆಮೊರಿ**: ನಾಲೆಜ್ ಗ್ರಾಫ್‌ನಲ್ಲಿ ದೀರ್ಘಕಾಲಿಕ ಸಂಗ್ರಹಣೆ\n", + "- **ಸೆಷನ್ ಮೆಮೊರಿ**: ರಿಡಿಸ್ ಕ್ಯಾಶ್‌ನಲ್ಲಿ ತಾತ್ಕಾಲಿಕ ಸಂಭಾಷಣೆಯ ಸಂದರ್ಭ\n", + "- **ಸೆಮ್ಯಾಂಟಿಕ್ ಮೆಮೊರಿ**: ಎಲ್ಲಾ ಡೇಟಾದ ಮೇಲೆ ವೆಕ್ಟರ್ ಆಧಾರಿತ ಸಾದೃಶ್ಯ ಹುಡುಕಾಟ\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 ಅಗತ್ಯವಿರುವ ಪ್ಯಾಕೇಜ್‌ಗಳನ್ನು ಸ್ಥಾಪಿಸಿ\n", + "\n", + "ಸೆಷನ್ ನಿರ್ವಹಣೆಗೆ Redis ಬೆಂಬಲದೊಂದಿಗೆ Cognee ಅನ್ನು ಸ್ಥಾಪಿಸಿ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 ಪರಿಸರವನ್ನು ಪ್ರಾರಂಭಿಸಿ ಮತ್ತು ಗ್ರಂಥಾಲಯಗಳನ್ನು ಲೋಡ್ ಮಾಡಿ\n", + "\n", + "ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ:\n", + "1. Redis ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿದೆ (ಉದಾ., Docker ಮೂಲಕ: `docker run -d -p 6379:6379 redis`)\n", + "2. ಕ್ಯಾಶ್ ಮಾಯುಲ್ಗಳನ್ನು ಆಮದು ಮಾಡುವ ಮೊದಲು ಪರಿಸರ ಚರಾಂಶಗಳನ್ನು ಹೊಂದಿಸಲಾಗಿದೆ\n", + "3. ಅಗತ್ಯವಿದ್ದರೆ, ಕೆರ್ನಲ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ ಮತ್ತು ಸೆಲ್‌ಗಳನ್ನು ಕ್ರಮವಾಗಿ ಚಲಾಯಿಸಿ\n", + "\n", + "ಕೆಳಗಿನ ಸೆಲ್:\n", + "1. `.env` ನಿಂದ ಪರಿಸರ ಚರಾಂಶಗಳನ್ನು ಲೋಡ್ ಮಾಡುತ್ತದೆ\n", + "2. ನಿಮ್ಮ LLM ಸೆಟ್ಟಿಂಗ್‌ಗಳೊಂದಿಗೆ Cognee ಅನ್ನು ಸಂರಚಿಸುತ್ತದೆ\n", + "3. ಸೆಷನ್ ನಿರ್ವಹಣೆಗೆ ಕ್ಯಾಶಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ\n", + "4. ಎಲ್ಲಾ ಘಟಕಗಳು ಸರಿಯಾಗಿ ಸಂಪರ್ಕಗೊಂಡಿರುವುದನ್ನು ಪರಿಶೀಲಿಸುತ್ತದೆ\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 ಸಂಗ್ರಹ ಡೈರೆಕ್ಟರಿಗಳನ್ನು ಸಂರಚಿಸಿ\n", + "\n", + "Cognee ತನ್ನ ಕಾರ್ಯಾಚರಣೆಗಳಿಗೆ ಎರಡು ಪ್ರತ್ಯೇಕ ಡೈರೆಕ್ಟರಿಗಳನ್ನು ಬಳಸುತ್ತದೆ:\n", + "- **ಡೇಟಾ ರೂಟ್**: ಒಳಗೊಂಡ ದಾಖಲೆಗಳು ಮತ್ತು ಪ್ರಕ್ರಿಯೆಯಾದ ಡೇಟಾವನ್ನು ಸಂಗ್ರಹಿಸುತ್ತದೆ\n", + "- **ಸಿಸ್ಟಮ್ ರೂಟ್**: ಜ್ಞಾನ ಗ್ರಾಫ್ ಡೇಟಾಬೇಸ್ ಮತ್ತು ಸಿಸ್ಟಮ್ ಮೆಟಾಡೇಟಾವನ್ನು ಹೊಂದಿರುತ್ತದೆ\n", + "\n", + "ಈ ಟ್ಯುಟೋರಿಯಲ್‌ಗಾಗಿ ಪ್ರತ್ಯೇಕ ಡೈರೆಕ್ಟರಿಗಳನ್ನು ಈ ಕೆಳಗಿನಂತೆ ರಚಿಸುತ್ತೇವೆ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 ಮೆಮೊರಿ ಸ್ಥಿತಿಯನ್ನು ಮರುಹೊಂದಿಸಿ\n", + "\n", + "ನಮ್ಮ ಮೆಮೊರಿ ವ್ಯವಸ್ಥೆಯನ್ನು ನಿರ್ಮಿಸಲು ಪ್ರಾರಂಭಿಸುವ ಮೊದಲು, ನಾವು ಹೊಸದಾಗಿ ಪ್ರಾರಂಭಿಸುತ್ತಿದ್ದೇವೆ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳೋಣ.\n", + "\n", + "> 💡 **ಸಲಹೆ**: ನೀವು ಈ ನೋಟ್ಬುಕ್ ಅನ್ನು ನಂತರ ಬಳಸುವಾಗ ನಿಮ್ಮ ಹಿಂದಿನ ರನ್‌ಗಳಿಂದ ಇರುವ ಮೆಮೊರಿಗಳನ್ನು ಉಳಿಸಿಕೊಳ್ಳಲು ಬಯಸಿದರೆ, ಈ ಹಂತವನ್ನು ಬಿಟ್ಟುಬಿಡಬಹುದು.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 ಭಾಗ 1: ಜ್ಞಾನ ಆಧಾರವನ್ನು ನಿರ್ಮಿಸುವುದು\n", + "\n", + "### ನಮ್ಮ ಡೆವಲಪರ್ ಸಹಾಯಕರಿಗಾಗಿ ಡೇಟಾ ಮೂಲಗಳು\n", + "\n", + "ಸಮಗ್ರ ಜ್ಞಾನ ಆಧಾರವನ್ನು ರಚಿಸಲು ನಾವು ಮೂರು ರೀತಿಯ ಡೇಟಾವನ್ನು ಸಂಗ್ರಹಿಸುತ್ತೇವೆ:\n", + "\n", + "1. **ಡೆವಲಪರ್ ಪ್ರೊಫೈಲ್**: ವೈಯಕ್ತಿಕ ಪರಿಣತಿ ಮತ್ತು ತಾಂತ್ರಿಕ ಹಿನ್ನೆಲೆ\n", + "2. **ಪೈಥಾನ್ ಉತ್ತಮ ಅಭ್ಯಾಸಗಳು**: ಪೈಥಾನ್‌ನ ಝೆನ್ ಮತ್ತು ಪ್ರಾಯೋಗಿಕ ಮಾರ್ಗಸೂಚಿಗಳು\n", + "3. **ಐತಿಹಾಸಿಕ ಸಂಭಾಷಣೆಗಳು**: ಡೆವಲಪರ್‌ಗಳು ಮತ್ತು AI ಸಹಾಯಕರ ನಡುವಿನ ಹಳೆಯ ಪ್ರಶ್ನೋತ್ತರ ಸೆಷನ್‌ಗಳು\n", + "\n", + "ಈ ವೈವಿಧ್ಯಮಯ ಡೇಟಾ ನಮ್ಮ ಏಜೆಂಟ್‌ಗೆ ಕೆಳಗಿನವುಗಳನ್ನು ಮಾಡಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ:\n", + "- ಬಳಕೆದಾರರ ತಾಂತ್ರಿಕ ಹಿನ್ನೆಲೆಯನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವುದು\n", + "- ಶಿಫಾರಸುಗಳಲ್ಲಿ ಉತ್ತಮ ಅಭ್ಯಾಸಗಳನ್ನು ಅನ್ವಯಿಸುವುದು\n", + "- ಹಿಂದಿನ ಯಶಸ್ವಿ ಸಂವಹನಗಳಿಂದ ಕಲಿಯುವುದು\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 ಡೇಟಾವನ್ನು ಜ್ಞಾನ ಗ್ರಾಫ್‌ಗೆ ಪರಿವರ್ತನೆ ಮಾಡುವುದು\n", + "\n", + "ಈಗ ನಾವು ನಮ್ಮ ಕಚ್ಚಾ ಪಠ್ಯವನ್ನು ರಚಿತ ಸ್ಮೃತಿಯಾಗಿ ಪರಿವರ್ತಿಸುತ್ತೇವೆ. ಈ ಪ್ರಕ್ರಿಯೆ:\n", + "\n", + "1. **NodeSets ಗೆ ಡೇಟಾವನ್ನು ಸೇರಿಸುತ್ತದೆ**: ಮಾಹಿತಿಯನ್ನು ತಾರ್ಕಿಕ ವರ್ಗಗಳಲ್ಲಿ ಸಂಘಟಿಸುತ್ತದೆ\n", + " - `developer_data`: ಡೆವಲಪರ್ ಪ್ರೊಫೈಲ್ ಮತ್ತು ಸಂಭಾಷಣೆಗಳು\n", + " - `principles_data`: ಪೈಥಾನ್ ಉತ್ತಮ ಅಭ್ಯಾಸಗಳು ಮತ್ತು ಮಾರ್ಗಸೂಚಿಗಳು\n", + "\n", + "2. **Cognify Pipeline ಅನ್ನು ಚಲಾಯಿಸುತ್ತದೆ**: ಘಟಕಗಳು, ಸಂಬಂಧಗಳು ಮತ್ತು ಎಂಬೆಡಿಂಗ್‌ಗಳನ್ನು ರಚಿಸುತ್ತದೆ\n", + " - ಪ್ರಮುಖ ಪರಿಕಲ್ಪನೆಗಳನ್ನು ಗುರುತಿಸುತ್ತದೆ\n", + " - ಸಂಬಂಧಿತ ಮಾಹಿತಿಯ ನಡುವೆ ಅರ್ಥಪೂರ್ಣ ಸಂಪರ್ಕಗಳನ್ನು ರಚಿಸುತ್ತದೆ\n", + " - ವೆಕ್ಟರ್ ಎಂಬೆಡಿಂಗ್‌ಗಳನ್ನು ರಚಿಸುತ್ತದೆ\n", + "\n", + "ಈ ಪ್ರಕ್ರಿಯೆ ಕೆಲವು ಕ್ಷಣಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು ಏಕೆಂದರೆ LLM ಪಠ್ಯವನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಿ ಗ್ರಾಫ್ ರಚನೆಯನ್ನು ನಿರ್ಮಿಸುತ್ತದೆ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 ಜ್ಞಾನ ಗ್ರಾಫ್ ಅನ್ನು ದೃಶ್ಯೀಕರಿಸಿ\n", + "\n", + "ನಮ್ಮ ಜ್ಞಾನ ಗ್ರಾಫ್‌ನ ರಚನೆಯನ್ನು ಅನ್ವೇಷಿಸೋಣ. ದೃಶ್ಯೀಕರಣವು ತೋರಿಸುತ್ತದೆ:\n", + "- **ನೋಡ್ಸ್**: ಪಠ್ಯದಿಂದ ಹೊರತೆಗೆಯಲಾದ ಘಟಕಗಳು (ಕಾನ್ಸೆಪ್ಟ್‌ಗಳು, ತಂತ್ರಜ್ಞಾನಗಳು, ವ್ಯಕ್ತಿಗಳು)\n", + "- **ಎಡ್ಜಸ್**: ಘಟಕಗಳ ನಡುವಿನ ಸಂಬಂಧಗಳು ಮತ್ತು ಸಂಪರ್ಕಗಳು\n", + "- **ಕ್ಲಸ್ಟರ್ಸ್**: ಅರ್ಥಪೂರ್ಣ ಸಾದೃಶ್ಯದಿಂದ ಗುಂಪುಗೊಂಡ ಸಂಬಂಧಿತ ಕಾನ್ಸೆಪ್ಟ್‌ಗಳು\n", + "\n", + "ಗ್ರಾಫ್ ಅನ್ನು ಸಂವಹನಾತ್ಮಕವಾಗಿ ಅನ್ವೇಷಿಸಲು ನಿಮ್ಮ ಬ್ರೌಸರ್‌ನಲ್ಲಿ ರಚಿಸಲಾದ HTML ಫೈಲ್ ಅನ್ನು ತೆರೆಯಿರಿ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 ಮೆಮೊರಿ ಹೆಚ್ಚಿಸಲು ಮೆಮಿಫೈ\n", + "\n", + "`memify()` ಫಂಕ್ಷನ್ ಜ್ಞಾನ ಗ್ರಾಫ್ ಅನ್ನು ವಿಶ್ಲೇಷಿಸಿ, ಡೇಟಾದ ಬಗ್ಗೆ ಬುದ್ಧಿವಂತ ನಿಯಮಗಳನ್ನು ರಚಿಸುತ್ತದೆ. ಈ ಪ್ರಕ್ರಿಯೆ:\n", + "- ಮಾದರಿಗಳು ಮತ್ತು ಉತ್ತಮ ಅಭ್ಯಾಸಗಳನ್ನು ಗುರುತಿಸುತ್ತದೆ\n", + "- ವಿಷಯದ ಆಧಾರದ ಮೇಲೆ ಕಾರ್ಯಗತ ಮಾರ್ಗಸೂಚಿಗಳನ್ನು ರಚಿಸುತ್ತದೆ\n", + "- ವಿಭಿನ್ನ ಜ್ಞಾನ ಕ್ಷೇತ್ರಗಳ ನಡುವೆ ಸಂಬಂಧಗಳನ್ನು ಸ್ಥಾಪಿಸುತ್ತದೆ\n", + "\n", + "ಈ ನಿಯಮಗಳು ಏಜೆಂಟ್‌ಗೆ ಪ್ರಶ್ನೆಗಳಿಗೆ ಉತ್ತರಿಸುವಾಗ ಹೆಚ್ಚು ಮಾಹಿತಿ ಹೊಂದಿದ ನಿರ್ಧಾರಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಲು ಸಹಾಯ ಮಾಡುತ್ತವೆ. ಎರಡನೇ ದೃಶ್ಯೀಕರಣವನ್ನು ಸೆರೆಹಿಡಿಯುವುದರಿಂದ ಗ್ರಾಫ್ ಸಮೃದ್ಧವಾದ ನಂತರ ಅದು ಹೇಗೆ ಗಟ್ಟಿಯಾಗುತ್ತದೆ ಎಂಬುದನ್ನು ಹೋಲಿಸಲು ನಿಮಗೆ ಸಹಾಯವಾಗುತ್ತದೆ.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 ಭಾಗ 2: ಬುದ್ಧಿವಂತ ಮೆಮೊರಿ ಹಿಂಪಡೆಯುವುದು\n", + "\n", + "### ಪ್ರಾತ್ಯಕ್ಷಿಕೆ 1: ಡಾಕ್ಯುಮೆಂಟ್ ಅಂತರದ ಜ್ಞಾನ ಸಮಗ್ರೀಕರಣ\n", + "\n", + "ಈಗ ನಮ್ಮ ಜ್ಞಾನ ಗ್ರಾಫ್ ನಿರ್ಮಾಣವಾಗಿದೆ, Cognee ಹೇಗೆ ಹಲವಾರು ಮೂಲಗಳಿಂದ ಮಾಹಿತಿಯನ್ನು ಸಂಯೋಜಿಸಿ ಸಂಕೀರ್ಣ ಪ್ರಶ್ನೆಗಳಿಗೆ ಉತ್ತರಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಪರೀಕ್ಷಿಸೋಣ.\n", + "\n", + "ಮೊದಲ ಪ್ರಶ್ನೆ ಈ ವಿಷಯಗಳನ್ನು ತೋರಿಸುತ್ತದೆ:\n", + "- **ಅರ್ಥಪೂರ್ಣ ಗ್ರಹಿಕೆ**: ಸ್ಪಷ್ಟವಾಗಿ ಉಲ್ಲೇಖಿಸದಿದ್ದರೂ ಸಂಬಂಧಿತ ಕಲ್ಪನೆಗಳನ್ನು ಹುಡುಕುವುದು\n", + "- **ಅಂತರಸಂಬಂಧ**: ಡೆವಲಪರ್ ಪ್ರೊಫೈಲ್ ಅನ್ನು Python ತತ್ವಗಳೊಂದಿಗೆ ಸಂಯೋಜಿಸುವುದು\n", + "- **ಸಂದರ್ಭಾತ್ಮಕ ತರ್ಕ**: ನಿರ್ದಿಷ್ಟ ಅನುಷ್ಠಾನಗಳಿಗೆ ಉತ್ತಮ ಅಭ್ಯಾಸಗಳನ್ನು ಅನ್ವಯಿಸುವುದು\n", + "\n", + "### ಪ್ರಾತ್ಯಕ್ಷಿಕೆ 2: NodeSets ಬಳಸಿ ಶೋಧವನ್ನು ಶ್ರೇಣೀಕರಿಸುವುದು\n", + "\n", + "ಎರಡನೇ ಪ್ರಶ್ನೆ ಜ್ಞಾನ ಗ್ರಾಫ್‌ನ ನಿರ್ದಿಷ್ಟ ಉಪಸಮೂಹಗಳನ್ನು ಗುರಿಯಾಗಿಸುವುದನ್ನು ತೋರಿಸುತ್ತದೆ:\n", + "- `node_name` ಪ್ಯಾರಾಮೀಟರ್ ಅನ್ನು ಬಳಸಿಕೊಂಡು `principles_data` ಒಳಗೇ ಶೋಧಿಸುತ್ತದೆ\n", + "- ನಿರ್ದಿಷ್ಟ ಜ್ಞಾನ ಕ್ಷೇತ್ರದಿಂದ ಕೇಂದ್ರೀಕೃತ ಉತ್ತರಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ\n", + "- ನಿಮಗೆ ಕ್ಷೇತ್ರ-ನಿರ್ದಿಷ್ಟ ಮಾಹಿತಿಯ ಅಗತ್ಯವಿದ್ದಾಗ ಉಪಯುಕ್ತವಾಗಿದೆ\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 ಭಾಗ 3: ಸೆಷನ್ ನಿರ್ವಹಣೆ ಸೆಟಪ್\n", + "\n", + "### ಸಂಭಾಷಣಾ ಮೆಮೊರಿ ಸಕ್ರಿಯಗೊಳಿಸುವುದು\n", + "\n", + "ಸೆಷನ್ ನಿರ್ವಹಣೆ ಹಲವು ಸಂವಹನಗಳಲ್ಲಿ ಸಂದರ್ಭವನ್ನು ಕಾಪಾಡಿಕೊಳ್ಳಲು ಅತ್ಯಂತ ಮುಖ್ಯವಾಗಿದೆ. ಇಲ್ಲಿ ನಾವು ಮಾಡಬೇಕಾದವು:\n", + "\n", + "1. **ಬಳಕೆದಾರರ ಸಂದರ್ಭವನ್ನು ಪ್ರಾರಂಭಿಸಿ**: ಸೆಷನ್ ಟ್ರ್ಯಾಕಿಂಗ್‌ಗಾಗಿ ಬಳಕೆದಾರರ ಪ್ರೊಫೈಲ್ ಅನ್ನು ರಚಿಸಿ ಅಥವಾ ಹಿಂಪಡೆಯಿರಿ\n", + "2. **ಕ್ಯಾಶ್ ಎಂಜಿನ್ ಅನ್ನು ಸಂರಚಿಸಿ**: ಸಂಭಾಷಣಾ ಇತಿಹಾಸವನ್ನು ಸಂಗ್ರಹಿಸಲು Redis ಗೆ ಸಂಪರ್ಕಿಸಿ\n", + "3. **ಸೆಷನ್ ವ್ಯಾರಿಯಬಲ್ಸ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ**: ಪ್ರಶ್ನೆಗಳಿಗೆ ನಡುವೆ ನಿರಂತರವಾಗಿರುವ ಸಂದರ್ಭ ವ್ಯಾರಿಯಬಲ್ಸ್ ಅನ್ನು ಸೆಟಪ್ ಮಾಡಿ\n", + "\n", + "> ⚠️ **ಮುಖ್ಯ**: ಇದಕ್ಕಾಗಿ Redis ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿರಬೇಕು ಮತ್ತು ನಿಮ್ಮ ಪರಿಸರದಲ್ಲಿ `CACHING=true` ಇರಬೇಕು\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ ಸಹಾಯಕ ಕಾರ್ಯ: ಸೆಷನ್ ಇತಿಹಾಸ ವೀಕ್ಷಣೆ\n", + "\n", + "ಈ ಉಪಯುಕ್ತ ಕಾರ್ಯವು Redis ನಲ್ಲಿ ಸಂಗ್ರಹಿತ ಸಂಭಾಷಣಾ ಇತಿಹಾಸವನ್ನು ಪರಿಶೀಲಿಸಲು ನಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಇದು ಉಪಯೋಗಕರಿಗೆ ಸಹಾಯಕವಾಗಿದೆ:\n", + "- ಸೆಷನ್ ನಿರ್ವಹಣೆಯನ್ನು ಡಿಬಗ್ ಮಾಡಲು\n", + "- ಸಂಭಾಷಣೆಗಳನ್ನು ಕ್ಯಾಶ್ ಮಾಡಲಾಗುತ್ತಿದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಲು\n", + "- ಏನು ಸಂದರ್ಭವನ್ನು ಏಜೆಂಟ್‌ಗೆ ಲಭ್ಯವಿದೆ ಎಂಬುದನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## ಸೆಷನ್ 1: ಅಸಿಂಕ್ ಬೆಂಬಲ ಪ್ರಯೋಗಾಲಯ — ಮೊದಲ ಪ್ರಶ್ನೆ\n", + "\n", + "`async-support-lab` ಸೆಷನ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಿ, ದೊಡ್ಡ ವೆಬ್ ಸ್ಕ್ರೇಪರ್‌ಗಾಗಿ ಟೆಲಿಮೆಟ್ರಿ-ಸ್ನೇಹಿ asyncio ಮಾದರಿಗಳನ್ನು ಕೇಳಿ. ಗ್ರಾಫ್ ಈಗಾಗಲೇ asyncio, aiohttp, ಮತ್ತು ಮಾನಿಟರಿಂಗ್ ಅಭ್ಯಾಸಗಳ ಬಗ್ಗೆ ತಿಳಿದಿದೆ, ಆದ್ದರಿಂದ ಪ್ರತಿಕ್ರಿಯೆ ಹಿಂದಿನ ಸಂಭಾಷಣೆಯನ್ನು ಪ್ರತಿಬಿಂಬಿಸಬೇಕು ಮತ್ತು ಹೊಸ ಪ್ರಶ್ನೆಗೆ ಉತ್ತರವನ್ನು ಹೊಂದಿಸಬೇಕು.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## ಮೊದಲ ವಿನಿಮಯದ ನಂತರ ಸೆಷನ್ 1 ಮೆಮೊರಿಯನ್ನು ಪರಿಶೀಲಿಸಿ\n", + "\n", + "ಪ್ರಾರಂಭಿಕ ಪ್ರಶ್ನೆಯ ನಂತರ ತಕ್ಷಣವೇ `show_history(session_1)` ಅನ್ನು ಚಲಾಯಿಸುವುದು, ಪ್ರಾಂಪ್ಟ್ ಮತ್ತು ಪೂರ್ಣಗತಿಯನ್ನು Redis ಗೆ Cognee ಬರೆದಿರುವುದನ್ನು ದೃಢೀಕರಿಸುತ್ತದೆ. ನೀವು ಸಮಕಾಲಿಕ ಮಾರ್ಗದರ್ಶನದೊಂದಿಗೆ ಒಂದು ಎಂಟ್ರಿಯನ್ನು ನೋಡಬಹುದು.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## ಸೆಷನ್ 1: ಡೇಟಾ ಮಾದರಿಗಳ ಮೇಲಿನ ಅನುಸರಣೆ\n", + "\n", + "ಮುಂದೆ ನಾವು ಕೇಳುತ್ತೇವೆ, \"ನಾನು ಯಾವಾಗ dataclasses ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಬೇಕು ಮತ್ತು ಯಾವಾಗ Pydantic ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಬೇಕು?\" ಅದೇ ಸೆಷನ್ ಐಡಿಯನ್ನು ಬಳಸಿಕೊಂಡು. Cognee Python ತತ್ವಗಳು ಮತ್ತು ಹಿಂದಿನ FastAPI ಚರ್ಚೆಗಳನ್ನು ಒಟ್ಟುಗೂಡಿಸಿ ಸೂಕ್ಷ್ಮ ಸಲಹೆ ನೀಡಬೇಕು—ನಾಮೀಕೃತ ಸೆಷನ್‌ನಲ್ಲಿ ಸಂದರ್ಭವನ್ನು ಮುಂದುವರಿಸಬಹುದೆಂಬುದನ್ನು ತೋರಿಸುತ್ತದೆ.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## ಸೆಷನ್ 1 ಇತಿಹಾಸದಲ್ಲಿ ಎರಡೂ ತಿರುವುಗಳು ಇರುವುದನ್ನು ದೃಢೀಕರಿಸಿ\n", + "\n", + "ಮತ್ತೊಂದು `show_history(session_1)` ಕರೆ ಎರಡು ಪ್ರಶ್ನೆ-ಉತ್ತರಗಳ ದಾಖಲೆಗಳನ್ನು ತೋರಿಸಬೇಕು. ಇದು Mem0 ಪ್ರಯೋಗಾಲಯದ \"ಮೆಮೊರಿ ರಿಪ್ಲೇ\" ಹಂತಕ್ಕೆ ಹೊಂದುತ್ತದೆ ಮತ್ತು ಹೆಚ್ಚುವರಿ ತಿರುವುಗಳು ಅದೇ ಸಂವಾದವನ್ನು ವಿಸ್ತರಿಸುತ್ತವೆ ಎಂಬುದನ್ನು ಸಾಬೀತುಪಡಿಸುತ್ತದೆ.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## ಸೆಷನ್ 2: ವಿನ್ಯಾಸ ಪರಿಶೀಲನೆ ಥ್ರೆಡ್ — ಹೊಸ ಸೆಷನ್\n", + "\n", + "ಥ್ರೆಡ್‌ಗಳ ನಡುವೆ ಪ್ರತ್ಯೇಕತೆಯನ್ನು ತೋರಿಸಲು ನಾವು `design-review-session` ಅನ್ನು ಪ್ರಾರಂಭಿಸುತ್ತೇವೆ ಮತ್ತು ಘಟನೆಗಳ ಪರಿಶೀಲನೆಗಾಗಿ ಲಾಗಿಂಗ್ ಮಾರ್ಗದರ್ಶನವನ್ನು ಕೇಳುತ್ತೇವೆ. ಆಧಾರಭೂತ ಜ್ಞಾನಕೋಶವು ಒಂದೇ ಆಗಿದ್ದರೂ, ಹೊಸ ಸೆಷನ್ ಐಡಿಯು ಲಿಪಿಗಳನ್ನು ಪ್ರತ್ಯೇಕವಾಗಿ ಇಡುತ್ತದೆ.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## ಸೆಷನ್ 2 ಇತಿಹಾಸ ಪರಿಶೀಲನೆ\n", + "\n", + "`show_history(session_2)` ಕೇವಲ ವಿನ್ಯಾಸ-ಪರಿಶೀಲನೆ ಪ್ರಾಂಪ್ಟ್/ಪ್ರತಿಕ್ರಿಯಾ ಜೋಡಿಯನ್ನು ಮಾತ್ರ ಪಟ್ಟಿ ಮಾಡಬೇಕು. ಸೆಷನ್ 1 ಜೊತೆ ಹೋಲಿಸಿ, Cognee ಹೇಗೆ ಸ್ವತಂತ್ರ ಲಿಪಿಗಳನ್ನು ಉಳಿಸುತ್ತದೆ ಮತ್ತು ಹಂಚಿದ ಜ್ಞಾನ ಗ್ರಾಫ್ ಅನ್ನು ಪುನಃ ಬಳಸುತ್ತದೆ ಎಂಬುದನ್ನು ಹೈಲೈಟ್ ಮಾಡಿ.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## ಸಾರಾಂಶ\n", + "\n", + "ಅಭಿನಂದನೆಗಳು! ನೀವು ನಿಮ್ಮ ಕೋಡಿಂಗ್ ಸಹಾಯಕರಿಗೆ Cognee ಮೂಲಕ ಶಕ್ತಿಯುತವಾದ ನಿಜವಾದ ದೀರ್ಘಕಾಲದ ಮೆಮೊರಿ ಲೇಯರ್ ಅನ್ನು ನೀಡಿದ್ದೀರಿ.\n", + "\n", + "ಈ ಟ್ಯುಟೋರಿಯಲ್‌ನಲ್ಲಿ ನೀವು ಮೂಲ ಡೆವಲಪರ್ ವಿಷಯವನ್ನು (ಕೋಡ್, ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳು, ಚಾಟ್‌ಗಳು) ತೆಗೆದುಕೊಂಡು, ಅದನ್ನು ಗ್ರಾಫ್ + ವೆಕ್ಟರ್ ಮೆಮೊರಿಯಾಗಿ ಪರಿವರ್ತನೆ ಮಾಡಿದ್ದೀರಿ, ಇದನ್ನು ನಿಮ್ಮ ಏಜೆಂಟ್ ಹುಡುಕಲು, ತರ್ಕಿಸಲು ಮತ್ತು ನಿರಂತರವಾಗಿ ಸುಧಾರಿಸಲು ಬಳಸಬಹುದು.\n", + "\n", + "ನೀವು ಕಲಿತದ್ದೇನು\n", + "\n", + "1. **ಮೂಲ ಪಠ್ಯದಿಂದ AI ಮೆಮೊರಿಯವರೆಗೆ**: Cognee ಹೇಗೆ ಅಸಂರಚಿತ ಡೇಟಾವನ್ನು ಗ್ರಹಿಸುತ್ತದೆ ಮತ್ತು ಅದನ್ನು ಬುದ್ಧಿವಂತ, ಹುಡುಕಬಹುದಾದ ಮೆಮೊರಿಯಾಗಿ ಪರಿವರ್ತಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ವೆಕ್ಟರ್ + ನಾಲೆಜ್ ಗ್ರಾಫ್ ಆರ್ಕಿಟೆಕ್ಚರ್ ಬಳಸಿ.\n", + "\n", + "2. **ಮೆಮಿಫೈ ಮೂಲಕ ಗ್ರಾಫ್ ಸಮೃದ್ಧೀಕರಣ**: ಮೂಲ ಗ್ರಾಫ್ ರಚನೆಯ ಪಾರಮ್ಯವನ್ನು ಮೀರಿ, ಮೆಮಿಫೈ ಬಳಸಿ ನಿಮ್ಮ ಹಾಲಿ ಗ್ರಾಫ್ ಮೇಲೆ ಉತ್ಪನ್ನವಾದ ತಥ್ಯಗಳು ಮತ್ತು ಸಮೃದ್ಧ ಸಂಬಂಧಗಳನ್ನು ಸೇರಿಸುವ ವಿಧಾನ.\n", + "\n", + "3. **ಬಹು ಹುಡುಕಾಟ ತಂತ್ರಗಳು**: ನಿಮ್ಮ ಏಜೆಂಟ್‌ಗೆ ಅಗತ್ಯವಿರುವುದನ್ನು ಅವಲಂಬಿಸಿ, ವಿವಿಧ ಹುಡುಕಾಟ ಪ್ರಕಾರಗಳೊಂದಿಗೆ (ಗ್ರಾಫ್-ಅವೇರ್ Q&A, RAG-ಶೈಲಿ ಪೂರ್ಣಗೊಳಿಸುವಿಕೆ, ಅಂತರದೃಷ್ಟಿಗಳು, ಮೂಲ ತುಣುಕುಗಳು, ಕೋಡ್ ಹುಡುಕಾಟ, ಇತ್ಯಾದಿ) ಮೆಮೊರಿಯನ್ನು ಹೇಗೆ ಪ್ರಶ್ನಿಸಬೇಕು ಎಂಬುದು.\n", + "\n", + "4. **ದೃಶ್ಯ ಅನ್ವೇಷಣೆ**: ಗ್ರಾಫ್ ದೃಶ್ಯೀಕರಣಗಳು ಮತ್ತು Cognee UI ಬಳಸಿ Cognee ನಿರ್ಮಿಸಿದುದನ್ನು ಪರಿಶೀಲಿಸಲು ಮತ್ತು ಡೀಬಗ್ ಮಾಡಲು, ಜ್ಞಾನವನ್ನು ಹೇಗೆ ರಚಿಸಲಾಗಿದೆ ಎಂಬುದನ್ನು ನಿಜವಾಗಿಯೂ ನೋಡಲು ಹೇಗೆ.\n", + "\n", + "5. **ಸೆಷನ್-ಅವೇರ್ ಮೆಮೊರಿ**: ಪ್ರತಿ ಸೆಷನ್‌ನ ಸಂದರ್ಭವನ್ನು ಸ್ಥಿರ ಅರ್ಥಪೂರ್ಣ ಮೆಮೊರಿಯೊಂದಿಗೆ ಸಂಯೋಜಿಸುವ ಮೂಲಕ, ಏಜೆಂಟ್‌ಗಳು ಬಳಕೆದಾರರ ನಡುವೆ ಮಾಹಿತಿಯನ್ನು ಲೀಕ್ ಮಾಡದೆ, ರನ್‌ಗಳಾದ್ಯಂತ ನೆನಪಿಡಲು ಹೇಗೆ ಸಾಧ್ಯ.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## ಮುಖ್ಯ ಅಂಶಗಳು\n", + "1. ಎಂಬೆಡಿಂಗ್‌ಗಳ ಮೂಲಕ ಬೆಂಬಲಿತ ಜ್ಞಾನ ಗ್ರಾಫ್‌ ಆಗಿರುವ ಮೆಮೊರಿ\n", + "\n", + " - **ಸಂರಚಿತ ಅರ್ಥಮಾಡಿಕೆ**: Cognee ಒಂದು ವೆಕ್ಟರ್ ಸ್ಟೋರ್ ಮತ್ತು ಗ್ರಾಫ್ ಸ್ಟೋರ್ ಅನ್ನು ಸಂಯೋಜಿಸುತ್ತದೆ, ಆದ್ದರಿಂದ ನಿಮ್ಮ ಡೇಟಾ ಅರ್ಥದ ಮೂಲಕ ಹುಡುಕಬಹುದಾದ ಮತ್ತು ಸಂಬಂಧಗಳಿಂದ ಸಂಪರ್ಕಿತವಾಗಿರುತ್ತದೆ. Cognee ಡೀಫಾಲ್ಟ್ ಆಗಿ ಫೈಲ್ ಆಧಾರಿತ ಡೇಟಾಬೇಸ್‌ಗಳನ್ನು ಬಳಸುತ್ತದೆ (ವೆಕ್ಟರ್‌ಗಾಗಿ LanceDB, ಗ್ರಾಫ್ ಡೇಟಾಬೇಸ್‌ಗಾಗಿ Kuzu).\n", + "\n", + " - **ಸಂಬಂಧ-ಜಾಗೃತ ಹುಡುಕಾಟ**: ಉತ್ತರಗಳು ಕೇವಲ \"ಹೋಲುವ ಪಠ್ಯ\"ದಲ್ಲಿ ಮಾತ್ರವಲ್ಲ, ಎಂಟಿಟಿಗಳು ಹೇಗೆ ಸಂಬಂಧಿತವಾಗಿವೆ ಎಂಬುದರ ಆಧಾರದ ಮೇಲೂ ಆಧಾರಿತವಾಗಿರಬಹುದು.\n", + "\n", + " - **ಜೀವಂತ ಮೆಮೊರಿ**: ಮೆಮೊರಿ ಲೇಯರ್ ಅಭಿವೃದ್ಧಿಯಾಗುತ್ತದೆ, ವೃದ್ಧಿಯಾಗುತ್ತದೆ, ಮತ್ತು ಒಂದು ಸಂಪರ್ಕಿತ ಗ್ರಾಫ್ ಆಗಿ ಪ್ರಶ್ನಿಸಬಹುದಾಗಿದೆ.\n", + "\n", + "2. ಹುಡುಕಾಟ ಮತ್ತು ತಾರ್ಕಿಕ ಮೋಡ್‌ಗಳು\n", + " - **ಹೈಬ್ರಿಡ್ ರಿಟ್ರೀವಲ್**: ಹುಡುಕಾಟವು ವೆಕ್ಟರ್ ಹೋಲಿಕೆ, ಗ್ರಾಫ್ ರಚನೆ, ಮತ್ತು LLM ತಾರ್ಕಿಕತೆಯನ್ನು ಮಿಶ್ರಣ ಮಾಡುತ್ತದೆ, ಕಚ್ಚಾ ಚಂಕ್ ಹುಡುಕಾಟದಿಂದ ಗ್ರಾಫ್-ಜಾಗೃತ ಪ್ರಶ್ನೋತ್ತರದವರೆಗೆ.\n", + "\n", + " - **ಕೆಲಸಕ್ಕೆ ತಕ್ಕ ಮೋಡ್ ಆಯ್ಕೆಮಾಡಿ**: ನೈಸರ್ಗಿಕ ಭಾಷೆಯ ಉತ್ತರಗಳನ್ನು ಬಯಸಿದಾಗ completion-ಶೈಲಿಯ ಮೋಡ್‌ಗಳನ್ನು ಬಳಸಿ, ಮತ್ತು ನಿಮ್ಮ ಏಜೆಂಟ್‌ಗೆ ಕಚ್ಚಾ ಸಂದರ್ಭ ಅಥವಾ ತನ್ನದೇ ಆದ ತಾರ್ಕಿಕತೆಯನ್ನು ಚಲಾಯಿಸಲು ಚಂಕ್/ಸಾರಾಂಶ/ಗ್ರಾಫ್ ಮೋಡ್‌ಗಳನ್ನು ಬಳಸಿ.\n", + "\n", + "3. ವೈಯಕ್ತಿಕ, ಸೆಷನ್-ಜಾಗೃತ ಏಜೆಂಟ್‌ಗಳು\n", + " - **ಸೆಷನ್ ಸಂದರ್ಭ + ದೀರ್ಘಕಾಲದ ಮೆಮೊರಿ**: Cognee ಚಿಕ್ಕ ಅವಧಿಯ \"ಥ್ರೆಡ್\" ಸಂದರ್ಭವನ್ನು ದೀರ್ಘಕಾಲದ, ಬಳಕೆದಾರ ಅಥವಾ ಸಂಸ್ಥಾ ಮಟ್ಟದ ಮೆಮೊರಿಯಿಂದ ಪ್ರತ್ಯೇಕವಾಗಿ ಇಡುತ್ತದೆ.\n", + "\n", + "## ನೈಜ ಜಗತ್ತಿನ ಅನ್ವಯಿಕೆಗಳು\n", + "\n", + "1. **ವೈಜ್ಞಾನಿಕ AI ಏಜೆಂಟ್‌ಗಳು**\n", + "\n", + " ಈ ನೋಟ್ಬುಕ್‌ನ ಮಾದರಿಯನ್ನು ಬಳಸಿಕೊಂಡು Cognee ಅನ್ನು ತಮ್ಮ ರಿಟ್ರೀವಲ್ ಮತ್ತು ತಾರ್ಕಿಕತೆಯ ಆಧಾರವಾಗಿ ಬಳಸುವ ಡೊಮೈನ್-ಸ್ಮಾರ್ಟ್ ಸಹಾಯಕರನ್ನು ಶಕ್ತಿಮಾಡಿ:\n", + "\n", + "- **ಡೆವಲಪರ್ ಸಹಾಯಕರು**: ಕೋಡ್ ವಿಮರ್ಶೆ, ಘಟನೆ ವಿಶ್ಲೇಷಣೆ, ಮತ್ತು ಆರ್ಕಿಟೆಕ್ಚರ್ ಸಹಾಯಕರಾಗಿ ಕೋಡ್, APIಗಳು, ವಿನ್ಯಾಸ ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳು, ಮತ್ತು ಟಿಕೆಟ್‌ಗಳನ್ನು ಒಂದೇ ಮೆಮೊರಿ ಗ್ರಾಫ್‌ ಆಗಿ ಸಂಚರಿಸುತ್ತವೆ.\n", + "\n", + "- **ಗ್ರಾಹಕ-ಮುಖದ ಸಹಾಯಕರು**: ಉತ್ಪನ್ನ ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳು, FAQಗಳು, CRM ಟಿಪ್ಪಣಿಗಳು, ಮತ್ತು ಹಳೆಯ ಟಿಕೆಟ್‌ಗಳಿಂದ ಗ್ರಾಫ್-ಜಾಗೃತ ರಿಟ್ರೀವಲ್ ಮತ್ತು ಉಲ್ಲೇಖಿತ ಉತ್ತರಗಳನ್ನು ಪಡೆಯುವ ಬೆಂಬಲ ಅಥವಾ ಯಶಸ್ಸು ಏಜೆಂಟ್‌ಗಳು.\n", + "\n", + "- **ಆಂತರಿಕ ತಜ್ಞ ಸಹಾಯಕರು**: ನೀತಿ, ಕಾನೂನು, ಅಥವಾ ಭದ್ರತಾ ಸಹಾಯಕರು ಪ್ರತ್ಯೇಕ PDF‌ಗಳ ಬದಲು ಪರಸ್ಪರ ಸಂಪರ್ಕಿತ ನಿಯಮಗಳು, ಮಾರ್ಗಸೂಚಿಗಳು, ಮತ್ತು ಐತಿಹಾಸಿಕ ನಿರ್ಧಾರಗಳ ಮೇಲೆ ತಾರ್ಕಿಕತೆಯನ್ನು ನಡೆಸುತ್ತಾರೆ.\n", + "\n", + " Cognee ಅನ್ನು AI ಏಜೆಂಟ್‌ಗಳಿಗೆ ಶಾಶ್ವತ, ನಿಖರವಾದ ಮೆಮೊರಿಯಾಗಿ ಸ್ಪಷ್ಟವಾಗಿ ಸ್ಥಾಪಿಸಲಾಗಿದೆ, ಇದು ನಿಮ್ಮ ಏಜೆಂಟ್‌ ಹಿಂದೆ ಒಂದು ಜೀವಂತ ಜ್ಞಾನ ಗ್ರಾಫ್ ಅನ್ನು ಒದಗಿಸುತ್ತದೆ ಮತ್ತು ವೆಕ್ಟರ್ ಸ್ಟೋರ್‌ಗಳ ಮತ್ತು ಕಸ್ಟಮ್ ಗ್ರಾಫ್ ಕೋಡ್‌ಗಳ ಅಡ್ಹಾಕ್ ಸಂಯೋಜನೆಗಳನ್ನು ಬದಲಿಸುತ್ತದೆ.\n", + "\n", + "2. **ಒಂದು ಮೆಮೊರಿಯಲ್ಲಿಗೆ ಡೇಟಾ ಸೈಲೋಗಳನ್ನು ಏಕೀಕರಿಸುವುದು**\n", + "\n", + " ಇದೇ ವಿಧಾನವು ವಿಭಜಿತ ಮೂಲಗಳಿಂದ ಏಕೀಕೃತ ಮೆಮೊರಿ ಲೇಯರ್ ಅನ್ನು ನಿರ್ಮಿಸಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ:\n", + "\n", + "- **ಸೈಲೋಗಳಿಂದ ಒಂದು ಗ್ರಾಫ್‌ಗೆ**: ರಚಿತ (ಉದಾ., ಡೇಟಾಬೇಸ್‌ಗಳು) ಮತ್ತು ಅರಚಿತ ಡೇಟಾವನ್ನು (ಉದಾ., ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳು, ಚಾಟ್‌ಗಳು) ಒಂದೇ ಗ್ರಾಫ್‌ಗೆ ಎಂಬೆಡಿಂಗ್‌ಗಳ ಮೂಲಕ ಇನ್‌ಜೆಸ್ಟ್ ಮಾಡಿ, ಪ್ರತಿ ವ್ಯವಸ್ಥೆಗೆ ಪ್ರತ್ಯೇಕ ಸೂಚ್ಯಂಕಗಳ ಬದಲು.\n", + "\n", + "- **ಉಲ್ಲೇಖಗಳೊಂದಿಗೆ ಕ್ರಾಸ್-ಮೂಲ ತಾರ್ಕಿಕತೆ**: ಎಲ್ಲದರ ಮೇಲೆ ಬಹುಹಂತದ ತಾರ್ಕಿಕತೆಯನ್ನು ಚಲಾಯಿಸಿ—ಗ್ರಾಫ್ ಮೂಲಕ \"ಜೋಡಿಸಿ\" ಲಾಗ್‌ಗಳು, ಮೆಟ್ರಿಕ್‌ಗಳು, ಮತ್ತು ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳನ್ನು—ಮತ್ತು ಪ್ರಾಮಾಣಿಕ ಉತ್ತರಗಳನ್ನು ಉಲ್ಲೇಖಗಳೊಂದಿಗೆ ಹಿಂತಿರುಗಿಸಿ.\n", + "\n", + "- **ಜ್ಞಾನ ಕೇಂದ್ರಗಳು**: ಬ್ಯಾಂಕಿಂಗ್ ಅಥವಾ ಶಿಕ್ಷಣದಂತಹ ಕ್ಷೇತ್ರಗಳಿಗೆ, Cognee ಅನ್ನು ಈಗಾಗಲೇ PDF‌ಗಳು, ಆಂತರಿಕ ವ್ಯವಸ್ಥೆಗಳು, ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ ಡೇಟಾವನ್ನು ಒಂದೇ ಜ್ಞಾನ ಗ್ರಾಫ್‌ನಲ್ಲಿ ಏಕೀಕರಿಸಲು ಬಳಸಲಾಗುತ್ತಿದೆ, ಇದರಿಂದ ಏಜೆಂಟ್‌ಗಳು ನಿಖರವಾದ, ಉಲ್ಲೇಖಿತ ಸಂದರ್ಭದೊಂದಿಗೆ ಪ್ರಶ್ನೆಗಳಿಗೆ ಉತ್ತರಿಸಬಹುದು.\n", + "\n", + "## ಮುಂದಿನ ಹಂತಗಳು\n", + "\n", + "ನೀವು ಮೆಮೊರಿ ಲೂಪ್‌ನ ಮೂಲ ಭಾಗವನ್ನು ಅನುಷ್ಠಾನಗೊಳಿಸಿದ್ದೀರಿ. ಇಲ್ಲಿವೆ ನೀವು ಸ್ವತಃ ಪ್ರಯತ್ನಿಸಬಹುದಾದ ನೈಸರ್ಗಿಕ ವಿಸ್ತರಣೆಗಳು (ವಿವರಗಳಿಗೆ [Cognee ಡಾಕ್ಯುಮೆಂಟೇಶನ್](https://docs.cognee.ai/) ನೋಡಿ):\n", + "\n", + "1. **ಕಾಲಾತೀತ ಜಾಗೃತತೆಯೊಂದಿಗೆ ಪ್ರಯೋಗಿಸಿ**: ಪಠ್ಯದಿಂದ ಘಟನೆಗಳು ಮತ್ತು ಟೈಮ್‌ಸ್ಟ್ಯಾಂಪ್‌ಗಳನ್ನು ಹೊರತೆಗೆಯಲು ಕಾಲಾತೀತ Cognify ಅನ್ನು ಆನ್ ಮಾಡಿ.\n", + "\n", + "2. **ಒಂಟಾಲಜಿ-ಚಾಲಿತ ತಾರ್ಕಿಕತೆಯನ್ನು ಪರಿಚಯಿಸಿ**: ನಿಮ್ಮ ಕ್ಷೇತ್ರಕ್ಕಾಗಿ ಒಂದು OWL ಒಂಟಾಲಜಿಯನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಿ. Cognee ನ ಒಂಟಾಲಜಿ ಬೆಂಬಲವನ್ನು ಬಳಸಿ, ಹೀಗಾಗಿ ಹೊರತೆಗೆಯಲಾದ ಎಂಟಿಟಿಗಳು ಮತ್ತು ಸಂಬಂಧಗಳು ಆ ಯೋಜನೆಯಲ್ಲಿ ಆಧಾರಿತವಾಗಿರುತ್ತವೆ, ಗ್ರಾಫ್ ಗುಣಮಟ್ಟ ಮತ್ತು ಕ್ಷೇತ್ರ-ನಿರ್ದಿಷ್ಟ ಉತ್ತರಗಳನ್ನು ಸುಧಾರಿಸುತ್ತದೆ.\n", + "\n", + "3. **ಪ್ರತಿಕ್ರಿಯಾ ಲೂಪ್ ಸೇರಿಸಿ**: ನಿಜವಾದ ಬಳಕೆದಾರ ಪ್ರತಿಕ್ರಿಯೆಯಿಂದ ಗ್ರಾಫ್ ಎಡ್ಜ್ ತೂಕಗಳನ್ನು Cognee ಹೊಂದಿಸಲು ಅನುಮತಿಸಿ, ಹೀಗಾಗಿ ರಿಟ್ರೀವಲ್ ಸಮಯದೊಂದಿಗೆ ಸುಧಾರಿಸುತ್ತದೆ, ಸ್ಥಿರವಾಗಿರುವ ಬದಲು.\n", + "\n", + "4. **ವೈಯಕ್ತಿಕೀಕರಣ ಮತ್ತು ಸೆಷನ್ ವರ್ತನೆಗೆ ಟ್ಯೂನ್ ಮಾಡಿ**: ಬಳಕೆದಾರ IDಗಳು, ಟೆನಂಟ್‌ಗಳು, ಮತ್ತು ಡೇಟಾಸೆಟ್‌ಗಳನ್ನು ಬಳಸಿ ಪ್ರತಿ ವ್ಯಕ್ತಿ ಅಥವಾ ತಂಡಕ್ಕೆ ಹಂಚಿದ ಮೆಮೊರಿ ಎಂಜಿನ್ ಮೇಲೆ ತಮ್ಮದೇ ಆದ ದೃಷ್ಟಿಕೋನವನ್ನು ನೀಡಿ.\n", + "\n", + "5. **ಹೆಚ್ಚು ಸಂಕೀರ್ಣ ಏಜೆಂಟ್‌ಗಳಿಗೆ ವಿಸ್ತರಿಸಿ**: Cognee ಅನ್ನು ಏಜೆಂಟ್ ಫ್ರೇಮ್‌ವರ್ಕ್‌ಗಳಿಗೆ ಪ್ಲಗ್ ಮಾಡಿ, ಹೀಗಾಗಿ ಎಲ್ಲಾ ಏಜೆಂಟ್‌ಗಳು ಒಂದೇ ಮೆಮೊರಿ ಲೇಯರ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳುವ ಬಹು-ಏಜೆಂಟ್ ವ್ಯವಸ್ಥೆಗಳನ್ನು ನಿರ್ಮಿಸಿ. *Microsoft Agent Framework x Cognee ಪ್ಲಗಿನ್ ಶೀಘ್ರದಲ್ಲೇ ಬರುತ್ತಿದೆ.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**ಅಸ್ವೀಕಾರ**: \nಈ ದಸ್ತಾವೇಜನ್ನು AI ಅನುವಾದ ಸೇವೆ [Co-op Translator](https://github.com/Azure/co-op-translator) ಬಳಸಿ ಅನುವಾದಿಸಲಾಗಿದೆ. ನಾವು ನಿಖರತೆಯನ್ನು ಸಾಧಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದರೂ, ದಯವಿಟ್ಟು ಗಮನಿಸಿ, ಸ್ವಯಂಚಾಲಿತ ಅನುವಾದಗಳಲ್ಲಿ ದೋಷಗಳು ಅಥವಾ ಅಸಡ್ಡೆಗಳು ಇರಬಹುದು. ಮೂಲ ಭಾಷೆಯಲ್ಲಿರುವ ಮೂಲ ದಸ್ತಾವೇಜು ಪ್ರಾಮಾಣಿಕ ಮೂಲವೆಂದು ಪರಿಗಣಿಸಬೇಕು. ಮಹತ್ವದ ಮಾಹಿತಿಗಾಗಿ, ವೃತ್ತಿಪರ ಮಾನವ ಅನುವಾದವನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗುತ್ತದೆ. ಈ ಅನುವಾದವನ್ನು ಬಳಸುವ ಮೂಲಕ ಉಂಟಾಗುವ ಯಾವುದೇ ತಪ್ಪು ಅರ್ಥಗಳ ಅಥವಾ ತಪ್ಪು ವ್ಯಾಖ್ಯಾನಗಳ ಬಗ್ಗೆ ನಾವು ಹೊಣೆಗಾರರಲ್ಲ.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T15:02:28+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "kn" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/kn/13-agent-memory/README.md b/translations/kn/13-agent-memory/README.md index 7380b30f3..e7140fc50 100644 --- a/translations/kn/13-agent-memory/README.md +++ b/translations/kn/13-agent-memory/README.md @@ -1,8 +1,8 @@ -**ಅಸ್ವೀಕಾರ**: -ಈ ದಾಖಲೆ AI ಅನುವಾದ ಸೇವೆ [Co-op Translator](https://github.com/Azure/co-op-translator) ಬಳಸಿ ಅನುವಾದಿಸಲಾಗಿದೆ. ನಾವು ನಿಖರತೆಯನ್ನು ಸಾಧಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದರೂ, ದಯವಿಟ್ಟು ಗಮನಿಸಿ, ಸ್ವಯಂಚಾಲಿತ ಅನುವಾದಗಳಲ್ಲಿ ದೋಷಗಳು ಅಥವಾ ಅಸಮರ್ಪಕತೆಗಳು ಇರಬಹುದು. ಮೂಲ ಭಾಷೆಯಲ್ಲಿರುವ ಮೂಲ ದಾಖಲೆ ಪ್ರಾಮಾಣಿಕ ಮೂಲವೆಂದು ಪರಿಗಣಿಸಬೇಕು. ಪ್ರಮುಖ ಮಾಹಿತಿಗಾಗಿ, ವೃತ್ತಿಪರ ಮಾನವ ಅನುವಾದವನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗುತ್ತದೆ. ಈ ಅನುವಾದದ ಬಳಕೆಯಿಂದ ಉಂಟಾಗುವ ಯಾವುದೇ ತಪ್ಪುಅರ್ಥಗಳು ಅಥವಾ ತಪ್ಪುಅರ್ಥೈಸುವಿಕೆಗೆ ನಾವು ಹೊಣೆಗಾರರಲ್ಲ. +**ಅಸಮಾಕ್ಷ್ಯತೆ**: +ಈ ದಸ್ತಾವೇಜು AI ಅನುವಾದ ಸೇವೆ [Co-op Translator](https://github.com/Azure/co-op-translator) ಬಳಸಿ ಅನುವಾದಿಸಲಾಗಿದೆ. ನಾವು ನಿಖರತೆಯನ್ನು ಸಾಧಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದರೂ, ದಯವಿಟ್ಟು ಗಮನಿಸಿ, ಸ್ವಯಂಚಾಲಿತ ಅನುವಾದಗಳಲ್ಲಿ ದೋಷಗಳು ಅಥವಾ ಅಸಮಾಕ್ಷ್ಯತೆಗಳು ಇರಬಹುದು. ಮೂಲ ಭಾಷೆಯಲ್ಲಿರುವ ಮೂಲ ದಸ್ತಾವೇಜು ಪ್ರಾಮಾಣಿಕ ಮೂಲವೆಂದು ಪರಿಗಣಿಸಬೇಕು. ಮಹತ್ವದ ಮಾಹಿತಿಗಾಗಿ, ವೃತ್ತಿಪರ ಮಾನವ ಅನುವಾದವನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗುತ್ತದೆ. ಈ ಅನುವಾದವನ್ನು ಬಳಸುವ ಮೂಲಕ ಉಂಟಾಗುವ ಯಾವುದೇ ತಪ್ಪು ಅರ್ಥಗಳ ಅಥವಾ ತಪ್ಪು ವ್ಯಾಖ್ಯಾನಗಳ ಬಗ್ಗೆ ನಾವು ಹೊಣೆಗಾರರಲ್ಲ. \ No newline at end of file diff --git a/translations/ko/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/ko/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..e6cfc084f --- /dev/null +++ b/translations/ko/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Cognee를 사용하여 지속적인 메모리를 가진 AI 에이전트 구축하기\n", + "\n", + "이 노트북은 [**cognee**](https://www.cognee.ai/)를 사용하여 지식 그래프, 의미 검색, 세션 관리를 결합해 컨텍스트를 인식하는 AI 시스템을 만드는 방법을 보여줍니다. Cognee는 오픈 소스 AI 메모리입니다.\n", + "\n", + "## 🎯 학습 목표\n", + "\n", + "이 튜토리얼을 마치면 다음을 이해할 수 있습니다:\n", + "- **임베딩 기반 지식 그래프 구축**: 비구조화된 텍스트를 구조화되고 쿼리가 가능한 지식으로 변환하기\n", + "- **세션 메모리 구현**: 자동으로 컨텍스트를 유지하는 다중 턴 대화 생성하기\n", + "- **대화 저장**: 중요한 상호작용을 장기 메모리에 선택적으로 저장하여 나중에 참조하기\n", + "- **자연어로 쿼리하기**: 새로운 대화에서 과거 컨텍스트를 접근하고 활용하기\n", + "- **메모리 시각화**: 에이전트의 지식 그래프에서 관계 탐색하기\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ 무엇을 만들게 될까요\n", + "\n", + "이 튜토리얼에서는 지속적인 메모리를 가진 **코딩 어시스턴트**를 만들어볼 것입니다. 이 어시스턴트는 다음과 같은 기능을 갖추고 있습니다:\n", + "\n", + "### 1. **지식 베이스 구축**\n", + " - 개발자의 프로필과 전문성 정보를 수집\n", + " - Python 프로그래밍 원칙과 모범 사례를 처리\n", + " - 개발자와 AI 어시스턴트 간의 대화 기록 저장\n", + "\n", + "### 2. **세션 인식 대화**\n", + " - 동일한 세션 내에서 여러 질문 간의 맥락을 유지\n", + " - 각 질문/답변 쌍을 자동으로 캐시하여 효율적으로 검색\n", + " - 대화 기록을 기반으로 일관성 있고 맥락에 맞는 응답 제공\n", + "\n", + "### 3. **장기 메모리**\n", + " - 중요한 대화를 장기 메모리에 저장\n", + " - 지식 베이스와 과거 세션에서 관련 기억을 검색하여 새로운 상호작용에 반영\n", + " - 시간이 지남에 따라 개선되는 성장형 지식 베이스 구축\n", + "\n", + "### 4. **지능형 메모리 검색**\n", + " - 그래프 인식 의미론적 검색을 사용하여 저장된 모든 지식에서 관련 정보를 찾음\n", + " - 데이터 하위 그룹(개발자 정보 vs. 원칙)별로 검색 필터링\n", + " - 여러 데이터 소스를 결합하여 포괄적인 답변 제공\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 사전 준비 및 설정\n", + "\n", + "### 시스템 요구 사항\n", + "\n", + "시작하기 전에 다음을 확인하세요:\n", + "\n", + "1. **Python 환경**\n", + " - Python 3.9 이상\n", + " - 가상 환경 (권장)\n", + "\n", + "2. **Redis 캐시** (세션 관리를 위해 필요)\n", + " - 로컬 Redis: `docker run -d -p 6379:6379 redis`\n", + " - 또는 관리형 Redis 서비스 사용\n", + "\n", + "3. **LLM API 접근**\n", + " - OpenAI API 키 또는 기타 제공자 (자세한 내용은 [문서](https://docs.cognee.ai/setup-configuration/llm-providers) 참조)\n", + "\n", + "4. **데이터베이스 구성**\n", + " - 기본적으로 별도의 설정이 필요하지 않습니다. Cognee는 파일 기반 데이터베이스(LanceDB 및 Kuzu)를 사용합니다.\n", + " - 선택적으로 Azure AI Search를 벡터 스토어로 설정할 수 있습니다 (자세한 내용은 [문서](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch) 참조).\n", + "\n", + "### 환경 구성\n", + "\n", + "프로젝트 디렉토리에 `.env` 파일을 생성하고 다음 변수를 추가하세요:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Cognee의 메모리 아키텍처 이해하기\n", + "\n", + "### Cognee 작동 방식\n", + "\n", + "Cognee는 단순한 키-값 저장소를 넘어서는 정교한 메모리 시스템을 제공합니다:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### 주요 구성 요소:\n", + "\n", + "1. **지식 그래프**: 엔티티, 관계, 의미적 연결을 저장\n", + "2. **벡터 임베딩**: 저장된 모든 정보에 대한 의미적 검색 가능\n", + "3. **세션 캐시**: 세션 내 및 세션 간 대화 컨텍스트 유지\n", + "4. **노드셋(NodeSets)**: 데이터를 논리적 카테고리로 구성하여 목표 지향적 검색 가능\n", + "\n", + "### 이 튜토리얼에서 다룰 메모리 유형:\n", + "\n", + "- **영구 메모리**: 지식 그래프에 장기적으로 저장\n", + "- **세션 메모리**: Redis 캐시에 임시 대화 컨텍스트 저장\n", + "- **의미적 메모리**: 모든 데이터에 대한 벡터 기반 유사성 검색\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 필수 패키지 설치\n", + "\n", + "세션 관리를 위한 Redis 지원과 함께 Cognee를 설치하세요:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 환경 초기화 및 라이브러리 로드\n", + "\n", + "확인하세요:\n", + "1. Redis가 실행 중인지 확인 (예: Docker를 통해 `docker run -d -p 6379:6379 redis` 실행)\n", + "2. 환경 변수가 캐시 모듈을 가져오기 전에 설정되어 있는지 확인\n", + "3. 필요 시 커널을 재시작하고 셀을 순서대로 실행\n", + "\n", + "다음 셀은 다음 작업을 수행합니다:\n", + "1. `.env` 파일에서 환경 변수를 로드\n", + "2. Cognee를 LLM 설정으로 구성\n", + "3. 세션 관리를 위한 캐싱 활성화\n", + "4. 모든 구성 요소가 제대로 연결되었는지 확인\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 저장 디렉토리 구성\n", + "\n", + "Cognee는 작업을 위해 두 개의 별도 디렉토리를 사용합니다:\n", + "- **데이터 루트**: 가져온 문서와 처리된 데이터를 저장\n", + "- **시스템 루트**: 지식 그래프 데이터베이스와 시스템 메타데이터를 포함\n", + "\n", + "이 튜토리얼에서는 다음과 같이 독립된 디렉토리를 생성하겠습니다:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 메모리 상태 초기화\n", + "\n", + "메모리 시스템을 구축하기 전에, 새롭게 시작할 수 있도록 준비합시다.\n", + "\n", + "> 💡 **팁**: 나중에 이 노트북을 사용할 때 이전 실행에서의 기존 메모리를 유지하고 싶다면 이 단계를 건너뛸 수 있습니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 1부: 지식 베이스 구축\n", + "\n", + "### 개발자 도우미를 위한 데이터 소스\n", + "\n", + "포괄적인 지식 베이스를 만들기 위해 세 가지 유형의 데이터를 수집합니다:\n", + "\n", + "1. **개발자 프로필**: 개인의 전문 지식과 기술적 배경\n", + "2. **Python 모범 사례**: Python의 철학과 실용적인 가이드라인\n", + "3. **과거 대화 기록**: 개발자와 AI 도우미 간의 이전 Q&A 세션\n", + "\n", + "이 다양한 데이터는 에이전트가 다음을 가능하게 합니다:\n", + "- 사용자의 기술적 맥락을 이해\n", + "- 추천 사항에 모범 사례 적용\n", + "- 이전 성공적인 상호작용에서 학습\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 데이터를 지식 그래프로 변환하기\n", + "\n", + "이제 원시 텍스트를 구조화된 메모리로 변환합니다. 이 과정은 다음과 같습니다:\n", + "\n", + "1. **NodeSets에 데이터를 추가**: 정보를 논리적인 카테고리로 정리\n", + " - `developer_data`: 개발자 프로필 및 대화\n", + " - `principles_data`: Python 모범 사례 및 가이드라인\n", + "\n", + "2. **Cognify Pipeline 실행**: 엔티티와 관계를 추출하고 임베딩 생성\n", + " - 주요 개념 식별\n", + " - 관련 정보 간의 의미론적 연결 생성\n", + " - 벡터 임베딩 생성\n", + "\n", + "LLM이 텍스트를 처리하고 그래프 구조를 구축하는 동안 약간의 시간이 걸릴 수 있습니다:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 지식 그래프 시각화\n", + "\n", + "우리의 지식 그래프 구조를 살펴봅시다. 시각화는 다음을 보여줍니다:\n", + "- **노드**: 텍스트에서 추출된 엔티티(개념, 기술, 사람)\n", + "- **엣지**: 엔티티 간의 관계와 연결\n", + "- **클러스터**: 의미적 유사성에 따라 그룹화된 관련 개념들\n", + "\n", + "생성된 HTML 파일을 브라우저에서 열어 그래프를 상호작용하며 탐색하세요:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Memify로 기억 강화하기\n", + "\n", + "`memify()` 함수는 지식 그래프를 분석하고 데이터에 대한 지능적인 규칙을 생성합니다. 이 과정은 다음을 포함합니다:\n", + "- 패턴과 모범 사례 식별\n", + "- 콘텐츠를 기반으로 실행 가능한 지침 생성\n", + "- 다양한 지식 영역 간의 관계 설정\n", + "\n", + "이러한 규칙은 에이전트가 질문에 답할 때 더 나은 결정을 내릴 수 있도록 돕습니다. 두 번째 시각화를 캡처하면 그래프가 풍부해진 후 어떻게 밀도가 높아지는지 비교할 수 있습니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 2부: 지능형 메모리 검색\n", + "\n", + "### 데모 1: 문서 간 지식 통합\n", + "\n", + "지식 그래프가 구축되었으니, Cognee가 여러 출처의 정보를 결합하여 복잡한 질문에 어떻게 답변하는지 테스트해봅시다.\n", + "\n", + "첫 번째 쿼리는 다음을 보여줍니다:\n", + "- **의미 이해**: 명시적으로 언급되지 않은 경우에도 관련 개념 찾기\n", + "- **교차 참조**: 개발자 프로필과 Python 원칙 결합\n", + "- **맥락적 추론**: 특정 구현에 모범 사례 적용\n", + "\n", + "### 데모 2: NodeSets를 활용한 필터링 검색\n", + "\n", + "두 번째 쿼리는 지식 그래프의 특정 하위 집합을 대상으로 하는 방법을 보여줍니다:\n", + "- `node_name` 매개변수를 사용하여 `principles_data` 내에서만 검색\n", + "- 특정 지식 도메인에서 집중된 답변 제공\n", + "- 도메인별 정보가 필요할 때 유용\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 3부: 세션 관리 설정\n", + "\n", + "### 대화 메모리 활성화\n", + "\n", + "세션 관리는 여러 상호작용 간에 문맥을 유지하는 데 매우 중요합니다. 여기에서는 다음을 수행합니다:\n", + "\n", + "1. **사용자 컨텍스트 초기화**: 세션 추적을 위해 사용자 프로필을 생성하거나 가져오기\n", + "2. **캐시 엔진 구성**: 대화 기록을 저장하기 위해 Redis에 연결\n", + "3. **세션 변수 활성화**: 쿼리 간에 지속되는 컨텍스트 변수를 설정\n", + "\n", + "> ⚠️ **중요**: Redis가 실행 중이어야 하며 환경에서 `CACHING=true`로 설정되어 있어야 합니다\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ 도우미 함수: 세션 기록 보기\n", + "\n", + "이 유틸리티 함수는 Redis에 저장된 대화 기록을 확인할 수 있게 해줍니다. 이는 다음과 같은 경우에 유용합니다:\n", + "- 세션 관리 디버깅\n", + "- 대화가 캐시되고 있는지 확인\n", + "- 에이전트가 사용할 수 있는 컨텍스트 이해\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## 세션 1: 비동기 지원 실습 — 첫 번째 질문\n", + "\n", + "`async-support-lab` 세션을 시작하며 대규모 웹 스크래퍼를 위한 텔레메트리 친화적인 asyncio 패턴에 대해 질문하세요. 그래프는 이미 asyncio, aiohttp, 모니터링 실습에 대해 알고 있으므로, 응답은 이전 대화를 반영하면서도 새로운 질문에 맞춘 답변이어야 합니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## 첫 번째 교환 후 세션 1 메모리 확인\n", + "\n", + "초기 질문 직후 `show_history(session_1)`을 실행하면 Cognee가 프롬프트와 응답을 모두 Redis에 기록했음을 확인할 수 있습니다. 동시성 가이던스가 포함된 하나의 항목을 볼 수 있을 것입니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## 세션 1: 데이터 모델에 대한 후속 논의\n", + "\n", + "다음으로, \"dataclasses와 Pydantic 중 언제 선택해야 할까?\"라는 질문을 같은 세션 ID를 사용하여 탐구합니다. Cognee는 Python 원칙과 이전 FastAPI 대화를 결합하여 세부적인 조언을 제공해야 하며, 명명된 세션 내에서 문맥이 이어진다는 것을 보여줍니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## 세션 1 기록에 두 개의 턴이 포함되어 있는지 확인하기\n", + "\n", + "다시 `show_history(session_1)`를 호출하면 두 개의 Q&A 항목이 표시되어야 합니다. 이는 Mem0 실험실의 \"기억 재생\" 단계와 일치하며, 추가적인 턴이 동일한 대화 기록을 확장한다는 것을 증명합니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## 세션 2: 디자인 리뷰 스레드 — 새로운 세션\n", + "\n", + "스레드 간의 분리를 보여주기 위해 `design-review-session`을 시작하고 사고 리뷰를 위한 로깅 가이드를 요청합니다. 기본 지식 베이스는 동일하지만, 새로운 세션 ID는 대화 기록을 분리합니다.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## 검토 세션 2 기록\n", + "\n", + "`show_history(session_2)`는 디자인 검토 프롬프트/응답 쌍만 나열해야 합니다. 세션 1과 비교하여 Cognee가 공유 지식 그래프를 재사용하면서도 독립적인 기록을 유지하는 방식을 강조하세요.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## 요약\n", + "\n", + "축하합니다! 이제 코딩 어시스턴트에 Cognee로 구동되는 진정한 장기 기억 레이어를 추가했습니다.\n", + "\n", + "이 튜토리얼에서는 개발자 콘텐츠(코드, 문서, 채팅)를 그래프와 벡터 메모리로 변환하여 에이전트가 검색하고, 추론하며, 지속적으로 개선할 수 있도록 만드는 방법을 배웠습니다.\n", + "\n", + "배운 내용\n", + "\n", + "1. **원시 텍스트에서 AI 메모리로**: Cognee가 비구조화 데이터를 수집하고 벡터와 지식 그래프 아키텍처를 결합하여 지능적이고 검색 가능한 메모리로 변환하는 방법.\n", + "\n", + "2. **memify를 활용한 그래프 강화**: 기본적인 그래프 생성 단계를 넘어 memify를 사용하여 기존 그래프에 파생된 사실과 더 풍부한 관계를 추가하는 방법.\n", + "\n", + "3. **다양한 검색 전략**: 에이전트의 필요에 따라 메모리를 다양한 검색 유형(그래프 인식 Q&A, RAG 스타일 완성, 인사이트, 원시 텍스트 조각, 코드 검색 등)으로 쿼리하는 방법.\n", + "\n", + "4. **시각적 탐색**: 그래프 시각화와 Cognee UI를 사용하여 Cognee가 구축한 내용을 검사하고 디버그하며 지식이 어떻게 구조화되어 있는지 실제로 확인하는 방법.\n", + "\n", + "5. **세션 인식 메모리**: 세션별 컨텍스트와 지속적인 의미 메모리를 결합하여 에이전트가 사용자 간 정보 누출 없이 실행 간 기억을 유지할 수 있도록 하는 방법.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## 주요 요점\n", + "1. 임베딩을 기반으로 한 지식 그래프로서의 메모리\n", + "\n", + " - **구조화된 이해**: Cognee는 벡터 저장소와 그래프 저장소를 결합하여 데이터를 의미에 따라 검색 가능하게 하고 관계로 연결합니다. Cognee는 기본적으로 파일 기반 데이터베이스를 사용합니다 (벡터 데이터베이스는 LanceDB, 그래프 데이터베이스는 Kuzu).\n", + "\n", + " - **관계 인식 검색**: 답변은 \"유사한 텍스트\"뿐만 아니라 엔티티 간의 관계를 기반으로 할 수 있습니다.\n", + "\n", + " - **진화하는 메모리**: 메모리 계층은 하나의 연결된 그래프로 진화하고 성장하며 계속 쿼리 가능합니다.\n", + "\n", + "2. 검색 및 추론 모드\n", + " - **하이브리드 검색**: 검색은 벡터 유사성, 그래프 구조, LLM 추론을 결합하여 원시 청크 조회에서 그래프 인식 질문 응답까지 제공합니다.\n", + "\n", + " - **작업에 맞는 모드 선택**: 자연어 답변이 필요한 경우 완성형 모드를 사용하고, 에이전트가 원시 컨텍스트를 필요로 하거나 자체 추론을 주도해야 할 때는 청크/요약/그래프 모드를 사용하세요.\n", + "\n", + "3. 개인화된 세션 인식 에이전트\n", + " - **세션 컨텍스트 + 장기 메모리**: Cognee는 단기 \"스레드\" 컨텍스트를 장기적인 사용자 또는 조직 수준의 메모리와 분리하여 관리합니다.\n", + "\n", + "## 실제 응용 사례\n", + "\n", + "1. **특정 분야 AI 에이전트**\n", + "\n", + " 이 노트북의 패턴을 사용하여 Cognee를 검색 및 추론 핵심으로 활용하는 도메인 지능형 코파일럿을 구축하세요:\n", + "\n", + " - **개발자 코파일럿**: 코드 리뷰, 사고 분석, 아키텍처 지원 도구로 코드, API, 설계 문서, 티켓을 단일 메모리 그래프로 탐색합니다.\n", + "\n", + " - **고객 대면 코파일럿**: 제품 문서, FAQ, CRM 노트, 과거 티켓에서 그래프 인식 검색과 인용된 답변을 제공하는 지원 또는 성공 에이전트.\n", + "\n", + " - **내부 전문가 코파일럿**: 고립된 PDF 대신 상호 연결된 규칙, 지침, 과거 결정을 기반으로 추론하는 정책, 법률, 보안 지원 도구.\n", + "\n", + " Cognee는 AI 에이전트를 위한 지속적이고 정확한 메모리로 명확히 자리 잡고 있으며, 에이전트 뒤에서 작동하며 벡터 저장소와 맞춤형 그래프 코드를 대체하는 살아있는 지식 그래프를 제공합니다.\n", + "\n", + "2. **데이터 사일로를 하나의 메모리로 통합**\n", + "\n", + " 동일한 접근 방식은 분산된 소스를 통합 메모리 계층으로 구축하는 데도 도움이 됩니다:\n", + "\n", + " - **사일로에서 하나의 그래프로**: 구조화된 데이터(예: 데이터베이스)와 비구조화된 데이터(예: 문서, 채팅)를 별도의 인덱스 대신 임베딩으로 지원되는 단일 그래프로 수집합니다.\n", + "\n", + " - **인용과 함께 교차 소스 추론**: 그래프를 통해 로그, 메트릭, 문서를 \"조인\"하여 모든 것을 다단계로 추론하고, 여전히 출처가 명확한 답변을 반환합니다.\n", + "\n", + " - **지식 허브**: 은행업이나 교육과 같은 도메인에서는 Cognee를 사용하여 PDF, 내부 시스템, 앱 데이터를 하나의 지식 그래프로 통합하고 벡터를 활용하여 에이전트가 정확하고 인용된 컨텍스트로 질문에 답할 수 있도록 합니다.\n", + "\n", + "## 다음 단계\n", + "\n", + "핵심 메모리 루프를 구현했습니다. 다음은 스스로 시도해볼 수 있는 자연스러운 확장입니다 ([Cognee 문서](https://docs.cognee.ai/)에서 자세한 내용을 확인하세요):\n", + "\n", + "1. **시간 인식 실험**: 텍스트에서 이벤트와 타임스탬프를 추출하기 위해 시간 인식을 활성화하세요.\n", + "\n", + "2. **온톨로지 기반 추론 도입**: 도메인에 대한 OWL 온톨로지를 정의하세요. Cognee의 온톨로지 지원을 사용하여 추출된 엔티티와 관계를 해당 스키마에 기반하도록 하여 그래프 품질과 도메인별 답변을 개선하세요.\n", + "\n", + "3. **피드백 루프 추가**: 실제 사용자 피드백을 통해 Cognee가 그래프 엣지 가중치를 조정하도록 하여 검색이 정적 상태에 머무르지 않고 시간이 지남에 따라 개선되도록 하세요.\n", + "\n", + "4. **개인화 및 세션 동작 조정**: 사용자 ID, 테넌트, 데이터 세트를 사용하여 공유 메모리 엔진에 대해 각 개인이나 팀이 고유한 뷰를 가질 수 있도록 하세요.\n", + "\n", + "5. **더 복잡한 에이전트로 확장**: Cognee를 에이전트 프레임워크에 연결하여 동일한 메모리 계층을 공유하는 다중 에이전트 시스템을 구축하세요. *Microsoft Agent Framework x Cognee 플러그인은 곧 출시됩니다.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**면책 조항**: \n이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 사용하여 번역되었습니다. 정확성을 위해 최선을 다하고 있지만, 자동 번역에는 오류나 부정확성이 포함될 수 있습니다. 원본 문서의 원어 버전을 권위 있는 출처로 간주해야 합니다. 중요한 정보의 경우, 전문적인 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해 책임지지 않습니다.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:34:53+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "ko" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/ko/13-agent-memory/README.md b/translations/ko/13-agent-memory/README.md index 1bb67df35..5c2f99fd5 100644 --- a/translations/ko/13-agent-memory/README.md +++ b/translations/ko/13-agent-memory/README.md @@ -1,18 +1,18 @@ -# AI 에이전트의 메모리 -[![Agent Memory](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.ko.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) +# AI 에이전트를 위한 메모리 +[![에이전트 메모리](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.ko.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -AI 에이전트를 만드는 데 있어 독특한 이점에 대해 논의할 때 주로 두 가지가 언급됩니다: 도구를 호출하여 작업을 완료하는 능력과 시간이 지남에 따라 개선되는 능력입니다. 메모리는 사용자에게 더 나은 경험을 제공할 수 있는 자기 개선 에이전트를 만드는 데 있어 핵심입니다. +AI 에이전트를 만드는 고유한 이점에 대해 논의할 때 주로 두 가지가 언급됩니다: 도구를 호출하여 작업을 완료하는 능력과 시간이 지남에 따라 개선되는 능력입니다. 메모리는 사용자에게 더 나은 경험을 제공할 수 있는 자기 개선 에이전트를 만드는 데 핵심적인 요소입니다. -이번 강의에서는 AI 에이전트의 메모리가 무엇인지, 이를 어떻게 관리하고 애플리케이션에 활용할 수 있는지 살펴보겠습니다. +이번 강의에서는 AI 에이전트를 위한 메모리가 무엇인지, 이를 어떻게 관리하고 애플리케이션에 활용할 수 있는지 살펴보겠습니다. ## 소개 @@ -20,141 +20,161 @@ AI 에이전트를 만드는 데 있어 독특한 이점에 대해 논의할 때 • **AI 에이전트 메모리 이해하기**: 메모리가 무엇이며 에이전트에게 왜 중요한지. -• **메모리 구현 및 저장**: 단기 및 장기 메모리에 초점을 맞춘 AI 에이전트에 메모리 기능을 추가하는 실질적인 방법. +• **메모리 구현 및 저장**: 단기 및 장기 메모리에 중점을 두고 AI 에이전트에 메모리 기능을 추가하는 실질적인 방법. -• **AI 에이전트를 자기 개선 가능하게 만들기**: 메모리가 과거 상호작용에서 학습하고 시간이 지남에 따라 개선할 수 있도록 하는 방법. +• **AI 에이전트를 자기 개선형으로 만들기**: 메모리가 과거 상호작용에서 학습하고 시간이 지남에 따라 개선되도록 돕는 방법. + +## 제공되는 구현 + +이번 강의에는 두 가지 포괄적인 노트북 튜토리얼이 포함되어 있습니다: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Mem0와 Azure AI Search를 Semantic Kernel 프레임워크와 함께 사용하여 메모리를 구현. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Cognee를 사용하여 구조화된 메모리를 구현, 임베딩을 기반으로 지식 그래프를 자동으로 구축하고, 그래프를 시각화하며, 지능형 검색을 수행. ## 학습 목표 -이 강의를 완료한 후, 여러분은 다음을 알게 될 것입니다: +이 강의를 완료한 후, 다음을 할 수 있습니다: -• **AI 에이전트 메모리의 다양한 유형을 구분하기**: 작업 메모리, 단기 메모리, 장기 메모리, 그리고 페르소나 및 에피소드 메모리와 같은 특수 형태. +• **AI 에이전트 메모리의 다양한 유형을 구분**: 작업 메모리, 단기 메모리, 장기 메모리, 그리고 페르소나 및 에피소드 메모리와 같은 특수 형태 포함. -• **AI 에이전트의 단기 및 장기 메모리를 구현하고 관리하기**: Semantic Kernel 프레임워크를 활용하여 Mem0 및 Whiteboard 메모리와 같은 도구를 사용하고 Azure AI Search와 통합. +• **Semantic Kernel 프레임워크를 사용하여 AI 에이전트의 단기 및 장기 메모리를 구현하고 관리**: Mem0, Cognee, 화이트보드 메모리와 같은 도구를 활용하고 Azure AI Search와 통합. -• **자기 개선 AI 에이전트의 원리를 이해하기**: 강력한 메모리 관리 시스템이 지속적인 학습과 적응에 어떻게 기여하는지. +• **자기 개선형 AI 에이전트의 원리를 이해**: 강력한 메모리 관리 시스템이 지속적인 학습과 적응에 어떻게 기여하는지. ## AI 에이전트 메모리 이해하기 -기본적으로, **AI 에이전트의 메모리는 정보를 유지하고 회상할 수 있는 메커니즘을 의미합니다**. 이 정보는 대화의 특정 세부사항, 사용자 선호도, 과거 행동, 또는 학습된 패턴일 수 있습니다. +본질적으로, **AI 에이전트의 메모리는 정보를 유지하고 회상할 수 있는 메커니즘**을 의미합니다. 이 정보는 대화의 특정 세부사항, 사용자 선호도, 과거 행동 또는 학습된 패턴일 수 있습니다. -메모리가 없으면 AI 애플리케이션은 종종 상태를 유지하지 못하며, 각 상호작용이 처음부터 시작됩니다. 이는 에이전트가 이전의 맥락이나 선호도를 "잊어버리는" 반복적이고 답답한 사용자 경험을 초래합니다. +메모리가 없으면 AI 애플리케이션은 종종 상태를 유지하지 못하며, 이는 각 상호작용이 처음부터 시작된다는 것을 의미합니다. 이는 에이전트가 이전의 맥락이나 선호도를 "잊어버리는" 반복적이고 답답한 사용자 경험으로 이어집니다. ### 메모리가 왜 중요한가? -에이전트의 지능은 과거 정보를 회상하고 활용하는 능력과 깊이 연결되어 있습니다. 메모리는 에이전트를 다음과 같이 만듭니다: +에이전트의 지능은 과거 정보를 회상하고 활용하는 능력과 깊이 연관되어 있습니다. 메모리는 에이전트를 다음과 같이 만듭니다: • **반성적**: 과거 행동과 결과에서 학습. • **상호작용적**: 진행 중인 대화의 맥락을 유지. -• **능동적 및 반응적**: 과거 데이터를 기반으로 필요를 예측하거나 적절히 대응. +• **능동적 및 반응적**: 과거 데이터를 기반으로 필요를 예측하거나 적절히 반응. • **자율적**: 저장된 지식을 활용하여 더 독립적으로 작동. -메모리를 구현하는 목표는 에이전트를 더 **신뢰할 수 있고 능력 있는** 존재로 만드는 것입니다. +메모리를 구현하는 목표는 에이전트를 더 **신뢰할 수 있고 유능하게** 만드는 것입니다. ### 메모리의 유형 #### 작업 메모리 -작업 메모리는 에이전트가 단일 작업이나 사고 과정 중에 사용하는 임시 메모지와 같습니다. 다음 단계를 계산하는 데 필요한 즉각적인 정보를 보유합니다. +이것은 에이전트가 단일 작업이나 사고 과정 중에 사용하는 임시 메모지와 같습니다. 다음 단계를 계산하는 데 필요한 즉각적인 정보를 보유합니다. -AI 에이전트의 경우, 작업 메모리는 대화에서 가장 관련성이 높은 정보를 캡처하며, 전체 채팅 기록이 길거나 잘려 있더라도 핵심 요소를 추출하는 데 집중합니다. 여기에는 요구사항, 제안, 결정, 행동 등이 포함됩니다. +AI 에이전트의 경우, 작업 메모리는 대화에서 가장 관련성이 높은 정보를 캡처하며, 전체 채팅 기록이 길거나 잘려도 이를 유지합니다. 요구사항, 제안, 결정, 행동과 같은 주요 요소를 추출하는 데 중점을 둡니다. **작업 메모리 예시** -여행 예약 에이전트에서 작업 메모리는 사용자의 현재 요청, 예를 들어 "파리로 여행을 예약하고 싶어요"와 같은 요구사항을 캡처하여 현재 상호작용을 안내합니다. +여행 예약 에이전트에서 작업 메모리는 사용자의 현재 요청, 예를 들어 "파리로 여행을 예약하고 싶어요"와 같은 내용을 캡처할 수 있습니다. 이 특정 요구사항은 현재 상호작용을 안내하기 위해 에이전트의 즉각적인 맥락에 보유됩니다. #### 단기 메모리 -이 유형의 메모리는 단일 대화나 세션 동안 정보를 유지합니다. 현재 채팅의 맥락을 유지하여 에이전트가 대화의 이전 턴을 참조할 수 있도록 합니다. +이 메모리는 단일 대화나 세션 동안 정보를 유지합니다. 현재 채팅의 맥락으로, 에이전트가 대화의 이전 턴을 참조할 수 있도록 합니다. **단기 메모리 예시** -사용자가 "파리로 가는 항공편 비용은 얼마인가요?"라고 묻고 이어서 "거기 숙박은 어떻죠?"라고 질문하면, 단기 메모리는 "거기"가 같은 대화 내에서 "파리"를 의미한다는 것을 에이전트가 알 수 있도록 합니다. +사용자가 "파리로 가는 항공편 비용은 얼마인가요?"라고 묻고, 이어서 "거기 숙박은요?"라고 질문하면, 단기 메모리는 "거기"가 같은 대화 내에서 "파리"를 의미한다는 것을 에이전트가 알 수 있도록 합니다. #### 장기 메모리 -이 메모리는 여러 대화나 세션에 걸쳐 정보를 유지합니다. 에이전트가 사용자 선호도, 과거 상호작용, 또는 일반적인 지식을 장기간 기억할 수 있도록 합니다. 이는 개인화에 중요합니다. +이 메모리는 여러 대화나 세션에 걸쳐 정보를 유지합니다. 사용자 선호도, 과거 상호작용, 일반 지식을 장기간 기억할 수 있게 하여 개인화에 중요한 역할을 합니다. **장기 메모리 예시** -장기 메모리는 "벤은 스키와 야외 활동을 좋아하고, 산 전망이 있는 커피를 선호하며, 과거 부상으로 인해 고급 스키 슬로프를 피하고 싶어한다"는 정보를 저장할 수 있습니다. 이전 상호작용에서 학습한 이 정보는 미래 여행 계획 세션에서 추천을 개인화하는 데 영향을 미칩니다. +장기 메모리는 "벤은 스키와 야외 활동을 좋아하고, 산 전망이 있는 커피를 선호하며, 과거 부상으로 인해 고급 스키 슬로프를 피하고 싶어한다"는 정보를 저장할 수 있습니다. 이전 상호작용에서 학습한 이 정보는 향후 여행 계획 세션에서 추천에 영향을 미쳐 매우 개인화된 경험을 제공합니다. #### 페르소나 메모리 -이 특수한 메모리 유형은 에이전트가 일관된 "성격" 또는 "페르소나"를 개발하도록 돕습니다. 에이전트가 자신에 대한 세부사항이나 의도된 역할을 기억하여 상호작용을 더 유연하고 집중적으로 만듭니다. +이 특수 메모리 유형은 에이전트가 일관된 "성격" 또는 "페르소나"를 개발하도록 돕습니다. 에이전트가 자신이나 의도된 역할에 대한 세부사항을 기억하여 상호작용을 더 유연하고 집중적으로 만듭니다. **페르소나 메모리 예시** -여행 에이전트가 "스키 전문가"로 설계되었다면, 페르소나 메모리는 이 역할을 강화하여 전문가의 어조와 지식을 반영하는 응답을 제공하도록 영향을 미칩니다. +여행 에이전트가 "스키 전문가"로 설계되었다면, 페르소나 메모리는 이 역할을 강화하여 전문가의 어조와 지식을 반영하는 응답을 하도록 영향을 미칠 수 있습니다. #### 워크플로우/에피소드 메모리 -이 메모리는 에이전트가 복잡한 작업을 수행하는 동안의 단계 순서, 성공 및 실패를 저장합니다. 이는 특정 "에피소드" 또는 과거 경험을 기억하여 학습하는 것과 같습니다. +이 메모리는 에이전트가 복잡한 작업 중에 수행한 단계, 성공 및 실패를 저장합니다. 이는 특정 "에피소드"나 과거 경험을 기억하여 학습하는 것과 같습니다. **에피소드 메모리 예시** -에이전트가 특정 항공편을 예약하려 했지만 이용 불가로 실패한 경우, 에피소드 메모리는 이 실패를 기록하여 대체 항공편을 시도하거나 이후 시도에서 사용자에게 문제를 더 잘 알릴 수 있도록 합니다. +에이전트가 특정 항공편 예약을 시도했지만 이용 불가로 실패한 경우, 에피소드 메모리는 이 실패를 기록하여 대체 항공편을 시도하거나 후속 시도에서 사용자에게 문제를 더 잘 알릴 수 있습니다. -#### 엔티티 메모리 +#### 엔터티 메모리 -이 메모리는 대화에서 사람, 장소, 사물과 같은 특정 엔티티와 이벤트를 추출하고 기억하는 것을 포함합니다. 에이전트가 논의된 주요 요소에 대한 구조화된 이해를 구축할 수 있도록 합니다. +이 메모리는 대화에서 특정 엔터티(사람, 장소, 사물)와 이벤트를 추출하고 기억하는 것을 포함합니다. 이를 통해 에이전트는 논의된 주요 요소에 대한 구조화된 이해를 구축할 수 있습니다. -**엔티티 메모리 예시** +**엔터티 메모리 예시** -과거 여행에 대한 대화에서 에이전트는 "파리", "에펠탑", "Le Chat Noir 레스토랑에서의 저녁 식사"와 같은 엔티티를 추출할 수 있습니다. 이후 상호작용에서 에이전트는 "Le Chat Noir"를 기억하고 새로운 예약을 제안할 수 있습니다. +과거 여행에 대한 대화에서 에이전트는 "파리", "에펠탑", "Le Chat Noir 레스토랑에서의 저녁 식사"와 같은 엔터티를 추출할 수 있습니다. 이후 상호작용에서 에이전트는 "Le Chat Noir"를 기억하고 새로운 예약을 제안할 수 있습니다. #### 구조화된 RAG (Retrieval Augmented Generation) -RAG는 더 넓은 기술이지만, "구조화된 RAG"는 강력한 메모리 기술로 강조됩니다. 이는 대화, 이메일, 이미지와 같은 다양한 소스에서 밀도 높은 구조화된 정보를 추출하여 응답의 정확성, 회상력, 속도를 향상시킵니다. 고전적인 RAG가 의미적 유사성에만 의존하는 것과 달리, 구조화된 RAG는 정보의 고유한 구조를 활용합니다. +RAG는 더 넓은 기술이지만, "구조화된 RAG"는 강력한 메모리 기술로 강조됩니다. 이는 대화, 이메일, 이미지와 같은 다양한 소스에서 밀도 높은 구조화된 정보를 추출하여 정밀도, 회상, 응답 속도를 향상시킵니다. 고전적인 RAG가 의미적 유사성에만 의존하는 것과 달리, 구조화된 RAG는 정보의 고유한 구조를 활용합니다. **구조화된 RAG 예시** -단순히 키워드를 매칭하는 대신, 구조화된 RAG는 이메일에서 항공편 세부사항(목적지, 날짜, 시간, 항공사)을 분석하여 구조화된 방식으로 저장할 수 있습니다. 이를 통해 "화요일에 파리로 예약한 항공편은 무엇인가요?"와 같은 정확한 쿼리를 처리할 수 있습니다. +단순히 키워드를 일치시키는 대신, 구조화된 RAG는 이메일에서 항공편 세부정보(목적지, 날짜, 시간, 항공사)를 분석하고 구조화된 방식으로 저장할 수 있습니다. 이를 통해 "화요일에 파리로 예약한 항공편은 무엇인가요?"와 같은 정밀한 쿼리가 가능합니다. ## 메모리 구현 및 저장 -AI 에이전트의 메모리를 구현하는 것은 **메모리 관리**의 체계적인 과정을 포함합니다. 여기에는 정보 생성, 저장, 검색, 통합, 업데이트, 그리고 "잊기"(또는 삭제)가 포함됩니다. 특히 검색은 중요한 측면입니다. +AI 에이전트의 메모리를 구현하는 것은 **메모리 관리**의 체계적인 과정을 포함합니다. 여기에는 정보 생성, 저장, 검색, 통합, 업데이트, 심지어 "잊기"(또는 삭제)가 포함됩니다. 특히 검색은 중요한 측면입니다. ### 특수 메모리 도구 -에이전트 메모리를 저장하고 관리하는 한 가지 방법은 Mem0와 같은 특수 도구를 사용하는 것입니다. Mem0는 지속적인 메모리 계층으로 작동하여 에이전트가 관련 상호작용을 회상하고, 사용자 선호도와 사실적 맥락을 저장하며, 시간에 따라 성공과 실패에서 학습할 수 있도록 합니다. 여기서 아이디어는 상태를 유지하지 않는 에이전트를 상태를 유지하는 에이전트로 바꾸는 것입니다. +#### Mem0 + +에이전트 메모리를 저장하고 관리하는 한 가지 방법은 Mem0과 같은 특수 도구를 사용하는 것입니다. Mem0은 지속적인 메모리 계층으로 작동하여 에이전트가 관련 상호작용을 회상하고, 사용자 선호도와 사실적 맥락을 저장하며, 시간에 따라 성공과 실패에서 학습할 수 있도록 합니다. 이 아이디어는 상태를 유지하지 않는 에이전트를 상태를 유지하는 에이전트로 전환하는 것입니다. + +Mem0은 **추출 및 업데이트의 두 단계 메모리 파이프라인**을 통해 작동합니다. 먼저, 에이전트의 스레드에 추가된 메시지가 Mem0 서비스로 전송되며, 이는 대화 기록을 요약하고 새로운 메모리를 추출하기 위해 대형 언어 모델(LLM)을 사용합니다. 이후, LLM 기반 업데이트 단계는 이러한 메모리를 추가, 수정, 삭제할지 여부를 결정하여 벡터, 그래프, 키-값 데이터베이스를 포함할 수 있는 하이브리드 데이터 저장소에 저장합니다. 이 시스템은 다양한 메모리 유형을 지원하며, 엔터티 간 관계를 관리하기 위해 그래프 메모리를 통합할 수도 있습니다. + +#### Cognee + +또 다른 강력한 접근법은 **Cognee**를 사용하는 것입니다. 이는 구조화된 데이터와 비구조화된 데이터를 임베딩으로 지원되는 쿼리 가능한 지식 그래프로 변환하는 오픈 소스 의미 메모리입니다. Cognee는 벡터 유사성 검색과 그래프 관계를 결합한 **이중 저장소 아키텍처**를 제공하여 에이전트가 단순히 정보가 유사한지뿐만 아니라 개념이 어떻게 연결되어 있는지도 이해할 수 있도록 합니다. + +Cognee는 **하이브리드 검색**에서 뛰어나며, 벡터 유사성, 그래프 구조, LLM 추론을 결합하여 원시 청크 조회에서 그래프 인식 질문 응답까지 지원합니다. 이 시스템은 **진화하는 메모리**를 유지하며, 하나의 연결된 그래프로 쿼리 가능하면서도 단기 세션 맥락과 장기 지속 메모리를 모두 지원합니다. -Mem0는 **추출 및 업데이트의 두 단계 메모리 파이프라인**을 통해 작동합니다. 먼저, 에이전트의 스레드에 추가된 메시지가 Mem0 서비스로 전송되며, 이는 대화 기록을 요약하고 새로운 메모리를 추출하기 위해 대형 언어 모델(LLM)을 사용합니다. 이후, LLM 기반 업데이트 단계는 이러한 메모리를 추가, 수정 또는 삭제할지 여부를 결정하여 벡터, 그래프, 키-값 데이터베이스를 포함할 수 있는 하이브리드 데이터 저장소에 저장합니다. 이 시스템은 다양한 메모리 유형을 지원하며 엔티티 간 관계를 관리하기 위해 그래프 메모리를 통합할 수도 있습니다. +Cognee 노트북 튜토리얼([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb))은 이 통합 메모리 계층을 구축하는 방법을 보여주며, 다양한 데이터 소스를 수집하고, 지식 그래프를 시각화하며, 특정 에이전트 요구에 맞춘 다양한 검색 전략으로 쿼리하는 실질적인 예제를 제공합니다. -### RAG를 활용한 메모리 저장 +### RAG를 사용한 메모리 저장 -Mem0와 같은 특수 메모리 도구 외에도, **Azure AI Search**와 같은 강력한 검색 서비스를 메모리 저장 및 검색의 백엔드로 활용할 수 있습니다. 특히 구조화된 RAG에 적합합니다. +Mem0과 같은 특수 메모리 도구 외에도, **Azure AI Search**와 같은 강력한 검색 서비스를 메모리를 저장하고 검색하는 백엔드로 활용할 수 있습니다. 특히 구조화된 RAG에 적합합니다. -이를 통해 에이전트의 응답을 자체 데이터로 기반화하여 더 관련성 있고 정확한 답변을 보장할 수 있습니다. Azure AI Search는 사용자별 여행 메모리, 제품 카탈로그, 또는 기타 도메인별 지식을 저장하는 데 사용할 수 있습니다. +이를 통해 에이전트의 응답을 자체 데이터로 기반화하여 더 관련성 있고 정확한 답변을 보장할 수 있습니다. Azure AI Search는 사용자별 여행 메모리, 제품 카탈로그 또는 기타 도메인별 지식을 저장하는 데 사용할 수 있습니다. -Azure AI Search는 **구조화된 RAG**와 같은 기능을 지원하며, 이는 대화 기록, 이메일, 또는 이미지와 같은 대규모 데이터셋에서 밀도 높은 구조화된 정보를 추출하고 검색하는 데 뛰어납니다. 이는 기존 텍스트 청킹 및 임베딩 접근법에 비해 "초인적인 정확성과 회상력"을 제공합니다. +Azure AI Search는 대화 기록, 이메일, 이미지와 같은 대규모 데이터 세트에서 밀도 높은 구조화된 정보를 추출하고 검색하는 데 뛰어난 **구조화된 RAG** 기능을 지원합니다. 이는 전통적인 텍스트 청크 및 임베딩 접근법에 비해 "초인적인 정밀도와 회상"을 제공합니다. -## AI 에이전트를 자기 개선 가능하게 만들기 +## AI 에이전트를 자기 개선형으로 만들기 -자기 개선 에이전트를 위한 일반적인 패턴은 **"지식 에이전트"**를 도입하는 것입니다. 이 별도의 에이전트는 사용자와 주요 에이전트 간의 대화를 관찰합니다. 그 역할은 다음과 같습니다: +자기 개선형 에이전트를 위한 일반적인 패턴은 **"지식 에이전트"**를 도입하는 것입니다. 이 별도의 에이전트는 사용자와 주요 에이전트 간의 주요 대화를 관찰합니다. 그 역할은 다음과 같습니다: -1. **유용한 정보 식별**: 대화의 일부가 일반 지식 또는 특정 사용자 선호도로 저장할 가치가 있는지 판단. +1. **가치 있는 정보 식별**: 대화의 일부가 일반 지식이나 특정 사용자 선호도로 저장할 가치가 있는지 판단. -2. **추출 및 요약**: 대화에서 필수 학습 또는 선호도를 추출하여 요약. +2. **추출 및 요약**: 대화에서 필수 학습 또는 선호도를 추출. -3. **지식 베이스에 저장**: 추출된 정보를 벡터 데이터베이스에 저장하여 나중에 검색 가능하도록 유지. +3. **지식 베이스에 저장**: 추출된 정보를 벡터 데이터베이스에 영구 저장하여 나중에 검색 가능하도록 함. -4. **미래 쿼리 증강**: 사용자가 새로운 쿼리를 시작할 때, 지식 에이전트가 관련 저장 정보를 검색하여 사용자 프롬프트에 추가하여 주요 에이전트에 중요한 맥락을 제공 (RAG와 유사). +4. **미래 쿼리 보강**: 사용자가 새로운 쿼리를 시작할 때, 지식 에이전트가 관련 저장 정보를 검색하여 사용자의 프롬프트에 추가, 주요 맥락을 주요 에이전트에 제공(RAG와 유사). ### 메모리 최적화 -• **지연 시간 관리**: 사용자 상호작용 속도를 늦추지 않기 위해, 정보가 저장 또는 검색할 가치가 있는지 빠르게 확인하기 위해 저렴하고 빠른 모델을 처음에 사용하고, 필요할 때만 더 복잡한 추출/검색 프로세스를 호출. +• **지연 시간 관리**: 사용자 상호작용 속도를 늦추지 않기 위해, 정보가 저장하거나 검색할 가치가 있는지 빠르게 확인하기 위해 더 저렴하고 빠른 모델을 처음에 사용하고, 필요할 때만 더 복잡한 추출/검색 프로세스를 호출. • **지식 베이스 유지 관리**: 성장하는 지식 베이스의 경우, 덜 자주 사용되는 정보를 "콜드 스토리지"로 이동하여 비용을 관리. -## 에이전트 메모리에 대한 추가 질문이 있나요? +## 에이전트 메모리에 대해 더 궁금한 점이 있나요? -[Azure AI Foundry Discord](https://aka.ms/ai-agents/discord)에 참여하여 다른 학습자들과 만나고, 오피스 아워에 참석하며 AI 에이전트에 대한 질문을 해결하세요. +[Azure AI Foundry Discord](https://aka.ms/ai-agents/discord)에 참여하여 다른 학습자들과 만나고, 오피스 아워에 참석하며, AI 에이전트에 대한 질문에 답을 얻으세요. --- + **면책 조항**: -이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 사용하여 번역되었습니다. 정확성을 위해 최선을 다하고 있으나, 자동 번역에는 오류나 부정확성이 포함될 수 있습니다. 원본 문서의 원어 버전이 권위 있는 출처로 간주되어야 합니다. 중요한 정보의 경우, 전문적인 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해 당사는 책임을 지지 않습니다. \ No newline at end of file +이 문서는 AI 번역 서비스 [Co-op Translator](https://github.com/Azure/co-op-translator)를 사용하여 번역되었습니다. 정확성을 위해 최선을 다하고 있지만, 자동 번역에는 오류나 부정확성이 포함될 수 있습니다. 원본 문서의 원어 버전을 권위 있는 출처로 간주해야 합니다. 중요한 정보에 대해서는 전문적인 인간 번역을 권장합니다. 이 번역 사용으로 인해 발생하는 오해나 잘못된 해석에 대해 책임을 지지 않습니다. + \ No newline at end of file diff --git a/translations/lt/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/lt/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..97b7eb3d2 --- /dev/null +++ b/translations/lt/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# AI agentų kūrimas su nuolatine atmintimi naudojant Cognee\n", + "\n", + "Šiame užrašų knygelėje demonstruojama, kaip sukurti intelektualius AI agentus su pažangiomis atminties galimybėmis naudojant [**cognee**](https://www.cognee.ai/) - atvirojo kodo AI atmintį, kuri sujungia žinių grafikus, semantinę paiešką ir sesijų valdymą, kad sukurtų kontekstą suprantančias AI sistemas.\n", + "\n", + "## 🎯 Mokymosi tikslai\n", + "\n", + "Šio mokymo pabaigoje jūs suprasite, kaip:\n", + "- **Kurti žinių grafikus, paremtus įterpimais**: Paversti nestruktūrizuotą tekstą į struktūrizuotą, užklausiamą žinių bazę\n", + "- **Įgyvendinti sesijos atmintį**: Sukurti daugiapakopius pokalbius su automatiniu konteksto išlaikymu\n", + "- **Išsaugoti pokalbius**: Pasirinktinai saugoti svarbias sąveikas ilgalaikėje atmintyje, kad būtų galima jas naudoti ateityje\n", + "- **Užklausti naudojant natūralią kalbą**: Pasiekti ir panaudoti istorinį kontekstą naujuose pokalbiuose\n", + "- **Vizualizuoti atmintį**: Tyrinėti ryšius jūsų agento žinių grafike\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Ką Sukursite\n", + "\n", + "Šiame vadove sukursime **Kodo Asistentą** su nuolatine atmintimi, kuris:\n", + "\n", + "### 1. **Žinių Bazės Kūrimas**\n", + " - Priima informaciją apie programuotojo profilį ir patirtį\n", + " - Apdoroja Python programavimo principus ir geriausias praktikas\n", + " - Saugo istorinius pokalbius tarp programuotojų ir AI asistentų\n", + "\n", + "### 2. **Sesijos Kontekstą Išlaikantys Pokalbiai**\n", + " - Išlaiko kontekstą per kelis klausimus toje pačioje sesijoje\n", + " - Automatiškai talpina kiekvieną klausimo/atsakymo porą efektyviam paieškos procesui\n", + " - Pateikia nuoseklius, kontekstinius atsakymus, remdamasis pokalbio istorija\n", + "\n", + "### 3. **Ilgalaikė Atmintis**\n", + " - Išsaugo svarbius pokalbius ilgalaikėje atmintyje\n", + " - Ištraukia svarbias atmintis iš žinių bazės ir ankstesnių sesijų, kad informuotų naujas sąveikas\n", + " - Kuria augančią žinių bazę, kuri laikui bėgant tobulėja\n", + "\n", + "### 4. **Išmanus Atminties Paieškos Mechanizmas**\n", + " - Naudoja semantinę paiešką, pagrįstą grafais, kad surastų svarbią informaciją visoje saugomoje žinių bazėje\n", + " - Filtruoja paieškas pagal duomenų pogrupius (programuotojo informacija vs. principai)\n", + " - Sujungia kelis duomenų šaltinius, kad pateiktų išsamius atsakymus\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Būtinos sąlygos ir nustatymai\n", + "\n", + "### Sistemos reikalavimai\n", + "\n", + "Prieš pradėdami, įsitikinkite, kad turite:\n", + "\n", + "1. **Python aplinka**\n", + " - Python 3.9 ar naujesnė versija\n", + " - Virtuali aplinka (rekomenduojama)\n", + " \n", + "2. **Redis talpykla** (Reikalinga sesijų valdymui)\n", + " - Vietinis Redis: `docker run -d -p 6379:6379 redis`\n", + " - Arba naudokite valdomą Redis paslaugą\n", + " \n", + "3. **LLM API prieiga**\n", + " - OpenAI API raktas arba kiti tiekėjai (žr. [dokumentaciją](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Duomenų bazės konfigūracija**\n", + " - Pagal numatymą konfigūracija nereikalinga. Cognee naudoja failų pagrindu veikiančias duomenų bazes (LanceDB ir Kuzu)\n", + " - Pasirinktinai galite nustatyti Azure AI Search kaip vektorinę saugyklą (žr. [dokumentaciją](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Aplinkos konfigūracija\n", + "\n", + "Sukurkite `.env` failą savo projekto kataloge su šiais kintamaisiais:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Supratimas apie Cognee atminties architektūrą\n", + "\n", + "### Kaip veikia Cognee\n", + "\n", + "Cognee siūlo pažangią atminties sistemą, kuri viršija paprastą raktų-reikšmių saugojimą:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Pagrindiniai komponentai:\n", + "\n", + "1. **Žinių grafas**: Saugo objektus, ryšius ir semantinius ryšius\n", + "2. **Vektoriniai įterpiniai**: Leidžia atlikti semantinę paiešką visoje saugomoje informacijoje\n", + "3. **Sesijos talpykla**: Išlaiko pokalbio kontekstą sesijos metu ir tarp jų\n", + "4. **NodeSets**: Organizuoja duomenis į logines kategorijas, kad būtų lengviau juos pasiekti\n", + "\n", + "### Atminties tipai šiame vadove:\n", + "\n", + "- **Nuolatinė atmintis**: Ilgalaikis saugojimas žinių grafe\n", + "- **Sesijos atmintis**: Laikinas pokalbio kontekstas Redis talpykloje\n", + "- **Semantinė atmintis**: Vektorinė panašumo paieška visoje informacijoje\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Įdiegti reikalingus paketus\n", + "\n", + "Įdiekite Cognee su Redis palaikymu sesijų valdymui:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Inicializuokite aplinką ir įkelkite bibliotekas\n", + "\n", + "Įsitikinkite:\n", + "1. Redis veikia (pvz., per Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Aplinkos kintamieji nustatyti prieš importuojant talpyklos modulius\n", + "3. Jei reikia, paleiskite branduolį iš naujo ir vykdykite langelius iš eilės\n", + "\n", + "Šiame langelyje bus:\n", + "1. Įkelti aplinkos kintamieji iš `.env`\n", + "2. Sukonfigūruotas Cognee su jūsų LLM nustatymais\n", + "3. Įjungta talpykla sesijos valdymui\n", + "4. Patikrinta, ar visi komponentai tinkamai prijungti\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Konfigūruoti Saugojimo Katalogus\n", + "\n", + "Cognee naudoja du atskirus katalogus savo veiklai:\n", + "- **Duomenų Šaknis**: Saugo įkeltus dokumentus ir apdorotus duomenis\n", + "- **Sistemos Šaknis**: Talpina žinių grafo duomenų bazę ir sistemos metaduomenis\n", + "\n", + "Šiame vadove sukursime atskirus katalogus taip:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Atstatyti atminties būseną\n", + "\n", + "Prieš pradėdami kurti mūsų atminties sistemą, įsitikinkime, kad pradedame nuo švaraus lapo.\n", + "\n", + "> 💡 **Patarimas**: Galite praleisti šį žingsnį, jei norite išsaugoti esamas atmintis iš ankstesnių paleidimų, kai vėliau naudosite šį užrašų knygelę.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 1 dalis: Žinių bazės kūrimas\n", + "\n", + "### Duomenų šaltiniai mūsų kūrėjų asistentui\n", + "\n", + "Sukursime išsamią žinių bazę, naudodami trijų tipų duomenis:\n", + "\n", + "1. **Kūrėjo profilis**: Asmeninė patirtis ir techninis pagrindas\n", + "2. **Geriausios Python praktikos**: Python filosofija su praktiniais patarimais\n", + "3. **Istoriniai pokalbiai**: Ankstesni klausimų-atsakymų seansai tarp kūrėjų ir AI asistentų\n", + "\n", + "Ši įvairi duomenų bazė leidžia mūsų agentui:\n", + "- Suprasti vartotojo techninį kontekstą\n", + "- Taikyti geriausias praktikas rekomendacijose\n", + "- Mokytis iš ankstesnių sėkmingų sąveikų\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Apdoroti duomenis į žinių grafą\n", + "\n", + "Dabar paversime mūsų neapdorotą tekstą į struktūrizuotą atmintį. Šis procesas:\n", + "\n", + "1. **Prideda duomenis į NodeSets**: Organizuojama informacija į logines kategorijas\n", + " - `developer_data`: Kūrėjo profilis ir pokalbiai\n", + " - `principles_data`: Geriausios Python praktikos ir gairės\n", + "\n", + "2. **Vykdo Cognify Pipeline**: Išskiria esybes, ryšius ir kuria įterpimus\n", + " - Identifikuoja pagrindines sąvokas\n", + " - Kuria semantinius ryšius tarp susijusios informacijos\n", + " - Generuoja vektorių įterpimus\n", + "\n", + "Tai gali užtrukti kelias akimirkas, kol LLM apdoros tekstą ir sukurs grafo struktūrą:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Vizualizuokite žinių grafą\n", + "\n", + "Pažvelkime į mūsų žinių grafo struktūrą. Vizualizacija parodo:\n", + "- **Mazgus**: Iš teksto išgautus objektus (sąvokas, technologijas, žmones)\n", + "- **Kraštines**: Ryšius ir sąsajas tarp objektų\n", + "- **Klasterius**: Susijusias sąvokas, sugrupuotas pagal semantinį panašumą\n", + "\n", + "Atidarykite sugeneruotą HTML failą savo naršyklėje, kad interaktyviai tyrinėtumėte grafą:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Praturtinkite atmintį su Memify\n", + "\n", + "Funkcija `memify()` analizuoja žinių grafą ir generuoja išmanias taisykles apie duomenis. Šis procesas:\n", + "- Nustato šablonus ir geriausias praktikas\n", + "- Sukuria veiksmingas gaires, remiantis turiniu\n", + "- Nustato ryšius tarp skirtingų žinių sričių\n", + "\n", + "Šios taisyklės padeda agentui priimti labiau pagrįstus sprendimus atsakant į klausimus. Sukūrus antrą vizualizaciją, galite palyginti, kaip grafas tampa tankesnis po praturtinimo.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 2 dalis: Išmanusis atminties paieškos mechanizmas\n", + "\n", + "### Demonstracija 1: Žinių integracija iš skirtingų dokumentų\n", + "\n", + "Dabar, kai mūsų žinių grafas sukurtas, išbandykime, kaip Cognee sujungia informaciją iš kelių šaltinių, kad atsakytų į sudėtingus klausimus.\n", + "\n", + "Pirmasis užklausos pavyzdys parodo:\n", + "- **Semantinį supratimą**: Suranda susijusias sąvokas, net jei jos nėra aiškiai paminėtos\n", + "- **Kryžminį susiejimą**: Sujungia kūrėjo profilį su Python principais\n", + "- **Kontekstinį mąstymą**: Taiko geriausią praktiką konkrečiuose įgyvendinimuose\n", + "\n", + "### Demonstracija 2: Filtruota paieška su NodeSets\n", + "\n", + "Antrasis užklausos pavyzdys parodo, kaip nukreipti paiešką į konkrečius žinių grafo pogrupius:\n", + "- Naudoja `node_name` parametrą, kad ieškotų tik `principles_data`\n", + "- Pateikia tikslius atsakymus iš konkrečios žinių srities\n", + "- Naudinga, kai reikia informacijos iš tam tikros srities\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 3 dalis: Sesijos valdymo nustatymas\n", + "\n", + "### Pokalbio atminties įgalinimas\n", + "\n", + "Sesijos valdymas yra labai svarbus, siekiant išlaikyti kontekstą per kelias sąveikas. Čia mes:\n", + "\n", + "1. **Inicijuosime naudotojo kontekstą**: Sukursime arba atkursime naudotojo profilį sesijos stebėjimui\n", + "2. **Sukonfigūruosime talpyklos variklį**: Prisijungsime prie Redis, kad išsaugotume pokalbių istoriją\n", + "3. **Įgalinsime sesijos kintamuosius**: Nustatysime konteksto kintamuosius, kurie išliks tarp užklausų\n", + "\n", + "> ⚠️ **Svarbu**: Tam reikalinga veikianti Redis ir `CACHING=true` jūsų aplinkoje\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Pagalbinė funkcija: Peržiūrėti sesijos istoriją\n", + "\n", + "Ši pagalbinė funkcija leidžia mums peržiūrėti pokalbių istoriją, saugomą Redis. Ji naudinga:\n", + "- Derinant sesijos valdymą\n", + "- Tikrinant, ar pokalbiai yra talpinami\n", + "- Suprantant, kokį kontekstą agentas turi\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Sesija 1: Asinchroninio palaikymo laboratorija — Pirmas klausimas\n", + "\n", + "Pradėkite `async-support-lab` sesiją, klausdami apie telemetrijai pritaikytus asyncio modelius masyviam interneto duomenų rinkikliui. Grafas jau žino apie asyncio, aiohttp ir stebėjimo praktikas, todėl atsakymas turėtų atspindėti ankstesnius pokalbius, pritaikant atsakymą naujam klausimui.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Patikrinkite 1 sesijos atmintį po pirmo apsikeitimo\n", + "\n", + "Paleidus `show_history(session_1)` iškart po pradinio klausimo, patvirtinama, kad Cognee įrašė tiek užklausą, tiek atsakymą į Redis. Turėtumėte matyti vieną įrašą su lygiagretumo gairėmis.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Sesija 1: Tęsinys apie duomenų modelius\n", + "\n", + "Toliau klausiame: „Kada turėčiau pasirinkti dataclasses, o kada Pydantic?“ naudojant tą patį sesijos ID. Cognee turėtų sujungti Python principus su ankstesnėmis FastAPI diskusijomis, kad pateiktų subtilius patarimus—parodydama, jog kontekstas išlieka per vardinę sesiją.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Patvirtinkite, kad 1 sesijos istorijoje yra abu posūkiai\n", + "\n", + "Dar vienas `show_history(session_1)` iškvietimas turėtų parodyti du klausimų-atsakymų įrašus. Tai atitinka Mem0 laboratorijos „atminties atkūrimo“ etapą ir įrodo, kad papildomi posūkiai pratęsia tą patį pokalbio protokolą.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Sesija 2: Dizaino peržiūros gija — Nauja sesija\n", + "\n", + "Norėdami parodyti atskyrimą tarp gijų, paleidžiame `design-review-session` ir prašome pateikti žurnalų rekomendacijas incidentų peržiūroms. Nors pagrindinė žinių bazė yra ta pati, naujas sesijos ID išlaiko atskirus transkriptus.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Peržiūros sesija 2 istorija\n", + "\n", + "`show_history(session_2)` turėtų rodyti tik dizaino peržiūros užklausos/atsakymo porą. Palyginkite ją su Sesija 1, kad pamatytumėte, kaip Cognee išlaiko nepriklausomus pokalbių įrašus, tuo pačiu naudodama bendrą žinių grafiką.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Santrauka\n", + "\n", + "Sveikiname! Jūs ką tik suteikėte savo kodavimo asistentui tikrą ilgalaikės atminties sluoksnį, kurį valdo Cognee.\n", + "\n", + "Šioje pamokoje jūs paėmėte neapdorotą kūrėjų turinį (kodą, dokumentus, pokalbius) ir pavertėte jį grafu + vektorine atmintimi, kurią jūsų agentas gali ieškoti, analizuoti ir nuolat tobulinti.\n", + "\n", + "Ką išmokote\n", + "\n", + "1. **Nuo neapdoroto teksto iki AI atminties**: Kaip Cognee apdoroja nestruktūrizuotus duomenis ir paverčia juos išmaniąja, ieškoma atmintimi, naudodama kombinuotą vektorinę + žinių grafo architektūrą.\n", + "\n", + "2. **Grafo praturtinimas su memify**: Kaip peržengti bazinio grafo kūrimo ribas ir naudoti memify, kad pridėtumėte išvestinius faktus ir turtingesnius ryšius prie esamo grafo.\n", + "\n", + "3. **Įvairios paieškos strategijos**: Kaip užklausti atmintį naudojant skirtingus paieškos tipus (grafu pagrįstą klausimų-atsakymų sistemą, RAG stiliaus užbaigimą, įžvalgas, neapdorotus fragmentus, kodo paiešką ir kt.), priklausomai nuo to, ko reikia jūsų agentui.\n", + "\n", + "4. **Vizualinė analizė**: Kaip patikrinti ir derinti tai, ką sukūrė Cognee, naudojant grafo vizualizacijas ir Cognee vartotojo sąsają, kad galėtumėte realiai matyti, kaip struktūrizuotos žinios.\n", + "\n", + "5. **Sesijos konteksto atmintis**: Kaip derinti kiekvienos sesijos kontekstą su nuolatine semantine atmintimi, kad agentai galėtų prisiminti tarp sesijų, neišduodant informacijos tarp vartotojų.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Pagrindinės įžvalgos\n", + "1. Atmintis kaip žinių grafas, paremtas įterpimais\n", + "\n", + " - **Struktūrizuotas supratimas**: Cognee sujungia vektorinę saugyklą ir grafinę saugyklą, todėl jūsų duomenys yra tiek ieškomi pagal prasmę, tiek susieti ryšiais. Pagal numatytuosius nustatymus Cognee naudoja failų pagrindu veikiančias duomenų bazes (LanceDB vektorinėms, Kuzu grafinėms duomenų bazėms).\n", + "\n", + " - **Ryšių suvokimu pagrįsta paieška**: Atsakymai gali būti pagrįsti ne tik „panašiu tekstu“, bet ir tuo, kaip susiję objektai.\n", + "\n", + " - **Gyva atmintis**: Atminties sluoksnis vystosi, auga ir išlieka užklausiamas kaip vienas susietas grafas.\n", + "\n", + "2. Paieškos ir samprotavimo režimai\n", + " - **Hibridinė paieška**: paieška apjungia vektorinį panašumą, grafo struktūrą ir LLM samprotavimą – nuo žalių fragmentų paieškos iki grafo suvokimu pagrįsto klausimų atsakymo.\n", + "\n", + " - **Priderinkite režimą prie užduoties**: Naudokite užbaigimo stiliaus režimus, kai norite natūralios kalbos atsakymų, o fragmentų/santraukų/grafų režimus, kai jūsų agentui reikia žalių kontekstų arba savarankiško samprotavimo.\n", + "\n", + "3. Personalizuoti, sesijos kontekstą suvokiantys agentai\n", + " - **Sesijos kontekstas + ilgalaikė atmintis**: Cognee atskiria trumpalaikį „gijos“ kontekstą nuo ilgalaikės, vartotojo ar organizacijos lygmens atminties.\n", + "\n", + "## Realūs pritaikymai\n", + "\n", + "1. **Vertikalūs AI agentai**\n", + "\n", + " Naudokite šio užrašų knygelės modelį, kad sukurtumėte išmanius pagalbininkus, kurie remiasi Cognee kaip jų paieškos ir samprotavimo pagrindu:\n", + "\n", + "- **Kūrėjų pagalbininkai**: Kodo peržiūros, incidentų analizės ir architektūros asistentai, kurie naršo kodą, API, dizaino dokumentus ir bilietus kaip vieną atminties grafą.\n", + "\n", + "- **Klientų aptarnavimo pagalbininkai**: Pagalbos ar sėkmės agentai, kurie naudoja produktų dokumentus, DUK, CRM užrašus ir ankstesnius bilietus su grafo suvokimu pagrįsta paieška ir cituotais atsakymais.\n", + "\n", + "- **Vidiniai ekspertų pagalbininkai**: Politikos, teisės ar saugumo asistentai, kurie samprotauja remdamiesi tarpusavyje susijusiomis taisyklėmis, gairėmis ir istoriniais sprendimais, o ne atskirais PDF failais.\n", + "\n", + " Cognee aiškiai pozicionuojama kaip nuolatinė, tiksli atmintis AI agentams, suteikianti gyvą žinių grafą, kuris integruojasi už jūsų agento ir pakeičia ad hoc vektorinių saugyklų ir individualaus grafo kodo derinius.\n", + "\n", + "2. **Duomenų silosų sujungimas į vieną atmintį**\n", + "\n", + " Tas pats požiūris padeda sukurti vieningą atminties sluoksnį iš išsklaidytų šaltinių:\n", + "\n", + "- **Nuo silosų iki vieno grafo**: Įtraukite struktūrizuotus (pvz., duomenų bazes) ir nestruktūrizuotus duomenis (pvz., dokumentus, pokalbius) į vieną grafą, paremtą įterpimais, o ne atskirais indeksais kiekvienai sistemai.\n", + "\n", + "- **Kryžminis šaltinių samprotavimas su citatomis**: Vykdykite daugiapakopį samprotavimą per viską – „sujunkite“ žurnalus, metrikas ir dokumentus per grafą – ir vis tiek pateikite pagrįstus atsakymus su kilme.\n", + "\n", + "- **Žinių centrai**: Tokiose srityse kaip bankininkystė ar švietimas Cognee jau naudojama sujungti PDF failus, vidines sistemas ir programų duomenis į vieną žinių grafą su vektoriais, kad agentai galėtų atsakyti į klausimus su tiksliu, cituotu kontekstu.\n", + "\n", + "## Kiti žingsniai\n", + "\n", + "Jūs įgyvendinote pagrindinį atminties ciklą. Štai natūralūs plėtiniai, kuriuos galite išbandyti savarankiškai (žr. [Cognee dokumentaciją](https://docs.cognee.ai/) dėl detalių):\n", + "\n", + "1. **Eksperimentuokite su laiko suvokimu**: Įjunkite laiko suvokimą, kad išgautumėte įvykius ir laiko žymes iš teksto.\n", + "\n", + "2. **Įveskite ontologija pagrįstą samprotavimą**: Apibrėžkite OWL ontologiją savo sričiai. Naudokite Cognee ontologijos palaikymą, kad išgauti objektai ir ryšiai būtų pagrįsti ta schema, pagerinant grafo kokybę ir srities specifinius atsakymus.\n", + "\n", + "3. **Pridėkite grįžtamojo ryšio ciklą**: Leiskite Cognee koreguoti grafo kraštų svorius pagal tikrą vartotojų grįžtamąjį ryšį, kad paieška laikui bėgant tobulėtų, o ne liktų statiška.\n", + "\n", + "4. **Optimizuokite personalizacijai ir sesijos elgsenai**: Naudokite vartotojų ID, nuomininkus ir duomenų rinkinius, kad kiekvienas asmuo ar komanda turėtų savo vaizdą per bendrą atminties variklį.\n", + "\n", + "5. **Išplėskite iki sudėtingesnių agentų**: Prijunkite Cognee prie agentų sistemų, kad sukurtumėte daugiagentines sistemas, kurios visos dalijasi tuo pačiu atminties sluoksniu. *Microsoft Agent Framework x Cognee įskiepis netrukus pasirodys.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Atsakomybės apribojimas**: \nŠis dokumentas buvo išverstas naudojant AI vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama profesionali žmogaus vertimo paslauga. Mes neprisiimame atsakomybės už nesusipratimus ar neteisingus aiškinimus, kylančius dėl šio vertimo naudojimo.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:47:15+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "lt" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/lt/13-agent-memory/README.md b/translations/lt/13-agent-memory/README.md index 735675352..b427c6f21 100644 --- a/translations/lt/13-agent-memory/README.md +++ b/translations/lt/13-agent-memory/README.md @@ -1,44 +1,52 @@ -# Atmintis AI agentams +# Atmintis dirbtinio intelekto agentams [![Agentų atmintis](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.lt.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Kalbant apie unikalius AI agentų kūrimo privalumus, dažniausiai aptariami du dalykai: gebėjimas naudoti įrankius užduotims atlikti ir gebėjimas tobulėti laikui bėgant. Atmintis yra pagrindas kuriant savarankiškai tobulėjančius agentus, kurie gali suteikti geresnę patirtį mūsų vartotojams. +Kalbant apie unikalius dirbtinio intelekto agentų kūrimo privalumus, dažniausiai aptariami du dalykai: gebėjimas naudoti įrankius užduotims atlikti ir gebėjimas tobulėti laikui bėgant. Atmintis yra pagrindas kuriant savarankiškai tobulėjančius agentus, kurie gali suteikti geresnę patirtį mūsų vartotojams. -Šioje pamokoje aptarsime, kas yra atmintis AI agentams, kaip ją valdyti ir panaudoti mūsų programų naudai. +Šioje pamokoje aptarsime, kas yra atmintis dirbtinio intelekto agentams, kaip ją valdyti ir panaudoti mūsų programų naudai. ## Įvadas Šioje pamokoje aptarsime: -• **AI agentų atminties supratimą**: Kas yra atmintis ir kodėl ji būtina agentams. +• **Dirbtinio intelekto agentų atminties supratimas**: Kas yra atmintis ir kodėl ji būtina agentams. -• **Atminties įgyvendinimą ir saugojimą**: Praktiniai metodai, kaip pridėti atminties funkcijas AI agentams, akcentuojant trumpalaikę ir ilgalaikę atmintį. +• **Atminties įgyvendinimas ir saugojimas**: Praktiniai metodai, kaip pridėti atminties funkcijas jūsų dirbtinio intelekto agentams, akcentuojant trumpalaikę ir ilgalaikę atmintį. -• **AI agentų savarankiško tobulėjimo užtikrinimą**: Kaip atmintis leidžia agentams mokytis iš ankstesnių sąveikų ir tobulėti laikui bėgant. +• **Dirbtinio intelekto agentų savarankiškas tobulėjimas**: Kaip atmintis leidžia agentams mokytis iš ankstesnių sąveikų ir tobulėti laikui bėgant. + +## Galimos įgyvendinimo priemonės + +Šioje pamokoje pateikiami du išsamūs mokomieji užrašai: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Atminties įgyvendinimas naudojant Mem0 ir Azure AI Search su Semantic Kernel sistema. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Struktūruotos atminties įgyvendinimas naudojant Cognee, automatiškai kuriant žinių grafą, paremtą įterpimais, vizualizuojant grafą ir protingai ieškant. ## Mokymosi tikslai Baigę šią pamoką, sužinosite, kaip: -• **Atskirti įvairius AI agentų atminties tipus**, įskaitant darbinę, trumpalaikę ir ilgalaikę atmintį, taip pat specializuotas formas, tokias kaip asmenybės ir epizodinė atmintis. +• **Atskirti įvairius dirbtinio intelekto agentų atminties tipus**, įskaitant darbinę, trumpalaikę ir ilgalaikę atmintį, taip pat specializuotas formas, tokias kaip asmenybės ir epizodinė atmintis. -• **Įgyvendinti ir valdyti trumpalaikę ir ilgalaikę atmintį AI agentams**, naudojant Semantic Kernel sistemą, pasitelkiant įrankius, tokius kaip Mem0 ir Whiteboard atmintis, bei integruojant su Azure AI Search. +• **Įgyvendinti ir valdyti trumpalaikę ir ilgalaikę atmintį dirbtinio intelekto agentams** naudojant Semantic Kernel sistemą, pasitelkiant tokius įrankius kaip Mem0, Cognee, Whiteboard atmintis ir integraciją su Azure AI Search. -• **Suprasti savarankiškai tobulėjančių AI agentų principus** ir kaip tvirtos atminties valdymo sistemos prisideda prie nuolatinio mokymosi ir prisitaikymo. +• **Suprasti savarankiškai tobulėjančių dirbtinio intelekto agentų principus** ir kaip tvirtos atminties valdymo sistemos prisideda prie nuolatinio mokymosi ir prisitaikymo. -## AI agentų atminties supratimas +## Dirbtinio intelekto agentų atminties supratimas -Iš esmės, **AI agentų atmintis reiškia mechanizmus, leidžiančius jiems išsaugoti ir prisiminti informaciją**. Ši informacija gali būti specifinės detalės apie pokalbį, vartotojo pageidavimus, ankstesnius veiksmus ar net išmoktas tendencijas. +Iš esmės, **dirbtinio intelekto agentų atmintis reiškia mechanizmus, leidžiančius jiems išsaugoti ir prisiminti informaciją**. Ši informacija gali būti specifinės pokalbio detalės, vartotojo pageidavimai, ankstesni veiksmai ar net išmokti modeliai. -Be atminties AI programos dažnai yra be būsenos, tai reiškia, kad kiekviena sąveika prasideda nuo nulio. Tai sukelia pasikartojančią ir varginančią vartotojo patirtį, kai agentas „pamiršta“ ankstesnį kontekstą ar pageidavimus. +Be atminties dirbtinio intelekto programos dažnai yra be būsenos, tai reiškia, kad kiekviena sąveika prasideda nuo nulio. Tai sukelia pasikartojančią ir varginančią vartotojo patirtį, kai agentas „pamiršta“ ankstesnį kontekstą ar pageidavimus. ### Kodėl atmintis svarbi? @@ -58,17 +66,17 @@ Atminties įgyvendinimo tikslas yra padaryti agentus **patikimesnius ir pajėges #### Darbinė atmintis -Tai tarsi užrašų lapelis, kurį agentas naudoja vykdydamas vieną užduotį ar minties procesą. Ji saugo tiesioginę informaciją, reikalingą kitam žingsniui atlikti. +Tai tarsi popieriaus lapelis, kurį agentas naudoja vykdydamas vieną užduotį ar minties procesą. Ji saugo tiesioginę informaciją, reikalingą kitam žingsniui apskaičiuoti. -AI agentams darbinė atmintis dažnai fiksuoja svarbiausią informaciją iš pokalbio, net jei visas pokalbio istorija yra ilga ar sutrumpinta. Ji koncentruojasi į pagrindinių elementų, tokių kaip reikalavimai, pasiūlymai, sprendimai ir veiksmai, išskyrimą. +Dirbtinio intelekto agentams darbinė atmintis dažnai užfiksuoja svarbiausią informaciją iš pokalbio, net jei visa pokalbio istorija yra ilga ar sutrumpinta. Ji sutelkia dėmesį į pagrindinių elementų, tokių kaip reikalavimai, pasiūlymai, sprendimai ir veiksmai, išskyrimą. **Darbinės atminties pavyzdys** -Kelionių rezervavimo agentas darbinėje atmintyje gali išsaugoti vartotojo dabartinį prašymą, pavyzdžiui, „Noriu užsisakyti kelionę į Paryžių“. Šis konkretus reikalavimas laikomas agento tiesioginiame kontekste, kad būtų galima vadovauti dabartinei sąveikai. +Kelionių rezervavimo agentui darbinė atmintis gali užfiksuoti vartotojo dabartinį prašymą, pvz., „Noriu užsisakyti kelionę į Paryžių“. Šis konkretus reikalavimas laikomas agento tiesioginiame kontekste, kad būtų galima vadovautis dabartine sąveika. #### Trumpalaikė atmintis -Šis atminties tipas saugo informaciją vieno pokalbio ar sesijos metu. Tai yra dabartinio pokalbio kontekstas, leidžiantis agentui grįžti prie ankstesnių dialogo posūkių. +Šis atminties tipas išlaiko informaciją vieno pokalbio ar sesijos metu. Tai yra dabartinio pokalbio kontekstas, leidžiantis agentui grįžti prie ankstesnių dialogo posūkių. **Trumpalaikės atminties pavyzdys** @@ -76,7 +84,7 @@ Jei vartotojas klausia: „Kiek kainuotų skrydis į Paryžių?“ ir vėliau pr #### Ilgalaikė atmintis -Tai informacija, kuri išlieka per kelis pokalbius ar sesijas. Ji leidžia agentams prisiminti vartotojo pageidavimus, istorines sąveikas ar bendras žinias ilgesnį laiką. Tai svarbu personalizacijai. +Tai informacija, kuri išlieka per kelis pokalbius ar sesijas. Ji leidžia agentams prisiminti vartotojo pageidavimus, istorines sąveikas ar bendras žinias per ilgą laikotarpį. Tai svarbu personalizacijai. **Ilgalaikės atminties pavyzdys** @@ -84,7 +92,7 @@ Ilgalaikė atmintis gali saugoti, kad „Benui patinka slidinėjimas ir lauko ve #### Asmenybės atmintis -Šis specializuotas atminties tipas padeda agentui sukurti nuoseklią „asmenybę“ ar „vaidmenį“. Tai leidžia agentui prisiminti detales apie save ar savo numatytą vaidmenį, todėl sąveika tampa sklandesnė ir labiau orientuota. +Šis specializuotas atminties tipas padeda agentui sukurti nuoseklią „asmenybę“ ar „vaidmenį“. Tai leidžia agentui prisiminti detales apie save ar savo numatytą vaidmenį, kad sąveika būtų sklandesnė ir labiau orientuota. **Asmenybės atminties pavyzdys** @@ -100,61 +108,73 @@ Jei agentas bandė užsisakyti konkretų skrydį, bet nepavyko dėl vietų trūk #### Subjekto atmintis -Tai apima specifinių subjektų (pvz., žmonių, vietų ar daiktų) ir įvykių iš pokalbių išskyrimą ir prisiminimą. Tai leidžia agentui sukurti struktūrinį supratimą apie pagrindinius aptartus elementus. +Tai apima specifinių subjektų (pvz., žmonių, vietų ar daiktų) ir įvykių iš pokalbių išskyrimą ir prisiminimą. Tai leidžia agentui sukurti struktūruotą supratimą apie aptartus pagrindinius elementus. **Subjekto atminties pavyzdys** -Iš pokalbio apie ankstesnę kelionę agentas galėtų išskirti „Paryžių“, „Eifelio bokštą“ ir „vakarienę restorane Le Chat Noir“. Per būsimą sąveiką agentas galėtų prisiminti „Le Chat Noir“ ir pasiūlyti ten rezervuoti naują vakarienę. +Iš pokalbio apie ankstesnę kelionę agentas galėtų išskirti „Paryžių“, „Eifelio bokštą“ ir „vakarienę Le Chat Noir restorane“ kaip subjektus. Per būsimą sąveiką agentas galėtų prisiminti „Le Chat Noir“ ir pasiūlyti ten rezervuoti naują vakarienę. -#### Struktūrizuotas RAG (Retrieval Augmented Generation) +#### Struktūruotas RAG (Retrieval Augmented Generation) -Nors RAG yra platesnė technika, „Struktūrizuotas RAG“ išskiriamas kaip galinga atminties technologija. Jis ištraukia tankią, struktūrizuotą informaciją iš įvairių šaltinių (pokalbių, el. laiškų, vaizdų) ir naudoja ją tikslumui, prisiminimui ir atsakymų greičiui pagerinti. Skirtingai nuo klasikinio RAG, kuris remiasi tik semantiniu panašumu, Struktūrizuotas RAG dirba su informacijos struktūra. +Nors RAG yra platesnė technika, „Struktūruotas RAG“ išskiriamas kaip galinga atminties technologija. Jis ištraukia tankią, struktūruotą informaciją iš įvairių šaltinių (pokalbių, el. laiškų, vaizdų) ir naudoja ją atsakymų tikslumui, prisiminimui ir greičiui pagerinti. Skirtingai nuo klasikinio RAG, kuris remiasi tik semantiniu panašumu, Struktūruotas RAG dirba su informacijos vidine struktūra. -**Struktūrizuoto RAG pavyzdys** +**Struktūruoto RAG pavyzdys** -Užuot tiesiog atitikęs raktinius žodžius, Struktūrizuotas RAG galėtų analizuoti skrydžio detales (kelionės tikslą, datą, laiką, oro linijas) iš el. laiško ir saugoti jas struktūrizuotu būdu. Tai leidžia tiksliai užklausti, pavyzdžiui, „Kokį skrydį užsisakiau į Paryžių antradienį?“ +Užuot tik atitikęs raktinius žodžius, Struktūruotas RAG galėtų analizuoti skrydžio detales (kelionės tikslą, datą, laiką, oro linijas) iš el. laiško ir saugoti jas struktūruotu būdu. Tai leidžia tiksliai užklausoms, pvz., „Kokį skrydį užsisakiau į Paryžių antradienį?“ ## Atminties įgyvendinimas ir saugojimas -AI agentų atminties įgyvendinimas apima sistemingą **atminties valdymo** procesą, kuris apima informacijos generavimą, saugojimą, išgavimą, integravimą, atnaujinimą ir net „pamiršimą“ (arba ištrynimą). Informacijos išgavimas yra ypač svarbus aspektas. +Atminties įgyvendinimas dirbtinio intelekto agentams apima sistemingą **atminties valdymo** procesą, kuris apima informacijos generavimą, saugojimą, paiešką, integravimą, atnaujinimą ir net „pamiršimą“ (arba ištrynimą). Paieška yra ypač svarbus aspektas. ### Specializuoti atminties įrankiai -Vienas iš būdų saugoti ir valdyti agentų atmintį yra naudoti specializuotus įrankius, tokius kaip Mem0. Mem0 veikia kaip nuolatinis atminties sluoksnis, leidžiantis agentams prisiminti svarbias sąveikas, saugoti vartotojo pageidavimus ir faktinį kontekstą bei mokytis iš sėkmių ir nesėkmių laikui bėgant. Idėja yra ta, kad agentai be būsenos tampa būseniniais. +#### Mem0 + +Vienas iš būdų saugoti ir valdyti agentų atmintį yra naudoti specializuotus įrankius, tokius kaip Mem0. Mem0 veikia kaip nuolatinis atminties sluoksnis, leidžiantis agentams prisiminti svarbias sąveikas, saugoti vartotojo pageidavimus ir faktinį kontekstą bei mokytis iš sėkmių ir nesėkmių laikui bėgant. Idėja yra ta, kad be būsenos agentai tampa būseniniais. + +Jis veikia per **dviejų etapų atminties vamzdyną: ištraukimas ir atnaujinimas**. Pirma, pranešimai, pridėti prie agento gijos, siunčiami į Mem0 paslaugą, kuri naudoja didelį kalbos modelį (LLM), kad apibendrintų pokalbio istoriją ir ištrauktų naujas atmintis. Vėliau LLM valdomas atnaujinimo etapas nustato, ar pridėti, modifikuoti ar ištrinti šias atmintis, saugant jas hibridiniame duomenų saugykloje, kuri gali apimti vektorių, grafų ir raktų-reikšmių duomenų bazes. Ši sistema taip pat palaiko įvairius atminties tipus ir gali įtraukti grafų atmintį, skirtą valdyti ryšius tarp subjektų. + +#### Cognee + +Kitas galingas požiūris yra naudoti **Cognee**, atvirojo kodo semantinę atmintį dirbtinio intelekto agentams, kuri transformuoja struktūruotus ir nestruktūruotus duomenis į užklausiamus žinių grafus, paremtus įterpimais. Cognee siūlo **dvigubos saugyklos architektūrą**, derinančią vektorinę panašumo paiešką su grafų ryšiais, leidžiančią agentams suprasti ne tik kokia informacija yra panaši, bet ir kaip sąvokos tarpusavyje susijusios. + +Jis puikiai tinka **hibridinei paieškai**, kuri sujungia vektorinį panašumą, grafų struktūrą ir LLM samprotavimus – nuo žalių fragmentų paieškos iki grafų suvokimo klausimų atsakymo. Sistema palaiko **gyvą atmintį**, kuri vystosi ir auga, išliekant užklausiamai kaip vienas susietas grafas, palaikantis tiek trumpalaikį sesijos kontekstą, tiek ilgalaikę nuolatinę atmintį. -Jis veikia per **dviejų etapų atminties procesą: išgavimą ir atnaujinimą**. Pirma, pranešimai, pridėti prie agento gijos, siunčiami į Mem0 paslaugą, kuri naudoja didelio masto kalbos modelį (LLM), kad apibendrintų pokalbio istoriją ir išgautų naujus prisiminimus. Vėliau LLM valdomas atnaujinimo etapas nustato, ar pridėti, modifikuoti ar ištrinti šiuos prisiminimus, saugodamas juos hibridiniame duomenų saugykloje, kuri gali apimti vektorių, grafų ir raktų-reikšmių duomenų bazes. Ši sistema taip pat palaiko įvairius atminties tipus ir gali įtraukti grafų atmintį, skirtą valdyti ryšius tarp subjektų. +Cognee mokomasis užrašas ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) demonstruoja šio vieningo atminties sluoksnio kūrimą, pateikiant praktinius pavyzdžius, kaip įvesti įvairius duomenų šaltinius, vizualizuoti žinių grafą ir užklausti naudojant skirtingas paieškos strategijas, pritaikytas konkretiems agentų poreikiams. -### Atminties saugojimas naudojant RAG +### Atminties saugojimas su RAG -Be specializuotų atminties įrankių, tokių kaip Mem0, galite pasinaudoti patikimomis paieškos paslaugomis, tokiomis kaip **Azure AI Search**, kaip pagrindu atminties saugojimui ir išgavimui, ypač struktūrizuotam RAG. +Be specializuotų atminties įrankių, tokių kaip Mem0, galite pasinaudoti patikimomis paieškos paslaugomis, tokiomis kaip **Azure AI Search**, kaip pagrindu atmintims saugoti ir ieškoti, ypač struktūruotam RAG. -Tai leidžia pagrįsti agento atsakymus savo duomenimis, užtikrinant aktualesnius ir tikslesnius atsakymus. Azure AI Search gali būti naudojamas vartotojo specifinių kelionių prisiminimų, produktų katalogų ar bet kokių kitų specifinių žinių saugojimui. +Tai leidžia pagrįsti agento atsakymus jūsų pačių duomenimis, užtikrinant labiau tinkamus ir tikslius atsakymus. Azure AI Search gali būti naudojama vartotojo specifinėms kelionių atmintims, produktų katalogams ar bet kokioms kitoms specifinėms žinioms saugoti. -Azure AI Search palaiko tokias funkcijas kaip **Struktūrizuotas RAG**, kuris puikiai ištraukia ir išgauna tankią, struktūrizuotą informaciją iš didelių duomenų rinkinių, tokių kaip pokalbių istorijos, el. laiškai ar net vaizdai. Tai suteikia „antžmogišką tikslumą ir prisiminimą“, palyginti su tradiciniais teksto skaidymo ir įterpimo metodais. +Azure AI Search palaiko tokias funkcijas kaip **Struktūruotas RAG**, kuris puikiai tinka tankios, struktūruotos informacijos iš didelių duomenų rinkinių, pvz., pokalbių istorijų, el. laiškų ar net vaizdų, ištraukimo ir paieškos. Tai suteikia „antžmogišką tikslumą ir prisiminimą“, palyginti su tradiciniais teksto fragmentų ir įterpimų metodais. -## AI agentų savarankiško tobulėjimo užtikrinimas +## Dirbtinio intelekto agentų savarankiškas tobulėjimas Dažnas savarankiškai tobulėjančių agentų modelis apima **„žinių agento“** įvedimą. Šis atskiras agentas stebi pagrindinį pokalbį tarp vartotojo ir pagrindinio agento. Jo vaidmuo yra: -1. **Nustatyti vertingą informaciją**: Nustatyti, ar kuri nors pokalbio dalis verta išsaugoti kaip bendras žinias ar specifinį vartotojo pageidavimą. +1. **Identifikuoti vertingą informaciją**: Nustatyti, ar bet kuri pokalbio dalis verta išsaugoti kaip bendras žinias ar specifinį vartotojo pageidavimą. -2. **Išgauti ir apibendrinti**: Išskirti esminę mokymosi ar pageidavimų informaciją iš pokalbio. +2. **Ištraukti ir apibendrinti**: Išskirti esminį mokymąsi ar pageidavimą iš pokalbio. -3. **Saugojimas žinių bazėje**: Išgautą informaciją išsaugoti, dažnai vektorinėje duomenų bazėje, kad ją būtų galima vėliau išgauti. +3. **Saugojimas žinių bazėje**: Išsaugoti šią ištrauktą informaciją, dažnai vektorinėje duomenų bazėje, kad ją būtų galima vėliau rasti. -4. **Papildyti būsimus užklausimus**: Kai vartotojas inicijuoja naują užklausą, žinių agentas išgauna atitinkamą išsaugotą informaciją ir prideda ją prie vartotojo užklausos, suteikdamas pagrindiniam agentui svarbų kontekstą (panašiai kaip RAG). +4. **Papildyti būsimus užklausimus**: Kai vartotojas inicijuoja naują užklausą, žinių agentas suranda atitinkamą išsaugotą informaciją ir prideda ją prie vartotojo užklausos, suteikdamas pagrindinį kontekstą pagrindiniam agentui (panašiai kaip RAG). ### Atminties optimizavimas -• **Vėlavimo valdymas**: Siekiant išvengti vartotojo sąveikos sulėtėjimo, iš pradžių galima naudoti pigesnį, greitesnį modelį, kad greitai patikrintų, ar informacija verta saugojimo ar išgavimo, sudėtingesnį išgavimo/saugojimo procesą įjungiant tik prireikus. +• **Vėlavimo valdymas**: Kad vartotojo sąveika nebūtų sulėtinta, pigesnis, greitesnis modelis gali būti naudojamas iš pradžių greitai patikrinti, ar informacija verta saugoti ar ieškoti, sudėtingesnį ištraukimo/paieškos procesą įjungiant tik tada, kai būtina. • **Žinių bazės priežiūra**: Augančiai žinių bazei rečiau naudojama informacija gali būti perkelta į „šaltą saugyklą“, kad būtų valdomos išlaidos. ## Turite daugiau klausimų apie agentų atmintį? -Prisijunkite prie [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord), kad susitiktumėte su kitais besimokančiais, dalyvautumėte konsultacijose ir gautumėte atsakymus į savo klausimus apie AI agentus. +Prisijunkite prie [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord), kad susitiktumėte su kitais besimokančiais, dalyvautumėte konsultacijų valandose ir gautumėte atsakymus į --- + **Atsakomybės apribojimas**: -Šis dokumentas buvo išverstas naudojant dirbtinio intelekto vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, atkreipkite dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Dėl svarbios informacijos rekomenduojama profesionali žmogaus vertimo paslauga. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus aiškinimus, kylančius dėl šio vertimo naudojimo. \ No newline at end of file +Šis dokumentas buvo išverstas naudojant AI vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, prašome atkreipti dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Dėl svarbios informacijos rekomenduojama profesionali žmogaus vertimo paslauga. Mes neprisiimame atsakomybės už nesusipratimus ar neteisingus interpretavimus, atsiradusius naudojant šį vertimą. + \ No newline at end of file diff --git a/translations/ml/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/ml/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..c20ccf1a4 --- /dev/null +++ b/translations/ml/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# കോഗ്നി ഉപയോഗിച്ച് സ്ഥിരമായ മെമ്മറിയുള്ള AI ഏജന്റുമാരെ നിർമ്മിക്കുക\n", + "\n", + "ഈ നോട്ട്ബുക്ക്, [**കോഗ്നി**](https://www.cognee.ai/) ഉപയോഗിച്ച് മെമ്മറി ശേഷിയുള്ള ബുദ്ധിമാനായ AI ഏജന്റുമാരെ എങ്ങനെ നിർമ്മിക്കാമെന്ന് കാണിക്കുന്നു - അറിവ് ഗ്രാഫുകൾ, സെമാന്റിക് തിരച്ചിൽ, സെഷൻ മാനേജ്മെന്റ് എന്നിവ സംയോജിപ്പിച്ച് കോൺടെക്സ്റ്റ്-അവേർ AI സിസ്റ്റങ്ങൾ സൃഷ്ടിക്കുന്ന ഒരു ഓപ്പൺ സോഴ്‌സ് AI മെമ്മറി.\n", + "\n", + "## 🎯 പഠന ലക്ഷ്യങ്ങൾ\n", + "\n", + "ഈ ട്യൂട്ടോറിയൽ അവസാനിക്കുമ്പോൾ, നിങ്ങൾക്ക് താഴെ പറയുന്നവ മനസ്സിലാക്കാൻ കഴിയും:\n", + "- **എംബെഡിംഗുകൾ പിന്തുണയ്ക്കുന്ന അറിവ് ഗ്രാഫുകൾ നിർമ്മിക്കുക**: ഘടനയില്ലാത്ത ടെക്സ്റ്റ് ഘടനയുള്ള, ചോദ്യം ചെയ്യാവുന്ന അറിവായി മാറ്റുക\n", + "- **സെഷൻ മെമ്മറി നടപ്പിലാക്കുക**: സ്വയമേവ കോൺടെക്സ്റ്റ് നിലനിർത്തുന്ന മൾട്ടി-ടേൺ സംഭാഷണങ്ങൾ സൃഷ്ടിക്കുക\n", + "- **സംഭാഷണങ്ങൾ നിലനിർത്തുക**: ഭാവിയിൽ റഫറൻസിനായി പ്രധാനപ്പെട്ട ഇടപെടലുകൾ ദീർഘകാല മെമ്മറിയിൽ സൂക്ഷിക്കുക\n", + "- **നാചുറൽ ലാംഗ്വേജ് ഉപയോഗിച്ച് ചോദ്യം ചെയ്യുക**: പുതിയ സംഭാഷണങ്ങളിൽ ചരിത്ര കോൺടെക്സ്റ്റ് ആക്സസ് ചെയ്ത് പ്രയോജനപ്പെടുത്തുക\n", + "- **മെമ്മറി ദൃശ്യവൽക്കരിക്കുക**: നിങ്ങളുടെ ഏജന്റിന്റെ അറിവ് ഗ്രാഫിലെ ബന്ധങ്ങൾ പരിശോധിക്കുക\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ നിങ്ങൾ നിർമ്മിക്കുന്നതെന്താണ്\n", + "\n", + "ഈ ട്യൂട്ടോറിയലിൽ, സ്ഥിരമായ മെമ്മറിയുള്ള ഒരു **കോഡിംഗ് അസിസ്റ്റന്റ്** നിർമ്മിക്കും, ഇത്:\n", + "\n", + "### 1. **ജ്ഞാന അടിസ്ഥാന നിർമ്മാണം**\n", + " - ഡെവലപ്പർ പ്രൊഫൈൽ, വിദഗ്ധത വിവരങ്ങൾ ഉൾക്കൊള്ളുന്നു\n", + " - പൈത്തൺ പ്രോഗ്രാമിംഗ് തത്വങ്ങളും മികച്ച രീതികളും പ്രോസസ്സ് ചെയ്യുന്നു\n", + " - ഡെവലപ്പർമാരും AI അസിസ്റ്റന്റുകളും തമ്മിലുള്ള ചരിത്ര സംഭാഷണങ്ങൾ സംഭരിക്കുന്നു\n", + "\n", + "### 2. **സെഷൻ-അവബോധമുള്ള സംഭാഷണങ്ങൾ**\n", + " - ഒരേ സെഷനിലെ നിരവധി ചോദ്യങ്ങളിൽ പ്ര_CONTEXT_ നിലനിർത്തുന്നു\n", + " - ഓരോ ചോദ്യ/ഉത്തരം ജോഡിയും സ്വയം കാഷ് ചെയ്യുന്നു, കാര്യക്ഷമമായ തിരച്ചിലിനായി\n", + " - സംഭാഷണ ചരിത്രത്തെ അടിസ്ഥാനമാക്കി സുസംഗതമായ, പ്ര_CONTEXT_ ഉത്തരം നൽകുന്നു\n", + "\n", + "### 3. **ദീർഘകാല മെമ്മറി**\n", + " - പ്രധാനപ്പെട്ട സംഭാഷണങ്ങൾ ദീർഘകാല മെമ്മറിയിൽ നിലനിർത്തുന്നു\n", + " - പുതിയ ഇടപെടലുകൾക്ക് അറിവ് നൽകാൻ ജ്ഞാന അടിസ്ഥാനത്തിൽ നിന്നും പഴയ സെഷനുകളിൽ നിന്നും അനുയോജ്യമായ ഓർമ്മകൾ തിരികെ കൊണ്ടുവരുന്നു\n", + " - സമയം കഴിഞ്ഞ് മെച്ചപ്പെടുന്ന ഒരു വളരുന്ന ജ്ഞാന അടിസ്ഥാനം നിർമ്മിക്കുന്നു\n", + "\n", + "### 4. **ബുദ്ധിമാനായ മെമ്മറി തിരച്ചിൽ**\n", + " - സംഭരിച്ചിട്ടുള്ള എല്ലാ അറിവുകളിലും അനുയോജ്യമായ വിവരങ്ങൾ കണ്ടെത്താൻ ഗ്രാഫ്-അവബോധമുള്ള സെമാന്റിക് തിരച്ചിൽ ഉപയോഗിക്കുന്നു\n", + " - ഡാറ്റാ ഉപഗ്രൂപ്പുകൾ (ഡെവലപ്പർ വിവരങ്ങൾ vs. തത്വങ്ങൾ) പ്രകാരം തിരച്ചിൽ ഫിൽട്ടർ ചെയ്യുന്നു\n", + " - സമഗ്രമായ ഉത്തരം നൽകാൻ നിരവധി ഡാറ്റാ ഉറവിടങ്ങൾ സംയോജിപ്പിക്കുന്നു\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 മുൻകൂർ ആവശ്യങ്ങളും ക്രമീകരണവും\n", + "\n", + "### സിസ്റ്റം ആവശ്യകതകൾ\n", + "\n", + "തുടങ്ങുന്നതിന് മുമ്പ്, നിങ്ങൾക്ക് താഴെപ്പറയുന്നവ ഉറപ്പാക്കണം:\n", + "\n", + "1. **Python പരിസ്ഥിതി**\n", + " - Python 3.9 അല്ലെങ്കിൽ അതിനുമുകളിലുള്ള പതിപ്പ്\n", + " - വെർച്വൽ എൻവയോൺമെന്റ് (ശുപാർശ ചെയ്യുന്നു)\n", + " \n", + "2. **Redis കാഷെ** (സെഷൻ മാനേജ്മെന്റിനായി ആവശ്യമാണ്)\n", + " - ലോക്കൽ Redis: `docker run -d -p 6379:6379 redis`\n", + " - അല്ലെങ്കിൽ ഒരു മാനേജ്ഡ് Redis സേവനം ഉപയോഗിക്കുക\n", + " \n", + "3. **LLM API ആക്സസ്**\n", + " - OpenAI API കീ അല്ലെങ്കിൽ മറ്റ് പ്രൊവൈഡർമാർ (കൂടുതൽ വിവരങ്ങൾക്ക് [ഡോക്യുമെന്റേഷൻ](https://docs.cognee.ai/setup-configuration/llm-providers) കാണുക)\n", + "\n", + "4. **ഡാറ്റാബേസ് ക്രമീകരണം**\n", + " - ഡിഫോൾട്ടായി ഡാറ്റാബേസ് ക്രമീകരണം ആവശ്യമില്ല. Cognee ഫയൽ-ബേസ്ഡ് ഡാറ്റാബേസുകൾ (LanceDB, Kuzu) ഉപയോഗിക്കുന്നു.\n", + " - ഐച്ഛികമായി, Azure AI Search നെ ഒരു വെക്ടർ സ്റ്റോറായി ക്രമീകരിക്കാം (കൂടുതൽ വിവരങ്ങൾക്ക് [ഡോക്യുമെന്റേഷൻ](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch) കാണുക)\n", + "\n", + "### പരിസ്ഥിതി ക്രമീകരണം\n", + "\n", + "നിങ്ങളുടെ പ്രോജക്റ്റ് ഡയറക്ടറിയിൽ `.env` ഫയൽ സൃഷ്ടിച്ച് താഴെപ്പറയുന്ന വേരിയബിളുകൾ ചേർക്കുക:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ കോഗ്നിയുടെ മെമ്മറി ആർക്കിടെക്ചർ മനസ്സിലാക്കുക\n", + "\n", + "### കോഗ്നി എങ്ങനെ പ്രവർത്തിക്കുന്നു\n", + "\n", + "കോഗ്നി ഒരു സങ്കീർണ്ണമായ മെമ്മറി സിസ്റ്റം നൽകുന്നു, ഇത് സാധാരണ കീ-വാല്യു സ്റ്റോറേജിനെക്കാൾ ഏറെ മുന്നിലാണ്:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### പ്രധാന ഘടകങ്ങൾ:\n", + "\n", + "1. **നോളജ് ഗ്രാഫ്**: സബ്ജക്റ്റുകൾ, ബന്ധങ്ങൾ, അർത്ഥപൂർണ്ണമായ ബന്ധങ്ങൾ എന്നിവ സംഭരിക്കുന്നു \n", + "2. **വെക്ടർ എംബെഡ്ഡിംഗ്സ്**: സംഭരിച്ചിരിക്കുന്ന എല്ലാ വിവരങ്ങളിലും അർത്ഥപൂർണ്ണമായ തിരച്ചിൽ സാധ്യമാക്കുന്നു \n", + "3. **സെഷൻ കാഷ്**: സെഷനുകൾക്കുള്ളിലും സെഷനുകൾക്കിടയിലും സംഭാഷണത്തിന്റെ പ്രാസംഗികത നിലനിർത്തുന്നു \n", + "4. **നോഡ്‌സെറ്റുകൾ**: ഡാറ്റയെ ലജിക്കൽ വിഭാഗങ്ങളായി ക്രമീകരിച്ച് ലക്ഷ്യബദ്ധമായ തിരച്ചിലിനായി ഉപയോഗിക്കുന്നു \n", + "\n", + "### ഈ ട്യൂട്ടോറിയലിലെ മെമ്മറി തരം:\n", + "\n", + "- **പേഴ്സിസ്റ്റന്റ് മെമ്മറി**: നോളജ് ഗ്രാഫിൽ ദീർഘകാല സംഭരണം \n", + "- **സെഷൻ മെമ്മറി**: Redis കാഷിൽ താൽക്കാലിക സംഭാഷണ പ്രാസംഗികത \n", + "- **സെമാന്റിക് മെമ്മറി**: എല്ലാ ഡാറ്റയിലും വെക്ടർ അടിസ്ഥാനത്തിലുള്ള സാമ്യം തിരച്ചിൽ \n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 ആവശ്യമായ പാക്കേജുകൾ ഇൻസ്റ്റാൾ ചെയ്യുക\n", + "\n", + "സെഷൻ മാനേജ്മെന്റിനായി Redis പിന്തുണയോടെ Cognee ഇൻസ്റ്റാൾ ചെയ്യുക:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 പരിസ്ഥിതി ആരംഭിക്കുക, ലൈബ്രറികൾ ലോഡ് ചെയ്യുക\n", + "\n", + "ശ്രദ്ധിക്കുക:\n", + "1. Redis പ്രവർത്തനക്ഷമമാക്കുക (ഉദാ., Docker വഴി: `docker run -d -p 6379:6379 redis`)\n", + "2. കാഷ് മോഡ്യൂളുകൾ ഇറക്കുമതി ചെയ്യുന്നതിന് മുമ്പ് പരിസ്ഥിതി വേരിയബിളുകൾ സജ്ജമാക്കുക\n", + "3. ആവശ്യമെങ്കിൽ, കർണൽ പുനരാരംഭിച്ച് സെല്ലുകൾ ക്രമത്തിൽ പ്രവർത്തിപ്പിക്കുക\n", + "\n", + "താഴെ കാണുന്ന സെൽ:\n", + "1. `.env` ഫയലിൽ നിന്ന് പരിസ്ഥിതി വേരിയബിളുകൾ ലോഡ് ചെയ്യും\n", + "2. നിങ്ങളുടെ LLM ക്രമീകരണങ്ങളോടെ Cognee കോൺഫിഗർ ചെയ്യും\n", + "3. സെഷൻ മാനേജ്മെന്റിനായി കാഷിംഗ് സജ്ജമാക്കും\n", + "4. എല്ലാ ഘടകങ്ങളും ശരിയായി ബന്ധിപ്പിച്ചിട്ടുണ്ടെന്ന് സ്ഥിരീകരിക്കും\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 സംഭരണ ഡയറക്ടറികൾ ക്രമീകരിക്കുക\n", + "\n", + "Cognee അതിന്റെ പ്രവർത്തനങ്ങൾക്ക് രണ്ട് വ്യത്യസ്ത ഡയറക്ടറികൾ ഉപയോഗിക്കുന്നു:\n", + "- **ഡാറ്റ റൂട്ട്**: ഉൾക്കൊള്ളുന്ന ഡോക്യുമെന്റുകളും പ്രോസസ്സ് ചെയ്ത ഡാറ്റയും സംഭരിക്കുന്നു\n", + "- **സിസ്റ്റം റൂട്ട്**: നോളജ് ഗ്രാഫ് ഡാറ്റാബേസും സിസ്റ്റം മെറ്റാഡാറ്റയും ഉൾക്കൊള്ളുന്നു\n", + "\n", + "ഈ ട്യൂട്ടോറിയലിനായി നമുക്ക് താഴെ പറയുന്ന പോലെ വേർതിരിച്ച ഡയറക്ടറികൾ സൃഷ്ടിക്കാം:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 മെമ്മറി സ്റ്റേറ്റ് പുനഃസജ്ജമാക്കുക\n", + "\n", + "നമ്മുടെ മെമ്മറി സിസ്റ്റം നിർമ്മിക്കാൻ തുടങ്ങുന്നതിന് മുമ്പ്, നമുക്ക് പുതിയതായ ഒരു തുടക്കം ഉറപ്പാക്കാം.\n", + "\n", + "> 💡 **ടിപ്പ്**: നിങ്ങൾ ഈ നോട്ട്ബുക്ക് പിന്നീട് ഉപയോഗിക്കുമ്പോൾ നിങ്ങളുടെ മുൻ റൺസിൽ നിന്നുള്ള നിലവിലുള്ള ഓർമ്മകൾ സംരക്ഷിക്കാൻ ആഗ്രഹിക്കുന്നുവെങ്കിൽ, ഈ ഘട്ടം ഒഴിവാക്കാം.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 ഭാഗം 1: അറിവുകളുടെ ശേഖരം നിർമ്മിക്കൽ\n", + "\n", + "### ഡാറ്റാ ഉറവിടങ്ങൾ നമ്മുടെ ഡെവലപ്പർ അസിസ്റ്റന്റിനായി\n", + "\n", + "ഒരു സമഗ്രമായ അറിവുകളുടെ ശേഖരം സൃഷ്ടിക്കാൻ നാം മൂന്ന് തരത്തിലുള്ള ഡാറ്റാ ഉറവിടങ്ങൾ ഉൾപ്പെടുത്തും:\n", + "\n", + "1. **ഡെവലപ്പർ പ്രൊഫൈൽ**: വ്യക്തിഗത വിദഗ്ധതയും സാങ്കേതിക പശ്ചാത്തലവും\n", + "2. **Python മികച്ച രീതികൾ**: Python ന്റെ Zen, പ്രായോഗിക മാർഗനിർദ്ദേശങ്ങളോടെ\n", + "3. **ചരിത്രപരമായ സംഭാഷണങ്ങൾ**: ഡെവലപ്പർമാരും AI അസിസ്റ്റന്റുകളും തമ്മിലുള്ള പൂർവ്വ Q&A സെഷനുകൾ\n", + "\n", + "ഈ വൈവിധ്യമാർന്ന ഡാറ്റാ ഉറവിടങ്ങൾ നമ്മുടെ ഏജന്റിന് സഹായകരമാകും:\n", + "- ഉപയോക്താവിന്റെ സാങ്കേതിക പശ്ചാത്തലം മനസ്സിലാക്കാൻ\n", + "- ശുപാർശകളിൽ മികച്ച രീതികൾ പ്രയോഗിക്കാൻ\n", + "- മുൻകാല വിജയകരമായ ഇടപെടലുകളിൽ നിന്ന് പഠിക്കാൻ\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 ഡാറ്റയെ നോളജ് ഗ്രാഫിലേക്ക് പ്രോസസ് ചെയ്യുക\n", + "\n", + "ഇപ്പോൾ നമുക്ക് അസംസ്കൃത ടെക്സ്റ്റ് ഒരു ഘടനാപരമായ മെമ്മറിയായി മാറ്റാം. ഈ പ്രക്രിയ:\n", + "\n", + "1. **ഡാറ്റ NodeSets-ലേക്ക് ചേർക്കുന്നു**: വിവരങ്ങളെ തർക്കശേഷമുള്ള വിഭാഗങ്ങളായി ക്രമീകരിക്കുന്നു\n", + " - `developer_data`: ഡെവലപ്പർ പ്രൊഫൈലും സംഭാഷണങ്ങളും\n", + " - `principles_data`: പൈതൺ മികച്ച പ്രാക്ടീസുകളും മാർഗ്ഗനിർദ്ദേശങ്ങളും\n", + "\n", + "2. **Cognify Pipeline പ്രവർത്തിപ്പിക്കുന്നു**: ഘടകങ്ങൾ, ബന്ധങ്ങൾ എന്നിവ എക്സ്ട്രാക്റ്റ് ചെയ്യുകയും എംബെഡ്ഡിംഗുകൾ സൃഷ്ടിക്കുകയും ചെയ്യുന്നു\n", + " - പ്രധാന ആശയങ്ങളെ തിരിച്ചറിയുന്നു\n", + " - ബന്ധപ്പെട്ട വിവരങ്ങൾ തമ്മിൽ അർത്ഥപൂർണ്ണമായ ബന്ധങ്ങൾ സൃഷ്ടിക്കുന്നു\n", + " - വെക്ടർ എംബെഡ്ഡിംഗുകൾ സൃഷ്ടിക്കുന്നു\n", + "\n", + "LLM ടെക്സ്റ്റ് പ്രോസസ് ചെയ്ത് ഗ്രാഫ് ഘടന നിർമ്മിക്കുന്നതിനാൽ ഇത് കുറച്ച് സമയം എടുക്കാം:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 നോളജ് ഗ്രാഫ് ദൃശ്യമാക്കുക\n", + "\n", + "നമ്മുടെ നോളജ് ഗ്രാഫിന്റെ ഘടന പരിശോധിക്കാം. ദൃശ്യവൽക്കരണം കാണിക്കുന്നു:\n", + "- **നോഡുകൾ**: ടെക്സ്റ്റിൽ നിന്ന് എക്സ്ട്രാക്റ്റ് ചെയ്ത എന്റിറ്റികൾ (ധാരണങ്ങൾ, സാങ്കേതികവിദ്യകൾ, വ്യക്തികൾ)\n", + "- **എഡ്ജുകൾ**: എന്റിറ്റികൾ തമ്മിലുള്ള ബന്ധങ്ങളും കണക്ഷനുകളും\n", + "- **ക്ലസ്റ്ററുകൾ**: അർത്ഥസാദൃശ്യമനുസരിച്ച് ഗ്രൂപ്പ് ചെയ്ത ബന്ധപ്പെട്ട ധാരണകൾ\n", + "\n", + "ഗ്രാഫ് ഇന്ററാക്ടീവ് ആയി പരിശോധിക്കാൻ സൃഷ്ടിച്ച HTML ഫയൽ ബ്രൗസറിൽ തുറക്കുക:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 മെമ്മറി സമ്പന്നമാക്കുക മെമിഫൈ ഉപയോഗിച്ച്\n", + "\n", + "`memify()` ഫംഗ്ഷൻ നോളജ് ഗ്രാഫ് വിശകലനം ചെയ്ത് ഡാറ്റയെക്കുറിച്ചുള്ള ബുദ്ധിമാനായ നിയമങ്ങൾ സൃഷ്ടിക്കുന്നു. ഈ പ്രക്രിയ:\n", + "- മാതൃകകളും മികച്ച രീതികളും തിരിച്ചറിയുന്നു\n", + "- ഉള്ളടക്കത്തെ അടിസ്ഥാനമാക്കി പ്രായോഗിക മാർഗനിർദ്ദേശങ്ങൾ സൃഷ്ടിക്കുന്നു\n", + "- വ്യത്യസ്ത നോളജ് മേഖലകളുടെ ഇടയിൽ ബന്ധങ്ങൾ സ്ഥാപിക്കുന്നു\n", + "\n", + "ഈ നിയമങ്ങൾ ഏജന്റിന് ചോദ്യങ്ങൾക്ക് ഉത്തരം നൽകുമ്പോൾ കൂടുതൽ ബോധപൂർണ്ണമായ തീരുമാനങ്ങൾ എടുക്കാൻ സഹായിക്കുന്നു. രണ്ടാം ദൃശ്യവത്കരണം പിടിച്ചെടുക്കുന്നത് ഗ്രാഫ് സമ്പന്നമാക്കിയ ശേഷം എങ്ങനെ കൂടുതൽ സാന്ദ്രമാകുന്നുവെന്ന് താരതമ്യം ചെയ്യാൻ സഹായിക്കുന്നു.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 ഭാഗം 2: ബുദ്ധിമാനായ മെമ്മറി റിട്രീവൽ\n", + "\n", + "### പ്രദർശനം 1: ഡോക്യുമെന്റുകൾക്കിടയിലെ അറിവിന്റെ സംയോജനം\n", + "\n", + "ഇപ്പോൾ നമ്മുടെ നോളജ് ഗ്രാഫ് നിർമ്മിച്ചുകഴിഞ്ഞു, Cognee എങ്ങനെ പലതരം ഉറവിടങ്ങളിൽ നിന്നുള്ള വിവരങ്ങൾ സംയോജിപ്പിച്ച് സങ്കീർണ്ണമായ ചോദ്യങ്ങൾക്ക് ഉത്തരം നൽകുന്നുവെന്ന് പരിശോധിക്കാം.\n", + "\n", + "ആദ്യ ക്വറി കാണിക്കുന്നു:\n", + "- **സെമാന്റിക് മനസ്സിലാക്കൽ**: നേരിട്ട് പരാമർശിക്കാത്തതായാലും ബന്ധപ്പെട്ട ആശയങ്ങൾ കണ്ടെത്തൽ\n", + "- **ക്രോസ്-റഫറൻസിംഗ്**: ഡെവലപ്പർ പ്രൊഫൈലും Python പ്രിൻസിപ്പിളുകളും സംയോജിപ്പിക്കൽ\n", + "- **സന്ദർഭ reasoning**: മികച്ച പ്രാക്ടീസുകൾ പ്രത്യേക ഇംപ്ലിമെന്റേഷനുകളിൽ പ്രയോഗിക്കൽ\n", + "\n", + "### പ്രദർശനം 2: NodeSets ഉപയോഗിച്ച് ഫിൽട്ടർ ചെയ്ത തിരച്ചിൽ\n", + "\n", + "രണ്ടാമത്തെ ക്വറി നോളജ് ഗ്രാഫിന്റെ പ്രത്യേക ഉപസമൂഹങ്ങളെ ലക്ഷ്യമിടുന്നത് കാണിക്കുന്നു:\n", + "- `node_name` പാരാമീറ്റർ ഉപയോഗിച്ച് `principles_data`-യിൽ മാത്രം തിരയുന്നു\n", + "- ഒരു പ്രത്യേക അറിവ് മേഖലയിൽ നിന്ന് കേന്ദ്രീകൃത ഉത്തരങ്ങൾ നൽകുന്നു\n", + "- നിങ്ങൾക്ക് ഡൊമെയ്ൻ-സ്പെസിഫിക് വിവരങ്ങൾ ആവശ്യമുള്ളപ്പോൾ ഉപകാരപ്രദമാണ്\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 ഭാഗം 3: സെഷൻ മാനേജ്മെന്റ് സജ്ജീകരണം\n", + "\n", + "### സംഭാഷണ മെമ്മറി സജീവമാക്കൽ\n", + "\n", + "സെഷൻ മാനേജ്മെന്റ് പല ഇടപെടലുകളിലും സാന്ദർഭ്യം നിലനിർത്താൻ നിർണായകമാണ്. ഇവിടെ നാം ചെയ്യുന്നത്:\n", + "\n", + "1. **ഉപയോക്തൃ കോൺടെക്സ്റ്റ് ആരംഭിക്കുക**: സെഷൻ ട്രാക്കിംഗിനായി ഉപയോക്തൃ പ്രൊഫൈൽ സൃഷ്ടിക്കുക അല്ലെങ്കിൽ തിരികെ ലഭിക്കുക \n", + "2. **കാഷെ എഞ്ചിൻ ക്രമീകരിക്കുക**: സംഭാഷണ ചരിത്രം സംഭരിക്കുന്നതിന് Redis-നോട് കണക്റ്റുചെയ്യുക \n", + "3. **സെഷൻ വേരിയബിളുകൾ സജീവമാക്കുക**: ക്വറിയുകൾക്കിടയിൽ നിലനിൽക്കുന്ന കോൺടെക്സ്റ്റ് വേരിയബിളുകൾ സജ്ജമാക്കുക \n", + "\n", + "> ⚠️ **പ്രധാനമാണ്**: ഇതിന് Redis പ്രവർത്തനക്ഷമമായിരിക്കണം, കൂടാതെ നിങ്ങളുടെ പരിസ്ഥിതിയിൽ `CACHING=true` സജ്ജീകരിച്ചിരിക്കണം\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ സഹായക ഫംഗ്ഷൻ: സെഷൻ ചരിത്രം കാണുക\n", + "\n", + "Redis-ൽ സൂക്ഷിച്ചിരിക്കുന്ന സംഭാഷണ ചരിത്രം പരിശോധിക്കാൻ ഈ ഉപകരണ ഫംഗ്ഷൻ സഹായിക്കുന്നു. ഇത് ഉപയോഗപ്രദമാണ്:\n", + "- സെഷൻ മാനേജ്മെന്റ് ഡീബഗിംഗ് ചെയ്യാൻ\n", + "- സംഭാഷണങ്ങൾ കാഷ് ചെയ്യപ്പെടുന്നുണ്ടെന്ന് സ്ഥിരീകരിക്കാൻ\n", + "- ഏജന്റിന് ലഭ്യമായ സാഹചര്യങ്ങൾ മനസ്സിലാക്കാൻ\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## സെഷൻ 1: അസിങ്ക് സപ്പോർട്ട് ലാബ് — ആദ്യ ചോദ്യം\n", + "\n", + "`async-support-lab` സെഷൻ ആരംഭിച്ച് വലിയ വെബ് സ്ക്രാപ്പറിനായി ടെലിമെട്രി-ഫ്രണ്ട്ലി asyncio പാറ്റേണുകൾ ചോദിക്കുക. ഗ്രാഫ് ഇതിനകം asyncio, aiohttp, മോണിറ്ററിംഗ് പ്രാക്ടീസുകൾ എന്നിവയെക്കുറിച്ച് അറിയുന്നുണ്ട്, അതിനാൽ മറുപടി മുൻ സംഭാഷണങ്ങളെ പ്രതിഫലിപ്പിക്കുമ്പോഴും പുതിയ ചോദ്യത്തിന് അനുയോജ്യമായ രീതിയിൽ രൂപപ്പെടുത്തണം.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## ആദ്യത്തെ ചോദ്യത്തിന് ശേഷം സെഷൻ 1 മെമ്മറി പരിശോധിക്കുക\n", + "\n", + "ആദ്യ ചോദ്യത്തിന് ശേഷം `show_history(session_1)` പ്രവർത്തിപ്പിക്കുന്നത്, പ്രോംപ്റ്റും പൂർത്തിയാക്കലും Redis-ലേക്ക് എഴുതിയതായി Cognee സ്ഥിരീകരിക്കുന്നു. നിങ്ങൾ concurrency മാർഗനിർദ്ദേശത്തോടെ ഒരു എൻട്രി കാണും.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## സെഷൻ 1: ഡാറ്റ മോഡലുകൾ സംബന്ധിച്ച ഫോളോ-അപ്പ്\n", + "\n", + "അടുത്തതായി, \"എപ്പോൾ ഞാൻ dataclasses തിരഞ്ഞെടുക്കണം, എപ്പോൾ Pydantic തിരഞ്ഞെടുക്കണം?\" എന്നത് ചോദിക്കുന്നു, അതേ സെഷൻ ഐഡി ഉപയോഗിച്ച്. Python പ്രിൻസിപ്പിളുകളും മുൻ FastAPI സംഭാഷണങ്ങളും ചേർത്ത് കോഗ്നി വിശദമായ ഉപദേശം നൽകണം—ഒരു നാമകരിച്ച സെഷനിൽ പ്രാസംഗികത തുടർച്ചയായി നിലനിൽക്കുന്നുവെന്ന് തെളിയിക്കുന്നതിനായി.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## സെഷൻ 1 ചരിത്രത്തിൽ രണ്ട് ടേൺസും ഉൾപ്പെടുന്നുണ്ടെന്ന് സ്ഥിരീകരിക്കുക\n", + "\n", + "മറ്റൊരു `show_history(session_1)` കോൾ രണ്ട് ചോദ്യോത്തരങ്ങൾ ഉള്ള എൻട്രികൾ വെളിപ്പെടുത്തണം. ഇത് Mem0 ലാബിന്റെ \"മെമ്മറി റീപ്ലേ\" ഘട്ടവുമായി പൊരുത്തപ്പെടുകയും അധിക ടേൺസ് അതേ ട്രാൻസ്ക്രിപ്റ്റ് നീട്ടുന്നതായി തെളിയിക്കുകയും ചെയ്യുന്നു.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## സെഷൻ 2: ഡിസൈൻ റിവ്യൂ ത്രെഡ് — പുതിയ സെഷൻ\n", + "\n", + "ത്രെഡുകൾ തമ്മിലുള്ള വേർതിരിവ് കാണിക്കാൻ, `design-review-session` ആരംഭിച്ച് സംഭവ റിവ്യൂകൾക്കുള്ള ലോഗിംഗ് മാർഗ്ഗനിർദ്ദേശങ്ങൾ ചോദിക്കുന്നു. അടിസ്ഥാന അറിവ് ഒരേതാണെങ്കിലും, പുതിയ സെഷൻ ഐഡി ട്രാൻസ്ക്രിപ്റ്റുകൾ വേർതിരിച്ച് സൂക്ഷിക്കുന്നു.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## സെഷൻ 2 ചരിത്രം അവലോകനം\n", + "\n", + "`show_history(session_2)` ഡിസൈൻ-റിവ്യൂ പ്രോംപ്റ്റ്/റിസ്പോൺസ് ജോഡികളേയും മാത്രം ലിസ്റ്റ് ചെയ്യണം. സെഷൻ 1-നൊപ്പം താരതമ്യം ചെയ്ത്, കോഗ്നീ എങ്ങനെ സ്വതന്ത്രമായ ട്രാൻസ്ക്രിപ്റ്റുകൾ സൂക്ഷിക്കുമ്പോഴും പങ്കിടുന്ന നോളജ് ഗ്രാഫ് പുനരുപയോഗിക്കുന്നുവെന്ന് വ്യക്തമാക്കുക.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## സംഗ്രഹം\n", + "\n", + "അഭിനന്ദനങ്ങൾ! നിങ്ങൾ നിങ്ങളുടെ കോഡിംഗ് അസിസ്റ്റന്റിന് Cognee ഉപയോഗിച്ച് ഒരു യഥാർത്ഥ ദീർഘകാല മെമ്മറി ലെയർ നൽകിയിരിക്കുന്നു.\n", + "\n", + "ഈ ട്യൂട്ടോറിയലിൽ, നിങ്ങൾ അസംസ്കൃത ഡെവലപ്പർ ഉള്ളടക്കം (കോഡ്, ഡോക്യുമെന്റുകൾ, ചാറ്റുകൾ) എടുത്ത്, അത് ഒരു ഗ്രാഫ് + വെക്റ്റർ മെമ്മറിയായി മാറ്റി, നിങ്ങളുടെ ഏജന്റ് തിരയാനും, വിശകലനം ചെയ്യാനും, തുടർച്ചയായി മെച്ചപ്പെടുത്താനും കഴിയും.\n", + "\n", + "നിങ്ങൾ പഠിച്ചതെന്താണ്\n", + "\n", + "1. **അസംസ്കൃത ടെക്സ്റ്റിൽ നിന്ന് AI മെമ്മറിയിലേക്ക്**: Cognee എങ്ങനെ അസംസ്കൃത ഡാറ്റ സ്വീകരിച്ച്, വെക്റ്റർ + നോളജ് ഗ്രാഫ് ആർക്കിടെക്ചർ ഉപയോഗിച്ച് ബുദ്ധിമാനായ, തിരയാവുന്ന മെമ്മറിയാക്കി മാറ്റുന്നു എന്ന്.\n", + "\n", + "2. **മെമിഫൈ ഉപയോഗിച്ച് ഗ്രാഫ് സമ്പുഷ്ടീകരണം**: അടിസ്ഥാന ഗ്രാഫ് സൃഷ്ടിക്കലിന് മുകളിലേക്ക് പോയി, നിലവിലുള്ള ഗ്രാഫിൽ നിന്ന് വ്യുത്പന്നമായ വസ്തുതകളും സമ്പന്നമായ ബന്ധങ്ങളും ചേർക്കാൻ മെമിഫൈ എങ്ങനെ ഉപയോഗിക്കാം എന്ന്.\n", + "\n", + "3. **വിവിധ തിരയൽ തന്ത്രങ്ങൾ**: ഏജന്റിന് ആവശ്യമുള്ളതനുസരിച്ച് വ്യത്യസ്ത തിരയൽ രീതികൾ (ഗ്രാഫ്-അവേർ Q&A, RAG-സ്റ്റൈൽ പൂർത്തീകരണം, ഇൻസൈറ്റുകൾ, അസംസ്കൃത ചങ്കുകൾ, കോഡ് തിരയൽ മുതലായവ) ഉപയോഗിച്ച് മെമ്മറി എങ്ങനെ ചോദ്യം ചെയ്യാം എന്ന്.\n", + "\n", + "4. **ദൃശ്യപരമായ പര്യവേക്ഷണം**: ഗ്രാഫ് ദൃശ്യവൽക്കരണങ്ങളും Cognee UIയും ഉപയോഗിച്ച് Cognee നിർമ്മിച്ചതെന്താണെന്ന് പരിശോധിക്കുകയും ഡീബഗ് ചെയ്യുകയും ചെയ്യുന്നത്, അറിവ് എങ്ങനെ ഘടനയുള്ളതാണെന്ന് നിങ്ങൾക്ക് കാണാൻ കഴിയുന്ന വിധത്തിൽ.\n", + "\n", + "5. **സെഷൻ-അവേർ മെമ്മറി**: ഓരോ സെഷൻ കോണ്ടെക്സ്റ്റും സ്ഥിരമായ സെമാന്റിക് മെമ്മറിയും സംയോജിപ്പിച്ച്, ഏജന്റുകൾക്ക് ഉപയോക്താക്കൾക്കിടയിൽ വിവര ചോർച്ചയില്ലാതെ റൺസുകൾക്കിടയിൽ ഓർക്കാൻ കഴിയുന്ന വിധം.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## പ്രധാനപ്പെട്ട കാര്യങ്ങൾ\n", + "1. എംബഡിംഗുകൾ പിന്തുണയ്ക്കുന്ന ഒരു നോളഡ്ജ് ഗ്രാഫ് എന്ന നിലയിൽ മെമ്മറി\n", + "\n", + " - **സംഘടിതമായ മനസ്സിലാക്കൽ**: Cognee ഒരു വെക്ടർ സ്റ്റോർ, ഒരു ഗ്രാഫ് സ്റ്റോർ എന്നിവ സംയോജിപ്പിക്കുന്നു, അതിനാൽ നിങ്ങളുടെ ഡാറ്റ അർത്ഥത്തിൽ തിരയാവുന്നതും ബന്ധങ്ങൾ വഴി ബന്ധിപ്പിക്കപ്പെട്ടതുമാണ്. Cognee ഡിഫോൾട്ടായി ഫയൽ അടിസ്ഥാനമാക്കിയുള്ള ഡാറ്റാബേസുകൾ ഉപയോഗിക്കുന്നു (വെക്ടറിനായി LanceDB, ഗ്രാഫ് ഡാറ്റാബേസിനായി Kuzu).\n", + "\n", + " - **ബന്ധം-അറിയുന്ന തിരയൽ**: ഉത്തരം \"സമാനമായ ടെക്സ്റ്റ്\" മാത്രമല്ല, എന്റിറ്റികൾ തമ്മിലുള്ള ബന്ധം എങ്ങനെ ഉള്ളതെന്ന് അടിസ്ഥാനമാക്കി നൽകാം.\n", + "\n", + " - **ജീവനുള്ള മെമ്മറി**: മെമ്മറി ലെയർ വികസിക്കുന്നു, വളരുന്നു, ഒരു ബന്ധിത ഗ്രാഫ് ആയി തിരയാവുന്നതായി നിലനിൽക്കുന്നു.\n", + "\n", + "2. തിരയൽ & ചിന്താ രീതികൾ\n", + " - **ഹൈബ്രിഡ് റിട്രീവൽ**: തിരയൽ വെക്ടർ സിമിലാരിറ്റി, ഗ്രാഫ് ഘടന, LLM ചിന്താ പ്രക്രിയ എന്നിവ സംയോജിപ്പിക്കുന്നു, റോ ചങ്ക് ലുക്കപ്പ് മുതൽ ഗ്രാഫ്-അറിയുന്ന ചോദ്യോത്തരങ്ങൾ വരെ.\n", + "\n", + " - **ജോലിക്ക് അനുയോജ്യമായ രീതികൾ**: സ്വാഭാവിക ഭാഷാ ഉത്തരങ്ങൾ ആവശ്യമുള്ളപ്പോൾ completion-style മോഡുകൾ ഉപയോഗിക്കുക, നിങ്ങളുടെ ഏജന്റ് റോ കോൺടെക്സ്റ്റ് ആവശ്യമുള്ളപ്പോൾ അല്ലെങ്കിൽ സ്വന്തം ചിന്താ പ്രക്രിയ നടത്തേണ്ടതായപ്പോൾ chunk/summary/graph മോഡുകൾ ഉപയോഗിക്കുക.\n", + "\n", + "3. വ്യക്തിഗത, സെഷൻ-അറിയുന്ന ഏജന്റുകൾ\n", + " - **സെഷൻ കോൺടെക്സ്റ്റ് + ദീർഘകാല മെമ്മറി**: Cognee ഹ്രസ്വകാല \"ത്രീഡ്\" കോൺടെക്സ്റ്റ് ഉപയോക്താവോ ഓർഗനൈസേഷനോ തലത്തിലുള്ള ദീർഘകാല മെമ്മറിയിൽ നിന്ന് വേർതിരിക്കുന്നു.\n", + "\n", + "## യഥാർത്ഥ ലോകത്തിലെ പ്രയോഗങ്ങൾ\n", + "\n", + "1. **വെർട്ടിക്കൽ AI ഏജന്റുകൾ**\n", + "\n", + " ഈ നോട്ട്‌ബുക്കിൽ നിന്നുള്ള മാതൃക ഉപയോഗിച്ച് Cognee-യുടെ റിട്രീവൽ, ചിന്താ പ്രക്രിയ കോർ ആയി പ്രവർത്തിക്കുന്ന ഡൊമെയ്ൻ-സ്മാർട്ട് കോപൈലോട്ടുകൾ സജ്ജമാക്കുക:\n", + "\n", + "- **ഡെവലപ്പർ കോപൈലോട്ടുകൾ**: കോഡ് റിവ്യൂ, ഇൻസിഡന്റ് അനാലിസിസ്, ആർക്കിടെക്ചർ അസിസ്റ്റന്റുകൾ, കോഡ്, APIകൾ, ഡിസൈൻ ഡോകുകൾ, ടിക്കറ്റുകൾ എന്നിവയെ ഒരു മെമ്മറി ഗ്രാഫ് ആയി ട്രാവേഴ്സ് ചെയ്യുന്നു.\n", + "\n", + "- **കസ്റ്റമർ-ഫേസിംഗ് കോപൈലോട്ടുകൾ**: ഉൽപ്പന്ന ഡോകുകൾ, FAQs, CRM നോട്ടുകൾ, പാസ്റ് ടിക്കറ്റുകൾ എന്നിവയിൽ നിന്ന് ഗ്രാഫ്-അറിയുന്ന റിട്രീവലും സൈറ്റഡ് ഉത്തരങ്ങളും നൽകുന്ന സപ്പോർട്ട് അല്ലെങ്കിൽ സക്സസ് ഏജന്റുകൾ.\n", + "\n", + "- **ഇന്റേർണൽ എക്സ്പർട്ട് കോപൈലോട്ടുകൾ**: നയങ്ങൾ, നിയമങ്ങൾ, സുരക്ഷാ അസിസ്റ്റന്റുകൾ, ഒറ്റപ്പെട്ട PDFs അല്ലാതെ പരസ്പരം ബന്ധിപ്പിച്ച നിയമങ്ങൾ, മാർഗ്ഗനിർദ്ദേശങ്ങൾ, ചരിത്രപരമായ തീരുമാനങ്ങൾ എന്നിവയിൽ ചിന്തിക്കുന്നു.\n", + "\n", + " AI ഏജന്റുകൾക്കായി സ്ഥിരതയുള്ള, കൃത്യമായ മെമ്മറി എന്ന നിലയിൽ Cognee വ്യക്തമായി നിലനിൽക്കുന്നു, നിങ്ങളുടെ ഏജന്റിന് പിന്നിൽ ഒരു ജീവൻ നോളഡ്ജ് ഗ്രാഫ് നൽകുന്നു, വെക്ടർ സ്റ്റോറുകളുടെ ആഡ്ഹോക്ക് സംയോജനം, കസ്റ്റം ഗ്രാഫ് കോഡ് എന്നിവ മാറ്റിസ്ഥാപിക്കുന്നു.\n", + "\n", + "2. **ഡാറ്റ സിലോകൾ ഒന്നായി സംയോജിപ്പിക്കൽ**\n", + "\n", + " ഇതേ സമീപനം ചിതറിച്ചിരിക്കുന്ന സ്രോതസ്സുകളിൽ നിന്ന് ഒരു ഏകീകൃത മെമ്മറി ലെയർ നിർമ്മിക്കാൻ സഹായിക്കുന്നു:\n", + "\n", + "- **സിലോകളിൽ നിന്ന് ഒരു ഗ്രാഫിലേക്ക്**: ഘടനാപരമായ (ഉദാ: ഡാറ്റാബേസുകൾ) അല്ലെങ്കിൽ ഘടനയില്ലാത്ത ഡാറ്റ (ഉദാ: ഡോകുകൾ, ചാറ്റുകൾ) ഒരു എംബഡിംഗുകൾ പിന്തുണയ്ക്കുന്ന ഒരു ഗ്രാഫിലേക്ക് ഇൻജെസ്റ്റ് ചെയ്യുക, ഓരോ സിസ്റ്റത്തിനും വേർതിരിച്ചുള്ള ഇൻഡക്സുകൾക്ക് പകരം.\n", + "\n", + "- **സൈറ്റേഷനുകളുള്ള ക്രോസ്-സ്രോതസ്സുള്ള ചിന്താ പ്രക്രിയ**: എല്ലാത്തിലും മൾട്ടി-സ്റ്റെപ്പ് ചിന്താ പ്രക്രിയ നടത്തുക—ഗ്രാഫ് വഴി \"ലോഗുകൾ, മെട്രിക്സ്, ഡോകുകൾ\" \"ജോയിൻ\" ചെയ്യുക—എന്നും പ്രൊവനൻസ് ഉള്ള ഉറച്ച ഉത്തരങ്ങൾ നൽകുക.\n", + "\n", + "- **നോളഡ്ജ് ഹബുകൾ**: ബാങ്കിംഗ് അല്ലെങ്കിൽ വിദ്യാഭ്യാസം പോലുള്ള ഡൊമെയ്‌നുകൾക്കായി, PDFs, ഇന്റേർണൽ സിസ്റ്റങ്ങൾ, ആപ്പ് ഡാറ്റ എന്നിവയെ ഒരു നോളഡ്ജ് ഗ്രാഫിലേക്ക് സംയോജിപ്പിക്കാൻ Cognee ഇതിനകം ഉപയോഗിക്കുന്നു, അതിനാൽ ഏജന്റുകൾ കൃത്യമായ, സൈറ്റഡ് കോൺടെക്സ്റ്റ് ഉപയോഗിച്ച് ചോദ്യങ്ങൾക്ക് ഉത്തരം നൽകാൻ കഴിയും.\n", + "\n", + "## അടുത്ത ഘട്ടങ്ങൾ\n", + "\n", + "നിങ്ങൾ കോർ മെമ്മറി ലൂപ്പ് നടപ്പിലാക്കിയിട്ടുണ്ട്. നിങ്ങളുടെ സ്വന്തം ശ്രമങ്ങൾക്കായി പരീക്ഷിക്കാവുന്ന സ്വാഭാവിക വിപുലീകരണങ്ങൾ ഇവയാണ് (വിവരങ്ങൾക്ക് [Cognee ഡോക്യുമെന്റേഷൻ](https://docs.cognee.ai/) കാണുക):\n", + "\n", + "1. **കാലിക ബോധം പരീക്ഷിക്കുക**: ടെക്സ്റ്റിൽ നിന്ന് ഇവന്റുകളും ടൈംസ്റ്റാമ്പുകളും എക്സ്ട്രാക്റ്റ് ചെയ്യാൻ കാലിക cognify ഓൺ ചെയ്യുക.\n", + "\n", + "2. **ഓന്റോളജി-ഡ്രിവൻ ചിന്താ പ്രക്രിയ അവതരിപ്പിക്കുക**: നിങ്ങളുടെ ഡൊമെയ്ൻക്കായി ഒരു OWL ഓന്റോളജി നിർവചിക്കുക. Cognee-യുടെ ഓന്റോളജി പിന്തുണ ഉപയോഗിച്ച് എക്സ്ട്രാക്റ്റ് ചെയ്ത എന്റിറ്റികളും ബന്ധങ്ങളും ആ സ്കീമയിൽ ഗ്രൗണ്ട് ചെയ്യുക, ഗ്രാഫിന്റെ ഗുണനിലവാരം, ഡൊമെയ്ൻ-സ്പെസിഫിക് ഉത്തരങ്ങൾ മെച്ചപ്പെടുത്തുക.\n", + "\n", + "3. **ഫീഡ്ബാക്ക് ലൂപ്പ് ചേർക്കുക**: യഥാർത്ഥ ഉപയോക്തൃ ഫീഡ്ബാക്കിൽ നിന്ന് ഗ്രാഫ് എഡ്ജ് വെയിറ്റുകൾ ക്രമീകരിക്കാൻ Cognee-യെ അനുവദിക്കുക, അതിനാൽ റിട്രീവൽ സ്ഥിരതയില്ലാതെ സമയം കൂടുമ്പോൾ മെച്ചപ്പെടുന്നു.\n", + "\n", + "4. **വ്യക്തിഗതമാക്കലിനും സെഷൻ പെരുമാറ്റത്തിനും ട്യൂൺ ചെയ്യുക**: ഉപയോക്തൃ IDs, ടെനന്റുകൾ, ഡാറ്റാസെറ്റുകൾ ഉപയോഗിച്ച് ഓരോ വ്യക്തിക്കും അല്ലെങ്കിൽ ടീമിനും പങ്കിട്ട മെമ്മറി എഞ്ചിനിൽ അവരുടെ സ്വന്തം കാഴ്ച നൽകുക.\n", + "\n", + "5. **കൂടുതൽ സങ്കീർണ്ണമായ ഏജന്റുകളിലേക്ക് സ്കെയിൽ ചെയ്യുക**: മൾട്ടി-ഏജന്റ് സിസ്റ്റങ്ങൾ നിർമ്മിക്കാൻ ഏജന്റ് ഫ്രെയിംവർക്കുകളിൽ Cognee-നെ പ്ലഗ് ചെയ്യുക, എല്ലാം ഒരേ മെമ്മറി ലെയർ പങ്കിടുന്നു. *Microsoft Agent Framework x Cognee പ്ലഗിൻ ഉടൻ വരുന്നു.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**അറിയിപ്പ്**: \nഈ പ്രമാണം AI പരിഭാഷാ സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് പരിഭാഷപ്പെടുത്തിയതാണ്. ഞങ്ങൾ കൃത്യതയ്ക്കായി ശ്രമിക്കുന്നുവെങ്കിലും, ഓട്ടോമേറ്റഡ് പരിഭാഷകളിൽ പിഴവുകൾ അല്ലെങ്കിൽ തെറ്റായ വിവരങ്ങൾ ഉണ്ടാകാൻ സാധ്യതയുണ്ട്. പ്രമാണത്തിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ പതിപ്പ് പ്രാമാണികമായ ഉറവിടമായി പരിഗണിക്കണം. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ പരിഭാഷ ശുപാർശ ചെയ്യുന്നു. ഈ പരിഭാഷ ഉപയോഗിച്ച് ഉണ്ടാകുന്ന തെറ്റിദ്ധാരണകൾക്കോ അല്ലെങ്കിൽ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:59:50+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "ml" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/ml/13-agent-memory/README.md b/translations/ml/13-agent-memory/README.md index cb0a0762d..57da27b81 100644 --- a/translations/ml/13-agent-memory/README.md +++ b/translations/ml/13-agent-memory/README.md @@ -1,8 +1,8 @@ **അസത്യവാദം**: -ഈ രേഖ AI വിവർത്തന സേവനമായ [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. കൃത്യതയ്ക്കായി ഞങ്ങൾ ശ്രമിക്കുന്നുവെങ്കിലും, ഓട്ടോമേറ്റഡ് വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റായ വിവരങ്ങൾ ഉണ്ടാകാൻ സാധ്യതയുണ്ട്. അതിന്റെ സ്വാഭാവിക ഭാഷയിലുള്ള മൗലിക രേഖ പ്രാമാണികമായ ഉറവിടമായി കണക്കാക്കണം. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല. +ഈ രേഖ AI വിവർത്തന സേവനമായ [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. ഞങ്ങൾ കൃത്യതയ്ക്കായി ശ്രമിക്കുന്നുവെങ്കിലും, ഓട്ടോമേറ്റഡ് വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റായ വിവരങ്ങൾ ഉണ്ടാകാൻ സാധ്യതയുണ്ട്. അതിന്റെ സ്വാഭാവിക ഭാഷയിലുള്ള മൗലിക രേഖയാണ് വിശ്വസനീയമായ ഉറവിടമായി കണക്കാക്കേണ്ടത്. നിർണായകമായ വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല. \ No newline at end of file diff --git a/translations/mo/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/mo/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..c4e512546 --- /dev/null +++ b/translations/mo/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# 使用 Cognee 建立具持久記憶的 AI 代理\n", + "\n", + "此筆記本展示如何使用 [**cognee**](https://www.cognee.ai/) 建立具備高級記憶功能的智能 AI 代理。Cognee 是一個開源的 AI 記憶系統,結合知識圖譜、語義搜索和會話管理,創建具備上下文感知的 AI 系統。\n", + "\n", + "## 🎯 學習目標\n", + "\n", + "完成本教程後,您將了解如何:\n", + "- **建立基於嵌入的知識圖譜**:將非結構化文本轉化為結構化、可查詢的知識\n", + "- **實現會話記憶**:創建多輪對話,並自動保留上下文\n", + "- **保存對話**:選擇性地將重要的互動存儲於長期記憶中以供未來參考\n", + "- **使用自然語言查詢**:在新對話中訪問並利用歷史上下文\n", + "- **可視化記憶**:探索代理知識圖譜中的關係\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ 您將會建立的內容\n", + "\n", + "在這個教學中,我們將會建立一個具有持久記憶的**編程助手**,其功能包括:\n", + "\n", + "### 1. **知識庫建構**\n", + " - 收集開發者的個人資料及專業資訊\n", + " - 處理 Python 程式設計的原則及最佳實踐\n", + " - 儲存開發者與 AI 助手之間的歷史對話\n", + "\n", + "### 2. **會話感知功能**\n", + " - 在同一個會話中保持多個問題的上下文\n", + " - 自動快取每個問題/答案對,以提高檢索效率\n", + " - 根據對話歷史提供連貫且有上下文的回應\n", + "\n", + "### 3. **長期記憶**\n", + " - 將重要的對話保存到長期記憶中\n", + " - 從知識庫及過去的會話中檢索相關記憶,以輔助新的互動\n", + " - 建立一個隨時間增長並不斷改進的知識庫\n", + "\n", + "### 4. **智能記憶檢索**\n", + " - 使用圖形感知語義搜索來查找所有儲存知識中的相關資訊\n", + " - 按數據子群組(如開發者資訊與原則)篩選搜索結果\n", + " - 結合多個數據來源,提供全面的答案\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 先決條件與設置\n", + "\n", + "### 系統需求\n", + "\n", + "在開始之前,請確保您已具備以下條件:\n", + "\n", + "1. **Python 環境**\n", + " - Python 3.9 或更高版本\n", + " - 建議使用虛擬環境\n", + "\n", + "2. **Redis 快取**(用於會話管理,必需)\n", + " - 本地 Redis:`docker run -d -p 6379:6379 redis`\n", + " - 或使用託管的 Redis 服務\n", + "\n", + "3. **LLM API 訪問**\n", + " - OpenAI API 金鑰或其他提供商(請參閱[文件](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **資料庫配置**\n", + " - 預設情況下無需配置。Cognee 使用基於文件的資料庫(LanceDB 和 Kuzu)\n", + " - 可選地,您可以設置 Azure AI Search 作為向量存儲(請參閱[文件](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### 環境配置\n", + "\n", + "在您的專案目錄中建立 `.env` 文件,並包含以下變數:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ 理解 Cognee 的記憶體架構\n", + "\n", + "### Cognee 的運作方式\n", + "\n", + "Cognee 提供了一個超越簡單鍵值存儲的複雜記憶體系統:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### 主要組成部分:\n", + "\n", + "1. **知識圖譜**:存儲實體、關係及語義連結\n", + "2. **向量嵌入**:支持對所有存儲信息進行語義搜索\n", + "3. **會話緩存**:在會話內及跨會話維持對話上下文\n", + "4. **節點集**:將數據組織成邏輯分類以便於目標檢索\n", + "\n", + "### 本教程中的記憶體類型:\n", + "\n", + "- **持久記憶體**:知識圖譜中的長期存儲\n", + "- **會話記憶體**:Redis 緩存中的臨時對話上下文\n", + "- **語義記憶體**:基於向量的相似性搜索,涵蓋所有數據\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 安裝所需套件\n", + "\n", + "安裝 Cognee,並支援 Redis 用於會話管理:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 初始化環境並載入庫\n", + "\n", + "請確保:\n", + "1. Redis 已啟動(例如,透過 Docker:`docker run -d -p 6379:6379 redis`)\n", + "2. 在匯入快取模組之前已設定環境變數\n", + "3. 如有需要,重新啟動內核並按順序執行單元格\n", + "\n", + "以下單元格將會:\n", + "1. 從 `.env` 載入環境變數\n", + "2. 使用您的 LLM 設定配置 Cognee\n", + "3. 啟用快取以進行會話管理\n", + "4. 驗證所有組件是否已正確連接\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 配置存儲目錄\n", + "\n", + "Cognee 使用兩個獨立的目錄進行操作:\n", + "- **數據根目錄**:存儲已導入的文件和處理過的數據\n", + "- **系統根目錄**:包含知識圖譜數據庫和系統元數據\n", + "\n", + "我們將為本教程創建獨立的目錄,如下所示:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 重置記憶狀態\n", + "\n", + "在我們開始建立記憶系統之前,先確保我們從頭開始。\n", + "\n", + "> 💡 **提示**:如果您希望在之後使用此筆記本時保留之前運行的現有記憶,可以跳過此步驟。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 第 1 部分:建立知識庫\n", + "\n", + "### 我們的開發者助手的數據來源\n", + "\n", + "我們將採集三種類型的數據來建立全面的知識庫:\n", + "\n", + "1. **開發者檔案**:個人專業知識和技術背景 \n", + "2. **Python 最佳實踐**:Python 的禪意及實用指導 \n", + "3. **歷史對話**:開發者與 AI 助手之間的過去問答記錄 \n", + "\n", + "這些多樣化的數據使我們的代理能夠: \n", + "- 理解使用者的技術背景 \n", + "- 在建議中應用最佳實踐 \n", + "- 從過去成功的互動中學習 \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 將數據轉化為知識圖譜\n", + "\n", + "現在我們將把原始文本轉化為結構化的記憶。這個過程包括:\n", + "\n", + "1. **將數據添加到 NodeSets**:將信息組織到邏輯分類中\n", + " - `developer_data`:開發者檔案和對話\n", + " - `principles_data`:Python 的最佳實踐和指導方針\n", + "\n", + "2. **運行 Cognify Pipeline**:提取實體、關係並創建嵌入\n", + " - 識別關鍵概念\n", + " - 在相關信息之間創建語義連接\n", + " - 生成向量嵌入\n", + "\n", + "由於 LLM 需要處理文本並構建圖譜結構,這可能需要一些時間:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 視覺化知識圖譜\n", + "\n", + "讓我們來探索知識圖譜的結構。視覺化圖表顯示:\n", + "- **節點**:從文本中提取的實體(概念、技術、人員)\n", + "- **邊**:實體之間的關係和連接\n", + "- **群集**:根據語義相似性分組的相關概念\n", + "\n", + "在瀏覽器中打開生成的 HTML 文件,互動式地探索圖譜:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 用 Memify 豐富記憶\n", + "\n", + "`memify()` 函數會分析知識圖譜,並針對數據生成智能規則。這個過程:\n", + "- 識別模式和最佳實踐\n", + "- 根據內容創建可操作的指引\n", + "- 建立不同知識領域之間的關係\n", + "\n", + "這些規則幫助代理在回答問題時作出更明智的決策。捕捉第二個視覺化圖像有助於比較圖譜在豐富後如何變得更密集。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 第 2 部分:智能記憶檢索\n", + "\n", + "### 示範 1:跨文件知識整合\n", + "\n", + "現在我們的知識圖譜已經建立好,讓我們測試 Cognee 如何結合多個來源的資訊來回答複雜問題。\n", + "\n", + "第一個查詢展示了:\n", + "- **語義理解**:即使未明確提及,也能找到相關概念\n", + "- **交叉參考**:結合開發者檔案與 Python 原則\n", + "- **情境推理**:將最佳實踐應用於特定實現\n", + "\n", + "### 示範 2:使用 NodeSets 的篩選搜尋\n", + "\n", + "第二個查詢展示如何針對知識圖譜的特定子集進行搜尋:\n", + "- 使用 `node_name` 參數僅在 `principles_data` 中搜尋\n", + "- 提供來自特定知識領域的聚焦答案\n", + "- 當需要領域特定資訊時非常有用\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 第三部分:會話管理設置\n", + "\n", + "### 啟用對話記憶\n", + "\n", + "會話管理對於在多次互動中保持上下文非常重要。在這裡我們將:\n", + "\n", + "1. **初始化用戶上下文**:創建或檢索用戶檔案以進行會話跟蹤\n", + "2. **配置緩存引擎**:連接到 Redis 以存儲對話歷史記錄\n", + "3. **啟用會話變數**:設置在查詢中持續存在的上下文變數\n", + "\n", + "> ⚠️ **重要提示**:這需要 Redis 正在運行並且您的環境中設置了 `CACHING=true`\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ 輔助函數:查看會話歷史記錄\n", + "\n", + "此實用函數讓我們可以檢視儲存在 Redis 中的會話歷史記錄。這對以下情況非常有用:\n", + "- 偵錯會話管理\n", + "- 驗證會話是否已被快取\n", + "- 瞭解代理可用的上下文\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## 第1節:非同步支援實驗室 — 第一個問題\n", + "\n", + "開始 `async-support-lab` 會話,詢問適合大量網頁爬取的具備遙測友好的 asyncio 模式。系統已經了解 asyncio、aiohttp 和監控實踐,因此回應應該反映之前的對話,同時針對新問題進行調整。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## 檢查第一個交換後的 Session 1 記憶體\n", + "\n", + "在初始問題之後立即執行 `show_history(session_1)`,可以確認 Cognee 已將提示和完成內容寫入 Redis。你應該會看到一個包含並發指導的條目。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## 第 1 節:數據模型的後續討論\n", + "\n", + "接下來我們問:「什麼時候應該選擇 dataclasses 而不是 Pydantic?」使用相同的會話 ID。Cognee 應該結合 Python 的原則以及之前有關 FastAPI 的討論,提供細緻的建議——展示出在命名會話中,內容是可以延續的。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## 確認會話 1 的歷史記錄包含兩個回合\n", + "\n", + "再次執行 `show_history(session_1)` 應該會顯示兩個問答條目。這與 Mem0 實驗室的「記憶重播」步驟相符,並證明額外的回合會延續相同的對話記錄。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## 第二節:設計審查線程 — 新會話\n", + "\n", + "為了展示線程之間的隔離,我們啟動了 `design-review-session`,並要求提供事件審查的記錄指導。即使底層知識庫相同,新的會話 ID 仍然能將記錄分開。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## 檢討會議 2 歷史記錄\n", + "\n", + "`show_history(session_2)` 應該只列出設計檢討的提示/回應對比。將其與會議 1 進行比較,以突顯 Cognee 如何在重用共享知識圖譜的同時,保持獨立的會議記錄。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## 摘要\n", + "\n", + "恭喜!您剛剛為您的編程助手添加了一個由 Cognee 驅動的真正長期記憶層。\n", + "\n", + "在這個教程中,您將原始的開發者內容(代碼、文檔、聊天)轉化為一個圖形 + 向量記憶,讓您的代理可以進行搜索、推理並持續改進。\n", + "\n", + "您學到了什麼\n", + "\n", + "1. **從原始文本到 AI 記憶**:了解 Cognee 如何吸收非結構化數據,並通過結合向量 + 知識圖譜架構將其轉化為智能、可搜索的記憶。\n", + "\n", + "2. **使用 memify 豐富圖譜**:如何超越基本的圖譜創建,使用 memify 在現有圖譜之上添加衍生事實和更豐富的關係。\n", + "\n", + "3. **多種搜索策略**:如何根據代理的需求,使用不同的搜索類型(圖譜感知問答、RAG 風格補全、洞察、原始片段、代碼搜索等)來查詢記憶。\n", + "\n", + "4. **可視化探索**:如何使用圖譜可視化和 Cognee UI 檢查和調試 Cognee 構建的內容,讓您能夠真正看到知識的結構。\n", + "\n", + "5. **會話感知記憶**:如何結合每次會話的上下文與持久的語義記憶,讓代理能夠在多次運行中記住內容,同時避免在用戶之間洩漏信息。\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## 關鍵要點\n", + "1. 作為嵌入支持的知識圖譜的記憶\n", + "\n", + " - **結構化理解**:Cognee 結合了向量存儲和圖譜存儲,因此您的數據既可以按意義搜索,也可以按關係連接。Cognee 預設使用基於文件的數據庫(LanceDB 用於向量存儲,Kuzu 用於圖譜數據庫)。\n", + "\n", + " - **關係感知檢索**:答案不僅可以基於“相似文本”,還可以基於實體之間的關係。\n", + "\n", + " - **活記憶**:記憶層會隨著時間演變、增長,並作為一個連接的圖譜保持可查詢。\n", + "\n", + "2. 搜索與推理模式\n", + " - **混合檢索**:搜索結合了向量相似性、圖譜結構和 LLM 推理,從原始數據塊查詢到圖譜感知的問題解答。\n", + "\n", + " - **根據需求選擇模式**:當您需要自然語言答案時,使用補全模式;當代理需要原始上下文或進行自身推理時,使用數據塊/摘要/圖譜模式。\n", + "\n", + "3. 個性化、會話感知的代理\n", + " - **會話上下文 + 長期記憶**:Cognee 將短期“線索”上下文與長期的用戶或組織層級記憶分開。\n", + "\n", + "## 真實世界應用\n", + "\n", + "1. **垂直 AI 代理**\n", + "\n", + " 使用此筆記本中的模式,為基於 Cognee 的檢索和推理核心的領域智能助手提供支持:\n", + "\n", + "- **開發者助手**:代碼審查、事件分析和架構助手,能夠將代碼、API、設計文檔和工單作為單一記憶圖譜進行遍歷。\n", + "\n", + "- **面向客戶的助手**:支持或成功代理,通過圖譜感知檢索和引用答案,從產品文檔、常見問題解答、CRM 記錄和過去的工單中提取信息。\n", + "\n", + "- **內部專家助手**:政策、法律或安全助手,能夠基於互相關聯的規則、指導方針和歷史決策進行推理,而不是孤立的 PDF。\n", + "\n", + " Cognee 明確定位為 AI 代理的持久、準確記憶,提供一個活的知識圖譜,作為代理的後端,取代臨時組合的向量存儲和自定義圖譜代碼。\n", + "\n", + "2. **將數據孤島統一為一個記憶體系**\n", + "\n", + " 同樣的方法也可以幫助您在分散的數據源之間構建統一的記憶層:\n", + "\n", + "- **從孤島到單一圖譜**:將結構化數據(如數據庫)和非結構化數據(如文檔、聊天記錄)導入到一個由嵌入支持的單一圖譜中,而不是為每個系統建立單獨的索引。\n", + "\n", + "- **帶引用的跨源推理**:在所有數據上運行多步推理——通過圖譜“連接”日誌、指標和文檔——並仍然返回有根據的答案和來源。\n", + "\n", + "- **知識中心**:在銀行或教育等領域,Cognee 已經被用於將 PDF、內部系統和應用數據統一到一個帶有向量的知識圖譜中,讓代理能夠以精確且有引用的上下文回答問題。\n", + "\n", + "## 下一步\n", + "\n", + "您已經實現了核心記憶循環。以下是您可以自行嘗試的自然擴展(詳情請參閱 [Cognee 文檔](https://docs.cognee.ai/)):\n", + "\n", + "1. **嘗試時間感知功能**:啟用時間感知功能,從文本中提取事件和時間戳。\n", + "\n", + "2. **引入本體驅動的推理**:為您的領域定義一個 OWL 本體。使用 Cognee 的本體支持,讓提取的實體和關係基於該架構,提升圖譜質量和領域特定答案。\n", + "\n", + "3. **添加反饋循環**:讓 Cognee 根據真實用戶反饋調整圖譜邊權重,使檢索隨時間改進,而不是保持靜態。\n", + "\n", + "4. **針對個性化和會話行為進行調整**:使用用戶 ID、租戶和數據集,為每個人或團隊提供其在共享記憶引擎上的專屬視圖。\n", + "\n", + "5. **擴展到更複雜的代理**:將 Cognee 插入代理框架,構建共享相同記憶層的多代理系統。*Microsoft Agent Framework x Cognee 插件即將推出。*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**免責聲明**: \n此文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:27:50+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "mo" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/mo/13-agent-memory/README.md b/translations/mo/13-agent-memory/README.md index 6680077bc..2265de74c 100644 --- a/translations/mo/13-agent-memory/README.md +++ b/translations/mo/13-agent-memory/README.md @@ -1,8 +1,8 @@ **免責聲明**: -本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原文文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤讀概不負責。 \ No newline at end of file +此文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。 + \ No newline at end of file diff --git a/translations/mr/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/mr/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..60d0d1d38 --- /dev/null +++ b/translations/mr/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Cognee वापरून स्थिर मेमरीसह AI एजंट्स तयार करणे\n", + "\n", + "हा नोटबुक [**cognee**](https://www.cognee.ai/) वापरून प्रगत मेमरी क्षमता असलेल्या बुद्धिमान AI एजंट्स कसे तयार करायचे हे दाखवतो - एक ओपन सोर्स AI मेमरी जी ज्ञान ग्राफ्स, सेमॅंटिक सर्च आणि सेशन व्यवस्थापन एकत्र करून संदर्भ-जाणकार AI प्रणाली तयार करते.\n", + "\n", + "## 🎯 शिकण्याची उद्दिष्टे\n", + "\n", + "या ट्युटोरियलच्या शेवटी, तुम्हाला खालील गोष्टी समजतील:\n", + "- **एम्बेडिंगद्वारे समर्थित ज्ञान ग्राफ्स तयार करणे**: असंरचित मजकूर संरचित, क्वेरी करण्यायोग्य ज्ञानामध्ये रूपांतरित करा\n", + "- **सेशन मेमरी अंमलात आणणे**: स्वयंचलित संदर्भ टिकवून मल्टी-टर्न संवाद तयार करा\n", + "- **संवाद टिकवून ठेवणे**: भविष्यातील संदर्भासाठी दीर्घकालीन मेमरीमध्ये महत्त्वपूर्ण संवाद ऐच्छिकपणे संग्रहित करा\n", + "- **नैसर्गिक भाषेचा वापर करून क्वेरी करणे**: नवीन संवादांमध्ये ऐतिहासिक संदर्भ प्रवेश करा आणि त्याचा उपयोग करा\n", + "- **मेमरी व्हिज्युअलाइझ करणे**: तुमच्या एजंटच्या ज्ञान ग्राफमधील नातेसंबंध एक्सप्लोर करा\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ तुम्ही काय तयार कराल\n", + "\n", + "या ट्यूटोरियलमध्ये, आपण **कोडिंग सहाय्यक** तयार करू जो स्थिर मेमरीसह असेल:\n", + "\n", + "### 1. **ज्ञान आधार निर्माण**\n", + " - विकसक प्रोफाइल आणि कौशल्य माहिती समाविष्ट करतो\n", + " - Python प्रोग्रामिंग तत्त्वे आणि सर्वोत्तम पद्धती प्रक्रिया करतो\n", + " - विकसक आणि AI सहाय्यकांमधील ऐतिहासिक संभाषणे संग्रहित करतो\n", + "\n", + "### 2. **सत्र-जागरूक संभाषणे**\n", + " - त्याच सत्रातील अनेक प्रश्नांमध्ये संदर्भ राखतो\n", + " - प्रत्येक प्रश्न/उत्तर जोड कार्यक्षम पुनर्प्राप्तीसाठी स्वयंचलितपणे कॅश करतो\n", + " - संभाषणाच्या इतिहासावर आधारित सुसंगत, संदर्भपूर्ण प्रतिसाद प्रदान करतो\n", + "\n", + "### 3. **दीर्घकालीन मेमरी**\n", + " - महत्त्वाच्या संभाषणांना दीर्घकालीन मेमरीमध्ये टिकवतो\n", + " - नवीन संवादांना माहिती देण्यासाठी ज्ञान आधार आणि मागील सत्रांमधून संबंधित मेमरी पुनर्प्राप्त करतो\n", + " - वेळोवेळी सुधारणा करणारा वाढता ज्ञान आधार तयार करतो\n", + "\n", + "### 4. **बुद्धिमान मेमरी पुनर्प्राप्ती**\n", + " - संग्रहित ज्ञानामधील संबंधित माहिती शोधण्यासाठी ग्राफ-जागरूक सेमॅंटिक शोधाचा वापर करतो\n", + " - डेटा उपगटांद्वारे शोध फिल्टर करतो (विकसक माहिती विरुद्ध तत्त्वे)\n", + " - व्यापक उत्तर प्रदान करण्यासाठी अनेक डेटा स्रोत एकत्रित करतो\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 पूर्वअट आणि सेटअप\n", + "\n", + "### प्रणाली आवश्यकता\n", + "\n", + "सुरुवात करण्यापूर्वी, खात्री करा की तुमच्याकडे खालील गोष्टी आहेत:\n", + "\n", + "1. **Python वातावरण**\n", + " - Python 3.9 किंवा त्याहून उच्च आवृत्ती\n", + " - वर्चुअल वातावरण (शिफारस केलेले)\n", + "\n", + "2. **Redis Cache** (सत्र व्यवस्थापनासाठी आवश्यक)\n", + " - स्थानिक Redis: `docker run -d -p 6379:6379 redis`\n", + " - किंवा व्यवस्थापित Redis सेवा वापरा\n", + "\n", + "3. **LLM API प्रवेश**\n", + " - OpenAI API की किंवा इतर प्रदाते (पहा [माहितीपत्रक](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **डेटाबेस कॉन्फिगरेशन**\n", + " - डीफॉल्टनुसार कोणतीही कॉन्फिगरेशन आवश्यक नाही. Cognee फाइल-आधारित डेटाबेस (LanceDB आणि Kuzu) वापरते.\n", + " - ऐच्छिकरित्या, तुम्ही Azure AI Search वेक्टर स्टोअर म्हणून सेटअप करू शकता (पहा [माहितीपत्रक](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### वातावरण कॉन्फिगरेशन\n", + "\n", + "तुमच्या प्रकल्पाच्या डिरेक्टरीमध्ये `.env` फाइल तयार करा आणि खालील व्हेरिएबल्स जोडा:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ कॉग्नीच्या मेमरी आर्किटेक्चरची समज\n", + "\n", + "### कॉग्नी कसे कार्य करते\n", + "\n", + "कॉग्नी एक प्रगत मेमरी प्रणाली प्रदान करते जी साध्या की-वॅल्यू स्टोरेजच्या पलीकडे जाते:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### मुख्य घटक:\n", + "\n", + "1. **नॉलेज ग्राफ**: घटक, नातेसंबंध आणि अर्थपूर्ण कनेक्शन संग्रहित करते\n", + "2. **व्हेक्टर एम्बेडिंग्स**: संग्रहित माहितीवर अर्थपूर्ण शोध सक्षम करते\n", + "3. **सेशन कॅश**: सत्रांमध्ये आणि सत्रांदरम्यान संभाषणाचा संदर्भ राखते\n", + "4. **नोडसेट्स**: डेटा तर्कसंगत श्रेणींमध्ये आयोजित करून लक्ष्यित पुनर्प्राप्ती सुलभ करते\n", + "\n", + "### या ट्युटोरियलमधील मेमरी प्रकार:\n", + "\n", + "- **स्थिर मेमरी**: नॉलेज ग्राफमध्ये दीर्घकालीन संग्रहण\n", + "- **सेशन मेमरी**: Redis कॅशमध्ये तात्पुरता संभाषण संदर्भ\n", + "- **अर्थपूर्ण मेमरी**: सर्व डेटावर आधारित व्हेक्टर समानता शोध\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 आवश्यक पॅकेजेस स्थापित करा\n", + "\n", + "Redis समर्थनासह सत्र व्यवस्थापनासाठी Cognee स्थापित करा:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 वातावरण प्रारंभ करा आणि लायब्ररी लोड करा\n", + "\n", + "याची खात्री करा:\n", + "1. Redis चालू आहे (उदाहरणार्थ, Docker वापरून: `docker run -d -p 6379:6379 redis`)\n", + "2. कॅश मॉड्यूल्स आयात करण्यापूर्वी पर्यावरणीय व्हेरिएबल्स सेट केले आहेत\n", + "3. गरज असल्यास, कर्नल रीस्टार्ट करा आणि सेल्स क्रमाने चालवा\n", + "\n", + "खालील सेल:\n", + "1. `.env` मधून पर्यावरणीय व्हेरिएबल्स लोड करेल\n", + "2. तुमच्या LLM सेटिंग्जसह Cognee कॉन्फिगर करेल\n", + "3. सत्र व्यवस्थापनासाठी कॅशिंग सक्षम करेल\n", + "4. सर्व घटक योग्यरित्या कनेक्ट झाले आहेत याची पडताळणी करेल\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 संचयन निर्देशिका कॉन्फिगर करा\n", + "\n", + "Cognee त्याच्या ऑपरेशन्ससाठी दोन स्वतंत्र निर्देशिका वापरते:\n", + "- **डेटा रूट**: संग्रहित दस्तऐवज आणि प्रक्रिया केलेला डेटा साठवतो\n", + "- **सिस्टम रूट**: ज्ञान ग्राफ डेटाबेस आणि सिस्टम मेटाडेटा समाविष्ट करतो\n", + "\n", + "या ट्यूटोरियलसाठी आम्ही स्वतंत्र निर्देशिका खालीलप्रमाणे तयार करू:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 मेमरी स्थिती रीसेट करा\n", + "\n", + "आपली मेमरी प्रणाली तयार करण्यापूर्वी, आपण ताजी सुरुवात करत आहोत याची खात्री करूया.\n", + "\n", + "> 💡 **टीप**: जर तुम्हाला नंतर हे नोटबुक वापरताना तुमच्या मागील रनमधील विद्यमान मेमरी जतन करायच्या असतील, तर तुम्ही हा टप्पा वगळू शकता.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 भाग 1: ज्ञानभांडार तयार करणे\n", + "\n", + "### आमच्या डेव्हलपर सहाय्यकासाठी डेटा स्रोत\n", + "\n", + "आम्ही व्यापक ज्ञानभांडार तयार करण्यासाठी तीन प्रकारचा डेटा समाविष्ट करू:\n", + "\n", + "1. **डेव्हलपर प्रोफाइल**: वैयक्तिक कौशल्य आणि तांत्रिक पार्श्वभूमी \n", + "2. **Python सर्वोत्तम पद्धती**: Python च्या Zen सह व्यावहारिक मार्गदर्शक तत्त्वे \n", + "3. **ऐतिहासिक संभाषणे**: डेव्हलपर आणि AI सहाय्यक यांच्यातील पूर्वीच्या प्रश्नोत्तर सत्रांचे रेकॉर्ड \n", + "\n", + "हा विविध डेटा आमच्या एजंटला खालील गोष्टींमध्ये मदत करतो: \n", + "- वापरकर्त्याच्या तांत्रिक संदर्भाची समज \n", + "- शिफारसींमध्ये सर्वोत्तम पद्धतींचा वापर \n", + "- यशस्वी पूर्वीच्या संवादांमधून शिकणे \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 डेटा ज्ञान ग्राफमध्ये रूपांतरित करा\n", + "\n", + "आता आपण कच्च्या मजकुराला संरचित स्मृतीमध्ये रूपांतरित करू. हा प्रक्रिया:\n", + "\n", + "1. **NodeSets मध्ये डेटा जोडते**: माहितीला तर्कसंगत श्रेणींमध्ये आयोजित करते\n", + " - `developer_data`: विकसक प्रोफाइल आणि संभाषणे\n", + " - `principles_data`: Python सर्वोत्तम पद्धती आणि मार्गदर्शक तत्त्वे\n", + "\n", + "2. **Cognify Pipeline चालवते**: घटक, नाती शोधते आणि एम्बेडिंग तयार करते\n", + " - मुख्य संकल्पना ओळखते\n", + " - संबंधित माहितीसाठी अर्थपूर्ण कनेक्शन तयार करते\n", + " - व्हेक्टर एम्बेडिंग तयार करते\n", + "\n", + "हे काही क्षण लागू शकते कारण LLM मजकूर प्रक्रिया करते आणि ग्राफ संरचना तयार करते:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 ज्ञान ग्राफचे दृश्य\n", + "\n", + "आपल्या ज्ञान ग्राफची रचना पाहूया. दृश्यामध्ये खालील गोष्टी दाखवल्या जातात:\n", + "- **नोड्स**: मजकुरातून काढलेल्या घटकांवर आधारित घटक (संकल्पना, तंत्रज्ञान, व्यक्ती)\n", + "- **एजेस**: घटकांमधील नाती आणि कनेक्शन\n", + "- **क्लस्टर्स**: अर्थपूर्ण साम्यतेनुसार गटबद्ध केलेल्या संबंधित संकल्पना\n", + "\n", + "ग्राफचे इंटरॅक्टिव्ह अन्वेषण करण्यासाठी तयार केलेली HTML फाइल आपल्या ब्राउझरमध्ये उघडा:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 मेमरी समृद्ध करा मेमिफायसह\n", + "\n", + "`memify()` फंक्शन ज्ञान ग्राफचे विश्लेषण करते आणि डेटाबद्दल बुद्धिमान नियम तयार करते. या प्रक्रियेमध्ये:\n", + "- पॅटर्न आणि सर्वोत्तम पद्धती ओळखणे\n", + "- सामग्रीच्या आधारे कृतीयोग्य मार्गदर्शक तत्त्वे तयार करणे\n", + "- वेगवेगळ्या ज्ञान क्षेत्रांमधील संबंध प्रस्थापित करणे\n", + "\n", + "हे नियम एजंटला प्रश्नांची उत्तरे देताना अधिक माहितीपूर्ण निर्णय घेण्यास मदत करतात. दुसरे व्हिज्युअलायझेशन कॅप्चर केल्याने ग्राफ समृद्ध झाल्यानंतर कसा घनदाट होतो हे तुलनेने पाहता येते.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 भाग 2: बुद्धिमान माहिती पुनर्प्राप्ती\n", + "\n", + "### प्रात्यक्षिक 1: क्रॉस-डॉक्युमेंट ज्ञान समाकलन\n", + "\n", + "आता आपला ज्ञान ग्राफ तयार झाला आहे, चला पाहूया Cognee कसे अनेक स्रोतांमधील माहिती एकत्र करून जटिल प्रश्नांची उत्तरे देते.\n", + "\n", + "पहिल्या क्वेरीमध्ये दाखवले आहे:\n", + "- **सामान्य समज**: संबंधित संकल्पना शोधणे जरी त्या स्पष्टपणे उल्लेखित नसल्या तरी\n", + "- **क्रॉस-रेफरन्सिंग**: विकसक प्रोफाइल Python तत्त्वांसोबत एकत्र करणे\n", + "- **संदर्भात्मक विचार**: विशिष्ट अंमलबजावणीसाठी सर्वोत्तम पद्धती लागू करणे\n", + "\n", + "### प्रात्यक्षिक 2: NodeSets सह फिल्टर केलेली शोध प्रक्रिया\n", + "\n", + "दुसरी क्वेरी दाखवते की ज्ञान ग्राफमधील विशिष्ट उपसंच कसे लक्ष्य करायचे:\n", + "- `node_name` पॅरामीटर वापरून फक्त `principles_data` मध्ये शोध करते\n", + "- विशिष्ट ज्ञान क्षेत्रातून केंद्रित उत्तरे प्रदान करते\n", + "- जेव्हा तुम्हाला क्षेत्र-विशिष्ट माहिती आवश्यक असते तेव्हा उपयुक्त\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 भाग 3: सत्र व्यवस्थापन सेटअप\n", + "\n", + "### संवादाची स्मृती सक्षम करणे\n", + "\n", + "सत्र व्यवस्थापन अनेक संवादांमध्ये संदर्भ टिकवून ठेवण्यासाठी महत्त्वाचे आहे. येथे आपण:\n", + "\n", + "1. **वापरकर्ता संदर्भ प्रारंभ करा**: सत्र ट्रॅकिंगसाठी वापरकर्ता प्रोफाइल तयार करा किंवा पुनर्प्राप्त करा\n", + "2. **कॅश इंजिन कॉन्फिगर करा**: संवाद इतिहास साठवण्यासाठी Redis शी कनेक्ट करा\n", + "3. **सत्र व्हेरिएबल्स सक्षम करा**: क्वेरी दरम्यान टिकणाऱ्या संदर्भ व्हेरिएबल्स सेट करा\n", + "\n", + "> ⚠️ **महत्त्वाचे**: यासाठी Redis चालू असणे आणि तुमच्या वातावरणात `CACHING=true` असणे आवश्यक आहे\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ सहाय्यक फंक्शन: सत्र इतिहास पहा\n", + "\n", + "ही उपयोगी फंक्शन आम्हाला Redis मध्ये संग्रहित संभाषण इतिहास तपासण्याची परवानगी देते. हे उपयुक्त आहे:\n", + "- सत्र व्यवस्थापन डिबग करण्यासाठी\n", + "- संभाषण कॅश होत असल्याची पडताळणी करण्यासाठी\n", + "- एजंटसाठी उपलब्ध असलेल्या संदर्भाची समज मिळवण्यासाठी\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## सत्र 1: असिंक्रोन समर्थन प्रयोगशाळा — पहिला प्रश्न\n", + "\n", + "`async-support-lab` सत्राची सुरुवात मोठ्या वेब स्क्रॅपरसाठी टेलीमेट्री-अनुकूल asyncio पद्धती विचारून करा. ग्राफला आधीच asyncio, aiohttp, आणि मॉनिटरिंग पद्धतींबद्दल माहिती आहे, त्यामुळे उत्तराने आधीच्या संभाषणांचे प्रतिबिंब दाखवावे आणि नवीन प्रश्नासाठी उत्तर सानुकूलित करावे.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## पहिल्या संवादानंतर सत्र 1 ची मेमरी तपासा\n", + "\n", + "प्रारंभिक प्रश्नानंतर लगेचच `show_history(session_1)` चालवल्यास हे स्पष्ट होते की Cognee ने प्रॉम्प्ट आणि पूर्णता दोन्ही Redis मध्ये लिहिले आहे. तुम्हाला एक नोंद दिसेल ज्यामध्ये समांतरता मार्गदर्शन असेल.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## सत्र 1: डेटा मॉडेल्सवर पुढील चर्चा\n", + "\n", + "पुढे आपण विचारतो, \"मी dataclasses आणि Pydantic यापैकी काय निवडावे?\" त्याच सत्र आयडीचा वापर करून. Cognee ने Python चे तत्त्वज्ञान आणि आधीच्या FastAPI चर्चांना एकत्र गुंफून सखोल सल्ला द्यावा—हे दाखवण्यासाठी की एका नावाच्या सत्रामध्ये संदर्भ टिकून राहतो.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## सत्र 1 चा इतिहास दोन्ही टप्पे समाविष्ट करतो याची पुष्टी करा\n", + "\n", + "`show_history(session_1)` पुन्हा कॉल केल्यास दोन प्रश्नोत्तर नोंदी दिसतील. हे Mem0 लॅबच्या \"मेमरी रिप्ले\" टप्प्याशी जुळते आणि हे सिद्ध करते की अतिरिक्त टप्पे त्याच लिपीमध्ये जोडले जातात.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## सत्र 2: डिझाइन पुनरावलोकन थ्रेड — नवीन सत्र\n", + "\n", + "थ्रेड्समधील वेगळेपणा दाखवण्यासाठी आम्ही `design-review-session` सुरू करतो आणि घटना पुनरावलोकनांसाठी लॉगिंग मार्गदर्शन विचारतो. जरी मूलभूत ज्ञानसंच समान असला तरी, नवीन सत्र आयडी ट्रान्सक्रिप्ट्स वेगळे ठेवतो.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## पुनरावलोकन सत्र 2 इतिहास\n", + "\n", + "`show_history(session_2)` फक्त डिझाइन-पुनरावलोकन प्रॉम्प्ट/प्रतिसाद जोड्या सूचीबद्ध करेल. सत्र 1 शी तुलना करा जेणेकरून Cognee स्वतंत्र लिपी कशा ठेवते हे स्पष्ट होईल, तसेच सामायिक ज्ञान ग्राफ पुन्हा कसा वापरते हे दाखवता येईल.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## सारांश\n", + "\n", + "अभिनंदन! तुम्ही तुमच्या कोडिंग सहाय्यकाला Cognee द्वारे समर्थित दीर्घकालीन स्मृतीची एक वास्तविक थर दिली आहे.\n", + "\n", + "या ट्युटोरियलमध्ये तुम्ही कच्च्या डेव्हलपर सामग्रीला (कोड, दस्तऐवज, चॅट्स) एका ग्राफ + व्हेक्टर मेमरीमध्ये रूपांतरित केले, ज्याचा तुमचा एजंट शोध घेऊ शकतो, विचार करू शकतो आणि सतत सुधारणा करू शकतो.\n", + "\n", + "तुम्ही काय शिकलात\n", + "\n", + "1. **कच्च्या मजकुरापासून AI मेमरीपर्यंत**: Cognee कसे असंरचित डेटा घेतो आणि त्याला व्हेक्टर + नॉलेज ग्राफ आर्किटेक्चरच्या संयोजनाचा वापर करून बुद्धिमान, शोधण्यायोग्य मेमरीमध्ये रूपांतरित करतो.\n", + "\n", + "2. **मेमिफायसह ग्राफ समृद्धीकरण**: मूलभूत ग्राफ तयार करण्यापलीकडे जाऊन, मेमिफायचा वापर करून तुमच्या विद्यमान ग्राफवरून व्युत्पन्न तथ्ये आणि समृद्ध नाती कशी जोडायची.\n", + "\n", + "3. **अनेक शोध धोरणे**: तुमच्या एजंटच्या गरजेनुसार वेगवेगळ्या शोध प्रकारांसह (ग्राफ-अवेयर Q&A, RAG-शैली पूर्णता, अंतर्दृष्टी, कच्चे तुकडे, कोड शोध, इ.) मेमरी कशी क्वेरी करायची.\n", + "\n", + "4. **दृश्य अन्वेषण**: ग्राफ व्हिज्युअलायझेशन आणि Cognee UI चा वापर करून Cognee ने काय तयार केले आहे ते तपासणे आणि डीबग करणे, जेणेकरून तुम्ही ज्ञान कसे संरचित आहे ते प्रत्यक्ष पाहू शकता.\n", + "\n", + "5. **सत्र-जागरूक मेमरी**: सत्रानुसार संदर्भ कायम ठेवणाऱ्या सेमॅंटिक मेमरीसह कसे एकत्र करायचे, जेणेकरून एजंट्स अनेक सत्रांमध्ये आठवण ठेवू शकतील आणि वापरकर्त्यांदरम्यान माहिती गळती होणार नाही.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## मुख्य मुद्दे\n", + "1. एम्बेडिंगद्वारे समर्थित ज्ञान ग्राफ म्हणून मेमरी\n", + "\n", + " - **संरचित समज**: Cognee एकत्रितपणे व्हेक्टर स्टोअर आणि ग्राफ स्टोअर वापरते, ज्यामुळे तुमचा डेटा अर्थाने शोधता येतो आणि नातेसंबंधांद्वारे जोडलेला असतो. Cognee डीफॉल्टनुसार फाइल-आधारित डेटाबेस वापरते (व्हेक्टरसाठी LanceDB, ग्राफ डेटाबेससाठी Kuzu).\n", + "\n", + " - **नातेसंबंध-जाणूनबुजून पुनर्प्राप्ती**: उत्तर केवळ \"समान मजकूर\" यावर आधारित नसून, घटक कसे संबंधित आहेत यावरही आधारित असू शकते.\n", + "\n", + " - **सजीव मेमरी**: मेमरी लेयर विकसित होते, वाढते आणि एका जोडलेल्या ग्राफसारखे क्वेरी करण्यायोग्य राहते.\n", + "\n", + "2. शोध आणि विचार करण्याचे मोड्स\n", + " - **हायब्रिड पुनर्प्राप्ती**: शोध व्हेक्टर साम्य, ग्राफ संरचना, आणि LLM विचार यांचे मिश्रण करते, कच्च्या चंक लुकअपपासून ग्राफ-जाणूनबुजून प्रश्नोत्तरांपर्यंत.\n", + "\n", + " - **कामासाठी योग्य मोड निवडा**: नैसर्गिक भाषेतील उत्तर हवे असल्यास पूर्णता-शैलीचे मोड वापरा, आणि कच्च्या संदर्भासाठी किंवा स्वतःच्या विचारांना चालना देण्यासाठी चंक/सारांश/ग्राफ मोड वापरा.\n", + "\n", + "3. वैयक्तिकृत, सत्र-जाणूनबुजून एजंट्स\n", + " - **सत्र संदर्भ + दीर्घकालीन मेमरी**: Cognee लहान-मुदतीच्या \"थ्रेड\" संदर्भाला दीर्घकालीन, वापरकर्ता- किंवा संघ-स्तरीय मेमरीपासून वेगळे ठेवते.\n", + "\n", + "## प्रत्यक्ष जीवनातील उपयोग\n", + "\n", + "1. **विशिष्ट क्षेत्रातील AI एजंट्स**\n", + "\n", + " या नोटबुकमधील पॅटर्न वापरून Cognee च्या पुनर्प्राप्ती आणि विचार प्रक्रियेच्या कोरवर आधारित डोमेन-ज्ञानी कोपायलट्स तयार करा:\n", + "\n", + "- **डेव्हलपर कोपायलट्स**: कोड पुनरावलोकन, घटना विश्लेषण, आणि आर्किटेक्चर सहाय्यक जे कोड, API, डिझाइन डॉक, आणि तिकिटे एका मेमरी ग्राफसारखे पाहतात.\n", + "\n", + "- **ग्राहकांसाठी कोपायलट्स**: समर्थन किंवा यशस्वी एजंट्स जे उत्पादन दस्तऐवज, FAQ, CRM नोट्स, आणि मागील तिकिटांमधून ग्राफ-जाणूनबुजून पुनर्प्राप्ती आणि संदर्भित उत्तरे देतात.\n", + "\n", + "- **आंतरर्गत तज्ज्ञ कोपायलट्स**: धोरण, कायदेशीर, किंवा सुरक्षा सहाय्यक जे स्वतंत्र PDF ऐवजी परस्पर जोडलेल्या नियम, मार्गदर्शक तत्त्वे, आणि ऐतिहासिक निर्णयांवर विचार करतात.\n", + "\n", + " Cognee स्पष्टपणे AI एजंट्ससाठी टिकाऊ, अचूक मेमरी म्हणून स्थानबद्ध आहे, एक सजीव ज्ञान ग्राफ प्रदान करते जो तुमच्या एजंटच्या मागे बसतो आणि व्हेक्टर स्टोअर्स आणि सानुकूल ग्राफ कोडच्या अडहॉक संयोजनांची जागा घेतो.\n", + "\n", + "2. **डेटा सिलोस एकत्रित करून एक मेमरी तयार करणे**\n", + "\n", + " हाच दृष्टिकोन विखुरलेल्या स्रोतांमध्ये एकसंध मेमरी लेयर तयार करण्यातही मदत करतो:\n", + "\n", + "- **सिलोसपासून एका ग्राफकडे**: संरचित (उदा. डेटाबेस) आणि असंरचित डेटा (उदा. दस्तऐवज, चॅट्स) एका एम्बेडिंगद्वारे समर्थित ग्राफमध्ये समाविष्ट करा, प्रत्येक प्रणालीसाठी स्वतंत्र निर्देशांकाऐवजी.\n", + "\n", + "- **स्रोतांमधील विचार आणि संदर्भासह पुनर्प्राप्ती**: सर्वकाही—\"जॉइन\" लॉग्स, मेट्रिक्स, आणि दस्तऐवज ग्राफद्वारे—मल्टी-स्टेप विचार करा आणि तरीही पुराव्यासह आधारभूत उत्तरे परत करा.\n", + "\n", + "- **ज्ञान केंद्रे**: बँकिंग किंवा शिक्षण यांसारख्या क्षेत्रांसाठी, Cognee आधीच PDF, अंतर्गत प्रणाली, आणि अॅप डेटाला एकत्रित करून एक ज्ञान ग्राफ तयार करण्यासाठी वापरले जाते, ज्यामुळे एजंट्स अचूक, संदर्भित संदर्भासह प्रश्नांची उत्तरे देऊ शकतात.\n", + "\n", + "## पुढील पावले\n", + "\n", + "तुम्ही कोर मेमरी लूप लागू केला आहे. येथे काही नैसर्गिक विस्तार आहेत जे तुम्ही स्वतः प्रयत्न करू शकता (तपशीलांसाठी [Cognee दस्तऐवज](https://docs.cognee.ai/) पहा):\n", + "\n", + "1. **कालबद्ध जागरूकतेसह प्रयोग करा**: टेक्स्टमधून घटना आणि टाइमस्टॅम्प काढण्यासाठी टेम्पोरल कॉग्निफाय चालू करा.\n", + "\n", + "2. **ऑन्टोलॉजी-चालित विचार प्रक्रिया सादर करा**: तुमच्या डोमेनसाठी एक OWL ऑन्टोलॉजी परिभाषित करा. Cognee च्या ऑन्टोलॉजी समर्थनाचा वापर करा जेणेकरून काढलेल्या घटक आणि नातेसंबंध त्या योजनेत आधारित असतील, ज्यामुळे ग्राफची गुणवत्ता आणि डोमेन-विशिष्ट उत्तरे सुधारतील.\n", + "\n", + "3. **फीडबॅक लूप जोडा**: वास्तविक वापरकर्ता अभिप्रायातून ग्राफ एज वेट्स समायोजित करण्यासाठी Cognee ला परवानगी द्या, त्यामुळे पुनर्प्राप्ती स्थिर राहण्याऐवजी कालांतराने सुधारते.\n", + "\n", + "4. **वैयक्तिकरण आणि सत्र वर्तनासाठी ट्यून करा**: वापरकर्ता आयडी, भाडेकरू, आणि डेटासेट्स वापरून प्रत्येक व्यक्ती किंवा टीमला सामायिक मेमरी इंजिनवर त्यांचा स्वतःचा दृष्टिकोन द्या.\n", + "\n", + "5. **अधिक जटिल एजंट्ससाठी स्केल करा**: Cognee ला एजंट फ्रेमवर्कमध्ये प्लग करा जेणेकरून सर्व एकाच मेमरी लेयर सामायिक करणारी मल्टी-एजंट सिस्टम तयार करता येईल. *Microsoft Agent Framework x Cognee प्लगइन लवकरच येत आहे.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**अस्वीकरण**: \nहा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) वापरून भाषांतरित करण्यात आला आहे. आम्ही अचूकतेसाठी प्रयत्नशील असलो तरी, कृपयास लक्षात ठेवा की स्वयंचलित भाषांतरे त्रुटी किंवा अचूकतेच्या अभावासह असू शकतात. मूळ भाषेतील दस्तऐवज हा अधिकृत स्रोत मानला जावा. महत्त्वाच्या माहितीसाठी, व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराचा वापर करून उद्भवलेल्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थासाठी आम्ही जबाबदार नाही.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:40:56+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "mr" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/mr/13-agent-memory/README.md b/translations/mr/13-agent-memory/README.md index 8297ef8d4..3ae859cad 100644 --- a/translations/mr/13-agent-memory/README.md +++ b/translations/mr/13-agent-memory/README.md @@ -1,13 +1,13 @@ -# AI एजंट्ससाठी मेमरी +# AI एजंट्ससाठी मेमरी [![एजंट मेमरी](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.mr.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) AI एजंट्स तयार करण्याच्या अनोख्या फायद्यांबद्दल चर्चा करताना दोन गोष्टी मुख्यतः चर्चेत असतात: टूल्स वापरून कार्य पूर्ण करण्याची क्षमता आणि वेळोवेळी सुधारणा करण्याची क्षमता. मेमरी ही स्वतः सुधारणा करणाऱ्या एजंट्स तयार करण्याचा पाया आहे, ज्यामुळे आपल्या वापरकर्त्यांसाठी चांगले अनुभव निर्माण होतात. @@ -20,133 +20,151 @@ AI एजंट्स तयार करण्याच्या अनोख • **AI एजंट मेमरी समजून घेणे**: मेमरी म्हणजे काय आणि एजंट्ससाठी ती का महत्त्वाची आहे. -• **मेमरी अंमलात आणणे आणि साठवणे**: AI एजंट्समध्ये मेमरी क्षमता जोडण्यासाठी व्यावहारिक पद्धती, ज्यामध्ये अल्पकालीन आणि दीर्घकालीन मेमरीवर लक्ष केंद्रित केले आहे. +• **मेमरी अंमलात आणणे आणि साठवणे**: आपल्या AI एजंट्समध्ये मेमरी क्षमता जोडण्यासाठी व्यावहारिक पद्धती, ज्यामध्ये अल्पकालीन आणि दीर्घकालीन मेमरीवर लक्ष केंद्रित केले आहे. • **AI एजंट्स स्वतः सुधारणा कसे करतात**: मेमरी एजंट्सना भूतकाळातील संवादांमधून शिकण्यास आणि वेळोवेळी सुधारणा करण्यास कशी मदत करते. +## उपलब्ध अंमलबजावणी + +या धड्यात दोन सविस्तर नोटबुक ट्यूटोरियल्स समाविष्ट आहेत: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Mem0 आणि Azure AI Search वापरून Semantic Kernel फ्रेमवर्कसह मेमरी अंमलात आणते. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Cognee वापरून संरचित मेमरी अंमलात आणते, ज्यामध्ये एम्बेडिंगद्वारे समर्थित ज्ञान ग्राफ तयार करणे, ग्राफ व्हिज्युअलायझेशन आणि बुद्धिमान पुनर्प्राप्ती समाविष्ट आहे. + ## शिकण्याची उद्दिष्टे हा धडा पूर्ण केल्यानंतर, तुम्हाला खालील गोष्टी माहित असतील: -• **AI एजंट्सच्या विविध प्रकारच्या मेमरीमध्ये फरक ओळखणे**, ज्यामध्ये वर्किंग, अल्पकालीन आणि दीर्घकालीन मेमरी तसेच व्यक्तिमत्व आणि एपिसोडिक मेमरीसारख्या विशेष प्रकारांचा समावेश आहे. +• **AI एजंट्सच्या विविध प्रकारच्या मेमरीमध्ये फरक ओळखणे**, ज्यामध्ये कार्यरत, अल्पकालीन आणि दीर्घकालीन मेमरी तसेच व्यक्तिमत्व आणि एपिसोडिक मेमरीसारख्या विशेष प्रकारांचा समावेश आहे. -• **AI एजंट्ससाठी अल्पकालीन आणि दीर्घकालीन मेमरी अंमलात आणणे आणि व्यवस्थापित करणे** Semantic Kernel फ्रेमवर्क वापरून, Mem0 आणि Whiteboard मेमरीसारख्या टूल्सचा उपयोग करून आणि Azure AI Search सह एकत्रित करून. +• **AI एजंट्ससाठी अल्पकालीन आणि दीर्घकालीन मेमरी अंमलात आणणे आणि व्यवस्थापित करणे** Semantic Kernel फ्रेमवर्क वापरून, Mem0, Cognee, Whiteboard मेमरी आणि Azure AI Search सह एकत्रित करून. -• **स्वतः सुधारणा करणाऱ्या AI एजंट्सच्या मागील तत्त्वे समजून घेणे** आणि मजबूत मेमरी व्यवस्थापन प्रणाली सतत शिकण्यास आणि अनुकूलतेस कशी योगदान देते. +• **स्वतः सुधारणा करणाऱ्या AI एजंट्सच्या मागील तत्त्वे समजून घेणे** आणि मजबूत मेमरी व्यवस्थापन प्रणाली सतत शिकण्यास आणि अनुकूलतेस कशी मदत करते. ## AI एजंट मेमरी समजून घेणे -मूलत: **AI एजंट्ससाठी मेमरी म्हणजे अशी यंत्रणा जी त्यांना माहिती टिकवून ठेवण्यास आणि आठवण्यास सक्षम करते**. ही माहिती संवादातील विशिष्ट तपशील, वापरकर्त्याच्या पसंती, भूतकाळातील कृती किंवा शिकलेले नमुने असू शकते. +मूलत: **AI एजंट्ससाठी मेमरी म्हणजे त्यांना माहिती टिकवून ठेवण्याची आणि आठवण्याची परवानगी देणारे यंत्रणा**. ही माहिती संवादातील विशिष्ट तपशील, वापरकर्त्याच्या प्राधान्ये, भूतकाळातील कृती किंवा शिकलेले नमुने असू शकते. -मेमरीशिवाय, AI अॅप्लिकेशन्स बहुतेक वेळा "स्टेटलेस" असतात, म्हणजे प्रत्येक संवाद नव्याने सुरू होतो. यामुळे एजंट भूतकाळातील संदर्भ किंवा पसंती "विसरतो" आणि वापरकर्त्याचा अनुभव पुनरावृत्तीपूर्ण आणि निराशाजनक होतो. +मेमरीशिवाय, AI अॅप्लिकेशन्स अनेकदा स्टेटलेस असतात, म्हणजे प्रत्येक संवाद नव्याने सुरू होतो. यामुळे एजंट भूतकाळातील संदर्भ किंवा प्राधान्ये "विसरतो" आणि वापरकर्त्याचा अनुभव पुनरावृत्तीपूर्ण आणि निराशाजनक होतो. ### मेमरी का महत्त्वाची आहे? -एजंट्सची बुद्धिमत्ता भूतकाळातील माहिती आठवण्याची आणि वापरण्याची क्षमता यावर अवलंबून असते. मेमरी एजंट्सना खालील प्रकारे सक्षम करते: +एजंट्सची बुद्धिमत्ता भूतकाळातील माहिती आठवण्याची आणि वापरण्याची क्षमता यावर खूप अवलंबून असते. मेमरी एजंट्सना खालील प्रकारे मदत करते: • **प्रतिबिंबित**: भूतकाळातील कृती आणि परिणामांमधून शिकणे. • **संवादी**: चालू संवादाचा संदर्भ टिकवून ठेवणे. -• **प्रोएक्टिव्ह आणि रिएक्टिव्ह**: ऐतिहासिक डेटाच्या आधारे गरजा ओळखणे किंवा योग्य प्रतिसाद देणे. +• **प्रोएक्टिव्ह आणि रिएक्टिव्ह**: ऐतिहासिक डेटावर आधारित गरजा ओळखणे किंवा योग्य प्रतिसाद देणे. -• **स्वायत्त**: साठवलेल्या ज्ञानाचा उपयोग करून अधिक स्वतंत्रपणे कार्य करणे. +• **स्वायत्त**: साठवलेल्या ज्ञानाचा वापर करून अधिक स्वतंत्रपणे कार्य करणे. -मेमरी अंमलात आणण्याचा उद्देश एजंट्स अधिक **विश्वसनीय आणि सक्षम** बनवणे आहे. +मेमरी अंमलात आणण्याचे उद्दिष्ट एजंट्स अधिक **विश्वसनीय आणि सक्षम** बनवणे आहे. ### मेमरीचे प्रकार -#### वर्किंग मेमरी +#### कार्यरत मेमरी -याला एजंट एका विशिष्ट कार्य किंवा विचार प्रक्रियेदरम्यान वापरणाऱ्या तात्काळ माहितीचा तुकडा समजले जाते. हे पुढील पायरीसाठी आवश्यक माहिती ठेवते. +याला एजंट एका विशिष्ट कार्य किंवा विचार प्रक्रियेदरम्यान वापरत असलेल्या तात्पुरत्या माहितीचा तुकडा समजले जाते. हे पुढील चरणाची गणना करण्यासाठी आवश्यक तात्काळ माहिती ठेवते. -AI एजंट्ससाठी, वर्किंग मेमरी संवादातील सर्वात संबंधित माहिती कॅप्चर करते, जरी पूर्ण चॅट इतिहास लांब किंवा कापलेला असला तरी. हे आवश्यकता, प्रस्ताव, निर्णय आणि कृती यासारख्या मुख्य घटकांवर लक्ष केंद्रित करते. +AI एजंट्ससाठी, कार्यरत मेमरी अनेकदा संवादातील सर्वात संबंधित माहिती कॅप्चर करते, जरी पूर्ण चॅट इतिहास लांब किंवा कापलेला असला तरी. हे आवश्यकता, प्रस्ताव, निर्णय आणि कृती यासारख्या प्रमुख घटक काढण्यावर लक्ष केंद्रित करते. -**वर्किंग मेमरीचे उदाहरण** +**कार्यरत मेमरीचे उदाहरण** -एका प्रवास बुकिंग एजंटमध्ये, वर्किंग मेमरी वापरकर्त्याची सध्याची विनंती कॅप्चर करू शकते, जसे की "मला पॅरिसला प्रवास बुक करायचा आहे". ही विशिष्ट आवश्यकता सध्याच्या संवादाचे मार्गदर्शन करण्यासाठी एजंटच्या तात्काळ संदर्भात ठेवली जाते. +प्रवास बुकिंग एजंटमध्ये, कार्यरत मेमरी वापरकर्त्याच्या सध्याच्या विनंतीसाठी "मला पॅरिसला प्रवास बुक करायचा आहे" असे कॅप्चर करू शकते. ही विशिष्ट आवश्यकता सध्याच्या संवादाचे मार्गदर्शन करण्यासाठी एजंटच्या तात्काळ संदर्भात ठेवली जाते. #### अल्पकालीन मेमरी -हा प्रकार एका संवाद किंवा सत्राच्या कालावधीसाठी माहिती टिकवून ठेवतो. हे चालू चॅटचा संदर्भ आहे, ज्यामुळे एजंट संवादातील मागील टप्प्यांचा संदर्भ घेऊ शकतो. +हा प्रकार एका संवाद किंवा सत्राच्या कालावधीसाठी माहिती टिकवून ठेवतो. हे चालू चॅटचे संदर्भ आहे, ज्यामुळे एजंटला संवादातील मागील टप्प्यांचा संदर्भ घेता येतो. **अल्पकालीन मेमरीचे उदाहरण** -जर वापरकर्त्याने विचारले, "पॅरिसला फ्लाइटचा खर्च किती होईल?" आणि नंतर विचारले, "तेथे राहण्याचा खर्च काय असेल?", तर अल्पकालीन मेमरी एजंटला "तेथे" म्हणजे "पॅरिस" आहे हे माहित ठेवते. +जर वापरकर्त्याने विचारले, "पॅरिसला फ्लाइट किती खर्च येईल?" आणि नंतर "तेथे निवासस्थानाबद्दल काय?", तर अल्पकालीन मेमरी एजंटला "तेथे" म्हणजे "पॅरिस" असल्याचे माहित ठेवते. #### दीर्घकालीन मेमरी -ही माहिती अनेक संवाद किंवा सत्रांमध्ये टिकून राहते. यामुळे एजंट्सला वापरकर्त्याच्या पसंती, ऐतिहासिक संवाद किंवा सामान्य ज्ञान दीर्घ कालावधीसाठी लक्षात ठेवता येते. वैयक्तिकरणासाठी हे महत्त्वाचे आहे. +ही माहिती अनेक संवाद किंवा सत्रांमध्ये टिकून राहते. यामुळे एजंट्सना वापरकर्त्याच्या प्राधान्ये, ऐतिहासिक संवाद किंवा सामान्य ज्ञान दीर्घकाळ टिकवून ठेवता येते. वैयक्तिकरणासाठी हे महत्त्वाचे आहे. **दीर्घकालीन मेमरीचे उदाहरण** -दीर्घकालीन मेमरी "बेनला स्कीइंग आणि बाह्य क्रियाकलाप आवडतात, कॉफी पर्वताच्या दृश्यासह आवडते आणि भूतकाळातील दुखापतीमुळे प्रगत स्की स्लोप्स टाळायचे आहेत" हे साठवू शकते. ही माहिती, मागील संवादांमधून शिकलेली, भविष्यातील प्रवास नियोजन सत्रांमध्ये शिफारसींवर प्रभाव टाकते, ज्यामुळे त्या अत्यंत वैयक्तिकृत होतात. +दीर्घकालीन मेमरी "बेनला स्कीइंग आणि बाह्य क्रियाकलाप आवडतात, माउंटन व्ह्यूसह कॉफी आवडते आणि भूतकाळातील दुखापतीमुळे प्रगत स्की स्लोप्स टाळायचे आहेत" असे साठवू शकते. ही माहिती, मागील संवादांमधून शिकलेली, भविष्यातील प्रवास नियोजन सत्रांमध्ये शिफारसींवर प्रभाव टाकते, ज्यामुळे त्या अत्यंत वैयक्तिकृत होतात. #### व्यक्तिमत्व मेमरी -हा विशेष प्रकार एजंटला सुसंगत "व्यक्तिमत्व" किंवा "भूमिका" विकसित करण्यात मदत करतो. यामुळे एजंटला स्वतःबद्दल किंवा त्याच्या इच्छित भूमिकेबद्दल तपशील लक्षात ठेवता येतो, ज्यामुळे संवाद अधिक प्रवाही आणि केंद्रित होतो. +हा विशेष मेमरी प्रकार एजंटला सुसंगत "व्यक्तिमत्व" किंवा "व्यक्तिमत्व" विकसित करण्यात मदत करतो. यामुळे एजंटला स्वतःबद्दल किंवा त्याच्या इच्छित भूमिकेबद्दल तपशील लक्षात ठेवता येतो, ज्यामुळे संवाद अधिक प्रवाही आणि केंद्रित होतो. **व्यक्तिमत्व मेमरीचे उदाहरण** -जर प्रवास एजंट "स्की नियोजन तज्ञ" म्हणून डिझाइन केलेला असेल, तर व्यक्तिमत्व मेमरी ही भूमिका मजबूत करू शकते, ज्यामुळे त्याच्या प्रतिसादांवर तज्ञाच्या टोन आणि ज्ञानाशी सुसंगत परिणाम होतो. +जर प्रवास एजंट "तज्ञ स्की प्लॅनर" म्हणून डिझाइन केलेला असेल, तर व्यक्तिमत्व मेमरी ही भूमिका मजबूत करू शकते, ज्यामुळे त्याच्या प्रतिसादांवर तज्ञाच्या टोन आणि ज्ञानाशी सुसंगत परिणाम होतो. -#### वर्कफ्लो/एपिसोडिक मेमरी +#### कार्यप्रवाह/एपिसोडिक मेमरी -ही मेमरी एजंटने जटिल कार्यादरम्यान घेतलेल्या पायऱ्यांचा क्रम, यश आणि अपयश साठवते. हे भूतकाळातील विशिष्ट "एपिसोड्स" किंवा अनुभव लक्षात ठेवण्यासारखे आहे. +ही मेमरी एजंटने जटिल कार्यादरम्यान घेतलेल्या चरणांचा क्रम, यश आणि अपयश साठवते. हे भूतकाळातील विशिष्ट "एपिसोड" किंवा अनुभव लक्षात ठेवण्यासारखे आहे, ज्यामुळे त्यातून शिकता येते. **एपिसोडिक मेमरीचे उदाहरण** -जर एजंटने विशिष्ट फ्लाइट बुक करण्याचा प्रयत्न केला पण ती उपलब्ध नसल्यामुळे अपयशी ठरली, तर एपिसोडिक मेमरी हे अपयश नोंदवू शकते, ज्यामुळे एजंटला पर्यायी फ्लाइट्सचा प्रयत्न करण्यास किंवा वापरकर्त्याला पुढील प्रयत्नादरम्यान अधिक माहितीपूर्ण पद्धतीने समस्या सांगण्यास मदत होते. +जर एजंटने विशिष्ट फ्लाइट बुक करण्याचा प्रयत्न केला पण ती अनुपलब्धतेमुळे अयशस्वी झाली, तर एपिसोडिक मेमरी ही अयशस्वीता नोंदवू शकते, ज्यामुळे एजंटला पर्यायी फ्लाइट्सचा प्रयत्न करता येतो किंवा वापरकर्त्याला पुढील प्रयत्नादरम्यान अधिक माहितीपूर्ण पद्धतीने समस्या सांगता येते. -#### एंटिटी मेमरी +#### घटक मेमरी -यामध्ये संवादांमधून विशिष्ट घटक (जसे की व्यक्ती, ठिकाणे किंवा वस्तू) आणि घटना काढणे आणि लक्षात ठेवणे समाविष्ट आहे. यामुळे एजंटला चर्चेत असलेल्या प्रमुख घटकांची संरचित समज तयार करता येते. +यामध्ये संवादांमधून विशिष्ट घटक (जसे की लोक, ठिकाणे किंवा वस्तू) आणि घटना काढणे आणि लक्षात ठेवणे समाविष्ट आहे. यामुळे एजंटला चर्चेत असलेल्या प्रमुख घटकांची संरचित समज तयार करता येते. -**एंटिटी मेमरीचे उदाहरण** +**घटक मेमरीचे उदाहरण** -मागील प्रवासाबद्दलच्या संवादातून, एजंट "पॅरिस," "आयफेल टॉवर," आणि "Le Chat Noir रेस्टॉरंटमध्ये डिनर" यासारख्या घटक काढू शकतो. भविष्यातील संवादात, एजंट "Le Chat Noir" लक्षात ठेवून तिथे नवीन आरक्षण करण्याची ऑफर देऊ शकतो. +भूतकाळातील प्रवासाबद्दलच्या संवादातून, एजंट "पॅरिस," "आयफेल टॉवर," आणि "ले चॅट नोयर रेस्टॉरंटमध्ये डिनर" असे घटक काढू शकतो. भविष्यातील संवादात, एजंट "ले चॅट नोयर" लक्षात ठेवू शकतो आणि तेथे नवीन आरक्षण करण्याची ऑफर देऊ शकतो. -#### स्ट्रक्चर्ड RAG (रिट्रीव्हल ऑगमेंटेड जनरेशन) +#### संरचित RAG (पुनर्प्राप्ती वाढवलेली निर्मिती) -RAG ही एक व्यापक तंत्र आहे, परंतु "स्ट्रक्चर्ड RAG" हे एक शक्तिशाली मेमरी तंत्रज्ञान म्हणून अधोरेखित केले जाते. हे विविध स्रोतांमधून (संवाद, ईमेल्स, प्रतिमा) घन, संरचित माहिती काढते आणि प्रतिसादांमध्ये अचूकता, आठवण आणि वेग वाढवण्यासाठी वापरते. क्लासिक RAG केवळ सेमॅंटिक साम्यावर अवलंबून असते, तर स्ट्रक्चर्ड RAG माहितीच्या अंतर्गत संरचनेवर कार्य करते. +RAG ही एक व्यापक तंत्र आहे, परंतु "संरचित RAG" हे एक शक्तिशाली मेमरी तंत्रज्ञान म्हणून अधोरेखित केले जाते. हे विविध स्रोतांमधून (संवाद, ईमेल, प्रतिमा) घन, संरचित माहिती काढते आणि प्रतिसादांमध्ये अचूकता, पुनर्प्राप्ती आणि गती वाढवण्यासाठी वापरते. क्लासिक RAG केवळ सेमॅंटिक साम्यावर अवलंबून असते, तर संरचित RAG माहितीच्या अंतर्गत संरचनेवर कार्य करते. -**स्ट्रक्चर्ड RAG चे उदाहरण** +**संरचित RAG चे उदाहरण** -फक्त कीवर्ड जुळवण्याऐवजी, स्ट्रक्चर्ड RAG ईमेलमधून फ्लाइट तपशील (गंतव्यस्थान, तारीख, वेळ, एअरलाइन) पार्स करू शकते आणि ते संरचित पद्धतीने साठवू शकते. यामुळे "मी मंगळवारी पॅरिसला कोणती फ्लाइट बुक केली?" यासारख्या अचूक चौकशी शक्य होते. +फक्त कीवर्ड जुळवण्याऐवजी, संरचित RAG ईमेलमधून फ्लाइट तपशील (गंतव्यस्थान, तारीख, वेळ, एअरलाइन) पार्स करू शकते आणि ते संरचित पद्धतीने साठवू शकते. यामुळे "मंगळवारी पॅरिसला कोणती फ्लाइट बुक केली?" यासारख्या अचूक क्वेरींना परवानगी मिळते. ## मेमरी अंमलात आणणे आणि साठवणे -AI एजंट्ससाठी मेमरी अंमलात आणणे म्हणजे **मेमरी व्यवस्थापन** प्रक्रियेचा एक प्रणालीबद्ध दृष्टिकोन, ज्यामध्ये माहिती निर्माण करणे, साठवणे, पुनर्प्राप्त करणे, एकत्रित करणे, अद्यतनित करणे आणि "विसरणे" (किंवा हटवणे) यांचा समावेश आहे. पुनर्प्राप्ती हा विशेषतः महत्त्वाचा पैलू आहे. +AI एजंट्ससाठी मेमरी अंमलात आणणे म्हणजे **मेमरी व्यवस्थापन** प्रक्रिया, ज्यामध्ये माहिती निर्माण करणे, साठवणे, पुनर्प्राप्त करणे, एकत्रित करणे, अद्यतनित करणे आणि "विसरणे" (किंवा हटवणे) समाविष्ट आहे. पुनर्प्राप्ती हा विशेषतः महत्त्वाचा पैलू आहे. ### विशेष मेमरी टूल्स -एजंट मेमरी साठवण्यासाठी आणि व्यवस्थापित करण्याचा एक मार्ग म्हणजे Mem0 सारख्या विशेष टूल्सचा वापर. Mem0 एक स्थिर मेमरी स्तर म्हणून कार्य करते, ज्यामुळे एजंट्सना संबंधित संवाद आठवणे, वापरकर्त्याच्या पसंती आणि तथ्यात्मक संदर्भ साठवणे आणि वेळोवेळी यश आणि अपयशांमधून शिकणे शक्य होते. यामागील कल्पना अशी आहे की स्टेटलेस एजंट्स स्टेटफुल बनतात. +#### Mem0 + +एजंट मेमरी साठवण्यासाठी आणि व्यवस्थापित करण्याचा एक मार्ग म्हणजे Mem0 सारख्या विशेष टूल्सचा वापर. Mem0 एक स्थिर मेमरी लेयर म्हणून कार्य करते, ज्यामुळे एजंट्सना संबंधित संवाद आठवणे, वापरकर्त्याच्या प्राधान्ये आणि तथ्यात्मक संदर्भ साठवणे आणि वेळोवेळी यश आणि अपयशांमधून शिकणे शक्य होते. येथे कल्पना अशी आहे की स्टेटलेस एजंट्स स्टेटफुल बनतात. + +हे **दोन-चरणीय मेमरी पाइपलाइन: एक्स्ट्रॅक्शन आणि अपडेट** द्वारे कार्य करते. प्रथम, एजंटच्या थ्रेडमध्ये जोडलेले संदेश Mem0 सेवेकडे पाठवले जातात, जे संवाद इतिहासाचा सारांश तयार करण्यासाठी आणि नवीन मेमरी काढण्यासाठी मोठ्या भाषा मॉडेल (LLM) वापरते. त्यानंतर, LLM-चालित अपडेट टप्पा ठरवतो की या मेमरी जोडायच्या, सुधारायच्या किंवा हटवायच्या आहेत का, आणि त्यांना व्हेक्टर, ग्राफ आणि की-वॅल्यू डेटाबेस समाविष्ट असलेल्या हायब्रिड डेटा स्टोअरमध्ये साठवतो. ही प्रणाली विविध मेमरी प्रकारांना समर्थन देते आणि घटकांमधील संबंध व्यवस्थापित करण्यासाठी ग्राफ मेमरी समाविष्ट करू शकते. + +#### Cognee + +आणखी एक शक्तिशाली दृष्टिकोन म्हणजे **Cognee** वापरणे, AI एजंट्ससाठी एक ओपन-सोर्स सेमॅंटिक मेमरी जी संरचित आणि असंरचित डेटाला क्वेरी करण्यायोग्य ज्ञान ग्राफमध्ये रूपांतरित करते, एम्बेडिंगद्वारे समर्थित. Cognee एक **दुहेरी स्टोअर आर्किटेक्चर** प्रदान करते जे व्हेक्टर साम्य शोध आणि ग्राफ संबंध एकत्रित करते, ज्यामुळे एजंट्सना केवळ कोणती माहिती समान आहे हे समजण्यास मदत होते, तर संकल्पना एकमेकांशी कशा संबंधित आहेत हे देखील समजते. + +हे **हायब्रिड पुनर्प्राप्ती** मध्ये उत्कृष्ट आहे जे व्हेक्टर साम्य, ग्राफ संरचना आणि LLM तर्क यांचे मिश्रण करते - कच्च्या तुकड्यांच्या शोधापासून ग्राफ-जागरूक प्रश्न उत्तर देण्यापर्यंत. प्रणाली **जिवंत मेमरी** टिकवते जी विकसित होते आणि वाढते, एकत्रित ग्राफ म्हणून क्वेरी करण्यायोग्य राहते, अल्पकालीन सत्र संदर्भ आणि दीर्घकालीन स्थिर मेमरी दोन्हीला समर्थन देते. -हे **दोन-टप्प्यांच्या मेमरी पाइपलाइनद्वारे कार्य करते: एक्स्ट्रॅक्शन आणि अपडेट**. प्रथम, एजंटच्या थ्रेडमध्ये जोडलेले संदेश Mem0 सेवेला पाठवले जातात, जे संवाद इतिहासाचा सारांश तयार करण्यासाठी आणि नवीन मेमरी काढण्यासाठी मोठ्या भाषा मॉडेल (LLM) वापरते. त्यानंतर, LLM-चालित अपडेट टप्पा ठरवतो की या मेमरी जोडायच्या, सुधारायच्या किंवा हटवायच्या आहेत का, आणि त्या व्हेक्टर, ग्राफ आणि की-वॅल्यू डेटाबेससह हायब्रिड डेटा स्टोअरमध्ये साठवतो. ही प्रणाली विविध प्रकारच्या मेमरीला समर्थन देते आणि एंटिटींमधील संबंध व्यवस्थापित करण्यासाठी ग्राफ मेमरी समाविष्ट करू शकते. +Cognee नोटबुक ट्यूटोरियल ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) हे एकत्रित मेमरी लेयर तयार करण्याचे प्रात्यक्षिक देते, विविध डेटा स्रोतांचे इनजेस्टिंग, ज्ञान ग्राफ व्हिज्युअलायझेशन आणि विशिष्ट एजंट गरजांसाठी तयार केलेल्या वेगवेगळ्या शोध रणनीतींसह क्वेरी करण्याचे व्यावहारिक उदाहरणे. ### RAG सह मेमरी साठवणे -Mem0 सारख्या विशेष मेमरी टूल्स व्यतिरिक्त, तुम्ही **Azure AI Search** सारख्या मजबूत शोध सेवांचा उपयोग मेमरी साठवण्यासाठी आणि पुनर्प्राप्त करण्यासाठी करू शकता, विशेषतः स्ट्रक्चर्ड RAG साठी. +Mem0 सारख्या विशेष मेमरी टूल्स व्यतिरिक्त, तुम्ही **Azure AI Search** सारख्या मजबूत शोध सेवांचा वापर मेमरी साठवण्यासाठी आणि पुनर्प्राप्त करण्यासाठी करू शकता, विशेषतः संरचित RAG साठी. -यामुळे तुमच्या एजंटच्या प्रतिसादांना तुमच्या स्वतःच्या डेटासह आधार मिळतो, ज्यामुळे अधिक संबंधित आणि अचूक उत्तरांची खात्री होते. Azure AI Search वापरकर्त्याच्या प्रवासाच्या विशिष्ट आठवणी, उत्पादन कॅटलॉग किंवा इतर कोणत्याही डोमेन-विशिष्ट ज्ञान साठवण्यासाठी वापरले जाऊ शकते. +यामुळे तुमच्या एजंटच्या प्रतिसादांना तुमच्या स्वतःच्या डेटासह आधार देणे शक्य होते, ज्यामुळे अधिक संबंधित आणि अचूक उत्तर मिळते. Azure AI Search वापरकर्त्याच्या प्रवासाच्या विशिष्ट मेमरी, उत्पादन कॅटलॉग किंवा इतर कोणत्याही डोमेन-विशिष्ट ज्ञान साठवण्यासाठी वापरले जाऊ शकते. -Azure AI Search **स्ट्रक्चर्ड RAG** सारख्या क्षमता समर्थित करते, जे संवाद इतिहास, ईमेल्स किंवा प्रतिमा यासारख्या मोठ्या डेटासेटमधून घन, संरचित माहिती काढण्यात आणि पुनर्प्राप्त करण्यात उत्कृष्ट आहे. हे पारंपरिक टेक्स्ट चंकिंग आणि एम्बेडिंग पद्धतींशी तुलना करता "सुपरह्युमन अचूकता आणि आठवण" प्रदान करते. +Azure AI Search **संरचित RAG** सारख्या क्षमता समर्थित करते, जे संवाद इतिहास, ईमेल किंवा प्रतिमा यासारख्या मोठ्या डेटासेटमधून घन, संरचित माहिती काढण्यात आणि पुनर्प्राप्त करण्यात उत्कृष्ट आहे. हे पारंपरिक टेक्स्ट चंकिंग आणि एम्बेडिंग दृष्टिकोनांच्या तुलनेत "अतिमानवी अचूकता आणि पुनर्प्राप्ती" प्रदान करते. ## AI एजंट्स स्वतः सुधारणा कसे करतात -स्वतः सुधारणा करणाऱ्या एजंट्ससाठी एक सामान्य नमुना म्हणजे **"ज्ञान एजंट"** सादर करणे. हा स्वतंत्र एजंट वापरकर्त्याच्या आणि प्राथमिक एजंटच्या मुख्य संवादाचे निरीक्षण करतो. त्याची भूमिका खालीलप्रमाणे आहे: +स्वतः सुधारणा करणाऱ्या एजंट्ससाठी एक सामान्य नमुना म्हणजे **"ज्ञान एजंट"** सादर करणे. हा स्वतंत्र एजंट वापरकर्त्याच्या आणि प्राथमिक एजंटच्या मुख्य संवादाचे निरीक्षण करतो. त्याची भूमिका आहे: -1. **मूल्यवान माहिती ओळखणे**: संवादातील कोणताही भाग सामान्य ज्ञान किंवा विशिष्ट वापरकर्ता पसंती म्हणून साठवण्यास योग्य आहे का हे ठरवणे. +1. **मूल्यवान माहिती ओळखणे**: संवादाचा कोणताही भाग सामान्य ज्ञान किंवा विशिष्ट वापरकर्ता प्राधान्य म्हणून साठवण्यास योग्य आहे का ते ठरवणे. -2. **काढणे आणि सारांश तयार करणे**: संवादातून आवश्यक शिक्षण किंवा पसंती काढणे. +2. **काढणे आणि सारांश तयार करणे**: संवादातून आवश्यक शिक्षण किंवा प्राधान्य काढणे. -3. **ज्ञान बेसमध्ये साठवणे**: काढलेली माहिती टिकवून ठेवणे, अनेकदा व्हेक्टर डेटाबेसमध्ये, जेणेकरून ती नंतर पुनर्प्राप्त केली जाऊ शकते. +3. **ज्ञान बेसमध्ये साठवणे**: काढलेली माहिती टिकवणे, अनेकदा व्हेक्टर डेटाबेसमध्ये, जेणेकरून ती नंतर पुनर्प्राप्त करता येईल. -4. **भविष्यातील चौकशींमध्ये सुधारणा करणे**: जेव्हा वापरकर्ता नवीन चौकशी सुरू करतो, तेव्हा ज्ञान एजंट संबंधित साठवलेली माहिती पुनर्प्राप्त करतो आणि ती वापरकर्त्याच्या प्रॉम्प्टमध्ये जोडतो, प्राथमिक एजंटला महत्त्वाचा संदर्भ प्रदान करतो (RAG प्रमाणे). +4. **भविष्यातील क्वेरी वाढवणे**: जेव्हा वापरकर्ता नवीन क्वेरी सुरू करतो, तेव्हा ज्ञान एजंट संबंधित साठवलेली माहिती पुनर्प्राप्त करतो आणि ती वापरकर्त्याच्या प्रॉम्प्टमध्ये जोडतो, प्राथमिक एजंटला महत्त्वाचा संदर्भ प्रदान करतो (RAG प्रमाणे). -### मेमरीसाठी ऑप्टिमायझेशन्स +### मेमरीसाठी ऑप्टिमायझेशन -• **लेटन्सी व्यवस्थापन**: वापरकर्त्याच्या संवादात विलंब टाळण्यासाठी, माहिती साठवणे किंवा पुनर्प्राप्त करणे योग्य आहे का हे जलद तपासण्यासाठी स्वस्त, जलद मॉडेल वापरले जाऊ शकते, केवळ आवश्यक असल्यास अधिक जटिल एक्स्ट्रॅक्शन/रिट्रीव्हल प्रक्रिया सुरू केली जाते. +• **लेटन्सी व्यवस्थापन**: वापरकर्त्याच्या संवादांना धीमा होण्यापासून टाळण्यासाठी, माहिती साठवणे किंवा पुनर्प्राप्त करणे योग्य आहे का हे जलद तपासण्यासाठी स्वस्त, जलद मॉडेल वापरले जाऊ शकते, केवळ आवश्यक असल्यास अधिक जटिल प्रक्रिया सुरू केली जाते. • **ज्ञान बेस देखभाल**: वाढत्या ज्ञान बेससाठी, कमी वारंवार वापरली जाणारी माहिती "कोल्ड स्टोरेज" मध्ये हलवली जाऊ शकते, ज्यामुळे खर्च व्यवस्थापित होतो. @@ -156,5 +174,7 @@ Azure AI Search **स्ट्रक्चर्ड RAG** सारख्या --- + **अस्वीकरण**: -हा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) वापरून भाषांतरित करण्यात आला आहे. आम्ही अचूकतेसाठी प्रयत्नशील असलो तरी कृपया लक्षात ठेवा की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा अचूकतेचा अभाव असू शकतो. मूळ भाषेतील दस्तऐवज हा अधिकृत स्रोत मानला जावा. महत्त्वाच्या माहितीसाठी व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराचा वापर करून उद्भवलेल्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थासाठी आम्ही जबाबदार राहणार नाही. \ No newline at end of file +हा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) वापरून भाषांतरित करण्यात आला आहे. आम्ही अचूकतेसाठी प्रयत्नशील असलो तरी, कृपयास लक्षात ठेवा की स्वयंचलित भाषांतरे त्रुटी किंवा अचूकतेच्या अभावाने युक्त असू शकतात. मूळ भाषेतील दस्तऐवज हा अधिकृत स्रोत मानला जावा. महत्त्वाच्या माहितीसाठी, व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराचा वापर करून उद्भवलेल्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थासाठी आम्ही जबाबदार नाही. + \ No newline at end of file diff --git a/translations/ms/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/ms/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..a341e61c1 --- /dev/null +++ b/translations/ms/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Membina Ejen AI dengan Memori Berterusan menggunakan Cognee\n", + "\n", + "Notebook ini menunjukkan cara membina ejen AI pintar dengan keupayaan memori yang canggih menggunakan [**cognee**](https://www.cognee.ai/) - memori AI sumber terbuka yang menggabungkan graf pengetahuan, carian semantik, dan pengurusan sesi untuk mencipta sistem AI yang sedar konteks.\n", + "\n", + "## 🎯 Objektif Pembelajaran\n", + "\n", + "Pada akhir tutorial ini, anda akan memahami cara untuk:\n", + "- **Membina Graf Pengetahuan Disokong oleh Embedding**: Menukar teks tidak berstruktur kepada pengetahuan yang berstruktur dan boleh ditanya\n", + "- **Melaksanakan Memori Sesi**: Mewujudkan perbualan berbilang giliran dengan pengekalan konteks secara automatik\n", + "- **Menyimpan Perbualan**: Secara opsional menyimpan interaksi penting dalam memori jangka panjang untuk rujukan masa depan\n", + "- **Bertanya Menggunakan Bahasa Semula Jadi**: Mengakses dan memanfaatkan konteks sejarah dalam perbualan baru\n", + "- **Visualisasi Memori**: Meneroka hubungan dalam graf pengetahuan ejen anda\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Apa Yang Akan Anda Bina\n", + "\n", + "Dalam tutorial ini, kita akan mencipta **Pembantu Pengaturcaraan** dengan memori berterusan yang:\n", + "\n", + "### 1. **Pembinaan Pangkalan Pengetahuan**\n", + " - Mengambil maklumat profil dan kepakaran pembangun\n", + " - Memproses prinsip dan amalan terbaik pengaturcaraan Python\n", + " - Menyimpan perbualan sejarah antara pembangun dan pembantu AI\n", + "\n", + "### 2. **Perbualan Sedar Sesi**\n", + " - Mengekalkan konteks merentasi pelbagai soalan dalam sesi yang sama\n", + " - Secara automatik menyimpan setiap pasangan soalan/jawapan untuk pengambilan yang cekap\n", + " - Memberikan respons yang koheren dan berkonteks berdasarkan sejarah perbualan\n", + "\n", + "### 3. **Memori Jangka Panjang**\n", + " - Menyimpan perbualan penting ke dalam memori jangka panjang\n", + " - Mengambil memori yang relevan dari pangkalan pengetahuan dan sesi lalu untuk memaklumkan interaksi baru\n", + " - Membina pangkalan pengetahuan yang berkembang dan bertambah baik dari masa ke masa\n", + "\n", + "### 4. **Pengambilan Memori Pintar**\n", + " - Menggunakan carian semantik yang sedar graf untuk mencari maklumat yang relevan di seluruh pengetahuan yang disimpan\n", + " - Menapis carian mengikut subkumpulan data (maklumat pembangun vs. prinsip)\n", + " - Menggabungkan pelbagai sumber data untuk memberikan jawapan yang komprehensif\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Prasyarat & Persediaan\n", + "\n", + "### Keperluan Sistem\n", + "\n", + "Sebelum memulakan, pastikan anda mempunyai:\n", + "\n", + "1. **Persekitaran Python**\n", + " - Python 3.9 atau lebih tinggi\n", + " - Persekitaran maya (disyorkan)\n", + " \n", + "2. **Redis Cache** (Diperlukan untuk Pengurusan Sesi)\n", + " - Redis Tempatan: `docker run -d -p 6379:6379 redis`\n", + " - Atau gunakan perkhidmatan Redis yang diuruskan\n", + " \n", + "3. **Akses API LLM**\n", + " - Kunci API OpenAI atau penyedia lain (lihat [dokumentasi](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Konfigurasi Pangkalan Data**\n", + " - Tiada konfigurasi diperlukan secara lalai. Cognee menggunakan pangkalan data berasaskan fail (LanceDB dan Kuzu)\n", + " - Secara opsyenal, anda boleh menyediakan Azure AI Search sebagai stor vektor (lihat [dokumentasi](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Konfigurasi Persekitaran\n", + "\n", + "Cipta fail `.env` dalam direktori projek anda dengan pembolehubah berikut:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Memahami Seni Bina Memori Cognee\n", + "\n", + "### Bagaimana Cognee Berfungsi\n", + "\n", + "Cognee menyediakan sistem memori yang canggih yang melangkaui penyimpanan kunci-nilai yang mudah:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Komponen Utama:\n", + "\n", + "1. **Graf Pengetahuan**: Menyimpan entiti, hubungan, dan sambungan semantik\n", + "2. **Vector Embeddings**: Membolehkan carian semantik merentasi semua maklumat yang disimpan\n", + "3. **Cache Sesi**: Mengekalkan konteks perbualan dalam dan antara sesi\n", + "4. **NodeSets**: Mengatur data ke dalam kategori logik untuk pengambilan yang disasarkan\n", + "\n", + "### Jenis Memori dalam Tutorial Ini:\n", + "\n", + "- **Memori Kekal**: Penyimpanan jangka panjang dalam graf pengetahuan\n", + "- **Memori Sesi**: Konteks perbualan sementara dalam cache Redis\n", + "- **Memori Semantik**: Carian kesamaan berasaskan vektor merentasi semua data\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Pasang Pakej Diperlukan\n", + "\n", + "Pasang Cognee dengan sokongan Redis untuk pengurusan sesi:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Memulakan Persekitaran dan Memuatkan Pustaka\n", + "\n", + "Pastikan:\n", + "1. Redis sedang berjalan (contohnya, melalui Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Pembolehubah persekitaran telah ditetapkan sebelum mengimport modul cache\n", + "3. Jika perlu, mulakan semula kernel dan jalankan sel mengikut urutan\n", + "\n", + "Sel berikut akan:\n", + "1. Memuatkan pembolehubah persekitaran dari `.env`\n", + "2. Mengkonfigurasi Cognee dengan tetapan LLM anda\n", + "3. Mengaktifkan cache untuk pengurusan sesi\n", + "4. Mengesahkan semua komponen disambungkan dengan betul\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Konfigurasi Direktori Penyimpanan\n", + "\n", + "Cognee menggunakan dua direktori berasingan untuk operasinya:\n", + "- **Data Root**: Menyimpan dokumen yang dimasukkan dan data yang telah diproses\n", + "- **System Root**: Mengandungi pangkalan data graf pengetahuan dan metadata sistem\n", + "\n", + "Kita akan mencipta direktori yang terasing untuk tutorial ini seperti berikut:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Tetapkan Semula Keadaan Memori\n", + "\n", + "Sebelum kita mula membina sistem memori kita, mari pastikan kita bermula dengan keadaan yang bersih.\n", + "\n", + "> 💡 **Tip**: Anda boleh abaikan langkah ini jika anda ingin mengekalkan memori sedia ada daripada sesi sebelumnya apabila anda menggunakan buku nota ini nanti.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Bahagian 1: Membina Pangkalan Pengetahuan\n", + "\n", + "### Sumber Data untuk Pembantu Pembangun Kita\n", + "\n", + "Kita akan menggunakan tiga jenis data untuk mencipta pangkalan pengetahuan yang komprehensif:\n", + "\n", + "1. **Profil Pembangun**: Kepakaran peribadi dan latar belakang teknikal\n", + "2. **Amalan Terbaik Python**: Zen of Python dengan panduan praktikal\n", + "3. **Perbualan Sejarah**: Sesi soal jawab terdahulu antara pembangun dan pembantu AI\n", + "\n", + "Data yang pelbagai ini membolehkan agen kita untuk:\n", + "- Memahami konteks teknikal pengguna\n", + "- Menerapkan amalan terbaik dalam cadangan\n", + "- Belajar daripada interaksi berjaya yang lepas\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Proses Data ke dalam Graf Pengetahuan\n", + "\n", + "Sekarang kita akan menukar teks mentah kita menjadi memori yang berstruktur. Proses ini:\n", + "\n", + "1. **Menambah data ke NodeSets**: Menyusun maklumat ke dalam kategori logik\n", + " - `developer_data`: Profil pembangun dan perbualan\n", + " - `principles_data`: Amalan terbaik dan panduan Python\n", + "\n", + "2. **Menjalankan Cognify Pipeline**: Mengekstrak entiti, hubungan, dan mencipta embedding\n", + " - Mengenal pasti konsep utama\n", + " - Mewujudkan sambungan semantik antara maklumat yang berkaitan\n", + " - Menjana embedding vektor\n", + "\n", + "Ini mungkin mengambil masa beberapa saat kerana LLM memproses teks dan membina struktur graf:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Visualisasikan Graf Pengetahuan\n", + "\n", + "Mari kita terokai struktur graf pengetahuan kita. Visualisasi ini menunjukkan:\n", + "- **Nod**: Entiti yang diekstrak daripada teks (konsep, teknologi, individu)\n", + "- **Tepi**: Hubungan dan sambungan antara entiti\n", + "- **Kumpulan**: Konsep berkaitan yang dikelompokkan berdasarkan kesamaan semantik\n", + "\n", + "Buka fail HTML yang dijana dalam pelayar anda untuk meneroka graf secara interaktif:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Perkayakan Memori dengan Memify\n", + "\n", + "Fungsi `memify()` menganalisis graf pengetahuan dan menghasilkan peraturan pintar tentang data. Proses ini:\n", + "- Mengenal pasti corak dan amalan terbaik\n", + "- Mencipta panduan yang boleh diambil tindakan berdasarkan kandungan\n", + "- Menjalin hubungan antara pelbagai bidang pengetahuan\n", + "\n", + "Peraturan ini membantu agen membuat keputusan yang lebih bermaklumat semasa menjawab soalan. Menangkap visualisasi kedua membantu anda membandingkan bagaimana graf menjadi lebih padat setelah diperkayakan.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Bahagian 2: Pengambilan Memori Pintar\n", + "\n", + "### Demonstrasi 1: Integrasi Pengetahuan Merentas Dokumen\n", + "\n", + "Sekarang bahawa graf pengetahuan kita telah dibina, mari kita uji bagaimana Cognee menggabungkan maklumat dari pelbagai sumber untuk menjawab soalan yang kompleks.\n", + "\n", + "Pertanyaan pertama menunjukkan:\n", + "- **Pemahaman semantik**: Mencari konsep yang relevan walaupun tidak disebut secara eksplisit\n", + "- **Rujukan silang**: Menggabungkan profil pembangun dengan prinsip Python\n", + "- **Penaakulan kontekstual**: Menerapkan amalan terbaik kepada pelaksanaan tertentu\n", + "\n", + "### Demonstrasi 2: Carian Tapis dengan NodeSets\n", + "\n", + "Pertanyaan kedua menunjukkan cara menyasarkan subset tertentu dalam graf pengetahuan:\n", + "- Menggunakan parameter `node_name` untuk mencari hanya dalam `principles_data`\n", + "- Memberikan jawapan yang fokus dari domain pengetahuan tertentu\n", + "- Berguna apabila anda memerlukan maklumat khusus domain\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Bahagian 3: Tetapan Pengurusan Sesi\n", + "\n", + "### Mengaktifkan Memori Perbualan\n", + "\n", + "Pengurusan sesi adalah penting untuk mengekalkan konteks sepanjang pelbagai interaksi. Di sini kita akan:\n", + "\n", + "1. **Inisialisasi Konteks Pengguna**: Cipta atau dapatkan profil pengguna untuk penjejakan sesi\n", + "2. **Konfigurasi Enjin Cache**: Sambungkan ke Redis untuk menyimpan sejarah perbualan\n", + "3. **Aktifkan Pembolehubah Sesi**: Tetapkan pembolehubah konteks yang kekal merentasi pertanyaan\n", + "\n", + "> ⚠️ **Penting**: Ini memerlukan Redis sedang berjalan dan `CACHING=true` dalam persekitaran anda\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Fungsi Pembantu: Lihat Sejarah Sesi\n", + "\n", + "Fungsi utiliti ini membolehkan kita memeriksa sejarah perbualan yang disimpan dalam Redis. Ia berguna untuk:\n", + "- Menyelesaikan masalah pengurusan sesi\n", + "- Memastikan perbualan disimpan dalam cache\n", + "- Memahami konteks yang tersedia untuk ejen\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Sesi 1: Makmal Sokongan Async — Soalan Pertama\n", + "\n", + "Mulakan sesi `async-support-lab` dengan bertanya tentang corak asyncio yang mesra telemetri untuk pengikis web berskala besar. Graf sudah mengetahui tentang asyncio, aiohttp, dan amalan pemantauan, jadi responsnya harus mencerminkan perbualan sebelumnya sambil menyesuaikan jawapan dengan pertanyaan baru.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Periksa Memori Sesi 1 Selepas Pertukaran Pertama\n", + "\n", + "Menjalankan `show_history(session_1)` sejurus selepas soalan awal mengesahkan bahawa Cognee telah menulis kedua-dua prompt dan jawapan ke dalam Redis. Anda sepatutnya melihat satu entri dengan panduan keserentakan.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Sesi 1: Susulan mengenai Model Data\n", + "\n", + "Seterusnya kita tanya, \"Bila saya patut memilih dataclasses berbanding Pydantic?\" menggunakan ID sesi yang sama. Cognee sepatutnya menggabungkan prinsip Python bersama perbincangan FastAPI sebelum ini untuk memberikan nasihat yang lebih terperinci—menunjukkan bahawa konteks dibawa ke hadapan dalam sesi yang dinamakan.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Sahkan Sejarah Sesi 1 Mengandungi Kedua-dua Giliran\n", + "\n", + "Panggilan `show_history(session_1)` yang lain sepatutnya menunjukkan dua entri Soal & Jawab. Ini sepadan dengan langkah \"ulang ingatan\" dalam makmal Mem0 dan membuktikan bahawa giliran tambahan melanjutkan transkrip yang sama.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Sesi 2: Benang Semakan Reka Bentuk — Sesi Baru\n", + "\n", + "Untuk menunjukkan pengasingan antara benang, kami memulakan `design-review-session` dan meminta panduan log untuk semakan insiden. Walaupun asas pangkalan pengetahuan adalah sama, id sesi baru memastikan transkrip kekal berasingan.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Ulasan Sesi 2 Sejarah\n", + "\n", + "`show_history(session_2)` hanya perlu menyenaraikan pasangan prompt/respons ulasan reka bentuk. Bandingkan dengan Sesi 1 untuk menonjolkan bagaimana Cognee mengekalkan transkrip yang berasingan sambil menggunakan semula graf pengetahuan yang dikongsi.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Ringkasan\n", + "\n", + "Tahniah! Anda baru sahaja memberikan pembantu pengekodan anda lapisan memori jangka panjang sebenar yang dikuasakan oleh Cognee.\n", + "\n", + "Dalam tutorial ini, anda telah mengambil kandungan pembangun mentah (kod, dokumen, sembang) dan mengubahnya menjadi graf + memori vektor yang boleh dicari, dianalisis, dan diperbaiki secara berterusan oleh agen anda.\n", + "\n", + "Apa Yang Anda Pelajari\n", + "\n", + "1. **Daripada teks mentah kepada memori AI**: Bagaimana Cognee memproses data tidak berstruktur dan mengubahnya menjadi memori pintar yang boleh dicari menggunakan gabungan seni bina vektor + graf pengetahuan.\n", + "\n", + "2. **Pengayaan graf dengan memify**: Bagaimana untuk melangkaui penciptaan graf asas dan menggunakan memify untuk menambah fakta terbitan dan hubungan yang lebih kaya di atas graf sedia ada anda.\n", + "\n", + "3. **Pelbagai strategi carian**: Bagaimana untuk membuat pertanyaan memori dengan pelbagai jenis carian (Q&A yang sedar graf, pelengkapan gaya RAG, wawasan, potongan mentah, carian kod, dll.) bergantung pada keperluan agen anda.\n", + "\n", + "4. **Penerokaan visual**: Bagaimana untuk memeriksa dan menyahpepijat apa yang dibina oleh Cognee menggunakan visualisasi graf dan UI Cognee, supaya anda benar-benar dapat melihat bagaimana pengetahuan disusun.\n", + "\n", + "5. **Memori sedar sesi**: Bagaimana untuk menggabungkan konteks setiap sesi dengan memori semantik berterusan supaya agen dapat mengingati merentasi sesi tanpa membocorkan maklumat antara pengguna.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Poin Penting\n", + "1. Memori sebagai Graf Pengetahuan yang disokong oleh Embeddings\n", + "\n", + " - **Pemahaman terstruktur**: Cognee menggabungkan stor vektor dan stor graf supaya data anda boleh dicari berdasarkan makna dan dihubungkan melalui hubungan. Cognee menggunakan pangkalan data berasaskan fail secara lalai (LanceDB untuk stor vektor, Kuzu untuk pangkalan data graf).\n", + "\n", + " - **Pengambilan maklumat berasaskan hubungan**: Jawapan boleh diasaskan bukan sahaja pada \"teks yang serupa,\" tetapi juga pada bagaimana entiti saling berkaitan.\n", + "\n", + " - **Memori yang hidup**: Lapisan memori berkembang, bertambah, dan kekal boleh dicari sebagai satu graf yang bersambung.\n", + "\n", + "2. Mod Carian & Penaakulan\n", + " - **Pengambilan hibrid**: Carian menggabungkan kesamaan vektor, struktur graf, dan penaakulan LLM, dari pencarian potongan mentah hingga soal jawab yang sedar graf.\n", + "\n", + " - **Sesuaikan mod dengan tugas**: Gunakan mod gaya pelengkap apabila anda mahukan jawapan dalam bahasa semula jadi, dan mod potongan/ringkasan/graf apabila agen anda memerlukan konteks mentah atau untuk mendorong penaakulan sendiri.\n", + "\n", + "3. Agen yang Diperibadikan dan Sedar Sesi\n", + " - **Konteks sesi + memori jangka panjang**: Cognee memisahkan konteks \"benang\" jangka pendek daripada memori jangka panjang di peringkat pengguna atau organisasi.\n", + "\n", + "## Aplikasi Dunia Sebenar\n", + "\n", + "1. **Agen AI Vertikal**\n", + "\n", + " Gunakan corak dari buku nota ini untuk menggerakkan pembantu pintar domain yang duduk di atas Cognee sebagai teras pengambilan dan penaakulan mereka:\n", + "\n", + "- **Pembantu pembangun**: Semakan kod, analisis insiden, dan pembantu seni bina yang menelusuri kod, API, dokumen reka bentuk, dan tiket sebagai satu graf memori.\n", + "\n", + "- **Pembantu berhadapan pelanggan**: Agen sokongan atau kejayaan yang menarik dari dokumen produk, FAQ, nota CRM, dan tiket lalu dengan pengambilan sedar graf dan jawapan yang disokong.\n", + "\n", + "- **Pembantu pakar dalaman**: Pembantu dasar, undang-undang, atau keselamatan yang membuat penaakulan berdasarkan peraturan, panduan, dan keputusan sejarah yang saling berkaitan, bukannya PDF yang terasing.\n", + "\n", + " Cognee secara eksplisit diposisikan sebagai memori yang berterusan dan tepat untuk agen AI, menyediakan graf pengetahuan yang hidup yang menggantikan kombinasi ad-hoc stor vektor dan kod graf tersuai.\n", + "\n", + "2. **Menyatukan Silo Data ke dalam Satu Memori**\n", + "\n", + " Pendekatan yang sama juga membantu anda membina lapisan memori bersatu merentasi sumber yang tersebar:\n", + "\n", + "- **Dari silo ke satu graf**: Serap data terstruktur (contohnya, pangkalan data) dan tidak terstruktur (contohnya, dokumen, sembang) ke dalam satu graf yang disokong oleh embeddings, bukannya indeks berasingan untuk setiap sistem.\n", + "\n", + "- **Penaakulan silang sumber dengan sitasi**: Jalankan penaakulan berbilang langkah ke atas semuanya—“gabungkan” log, metrik, dan dokumen melalui graf—dan tetap kembalikan jawapan yang diasaskan dengan bukti.\n", + "\n", + "- **Hab pengetahuan**: Untuk domain seperti perbankan atau pendidikan, Cognee sudah digunakan untuk menyatukan PDF, sistem dalaman, dan data aplikasi ke dalam satu graf pengetahuan dengan vektor supaya agen boleh menjawab soalan dengan konteks yang tepat dan disokong.\n", + "\n", + "## Langkah Seterusnya\n", + "\n", + "Anda telah melaksanakan gelung memori teras. Berikut adalah lanjutan semula jadi yang boleh anda cuba sendiri (lihat [dokumentasi Cognee](https://docs.cognee.ai/) untuk butiran):\n", + "\n", + "1. **Bereksperimen dengan kesedaran temporal**: Hidupkan temporal cognify untuk mengekstrak peristiwa dan cap waktu dari teks.\n", + "\n", + "2. **Perkenalkan penaakulan berasaskan ontologi**: Tentukan ontologi OWL untuk domain anda. Gunakan sokongan ontologi Cognee supaya entiti dan hubungan yang diekstrak diasaskan dalam skema tersebut, meningkatkan kualiti graf dan jawapan khusus domain.\n", + "\n", + "3. **Tambah gelung maklum balas**: Biarkan Cognee menyesuaikan berat tepi graf berdasarkan maklum balas pengguna sebenar, supaya pengambilan maklumat bertambah baik dari masa ke masa dan tidak statik.\n", + "\n", + "4. **Laraskan untuk personalisasi & tingkah laku sesi**: Gunakan ID pengguna, penyewa, dan set data untuk memberikan setiap individu atau pasukan pandangan mereka sendiri terhadap enjin memori yang dikongsi.\n", + "\n", + "5. **Skalakan kepada agen yang lebih kompleks**: Sambungkan Cognee ke rangka kerja agen untuk membina sistem multi-agen yang semuanya berkongsi lapisan memori yang sama. *Microsoft Agent Framework x plugin Cognee akan datang tidak lama lagi.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Penafian**: \nDokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat kritikal, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:16:00+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "ms" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/ms/13-agent-memory/README.md b/translations/ms/13-agent-memory/README.md index 3e2c597db..646f2f05f 100644 --- a/translations/ms/13-agent-memory/README.md +++ b/translations/ms/13-agent-memory/README.md @@ -1,16 +1,16 @@ -# Memori untuk Ejen AI +# Memori untuk Ejen AI [![Memori Ejen](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.ms.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Apabila membincangkan kelebihan unik dalam mencipta Ejen AI, dua perkara utama sering dibincangkan: keupayaan untuk menggunakan alat bagi menyelesaikan tugas dan keupayaan untuk bertambah baik dari masa ke masa. Memori adalah asas dalam mencipta ejen yang mampu memperbaiki diri untuk memberikan pengalaman yang lebih baik kepada pengguna kita. +Apabila membincangkan kelebihan unik dalam mencipta Ejen AI, dua perkara utama sering dibincangkan: keupayaan untuk menggunakan alat bagi menyelesaikan tugas dan keupayaan untuk bertambah baik dari masa ke masa. Memori adalah asas dalam mencipta ejen yang mampu memperbaiki diri sendiri untuk memberikan pengalaman yang lebih baik kepada pengguna kita. Dalam pelajaran ini, kita akan melihat apa itu memori untuk Ejen AI dan bagaimana kita boleh mengurus serta menggunakannya untuk manfaat aplikasi kita. @@ -22,7 +22,15 @@ Pelajaran ini akan merangkumi: • **Melaksanakan dan Menyimpan Memori**: Kaedah praktikal untuk menambah keupayaan memori kepada ejen AI anda, dengan fokus pada memori jangka pendek dan jangka panjang. -• **Menjadikan Ejen AI Lebih Baik**: Bagaimana memori membolehkan ejen belajar daripada interaksi lalu dan bertambah baik dari masa ke masa. +• **Menjadikan Ejen AI Bertambah Baik**: Bagaimana memori membolehkan ejen belajar daripada interaksi lalu dan bertambah baik dari masa ke masa. + +## Implementasi yang Tersedia + +Pelajaran ini termasuk dua tutorial notebook yang komprehensif: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Melaksanakan memori menggunakan Mem0 dan Azure AI Search dengan rangka kerja Semantic Kernel + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Melaksanakan memori berstruktur menggunakan Cognee, secara automatik membina graf pengetahuan yang disokong oleh embeddings, memvisualkan graf, dan pengambilan pintar ## Matlamat Pembelajaran @@ -30,25 +38,25 @@ Selepas menyelesaikan pelajaran ini, anda akan tahu bagaimana untuk: • **Membezakan antara pelbagai jenis memori ejen AI**, termasuk memori kerja, jangka pendek, dan jangka panjang, serta bentuk khusus seperti memori persona dan episodik. -• **Melaksanakan dan mengurus memori jangka pendek dan jangka panjang untuk ejen AI** menggunakan rangka kerja Semantic Kernel, memanfaatkan alat seperti Mem0 dan memori Whiteboard, serta mengintegrasikan dengan Azure AI Search. +• **Melaksanakan dan mengurus memori jangka pendek dan jangka panjang untuk ejen AI** menggunakan rangka kerja Semantic Kernel, memanfaatkan alat seperti Mem0, Cognee, memori Whiteboard, dan integrasi dengan Azure AI Search. -• **Memahami prinsip di sebalik ejen AI yang mampu memperbaiki diri** dan bagaimana sistem pengurusan memori yang kukuh menyumbang kepada pembelajaran dan penyesuaian berterusan. +• **Memahami prinsip di sebalik ejen AI yang bertambah baik** dan bagaimana sistem pengurusan memori yang kukuh menyumbang kepada pembelajaran dan penyesuaian berterusan. ## Memahami Memori Ejen AI Secara asasnya, **memori untuk ejen AI merujuk kepada mekanisme yang membolehkan mereka menyimpan dan mengingat maklumat**. Maklumat ini boleh berupa butiran spesifik tentang perbualan, keutamaan pengguna, tindakan lalu, atau corak yang dipelajari. -Tanpa memori, aplikasi AI sering kali bersifat tanpa keadaan, bermaksud setiap interaksi bermula dari awal. Ini membawa kepada pengalaman pengguna yang berulang dan mengecewakan di mana ejen "lupa" konteks atau keutamaan sebelumnya. +Tanpa memori, aplikasi AI sering kali tidak mempunyai keadaan, bermakna setiap interaksi bermula dari awal. Ini membawa kepada pengalaman pengguna yang berulang dan mengecewakan di mana ejen "lupa" konteks atau keutamaan sebelumnya. ### Mengapa Memori Penting? -Kecerdasan ejen sangat berkait rapat dengan keupayaannya untuk mengingat dan menggunakan maklumat lalu. Memori membolehkan ejen menjadi: +Kepintaran ejen sangat berkait dengan keupayaannya untuk mengingat dan menggunakan maklumat lalu. Memori membolehkan ejen menjadi: • **Reflektif**: Belajar daripada tindakan dan hasil lalu. -• **Interaktif**: Mengekalkan konteks dalam perbualan yang berterusan. +• **Interaktif**: Mengekalkan konteks sepanjang perbualan yang berterusan. -• **Proaktif dan Reaktif**: Meramalkan keperluan atau bertindak balas dengan sesuai berdasarkan data sejarah. +• **Proaktif dan Reaktif**: Menjangka keperluan atau bertindak balas dengan sesuai berdasarkan data sejarah. • **Autonomi**: Beroperasi dengan lebih bebas dengan menggunakan pengetahuan yang disimpan. @@ -58,9 +66,9 @@ Tujuan melaksanakan memori adalah untuk menjadikan ejen lebih **boleh dipercayai #### Memori Kerja -Anggap ini sebagai sehelai kertas contengan yang digunakan oleh ejen semasa satu tugas atau proses pemikiran yang sedang berlangsung. Ia menyimpan maklumat segera yang diperlukan untuk langkah seterusnya. +Anggap ini sebagai sehelai kertas draf yang digunakan oleh ejen semasa satu tugas atau proses pemikiran yang sedang berlangsung. Ia menyimpan maklumat segera yang diperlukan untuk mengira langkah seterusnya. -Untuk ejen AI, memori kerja sering kali menangkap maklumat yang paling relevan daripada perbualan, walaupun sejarah penuh perbualan itu panjang atau dipotong. Ia memberi fokus kepada elemen utama seperti keperluan, cadangan, keputusan, dan tindakan. +Untuk ejen AI, memori kerja sering menangkap maklumat yang paling relevan daripada perbualan, walaupun sejarah penuh perbualan panjang atau dipotong. Ia memberi fokus kepada elemen utama seperti keperluan, cadangan, keputusan, dan tindakan. **Contoh Memori Kerja** @@ -72,11 +80,11 @@ Jenis memori ini menyimpan maklumat untuk tempoh satu perbualan atau sesi. Ia ad **Contoh Memori Jangka Pendek** -Jika pengguna bertanya, "Berapa harga tiket penerbangan ke Paris?" dan kemudian menyusul dengan "Bagaimana dengan penginapan di sana?", memori jangka pendek memastikan ejen tahu "di sana" merujuk kepada "Paris" dalam perbualan yang sama. +Jika pengguna bertanya, "Berapa harga penerbangan ke Paris?" dan kemudian menyusul dengan "Bagaimana dengan penginapan di sana?", memori jangka pendek memastikan ejen tahu "di sana" merujuk kepada "Paris" dalam perbualan yang sama. #### Memori Jangka Panjang -Ini adalah maklumat yang kekal merentasi pelbagai perbualan atau sesi. Ia membolehkan ejen mengingat keutamaan pengguna, interaksi sejarah, atau pengetahuan umum dalam jangka masa panjang. Ini penting untuk personalisasi. +Ini adalah maklumat yang kekal merentasi pelbagai perbualan atau sesi. Ia membolehkan ejen mengingat keutamaan pengguna, interaksi sejarah, atau pengetahuan umum dalam tempoh yang panjang. Ini penting untuk personalisasi. **Contoh Memori Jangka Panjang** @@ -87,7 +95,6 @@ Memori jangka panjang mungkin menyimpan bahawa "Ben suka bermain ski dan aktivit Jenis memori khusus ini membantu ejen membangunkan "personaliti" atau "persona" yang konsisten. Ia membolehkan ejen mengingat butiran tentang dirinya atau peranannya yang dimaksudkan, menjadikan interaksi lebih lancar dan fokus. **Contoh Memori Persona** - Jika ejen perjalanan direka untuk menjadi "pakar perancang ski," memori persona mungkin mengukuhkan peranan ini, mempengaruhi responsnya agar selaras dengan nada dan pengetahuan seorang pakar. #### Memori Alur Kerja/Episodik @@ -96,11 +103,11 @@ Memori ini menyimpan urutan langkah yang diambil oleh ejen semasa tugas yang kom **Contoh Memori Episodik** -Jika ejen cuba menempah penerbangan tertentu tetapi gagal kerana tidak tersedia, memori episodik boleh merekodkan kegagalan ini, membolehkan ejen mencuba penerbangan alternatif atau memaklumkan pengguna tentang isu tersebut dengan cara yang lebih berinformasi semasa percubaan seterusnya. +Jika ejen cuba menempah penerbangan tertentu tetapi gagal kerana tidak tersedia, memori episodik boleh merekodkan kegagalan ini, membolehkan ejen mencuba penerbangan alternatif atau memberitahu pengguna tentang isu tersebut dengan cara yang lebih bermaklumat semasa percubaan seterusnya. #### Memori Entiti -Ini melibatkan pengekstrakan dan pengingatan entiti tertentu (seperti orang, tempat, atau benda) dan peristiwa daripada perbualan. Ia membolehkan ejen membina pemahaman yang berstruktur tentang elemen utama yang dibincangkan. +Ini melibatkan pengekstrakan dan pengingatan entiti tertentu (seperti orang, tempat, atau benda) dan peristiwa daripada perbualan. Ia membolehkan ejen membina pemahaman berstruktur tentang elemen utama yang dibincangkan. **Contoh Memori Entiti** @@ -108,47 +115,57 @@ Daripada perbualan tentang perjalanan lalu, ejen mungkin mengekstrak "Paris," "M #### RAG Berstruktur (Retrieval Augmented Generation) -Walaupun RAG adalah teknik yang lebih luas, "RAG Berstruktur" diketengahkan sebagai teknologi memori yang berkuasa. Ia mengekstrak maklumat yang padat dan berstruktur daripada pelbagai sumber (perbualan, e-mel, imej) dan menggunakannya untuk meningkatkan ketepatan, pengingatan, dan kelajuan dalam respons. Berbeza dengan RAG klasik yang hanya bergantung pada kesamaan semantik, RAG Berstruktur berfungsi dengan struktur maklumat yang wujud. +Walaupun RAG adalah teknik yang lebih luas, "RAG Berstruktur" disorot sebagai teknologi memori yang kuat. Ia mengekstrak maklumat padat dan berstruktur daripada pelbagai sumber (perbualan, e-mel, imej) dan menggunakannya untuk meningkatkan ketepatan, pengingatan, dan kelajuan dalam respons. Berbeza dengan RAG klasik yang hanya bergantung pada kesamaan semantik, RAG Berstruktur berfungsi dengan struktur maklumat yang wujud. **Contoh RAG Berstruktur** -Daripada hanya memadankan kata kunci, RAG Berstruktur boleh menganalisis butiran penerbangan (destinasi, tarikh, masa, syarikat penerbangan) daripada e-mel dan menyimpannya dengan cara yang berstruktur. Ini membolehkan pertanyaan yang tepat seperti "Penerbangan apa yang saya tempah ke Paris pada hari Selasa?" +Daripada hanya memadankan kata kunci, RAG Berstruktur boleh menganalisis butiran penerbangan (destinasi, tarikh, masa, syarikat penerbangan) daripada e-mel dan menyimpannya dengan cara yang berstruktur. Ini membolehkan pertanyaan tepat seperti "Penerbangan apa yang saya tempah ke Paris pada hari Selasa?" ## Melaksanakan dan Menyimpan Memori -Melaksanakan memori untuk ejen AI melibatkan proses sistematik **pengurusan memori**, yang merangkumi penjanaan, penyimpanan, pengambilan, integrasi, pengemaskinian, dan bahkan "melupakan" (atau memadamkan) maklumat. Pengambilan adalah aspek yang sangat penting. +Melaksanakan memori untuk ejen AI melibatkan proses sistematik **pengurusan memori**, yang termasuk menjana, menyimpan, mengambil, mengintegrasi, mengemas kini, dan bahkan "melupakan" (atau memadam) maklumat. Pengambilan adalah aspek yang sangat penting. ### Alat Memori Khusus +#### Mem0 + Salah satu cara untuk menyimpan dan mengurus memori ejen adalah dengan menggunakan alat khusus seperti Mem0. Mem0 berfungsi sebagai lapisan memori yang berterusan, membolehkan ejen mengingat interaksi yang relevan, menyimpan keutamaan pengguna dan konteks fakta, serta belajar daripada kejayaan dan kegagalan dari masa ke masa. Idea di sini adalah bahawa ejen tanpa keadaan berubah menjadi ejen dengan keadaan. -Ia berfungsi melalui **saluran memori dua fasa: pengekstrakan dan pengemaskinian**. Pertama, mesej yang ditambahkan ke utas ejen dihantar ke perkhidmatan Mem0, yang menggunakan Model Bahasa Besar (LLM) untuk meringkaskan sejarah perbualan dan mengekstrak memori baru. Seterusnya, fasa pengemaskinian yang didorong oleh LLM menentukan sama ada untuk menambah, mengubah, atau memadamkan memori ini, menyimpannya dalam stor data hibrid yang boleh merangkumi pangkalan data vektor, graf, dan nilai kunci. Sistem ini juga menyokong pelbagai jenis memori dan boleh menggabungkan memori graf untuk mengurus hubungan antara entiti. +Ia berfungsi melalui **saluran memori dua fasa: pengekstrakan dan pengemaskinian**. Pertama, mesej yang ditambahkan ke thread ejen dihantar ke perkhidmatan Mem0, yang menggunakan Model Bahasa Besar (LLM) untuk meringkaskan sejarah perbualan dan mengekstrak memori baru. Seterusnya, fasa pengemaskinian yang didorong oleh LLM menentukan sama ada untuk menambah, mengubah, atau memadam memori ini, menyimpannya dalam stor data hibrid yang boleh termasuk pangkalan data vektor, graf, dan nilai kunci. Sistem ini juga menyokong pelbagai jenis memori dan boleh menggabungkan memori graf untuk mengurus hubungan antara entiti. + +#### Cognee + +Pendekatan lain yang kuat adalah menggunakan **Cognee**, memori semantik sumber terbuka untuk ejen AI yang mengubah data berstruktur dan tidak berstruktur menjadi graf pengetahuan yang boleh ditanya dan disokong oleh embeddings. Cognee menyediakan **senibina stor dua** yang menggabungkan carian kesamaan vektor dengan hubungan graf, membolehkan ejen memahami bukan hanya maklumat yang serupa, tetapi bagaimana konsep berkaitan antara satu sama lain. + +Ia cemerlang dalam **pengambilan hibrid** yang menggabungkan kesamaan vektor, struktur graf, dan penaakulan LLM - daripada carian chunk mentah hingga soal jawab yang sedar graf. Sistem ini mengekalkan **memori hidup** yang berkembang dan tumbuh sambil tetap boleh ditanya sebagai satu graf yang bersambung, menyokong konteks sesi jangka pendek dan memori berterusan jangka panjang. + +Tutorial notebook Cognee ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) menunjukkan cara membina lapisan memori bersatu ini, dengan contoh praktikal tentang pengambilan pelbagai sumber data, memvisualkan graf pengetahuan, dan pertanyaan dengan strategi carian yang berbeza yang disesuaikan dengan keperluan ejen tertentu. ### Menyimpan Memori dengan RAG -Selain alat memori khusus seperti Mem0, anda boleh memanfaatkan perkhidmatan carian yang kukuh seperti **Azure AI Search sebagai backend untuk menyimpan dan mengambil memori**, terutamanya untuk RAG Berstruktur. +Selain alat memori khusus seperti Mem0, anda boleh memanfaatkan perkhidmatan carian yang kukuh seperti **Azure AI Search sebagai backend untuk menyimpan dan mengambil memori**, terutamanya untuk RAG berstruktur. -Ini membolehkan anda mengasaskan respons ejen anda dengan data anda sendiri, memastikan jawapan yang lebih relevan dan tepat. Azure AI Search boleh digunakan untuk menyimpan memori perjalanan pengguna, katalog produk, atau sebarang pengetahuan khusus domain. +Ini membolehkan anda mengasaskan respons ejen anda dengan data anda sendiri, memastikan jawapan yang lebih relevan dan tepat. Azure AI Search boleh digunakan untuk menyimpan memori perjalanan khusus pengguna, katalog produk, atau sebarang pengetahuan khusus domain lain. -Azure AI Search menyokong keupayaan seperti **RAG Berstruktur**, yang cemerlang dalam mengekstrak dan mengambil maklumat yang padat dan berstruktur daripada set data besar seperti sejarah perbualan, e-mel, atau bahkan imej. Ini memberikan "ketepatan dan pengingatan supermanusia" berbanding pendekatan pemotongan teks dan pengekodan tradisional. +Azure AI Search menyokong keupayaan seperti **RAG Berstruktur**, yang cemerlang dalam mengekstrak dan mengambil maklumat padat dan berstruktur daripada dataset besar seperti sejarah perbualan, e-mel, atau bahkan imej. Ini memberikan "ketepatan dan pengingatan supermanusia" berbanding pendekatan chunking teks dan embedding tradisional. -## Menjadikan Ejen AI Lebih Baik +## Menjadikan Ejen AI Bertambah Baik -Corak biasa untuk ejen yang mampu memperbaiki diri melibatkan pengenalan **"ejen pengetahuan"**. Ejen berasingan ini memerhatikan perbualan utama antara pengguna dan ejen utama. Peranannya adalah untuk: +Corak biasa untuk ejen yang bertambah baik melibatkan pengenalan **"ejen pengetahuan"**. Ejen berasingan ini memerhatikan perbualan utama antara pengguna dan ejen utama. Peranannya adalah untuk: -1. **Mengenal pasti maklumat berharga**: Menentukan sama ada mana-mana bahagian perbualan patut disimpan sebagai pengetahuan umum atau keutamaan pengguna tertentu. +1. **Mengenal pasti maklumat berharga**: Menentukan sama ada mana-mana bahagian perbualan bernilai disimpan sebagai pengetahuan umum atau keutamaan pengguna tertentu. 2. **Mengekstrak dan meringkaskan**: Menyaring pembelajaran atau keutamaan penting daripada perbualan. -3. **Menyimpan dalam pangkalan pengetahuan**: Menyimpan maklumat yang diekstrak ini, selalunya dalam pangkalan data vektor, supaya ia boleh diambil semula kemudian. +3. **Menyimpan dalam pangkalan pengetahuan**: Menyimpan maklumat yang diekstrak ini, selalunya dalam pangkalan data vektor, supaya ia boleh diambil kemudian. -4. **Menambah pertanyaan masa depan**: Apabila pengguna memulakan pertanyaan baru, ejen pengetahuan mengambil maklumat yang disimpan yang relevan dan menambahkannya kepada arahan pengguna, memberikan konteks penting kepada ejen utama (serupa dengan RAG). +4. **Menambah pertanyaan masa depan**: Apabila pengguna memulakan pertanyaan baru, ejen pengetahuan mengambil maklumat yang disimpan yang relevan dan menambahkannya kepada prompt pengguna, memberikan konteks penting kepada ejen utama (serupa dengan RAG). ### Pengoptimuman untuk Memori -• **Pengurusan Kependaman**: Untuk mengelakkan interaksi pengguna menjadi perlahan, model yang lebih murah dan cepat boleh digunakan pada mulanya untuk memeriksa dengan cepat sama ada maklumat itu berharga untuk disimpan atau diambil, hanya menggunakan proses pengekstrakan/pengambilan yang lebih kompleks apabila perlu. +• **Pengurusan Latensi**: Untuk mengelakkan melambatkan interaksi pengguna, model yang lebih murah dan cepat boleh digunakan pada awalnya untuk dengan cepat memeriksa sama ada maklumat bernilai disimpan atau diambil, hanya menggunakan proses pengekstrakan/pengambilan yang lebih kompleks apabila perlu. -• **Penyelenggaraan Pangkalan Pengetahuan**: Untuk pangkalan pengetahuan yang semakin berkembang, maklumat yang kurang kerap digunakan boleh dipindahkan ke "penyimpanan sejuk" untuk menguruskan kos. +• **Penyelenggaraan Pangkalan Pengetahuan**: Untuk pangkalan pengetahuan yang semakin berkembang, maklumat yang kurang kerap digunakan boleh dipindahkan ke "stor sejuk" untuk mengurus kos. ## Ada Lagi Soalan Tentang Memori Ejen? @@ -156,5 +173,7 @@ Sertai [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) untuk berhub --- + **Penafian**: -Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat penting, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini. \ No newline at end of file +Dokumen ini telah diterjemahkan menggunakan perkhidmatan terjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Walaupun kami berusaha untuk ketepatan, sila ambil perhatian bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidaktepatan. Dokumen asal dalam bahasa asalnya harus dianggap sebagai sumber yang berwibawa. Untuk maklumat kritikal, terjemahan manusia profesional adalah disyorkan. Kami tidak bertanggungjawab atas sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini. + \ No newline at end of file diff --git a/translations/my/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/my/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..519a0c0f3 --- /dev/null +++ b/translations/my/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Cognee ကို အသုံးပြု၍ အမြဲတမ်းမှတ်ဉာဏ်ပါရှိသော AI အေးဂျင့်များ တည်ဆောက်ခြင်း\n", + "\n", + "ဒီ notebook က [**cognee**](https://www.cognee.ai/) ကို အသုံးပြုပြီး အဆင့်မြင့်မှတ်ဉာဏ်စွမ်းရည်များပါရှိသော ထူးခြားသော AI အေးဂျင့်များကို ဘယ်လိုတည်ဆောက်ရမယ်ဆိုတာ ပြသပေးမှာဖြစ်ပါတယ်။ Cognee သည် အခမဲ့ဖြန့်ဝေထားသော AI မှတ်ဉာဏ်တစ်ခုဖြစ်ပြီး၊ knowledge graphs, semantic search, နဲ့ session management တို့ကို ပေါင်းစပ်ကာ context-aware AI စနစ်များ ဖန်တီးပေးနိုင်ပါတယ်။\n", + "\n", + "## 🎯 သင်ယူရမည့် ရည်မှန်းချက်များ\n", + "\n", + "ဒီသင်ခန်းစာအဆုံးတွင်၊ သင်သည် အောက်ပါအရာများကို နားလည်နိုင်ပါမည်-\n", + "- **Embeddings ဖြင့် ထောက်ခံထားသော Knowledge Graphs တည်ဆောက်ခြင်း**: မဖွဲ့စည်းထားသောစာသားများကို ဖွဲ့စည်းထားသော၊ မေးမြန်းနိုင်သော knowledge အဖြစ် ပြောင်းလဲခြင်း\n", + "- **Session Memory ကို အကောင်အထည်ဖော်ခြင်း**: အလိုအလျောက် context ကို သိမ်းဆည်းထားနိုင်သော multi-turn conversations ဖန်တီးခြင်း\n", + "- **Conversations များကို အမြဲတမ်း သိမ်းဆည်းခြင်း**: အရေးကြီးသော အပြောအဆိုများကို အနာဂတ်တွင် ပြန်လည်ရယူနိုင်ရန် ရေရှည်မှတ်ဉာဏ်တွင် သိမ်းဆည်းခြင်း\n", + "- **သဘာဝဘာသာစကားဖြင့် မေးမြန်းခြင်း**: သမိုင်းကြောင်း context ကို အသစ်သော စကားဝိုင်းများတွင် အသုံးချခြင်း\n", + "- **မှတ်ဉာဏ်ကို မြင်နိုင်အောင် ဖော်ပြခြင်း**: သင့်အေးဂျင့်၏ knowledge graph တွင် ရှိသော ဆက်စပ်မှုများကို စူးစမ်းခြင်း\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ သင်တည်ဆောက်မည့်အရာ\n", + "\n", + "ဤသင်ခန်းစာတွင်၊ **Coding Assistant** တစ်ခုကို အမှတ်တရများကို ထိန်းသိမ်းထားနိုင်စွမ်းဖြင့် ဖန်တီးသွားမည်ဖြစ်ပြီး၊\n", + "\n", + "### 1. **Knowledge Base တည်ဆောက်ခြင်း**\n", + " - Developer ၏ ကိုယ်ရေးအချက်အလက်နှင့် ကျွမ်းကျင်မှုအချက်အလက်များကို စုဆောင်းခြင်း\n", + " - Python programming အခြေခံများနှင့် အကောင်းဆုံးလေ့ကျင့်မှုများကို လုပ်ဆောင်ခြင်း\n", + " - Developer များနှင့် AI Assistant များအကြား စကားဝိုင်းမှတ်တမ်းများကို သိမ်းဆည်းခြင်း\n", + "\n", + "### 2. **Session-Aware စကားဝိုင်းများ**\n", + " - တစ် session အတွင်း မေးခွန်းများစွာအတွက် အကြောင်းအရာကို ထိန်းသိမ်းထားနိုင်ခြင်း\n", + " - မေးခွန်း/အဖြေ တစ်စုံတစ်ခုစီကို အလိုအလျောက် cache ထားပြီး ထိရောက်စွာ ပြန်လည်ရယူနိုင်ခြင်း\n", + " - စကားဝိုင်းမှတ်တမ်းအပေါ် အခြေခံပြီး သက်ဆိုင်သော၊ အဆက်မပြတ်ဖြေကြားမှုများပေးနိုင်ခြင်း\n", + "\n", + "### 3. **ရေရှည်အမှတ်တရ**\n", + " - အရေးကြီးသော စကားဝိုင်းများကို ရေရှည်အမှတ်တရအဖြစ် သိမ်းဆည်းထားခြင်း\n", + " - အသစ်သော အပြန်အလှန်ဆက်သွယ်မှုများအတွက် Knowledge Base နှင့် ယခင် session များမှ သက်ဆိုင်သော အမှတ်တရများကို ရှာဖွေယူနိုင်ခြင်း\n", + " - အချိန်ကြာလာသည်နှင့်အမျှ တိုးတက်လာသော Knowledge Base တစ်ခုကို တည်ဆောက်ခြင်း\n", + "\n", + "### 4. **ထူးချွန်သော အမှတ်တရ ရှာဖွေမှု**\n", + " - Graph-aware semantic search ကို အသုံးပြု၍ သိမ်းဆည်းထားသော အချက်အလက်များအားလုံးအတွင်းမှ သက်ဆိုင်သော အချက်အလက်များကို ရှာဖွေခြင်း\n", + " - ဒေတာအုပ်စုခွဲများ (developer အချက်အလက် vs. အခြေခံများ) ဖြင့် ရှာဖွေမှုများကို စစ်ထုတ်ခြင်း\n", + " - အချက်အလက်ရင်းမြစ်များစွာကို ပေါင်းစပ်ပြီး ပြည့်စုံသော အဖြေများပေးနိုင်ခြင်း\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 လိုအပ်ချက်များနှင့် စတင်ခြင်း\n", + "\n", + "### စနစ်လိုအပ်ချက်များ\n", + "\n", + "စတင်မီ၊ သင်မှာ အောက်ပါအရာများရှိကြောင်း သေချာပါစေ-\n", + "\n", + "1. **Python ပတ်ဝန်းကျင်**\n", + " - Python 3.9 သို့မဟုတ် အထက်\n", + " - Virtual environment (အကြံပြုသည်)\n", + "\n", + "2. **Redis Cache** (Session Management အတွက် လိုအပ်သည်)\n", + " - ဒေသခံ Redis: `docker run -d -p 6379:6379 redis`\n", + " - သို့မဟုတ် managed Redis service တစ်ခုကို အသုံးပြုပါ\n", + "\n", + "3. **LLM API Access**\n", + " - OpenAI API key သို့မဟုတ် အခြားပံ့ပိုးသူများ (အချက်အလက်များကို [documentation](https://docs.cognee.ai/setup-configuration/llm-providers) တွင်ကြည့်ပါ)\n", + "\n", + "4. **Database Configuration**\n", + " - ပုံမှန်အားဖြင့် အတည်ပြုမှုမလိုအပ်ပါ။ Cognee သည် file-based databases (LanceDB နှင့် Kuzu) ကို အသုံးပြုသည်။\n", + " - လိုအပ်ပါက Azure AI Search ကို vector store အဖြစ် စနစ်တကျတပ်ဆင်နိုင်သည် (အချက်အလက်များကို [documentation](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch) တွင်ကြည့်ပါ)\n", + "\n", + "### ပတ်ဝန်းကျင် အတည်ပြုခြင်း\n", + "\n", + "သင့် project directory တွင် `.env` ဖိုင်တစ်ခု ဖန်တီးပြီး အောက်ပါ variable များထည့်ပါ-\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Cognee ၏ မှတ်ဉာဏ်ဖွဲ့စည်းမှုကို နားလည်ခြင်း\n", + "\n", + "### Cognee ဘယ်လိုအလုပ်လုပ်သလဲ\n", + "\n", + "Cognee သည် ရိုးရိုးသော key-value သိုလှောင်မှုထက် ကျော်လွန်သည့် အဆင့်မြင့်မှတ်ဉာဏ်စနစ်ကို ပံ့ပိုးပေးသည်။\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### အဓိကအစိတ်အပိုင်းများ:\n", + "\n", + "1. **Knowledge Graph**: အရာဝတ္ထုများ၊ ဆက်စပ်မှုများနှင့် အဓိပ္ပါယ်ဆိုင်ရာ ချိတ်ဆက်မှုများကို သိမ်းဆည်းထားသည်။\n", + "2. **Vector Embeddings**: သိမ်းဆည်းထားသော အချက်အလက်အားလုံးအတွက် အဓိပ္ပါယ်ဆိုင်ရာ ရှာဖွေမှုကို အခွင့်ပြုသည်။\n", + "3. **Session Cache**: စကားဝိုင်းအကြောင်းအရာကို session အတွင်းနှင့် session များအကြား ထိန်းသိမ်းထားသည်။\n", + "4. **NodeSets**: အချက်အလက်များကို သတ်မှတ်ထားသော အမျိုးအစားများအဖြစ် စီစဉ်ထားပြီး ရှာဖွေမှုကို ပိုမိုရလဒ်ထွက်အောင်လုပ်သည်။\n", + "\n", + "### ဤသင်ခန်းစာအတွင်းရှိ မှတ်ဉာဏ်အမျိုးအစားများ:\n", + "\n", + "- **Persistent Memory**: Knowledge graph အတွင်း ရေရှည်သိုလှောင်မှု\n", + "- **Session Memory**: Redis cache အတွင်း ယာယီစကားဝိုင်းအကြောင်းအရာ\n", + "- **Semantic Memory**: အချက်အလက်အားလုံးအတွက် vector-based တူညီမှု ရှာဖွေမှု\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 လိုအပ်သော Package များကို ထည့်သွင်းပါ\n", + "\n", + "Session စီမံခန့်ခွဲမှုအတွက် Redis ပံ့ပိုးမှုဖြင့် Cognee ကို ထည့်သွင်းပါ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 ပတ်ဝန်းကျင်ကို စတင်ပြီး စာကြည့်တိုက်များကို သွင်းပါ\n", + "\n", + "သေချာစေပါ:\n", + "1. Redis ကို အလုပ်လုပ်နေစေပါ (ဥပမာ - Docker မှတဆင့်: `docker run -d -p 6379:6379 redis`)\n", + "2. Cache module များကို သွင်းမီ ပတ်ဝန်းကျင် variable များကို သတ်မှတ်ထားပါ\n", + "3. လိုအပ်ပါက Kernel ကို ပြန်စပြီး cell များကို အစဉ်လိုက် အလုပ်လုပ်ပါ\n", + "\n", + "အောက်ပါ cell သည် အောက်ပါအတိုင်းလုပ်ဆောင်ပါမည်:\n", + "1. `.env` မှ ပတ်ဝန်းကျင် variable များကို သွင်းပါ\n", + "2. သင့် LLM ဆက်တင်များနှင့်အတူ Cognee ကို ပြင်ဆင်ပါ\n", + "3. Session စီမံခန့်ခွဲမှုအတွက် caching ကို ဖွင့်ပါ\n", + "4. အစိတ်အပိုင်းအားလုံးကို တိကျစွာ ချိတ်ဆက်ထားကြောင်း အတည်ပြုပါ\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 သိုလှောင်မှု ဒိုင်ရက်ထုတ်လုပ်ခြင်းကို ပြင်ဆင်ပါ\n", + "\n", + "Cognee သည် ၎င်း၏ လုပ်ဆောင်မှုများအတွက် သီးခြား ဒိုင်ရက်နှစ်ခုကို အသုံးပြုသည်။\n", + "- **Data Root**: စုဆောင်းထားသော စာရွက်စာတမ်းများနှင့် အချက်အလက်များကို သိမ်းဆည်းထားသည်။\n", + "- **System Root**: အသိပညာ ဂရပ်ဒေတာဘေစ်နှင့် စနစ် metadata ကို ပါဝင်သည်။\n", + "\n", + "ဤသင်ခန်းစာအတွက် သီးခြား ဒိုင်ရက်များကို အောက်ပါအတိုင်း ဖန်တီးပါမည်။\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 မှတ်ဉာဏ်အခြေအနေကို ပြန်လည်စတင်ခြင်း\n", + "\n", + "မှတ်ဉာဏ်စနစ်ကို တည်ဆောက်မည်မတိုင်မီ၊ အစစအရာအဆင်ပြေစွာ စတင်နိုင်ရန် သေချာစေပါ။\n", + "\n", + "> 💡 **အကြံပြုချက်**: နောက်ပိုင်းတွင် ဒီ notebook ကို အသုံးပြုသောအခါ၊ ယခင်အကြိမ်များမှ ရှိပြီးသား မှတ်ဉာဏ်များကို ထိန်းသိမ်းလိုပါက ဒီအဆင့်ကို ကျော်သွားနိုင်ပါသည်။\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 အပိုင်း ၁: အသိပညာအခြေခံကို တည်ဆောက်ခြင်း\n", + "\n", + "### ကျွန်ုပ်တို့၏ Developer Assistant အတွက် ဒေတာရင်းမြစ်များ\n", + "\n", + "ကျွန်ုပ်တို့သည် အခြေခံအသိပညာအတွက် အောက်ပါ ဒေတာအမျိုးအစား ၃ မျိုးကို စုဆောင်းမည်ဖြစ်သည်-\n", + "\n", + "1. **Developer Profile**: ကိုယ်ပိုင်ကျွမ်းကျင်မှုနှင့် နည်းပညာနောက်ခံ\n", + "2. **Python Best Practices**: The Zen of Python နှင့် လက်တွေ့အကြံဉာဏ်များ\n", + "3. **Historical Conversations**: Developer များနှင့် AI Assistant များအကြား အတိတ် Q&A အစည်းအဝေးများ\n", + "\n", + "ဒီအမျိုးမျိုးသော ဒေတာများက ကျွန်ုပ်တို့၏ Agent ကို အောက်ပါအတိုင်း အကျိုးရှိစေမည်ဖြစ်သည်-\n", + "- အသုံးပြုသူ၏ နည်းပညာဆိုင်ရာအခြေအနေကို နားလည်စေခြင်း\n", + "- အကြံဉာဏ်များတွင် အကောင်းဆုံးအလေ့အထများကို အသုံးချခြင်း\n", + "- အတိတ်အောင်မြင်မှုဆိုင်ရာ အပြန်အလှန်များမှ သင်ယူခြင်း\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 ဒေတာကို အသိပညာ ဂရပ်ဖြစ်အောင် ပြောင်းခြင်း\n", + "\n", + "အခုတော့ ကျွန်ုပ်တို့ရဲ့ မူလစာသားကို ဖွဲ့စည်းထားတဲ့ မှတ်ဉာဏ်တစ်ခုအဖြစ် ပြောင်းလဲသွားမှာဖြစ်ပါတယ်။ ဒီလုပ်ငန်းစဉ်မှာ -\n", + "\n", + "1. **ဒေတာကို NodeSets ထဲထည့်ခြင်း**: အချက်အလက်တွေကို သက်ဆိုင်ရာ အမျိုးအစားအလိုက် စနစ်တကျ စီစဉ်ပေးသည်။\n", + " - `developer_data`: Developer profile နဲ့ ဆွေးနွေးမှုများ\n", + " - `principles_data`: Python အကောင်းဆုံး လုပ်ထုံးလုပ်နည်းများနဲ့ လမ်းညွှန်ချက်များ\n", + "\n", + "2. **Cognify Pipeline ကို အလုပ်လုပ်စေခြင်း**: Entity, ဆက်စပ်မှုများကို ထုတ်ယူပြီး Embeddings ဖန်တီးသည်။\n", + " - အဓိက အကြောင်းအရာများကို ဖော်ထုတ်ပေးသည်\n", + " - ဆက်စပ်တဲ့ အချက်အလက်များအကြား အဓိပ္ပါယ်ဆိုင်ရာ ဆက်စပ်မှုများ ဖန်တီးပေးသည်\n", + " - Vector embeddings များ ဖန်တီးပေးသည်\n", + "\n", + "ဒီလုပ်ငန်းစဉ်မှာ LLM က စာသားကို အလုပ်လုပ်ပြီး ဂရပ်ဖွဲ့စည်းမှုကို တည်ဆောက်နေချိန်မှာ အချိန်အနည်းငယ် ကြာနိုင်ပါတယ်။\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 အတတ်ပညာဂရပ်ကို မြင်ကွင်းကျကျကြည့်ရှုပါ\n", + "\n", + "ကျွန်တော်တို့ရဲ့ အတတ်ပညာဂရပ်အဆောက်အအုံကို လေ့လာကြည့်ရအောင်။ ဒီမြင်ကွင်းမှာ ဖော်ပြထားတာတွေက:\n", + "- **Nodes**: စာသားထဲကနေ ထုတ်ယူထားတဲ့ အရာဝတ္ထုတွေ (အယူအဆတွေ၊ နည်းပညာတွေ၊ လူတွေ)\n", + "- **Edges**: အရာဝတ္ထုတွေကြားက ဆက်နွယ်မှုတွေ၊ ဆက်သွယ်မှုတွေ\n", + "- **Clusters**: အဓိပ္ပါယ်တူတဲ့ အယူအဆတွေကို အုပ်စုဖွဲ့ထားမှု\n", + "\n", + "HTML ဖိုင်ကို သင့် browser မှာ ဖွင့်ပြီး ဂရပ်ကို အပြန်အလှန် လေ့လာကြည့်ပါ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 မှတ်ဉာဏ်ကို Memify ဖြင့် တိုးတက်စေပါ\n", + "\n", + "`memify()` function သည် knowledge graph ကို ခွဲခြမ်းစိတ်ဖြာပြီး ဒေတာအပေါ် အာရုံစိုက်သော စည်းမျဉ်းများကို ဖန်တီးပေးသည်။ ဒီလုပ်ငန်းစဉ်မှာ:\n", + "- ပုံစံများနှင့် အကောင်းဆုံး လုပ်ထုံးလုပ်နည်းများကို ဖော်ထုတ်သည်\n", + "- အကြောင်းအရာအပေါ် အခြေခံပြီး လုပ်ဆောင်နိုင်သော လမ်းညွှန်ချက်များကို ဖန်တီးသည်\n", + "- မတူညီသော အသိပညာဧရိယာများအကြား ဆက်စပ်မှုများကို တည်ဆောက်သည်\n", + "\n", + "ဒီစည်းမျဉ်းများက အေးဂျင့်ကို မေးခွန်းများကို ဖြေဆိုရာတွင် ပိုမိုသိမြင်စေပြီး ဆုံးဖြတ်ချက်ချရာတွင် အထောက်အကူဖြစ်စေသည်။ ဒုတိယမြင်ကွင်းကို ဖမ်းယူခြင်းဖြင့် graph သည် enrichment ပြုလုပ်ပြီးနောက် ဘယ်လို ပိုမိုသိပ်သည်းလာသည်ကို နှိုင်းယှဉ်ကြည့်နိုင်သည်။\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 အပိုင်း ၂: ထောက်လှမ်းမှုရှိသော မှတ်ဉာဏ် ရှာဖွေမှု\n", + "\n", + "### အတည်ပြုမှု ၁: စာရွက်တစ်ခုထက်ပိုသော အချက်အလက်များ ပေါင်းစပ်ခြင်း\n", + "\n", + "ယခု ကျွန်ုပ်တို့၏ အသိပညာဇယားကို တည်ဆောက်ပြီးဖြစ်သောကြောင့် Cognee သည် အမျိုးမျိုးသော အရင်းအမြစ်များမှ အချက်အလက်များကို ပေါင်းစပ်ပြီး ရှုပ်ထွေးသော မေးခွန်းများကို ဖြေရှင်းပုံကို စမ်းသပ်ကြမည်။\n", + "\n", + "ပထမဆုံး မေးခွန်းသည် အောက်ပါအချက်များကို ပြသသည်-\n", + "- **အဓိပ္ပာယ်နားလည်မှု**: တိတိကျကျ ဖော်ပြထားခြင်းမရှိသော်လည်း သက်ဆိုင်ရာ အယူအဆများကို ရှာဖွေခြင်း\n", + "- **အချင်းချင်းကိုးကားမှု**: Developer profile နှင့် Python principles ကို ပေါင်းစပ်ခြင်း\n", + "- **အခြေအနေအရ ဆင်ခြင်မှု**: အကောင်းဆုံး လုပ်ထုံးလုပ်နည်းများကို သီးသန့် အကောင်အထည်ဖော်မှုများတွင် အသုံးချခြင်း\n", + "\n", + "### အတည်ပြုမှု ၂: NodeSets ဖြင့် စစ်ထုတ်ရှာဖွေမှု\n", + "\n", + "ဒုတိယ မေးခွန်းသည် အသိပညာဇယား၏ သီးခြား subsets များကို ပစ်မှတ်ထားပုံကို ပြသသည်-\n", + "- `node_name` parameter ကို အသုံးပြု၍ `principles_data` အတွင်းသာ ရှာဖွေခြင်း\n", + "- သီးခြား အသိပညာနယ်ပယ်မှ အာရုံစိုက်ထားသော အဖြေများ ပေးခြင်း\n", + "- သင့်အား နယ်ပယ်အထူးပြု အချက်အလက်များ လိုအပ်သောအခါ အထူးအသုံးဝင်သည်\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 အပိုင်း ၃ - အစည်းအဝေး စီမံခန့်ခွဲမှု စတင်ခြင်း\n", + "\n", + "### စကားဝိုင်း မှတ်ဉာဏ် ဖွင့်ခြင်း\n", + "\n", + "အစည်းအဝေး စီမံခန့်ခွဲမှုသည် အများပြားသော အပြန်အလှန် ဆက်သွယ်မှုများအတွင်း အကြောင်းအရာကို ထိန်းသိမ်းထားရန် အရေးကြီးပါသည်။ ဒီမှာ ကျွန်ုပ်တို့ -\n", + "\n", + "1. **အသုံးပြုသူ အကြောင်းအရာ စတင်ခြင်း** - အစည်းအဝေးကို ထိန်းသိမ်းရန် အသုံးပြုသူ ပရိုဖိုင်တစ်ခု ဖန်တီးခြင်း သို့မဟုတ် ရှာဖွေခြင်း\n", + "2. **Cache Engine ကို ပြင်ဆင်ခြင်း** - စကားဝိုင်း သမိုင်းကို သိမ်းဆည်းရန် Redis နှင့် ချိတ်ဆက်ခြင်း\n", + "3. **Session Variables ဖွင့်ခြင်း** - မေးခွန်းများအတွင်း အကြောင်းအရာများကို ဆက်လက်ထားရှိရန် context variables များကို ပြင်ဆင်ခြင်း\n", + "\n", + "> ⚠️ **အရေးကြီး**: ဤအရာသည် Redis ကို လည်ပတ်နေပြီး သင့်ပတ်ဝန်းကျင်တွင် `CACHING=true` ဖြစ်နေဖို့ လိုအပ်ပါသည်\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ အကူအညီပေးသော Function: Session History ကိုကြည့်ရှုရန်\n", + "\n", + "ဒီ utility function က Redis မှာသိမ်းဆည်းထားတဲ့ စကားဝိုင်းသမိုင်းကို စစ်ဆေးနိုင်စေပါတယ်။ ဒါက အောက်ပါအတွက် အသုံးဝင်ပါတယ် - \n", + "- Session ကိုစီမံခန့်ခွဲမှု Debugging လုပ်ရန် \n", + "- စကားဝိုင်းတွေ Cache လုပ်ထားတာကို အတည်ပြုရန် \n", + "- Agent အတွက် ရရှိနိုင်တဲ့ context ကို နားလည်ရန် \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## အစည်းအဝေး ၁: Async Support Lab — ပထမမေးခွန်း\n", + "\n", + "`async-support-lab` အစည်းအဝေးကို စတင်ရန် အကြီးမားသော web scraper အတွက် telemetry-friendly asyncio ပုံစံများကို မေးမြန်းပါ။ graph သည် asyncio, aiohttp နှင့် monitoring လုပ်ငန်းစဉ်များအကြောင်းကို ရှိပြီးသားဖြစ်သောကြောင့် အဖြေသည် ယခင် ဆွေးနွေးမှုများကို ထင်ဟပ်စေသလို၊ မေးခွန်းအသစ်အတွက်လည်း အထူးသဖြင့် ကိုက်ညီစေရမည်။\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## ပထမဆုံး အပြန်အလှန်ပြီးနောက် Session 1 Memory ကို စစ်ဆေးပါ\n", + "\n", + "မူလမေးခွန်းပြီးချိန်မှာ `show_history(session_1)` ကို အလျင်အမြန် run လုပ်ပါက Cognee က prompt နဲ့ completion ကို Redis ထဲမှာ ရေးသားထားတာကို အတည်ပြုနိုင်ပါတယ်။ Concurrency guidance ပါတဲ့ entry တစ်ခုကို တွေ့ရပါမယ်။\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## အစည်းအဝေး ၁: ဒေတာမော်ဒယ်များအပေါ် ဆက်လက်ဆွေးနွေးခြင်း\n", + "\n", + "နောက်တစ်ခုမှာတော့ \"Dataclasses နဲ့ Pydantic ကို ဘယ်အချိန်မှာ ရွေးချယ်သင့်သလဲ?\" ဆိုတာကို အတူတူ session id ကို အသုံးပြုပြီး မေးမြန်းပါမည်။ Cognee သည် Python အခြေခံသဘောတရားများနှင့် ယခင် FastAPI ဆွေးနွေးမှုများကို ပေါင်းစပ်ပြီး အနက်အဓိပ္ပါယ်ရှိသော အကြံဉာဏ်များပေးနိုင်ရန်—အမည်ပေးထားသော session အတွင်း context သည် ဆက်လက်တည်ရှိနေသည်ကို ပြသရန် လိုအပ်ပါသည်။\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## အစည်းအဝေး ၁ သမိုင်းတွင် နှစ်ခုလုံး ပါဝင်ကြောင်း အတည်ပြုပါ\n", + "\n", + "နောက်ထပ် `show_history(session_1)` ကို ခေါ်ဆိုပါက Q&A အချက်အလက် နှစ်ခုကို ဖော်ပြသင့်သည်။ ဤသည်မှာ Mem0 lab ၏ \"မှတ်ဉာဏ် ပြန်လည်ဖွင့်ခြင်း\" အဆင့်နှင့် ကိုက်ညီပြီး ထပ်ဆင့်သော အကြိမ်များသည် တူညီသော စာတမ်းကို တိုးချဲ့ကြောင်း သက်သေပြသည်။\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## အစည်းအဝေး ၂: ဒီဇိုင်းပြန်လည်သုံးသပ်မှု ချိတ်ဆက်မှု — အသစ်သော အစည်းအဝေး\n", + "\n", + "ချိတ်ဆက်မှုများအကြား သီးခြားမှုကို ပြသရန် `design-review-session` ကို စတင်ပြီး အရေးပေါ်ဖြစ်ရပ်များကို ပြန်လည်သုံးသပ်ရန် မှတ်တမ်းရေးအကြံဉာဏ်များကို မေးမြန်းပါသည်။ အခြေခံသိမှတ်ပညာအရင်းအမြစ်တူညီသော်လည်း အသစ်သော session id သည် စာတမ်းများကို သီးခြားထားနိုင်စေပါသည်။\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## ပြန်လည်ဆန်းစစ်မှု အစည်းအဝေး ၂ သမိုင်း\n", + "\n", + "`show_history(session_2)` သည် ဒီဇိုင်း-ပြန်လည်ဆန်းစစ်မှု အစီအစဉ်/တုံ့ပြန်မှု အတွဲကိုသာ ဖော်ပြသင့်သည်။ Session 1 နှင့် နှိုင်းယှဉ်ကြည့်ပြီး Cognee သည် မျှဝေထားသော အသိပညာ ဂရပ်ကို ပြန်လည်အသုံးပြုသော်လည်း လွတ်လပ်သော စာတမ်းများကို မည်သို့ ထိန်းသိမ်းထားသည်ကို ဖော်ပြပါ။\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## အကျဉ်းချုပ်\n", + "\n", + "ဂုဏ်ယူပါတယ်! သင်၏ coding အကူအညီပေးသူကို Cognee အားဖြင့် အချိန်အတန်ကြာ အသုံးပြုနိုင်သော မှတ်ဉာဏ်အလွှာတစ်ခု ပေးလိုက်ပါပြီ။\n", + "\n", + "ဒီသင်ခန်းစာမှာ သင်သည် developer အကြောင်းအရာများ (code, docs, chats) ကို ရိုးရိုးသားသားယူပြီး graph + vector memory အဖြစ် ပြောင်းလဲကာ သင့် agent အနေနဲ့ ရှာဖွေ၊ အကြောင်းပြချက်ထုတ်ယူနိုင်ပြီး ဆက်လက်တိုးတက်အောင်လုပ်နိုင်သော အခြေခံအဆောက်အအုံတစ်ခု ဖန်တီးခဲ့ပါတယ်။\n", + "\n", + "သင်လေ့လာခဲ့တာများ\n", + "\n", + "1. **Raw text မှ AI memory သို့**: Cognee သည် မဖွဲ့စည်းထားသော ဒေတာများကို ဘယ်လိုယူဆောင်ပြီး vector + knowledge graph အဆောက်အအုံပေါင်းစပ်မှုကို အသုံးပြုကာ ထိရောက်သော memory အဖြစ် ပြောင်းလဲပေးနိုင်သည်ကို သင်လေ့လာခဲ့ပါသည်။\n", + "\n", + "2. **Memify ဖြင့် graph enrichment**: ရိုးရိုး graph ဖန်တီးမှုကို ကျော်လွှားပြီး memify ကို အသုံးပြုကာ သင့်ရှိပြီးသား graph ပေါ်တွင် အချက်အလက်အသစ်များနှင့် ပိုမိုချုပ်ချယ်မှုများ ထည့်သွင်းပေးနိုင်သည်ကို သင်လေ့လာခဲ့ပါသည်။\n", + "\n", + "3. **ရှာဖွေမှု မျိုးစုံနည်းလမ်းများ**: သင့် agent အတွက် လိုအပ်သလို memory ကို မျိုးစုံရှာဖွေမှုနည်းလမ်းများ (graph-aware Q&A, RAG-style completion, insights, raw chunks, code search စသည်) ဖြင့် ဘယ်လို query လုပ်ရမည်ကို သင်လေ့လာခဲ့ပါသည်။\n", + "\n", + "4. **မြင်သာသော စူးစမ်းမှု**: Cognee UI နှင့် graph visualizations ကို အသုံးပြုကာ Cognee ဖန်တီးထားသော knowledge ကို ဘယ်လိုစစ်ဆေးပြီး debug လုပ်ရမည်ကို သင်လေ့လာခဲ့ပါသည်။ ဒါကြောင့် knowledge ကို ဘယ်လိုဖွဲ့စည်းထားသည်ကို သင်မြင်နိုင်ပါသည်။\n", + "\n", + "5. **Session-aware memory**: Per-session context ကို အမြဲတမ်း semantic memory နှင့် ပေါင်းစပ်ကာ agent များသည် အသုံးပြုသူများအကြား အချက်အလက်များ မပျံ့လွှင့်ဘဲ run များအကြား မှတ်မိနိုင်စေရန် ဘယ်လိုလုပ်ဆောင်ရမည်ကို သင်လေ့လာခဲ့ပါသည်။\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## အဓိကအချက်များ\n", + "1. Embeddings အားပံ့ပိုးထားသော Knowledge Graph အဖြစ် Memory\n", + "\n", + " - **ဖွဲ့စည်းထားသောနားလည်မှု**: Cognee သည် vector store နှင့် graph store ကိုပေါင်းစပ်ထားပြီး သင့်ဒေတာကို အဓိပ္ပါယ်အလိုက်ရှာဖွေနိုင်ခြင်းနှင့် ဆက်နွယ်မှုများဖြင့်ချိတ်ဆက်ထားနိုင်သည်။ Cognee သည် file-based databases ကို default အဖြစ်အသုံးပြုသည် (vector အတွက် LanceDB၊ graph database အတွက် Kuzu)\n", + "\n", + " - **ဆက်နွယ်မှုကိုသတိထားသော retrieval**: အဖြေများသည် \"တူညီသောစာသား\" အပေါ်မူတည်သည့်အပြင် entity များ၏ဆက်နွယ်မှုအပေါ်လည်းမူတည်နိုင်သည်။\n", + "\n", + " - **အသက်ရှင်သောမှတ်ဉာဏ်**: memory layer သည် တစ်ခုတည်းသော graph အဖြစ်တိုးတက်၊ ကြီးထွားပြီး queryable ဖြစ်နေဆဲဖြစ်သည်။\n", + "\n", + "2. ရှာဖွေမှုနှင့် Reasoning Modes\n", + " - **Hybrid retrieval**: ရှာဖွေမှုသည် vector similarity, graph structure, နှင့် LLM reasoning ကိုပေါင်းစပ်ထားပြီး raw chunk lookup မှ graph-aware question answering အထိဖြစ်သည်။\n", + "\n", + " - **အလုပ်အတွက် mode ကိုသင့်လျော်စွာအသုံးပြုပါ**: သဘာဝဘာသာစကားဖြင့်အဖြေများလိုအပ်သောအခါ completion-style modes ကိုအသုံးပြုပါ၊ သို့မဟုတ် agent သည် raw context လိုအပ်သည့်အခါ chunk/summary/graph modes ကိုအသုံးပြုပါ။\n", + "\n", + "3. တစ်ဦးချင်းစီနှင့် Session-Aware Agents\n", + " - **Session context + ရေရှည် memory**: Cognee သည် short-term “thread” context ကို ရေရှည်အသုံးပြုနိုင်သော user-level သို့မဟုတ် org-level memory မှခွဲထားသည်။\n", + "\n", + "## အမှန်တကယ်အသုံးချမှုများ\n", + "\n", + "1. **Vertical AI Agents**\n", + "\n", + " ဤ notebook မှ pattern ကိုအသုံးပြုပြီး Cognee ကို retrieval နှင့် reasoning core အဖြစ်ထားရှိသော domain-smart copilots များကိုတည်ဆောက်ပါ:\n", + "\n", + "- **Developer copilots**: Code review, incident analysis, နှင့် architecture assistants များသည် code, APIs, design docs, နှင့် tickets များကို memory graph တစ်ခုအဖြစ် traverse လုပ်သည်။\n", + "\n", + "- **Customer-facing copilots**: Product docs, FAQs, CRM notes, နှင့် အတိတ် tickets များမှ graph-aware retrieval နှင့် cited answers များကိုထုတ်ယူသော support သို့မဟုတ် success agents များ။\n", + "\n", + "- **Internal expert copilots**: Policy, legal, သို့မဟုတ် security assistants များသည် isolated PDFs များအစား interconnected rules, guidelines, နှင့် historical decisions များကို reasoning လုပ်သည်။\n", + "\n", + " Cognee သည် AI agents အတွက် ရေရှည်တိကျသော memory အဖြစ်တိကျစွာထားရှိပြီး agent အတွက် living knowledge graph အဖြစ်တည်ဆောက်ထားပြီး vector stores နှင့် custom graph code များကိုအစားထိုးသည်။\n", + "\n", + "2. **Data Silos များကို Memory တစ်ခုအဖြစ်ပေါင်းစည်းခြင်း**\n", + "\n", + " အတူတူပုံစံသည် scattered sources များအကြား unified memory layer တစ်ခုကိုတည်ဆောက်ရန်လည်းအထောက်အကူဖြစ်သည်:\n", + "\n", + "- **Silos မှ graph တစ်ခုသို့**: Structured (ဥပမာ databases) နှင့် unstructured data (ဥပမာ docs, chats) များကို embeddings ဖြင့် backed graph တစ်ခုအဖြစ် ingest လုပ်ပါ၊ system တစ်ခုစီအတွက် separate indices များမဟုတ်ပါ။\n", + "\n", + "- **Citations ဖြင့် cross-source reasoning**: အားလုံးအပေါ် multi-step reasoning run လုပ်ပြီး grounded answers များကို provenance ဖြင့်ပြန်လည်ပေးပါ—logs, metrics, နှင့် docs များကို graph မှတဆင့် “join” လုပ်ပါ။\n", + "\n", + "- **Knowledge hubs**: Banking သို့မဟုတ် education ကဲ့သို့သော domains များအတွက် Cognee သည် PDFs, internal systems, နှင့် app data များကို knowledge graph တစ်ခုအဖြစ်ပေါင်းစည်းထားပြီး vectors ဖြင့် agents များသည် precise, cited context ဖြင့်မေးခွန်းများကိုဖြေဆိုနိုင်သည်။\n", + "\n", + "## နောက်တစ်ဆင့်များ\n", + "\n", + "သင်သည် core memory loop ကိုအကောင်အထည်ဖော်ပြီးပါပြီ။ သင်ကိုယ်တိုင်စမ်းသပ်နိုင်သော extension များမှာ (အသေးစိတ်အတွက် [Cognee documentation](https://docs.cognee.ai/) ကိုကြည့်ပါ):\n", + "\n", + "1. **Temporal awareness ဖြင့်စမ်းသပ်ပါ**: Temporal cognify ကိုဖွင့်ပြီး text မှ events နှင့် timestamps များကို extract လုပ်ပါ။\n", + "\n", + "2. **Ontology-driven reasoning ကိုမိတ်ဆက်ပါ**: သင့် domain အတွက် OWL ontology ကိုသတ်မှတ်ပါ။ Cognee ၏ ontology support ကိုအသုံးပြုပြီး extracted entities နှင့် relations များကို schema ထဲတွင်အခြေခံထားသောအဖြစ်ထားရှိပါ၊ graph quality နှင့် domain-specific answers များကိုတိုးတက်စေပါ။\n", + "\n", + "3. **Feedback loop တစ်ခုထည့်ပါ**: Real user feedback မှ graph edge weights များကို Cognee အား adjust လုပ်ခွင့်ပြုပါ၊ retrieval သည် static ဖြစ်နေခြင်းမဟုတ်ဘဲအချိန်နှင့်အမျှတိုးတက်လာစေပါ။\n", + "\n", + "4. **Personalization & session behavior အတွက် tune လုပ်ပါ**: User IDs, tenants, နှင့် datasets များကိုအသုံးပြုပြီး shared memory engine အပေါ်တွင် လူတစ်ဦးစီ သို့မဟုတ် အဖွဲ့တစ်ခုစီ၏ view ကိုပေးပါ။\n", + "\n", + "5. **ပိုမိုရှုပ်ထွေးသော agents များအတွက် scale out လုပ်ပါ**: Cognee ကို agent frameworks တွင် plug လုပ်ပြီး shared memory layer တစ်ခုကိုအသုံးပြုသော multi-agent systems များကိုတည်ဆောက်ပါ။ *Microsoft Agent Framework x Cognee plugin သည်မကြာမီရရှိနိုင်ပါမည်။*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**အကြောင်းကြားချက်**: \nဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မမှန်ကန်မှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတရားရှိသော အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအမှားများ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:42:12+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "my" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/my/13-agent-memory/README.md b/translations/my/13-agent-memory/README.md index dbccc07f4..1721d5eb4 100644 --- a/translations/my/13-agent-memory/README.md +++ b/translations/my/13-agent-memory/README.md @@ -1,8 +1,8 @@ **အကြောင်းကြားချက်**: -ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတရ အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအလွတ်များ သို့မဟုတ် အနားလွဲမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ \ No newline at end of file +ဤစာရွက်စာတမ်းကို AI ဘာသာပြန်ဝန်ဆောင်မှု [Co-op Translator](https://github.com/Azure/co-op-translator) ကို အသုံးပြု၍ ဘာသာပြန်ထားပါသည်။ ကျွန်ုပ်တို့သည် တိကျမှုအတွက် ကြိုးစားနေသော်လည်း အလိုအလျောက် ဘာသာပြန်မှုများတွင် အမှားများ သို့မဟုတ် မတိကျမှုများ ပါဝင်နိုင်သည်ကို သတိပြုပါ။ မူရင်းဘာသာစကားဖြင့် ရေးသားထားသော စာရွက်စာတမ်းကို အာဏာတရားရှိသော အရင်းအမြစ်အဖြစ် သတ်မှတ်သင့်ပါသည်။ အရေးကြီးသော အချက်အလက်များအတွက် လူ့ဘာသာပြန်ပညာရှင်များကို အသုံးပြုရန် အကြံပြုပါသည်။ ဤဘာသာပြန်မှုကို အသုံးပြုခြင်းမှ ဖြစ်ပေါ်လာသော အလွဲအမှားများ သို့မဟုတ် အနားယူမှုများအတွက် ကျွန်ုပ်တို့သည် တာဝန်မယူပါ။ + \ No newline at end of file diff --git a/translations/ne/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/ne/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..8f3292999 --- /dev/null +++ b/translations/ne/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Cognee प्रयोग गरेर स्थायी मेमोरीसहित AI एजेन्टहरू निर्माण गर्नुहोस्\n", + "\n", + "यो नोटबुकले [**cognee**](https://www.cognee.ai/) प्रयोग गरेर उन्नत मेमोरी क्षमतासहित बौद्धिक AI एजेन्टहरू कसरी निर्माण गर्ने भनेर देखाउँछ - यो एक खुला स्रोत AI मेमोरी हो जसले ज्ञान ग्राफ, सेम्यान्टिक खोज, र सेसन व्यवस्थापनलाई संयोजन गरेर सन्दर्भ-सचेत AI प्रणालीहरू सिर्जना गर्दछ।\n", + "\n", + "## 🎯 सिकाइका उद्देश्यहरू\n", + "\n", + "यस ट्युटोरियलको अन्त्यसम्म, तपाईंले निम्न कुरा बुझ्नुहुनेछ:\n", + "- **एम्बेडिङद्वारा समर्थित ज्ञान ग्राफ निर्माण गर्नुहोस्**: असंरचित पाठलाई संरचित, सोधपुछ गर्न मिल्ने ज्ञानमा रूपान्तरण गर्नुहोस्\n", + "- **सेसन मेमोरी कार्यान्वयन गर्नुहोस्**: स्वचालित सन्दर्भ प्रतिधारणसहित बहु-वार्ता सिर्जना गर्नुहोस्\n", + "- **वार्तालापहरू स्थायी गर्नुहोस्**: भविष्यको सन्दर्भका लागि महत्त्वपूर्ण अन्तरक्रियाहरूलाई दीर्घकालीन मेमोरीमा वैकल्पिक रूपमा भण्डारण गर्नुहोस्\n", + "- **प्राकृतिक भाषाको प्रयोग गरेर सोधपुछ गर्नुहोस्**: नयाँ वार्तालापहरूमा ऐतिहासिक सन्दर्भ पहुँच गर्नुहोस् र उपयोग गर्नुहोस्\n", + "- **मेमोरीलाई दृश्यात्मक बनाउनुहोस्**: तपाईंको एजेन्टको ज्ञान ग्राफमा सम्बन्धहरू अन्वेषण गर्नुहोस्\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ तपाईंले के निर्माण गर्नुहुनेछ\n", + "\n", + "यस ट्युटोरियलमा, हामी एक **कोडिङ सहायक** निर्माण गर्नेछौं जसले स्थायी स्मृति राख्छ:\n", + "\n", + "### 1. **ज्ञान आधार निर्माण**\n", + " - विकासकर्ता प्रोफाइल र विशेषज्ञताको जानकारी ग्रहण गर्दछ\n", + " - Python प्रोग्रामिङ सिद्धान्त र उत्कृष्ट अभ्यासहरू प्रक्रिया गर्दछ\n", + " - विकासकर्ता र AI सहायकहरू बीचको ऐतिहासिक कुराकानीहरू भण्डारण गर्दछ\n", + "\n", + "### 2. **सत्र-प्रसंग कुराकानीहरू**\n", + " - एउटै सत्रमा धेरै प्रश्नहरूको सन्दर्भ कायम राख्छ\n", + " - प्रत्येक प्रश्न/उत्तर जोडीलाई स्वचालित रूपमा क्यास गर्दछ प्रभावकारी पुनःप्राप्तिको लागि\n", + " - कुराकानी इतिहासको आधारमा सुसंगत, सन्दर्भात्मक उत्तरहरू प्रदान गर्दछ\n", + "\n", + "### 3. **दीर्घकालीन स्मृति**\n", + " - महत्त्वपूर्ण कुराकानीहरू दीर्घकालीन स्मृतिमा कायम राख्छ\n", + " - नयाँ अन्तरक्रियाहरूलाई सूचित गर्न ज्ञान आधार र विगतका सत्रहरूबाट सान्दर्भिक स्मृतिहरू पुनःप्राप्त गर्दछ\n", + " - समयसँगै सुधार हुने बढ्दो ज्ञान आधार निर्माण गर्दछ\n", + "\n", + "### 4. **बुद्धिमान स्मृति पुनःप्राप्ति**\n", + " - सबै भण्डारण गरिएको ज्ञानभरि सान्दर्भिक जानकारी फेला पार्न ग्राफ-प्रसंगगत सेम्यान्टिक खोज प्रयोग गर्दछ\n", + " - डेटा उपसमूहहरू (विकासकर्ता जानकारी बनाम सिद्धान्तहरू) द्वारा खोजहरू फिल्टर गर्दछ\n", + " - व्यापक उत्तरहरू प्रदान गर्न धेरै डेटा स्रोतहरू संयोजन गर्दछ\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 पूर्वआवश्यकताहरू र सेटअप\n", + "\n", + "### प्रणाली आवश्यकताहरू\n", + "\n", + "सुरु गर्नु अघि, सुनिश्चित गर्नुहोस् कि तपाईंसँग यी छन्:\n", + "\n", + "1. **Python वातावरण**\n", + " - Python 3.9 वा उच्च संस्करण\n", + " - भर्चुअल वातावरण (सिफारिस गरिन्छ)\n", + " \n", + "2. **Redis क्यासे** (सत्र व्यवस्थापनको लागि आवश्यक)\n", + " - स्थानीय Redis: `docker run -d -p 6379:6379 redis`\n", + " - वा व्यवस्थापित Redis सेवा प्रयोग गर्नुहोस्\n", + " \n", + "3. **LLM API पहुँच**\n", + " - OpenAI API कुञ्जी वा अन्य प्रदायकहरू (हेर्नुहोस् [प्रलेखन](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **डाटाबेस कन्फिगरेसन**\n", + " - डिफल्ट रूपमा कुनै कन्फिगरेसन आवश्यक छैन। Cognee ले फाइल-आधारित डाटाबेसहरू (LanceDB र Kuzu) प्रयोग गर्दछ।\n", + " - वैकल्पिक रूपमा, तपाईँ Azure AI Search लाई भेक्टर स्टोरको रूपमा सेटअप गर्न सक्नुहुन्छ (हेर्नुहोस् [प्रलेखन](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### वातावरण कन्फिगरेसन\n", + "\n", + "तपाईंको प्रोजेक्ट डाइरेक्टरीमा `.env` फाइल निम्न भेरिएबलहरूसँग सिर्जना गर्नुहोस्:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Cognee को मेमोरी आर्किटेक्चर बुझ्दै\n", + "\n", + "### Cognee कसरी काम गर्छ\n", + "\n", + "Cognee ले साधारण key-value भण्डारण भन्दा पर sophisticated मेमोरी प्रणाली प्रदान गर्दछ:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### मुख्य घटकहरू:\n", + "\n", + "1. **Knowledge Graph**: संस्थाहरू, सम्बन्धहरू, र semantic जडानहरू भण्डारण गर्दछ\n", + "2. **Vector Embeddings**: भण्डारण गरिएको सबै जानकारीमा semantic खोज सक्षम बनाउँछ\n", + "3. **Session Cache**: सत्रभित्र र सत्रहरू बीचको संवाद सन्दर्भ कायम राख्छ\n", + "4. **NodeSets**: लक्षित पुनःप्राप्तिको लागि डाटालाई तार्किक श्रेणीहरूमा व्यवस्थित गर्दछ\n", + "\n", + "### यस ट्युटोरियलमा मेमोरीका प्रकारहरू:\n", + "\n", + "- **Persistent Memory**: Knowledge graph मा दीर्घकालीन भण्डारण\n", + "- **Session Memory**: Redis cache मा अस्थायी संवाद सन्दर्भ\n", + "- **Semantic Memory**: सबै डाटामा vector आधारित समानता खोज\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 आवश्यक प्याकेजहरू स्थापना गर्नुहोस्\n", + "\n", + "सत्र व्यवस्थापनको लागि Redis समर्थनसहित Cognee स्थापना गर्नुहोस्:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 वातावरण सुरु गर्नुहोस् र पुस्तकालयहरू लोड गर्नुहोस्\n", + "\n", + "निश्चित गर्नुहोस्:\n", + "1. Redis चलिरहेको छ (उदाहरणका लागि, Docker मार्फत: `docker run -d -p 6379:6379 redis`)\n", + "2. क्यास मोड्युलहरू आयात गर्नु अघि वातावरण भेरिएबलहरू सेट गरिएको छ\n", + "3. आवश्यक परे, कर्नेल पुनः सुरु गर्नुहोस् र कोषहरू क्रमबद्ध रूपमा चलाउनुहोस्\n", + "\n", + "तलको कोषले गर्नेछ:\n", + "1. `.env` बाट वातावरण भेरिएबलहरू लोड गर्नुहोस्\n", + "2. तपाईँको LLM सेटिङहरूसँग Cognee कन्फिगर गर्नुहोस्\n", + "3. सत्र व्यवस्थापनको लागि क्यास सक्षम गर्नुहोस्\n", + "4. सबै कम्पोनेन्टहरू सही रूपमा जडान भएको छ भनेर प्रमाणित गर्नुहोस्\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 स्टोरेज डाइरेक्टरीहरू कन्फिगर गर्नुहोस्\n", + "\n", + "Cognee ले आफ्नो अपरेशनका लागि दुई छुट्टाछुट्टै डाइरेक्टरीहरू प्रयोग गर्दछ:\n", + "- **डाटा रुट**: समाहित गरिएका कागजातहरू र प्रशोधित डाटा भण्डारण गर्दछ\n", + "- **सिस्टम रुट**: ज्ञान ग्राफ डाटाबेस र प्रणाली मेटाडाटा समावेश गर्दछ\n", + "\n", + "यस ट्यूटोरियलका लागि हामी निम्नानुसार अलग-अलग डाइरेक्टरीहरू सिर्जना गर्नेछौं:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 मेमोरी अवस्था रिसेट गर्नुहोस्\n", + "\n", + "हामी हाम्रो मेमोरी प्रणाली निर्माण गर्न सुरु गर्नु अघि, सुनिश्चित गरौं कि हामी नयाँबाट सुरु गर्दैछौं।\n", + "\n", + "> 💡 **सुझाव**: यदि तपाईंले यो नोटबुक पछि प्रयोग गर्दा अघिल्लो रनहरूबाट भएका मेमोरीहरू सुरक्षित राख्न चाहनुहुन्छ भने, यो चरण छोड्न सक्नुहुन्छ।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 भाग १: ज्ञान आधार निर्माण गर्दै\n", + "\n", + "### हाम्रो डेभलपर सहायकका लागि डाटा स्रोतहरू\n", + "\n", + "हामीले व्यापक ज्ञान आधार बनाउन तीन प्रकारका डाटा समावेश गर्नेछौं:\n", + "\n", + "1. **डेभलपर प्रोफाइल**: व्यक्तिगत विशेषज्ञता र प्राविधिक पृष्ठभूमि \n", + "2. **Python का उत्कृष्ट अभ्यासहरू**: Python को Zen र व्यावहारिक दिशानिर्देशहरू \n", + "3. **ऐतिहासिक संवादहरू**: डेभलपर र AI सहायकबीचका विगतका प्रश्न-उत्तर सत्रहरू \n", + "\n", + "यस विविध डाटाले हाम्रो एजेन्टलाई निम्न गर्न सक्षम बनाउँछ: \n", + "- प्रयोगकर्ताको प्राविधिक सन्दर्भ बुझ्न \n", + "- सिफारिसहरूमा उत्कृष्ट अभ्यासहरू लागू गर्न \n", + "- अघिल्ला सफल अन्तरक्रियाबाट सिक्न \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 कच्चा डाटालाई ज्ञान ग्राफमा रूपान्तरण गर्नुहोस्\n", + "\n", + "अब हामी हाम्रो कच्चा पाठलाई संरचित स्मृतिमा रूपान्तरण गर्नेछौं। यो प्रक्रिया:\n", + "\n", + "1. **NodeSets मा डाटा थप्छ**: जानकारीलाई तार्किक श्रेणीहरूमा व्यवस्थित गर्दछ\n", + " - `developer_data`: विकासकर्ता प्रोफाइल र कुराकानीहरू\n", + " - `principles_data`: Python का उत्कृष्ट अभ्यासहरू र दिशानिर्देशहरू\n", + "\n", + "2. **Cognify Pipeline चलाउँछ**: इकाईहरू, सम्बन्धहरू निकाल्छ, र embeddings सिर्जना गर्दछ\n", + " - मुख्य अवधारणाहरू पहिचान गर्दछ\n", + " - सम्बन्धित जानकारीहरू बीच अर्थपूर्ण सम्बन्धहरू सिर्जना गर्दछ\n", + " - भेक्टर embeddings उत्पन्न गर्दछ\n", + "\n", + "यसले केही समय लिन सक्छ किनभने LLM ले पाठलाई प्रक्रिया गरी ग्राफ संरचना निर्माण गर्दछ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 ज्ञान ग्राफलाई दृश्यात्मक बनाउनुहोस्\n", + "\n", + "आउनुहोस्, हाम्रो ज्ञान ग्राफको संरचना अन्वेषण गरौं। दृश्यले देखाउँछ:\n", + "- **नोडहरू**: पाठबाट निकालिएका इकाइहरू (धारणा, प्रविधि, व्यक्ति)\n", + "- **एजहरू**: इकाइहरू बीचका सम्बन्ध र जडानहरू\n", + "- **क्लस्टरहरू**: अर्थपूर्ण समानताका आधारमा समूह गरिएका सम्बन्धित धारणा\n", + "\n", + "ग्राफलाई अन्तरक्रियात्मक रूपमा अन्वेषण गर्न उत्पन्न HTML फाइललाई आफ्नो ब्राउजरमा खोल्नुहोस्:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 मेमोरीलाई समृद्ध बनाउनुहोस् Memify को साथ\n", + "\n", + "`memify()` फङ्सनले ज्ञान ग्राफलाई विश्लेषण गर्छ र डाटाबारे बौद्धिक नियमहरू उत्पन्न गर्छ। यो प्रक्रियाले:\n", + "- ढाँचाहरू र उत्कृष्ट अभ्यासहरू पहिचान गर्छ\n", + "- सामग्रीको आधारमा कार्यान्वयन योग्य दिशानिर्देशहरू सिर्जना गर्छ\n", + "- विभिन्न ज्ञान क्षेत्रहरू बीच सम्बन्ध स्थापना गर्छ\n", + "\n", + "यी नियमहरूले एजेन्टलाई प्रश्नहरूको उत्तर दिने क्रममा अझ सूचित निर्णय लिन मद्दत गर्छ। दोस्रो भिजुअलाइजेसन समात्दा, ग्राफ समृद्ध भएपछि कसरी घनिभूत हुन्छ भनेर तुलना गर्न मद्दत गर्छ।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 भाग २: बौद्धिक स्मृति पुनःप्राप्ति\n", + "\n", + "### प्रदर्शन १: क्रस-डकुमेन्ट ज्ञान एकीकरण\n", + "\n", + "अब हाम्रो ज्ञान ग्राफ तयार भएको छ, आउनुहोस् परीक्षण गरौं कि Cognee ले जटिल प्रश्नहरूको उत्तर दिनका लागि विभिन्न स्रोतहरूबाट जानकारी कसरी संयोजन गर्छ।\n", + "\n", + "पहिलो प्रश्नले देखाउँछ:\n", + "- **अर्थपूर्ण बुझाइ**: स्पष्ट रूपमा उल्लेख नगरिएका अवधारणाहरू पत्ता लगाउने क्षमता\n", + "- **क्रस-रेफरेन्सिङ**: डेभलपर प्रोफाइललाई Python सिद्धान्तहरूसँग संयोजन गर्ने\n", + "- **सन्दर्भात्मक तर्क**: विशेष कार्यान्वयनहरूमा उत्कृष्ट अभ्यासहरू लागू गर्ने\n", + "\n", + "### प्रदर्शन २: NodeSets सँग फिल्टर गरिएको खोज\n", + "\n", + "दोस्रो प्रश्नले ज्ञान ग्राफको विशिष्ट उपसमूहलाई लक्षित गर्ने तरिका देखाउँछ:\n", + "- `node_name` प्यारामिटर प्रयोग गरेर केवल `principles_data` भित्र खोजी गर्छ\n", + "- विशिष्ट ज्ञान क्षेत्रबाट केन्द्रित उत्तर प्रदान गर्छ\n", + "- जब तपाईंलाई क्षेत्र-विशेष जानकारी चाहिन्छ, यो उपयोगी हुन्छ\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 भाग ३: सेसन व्यवस्थापन सेटअप\n", + "\n", + "### संवाद स्मृति सक्षम गर्दै\n", + "\n", + "सेसन व्यवस्थापन धेरै अन्तरक्रियाहरूमा सन्दर्भ कायम राख्न महत्त्वपूर्ण छ। यहाँ हामी:\n", + "\n", + "1. **प्रयोगकर्ता सन्दर्भ सुरु गर्नुहोस्**: सेसन ट्र्याकिङका लागि प्रयोगकर्ता प्रोफाइल सिर्जना गर्नुहोस् वा पुन: प्राप्त गर्नुहोस् \n", + "2. **क्यास इन्जिन कन्फिगर गर्नुहोस्**: संवाद इतिहास भण्डारण गर्नका लागि Redis सँग जडान गर्नुहोस् \n", + "3. **सेसन भेरिएबलहरू सक्षम गर्नुहोस्**: प्रश्नहरूको बीचमा कायम रहने सन्दर्भ भेरिएबलहरू सेट गर्नुहोस् \n", + "\n", + "> ⚠️ **महत्त्वपूर्ण**: यसका लागि Redis चलिरहेको हुनुपर्छ र तपाईंको वातावरणमा `CACHING=true` सेट गरिएको हुनुपर्छ \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ सहायक फङ्सन: सेसन इतिहास हेर्नुहोस्\n", + "\n", + "यो उपयोगी फङ्सनले हामीलाई Redis मा भण्डारण गरिएको कुराकानी इतिहास निरीक्षण गर्न अनुमति दिन्छ। यो निम्नका लागि उपयोगी छ:\n", + "- सेसन व्यवस्थापन डिबग गर्न\n", + "- कुराकानीहरू क्यास भइरहेको छ कि छैन भनेर प्रमाणित गर्न\n", + "- एजेन्टलाई उपलब्ध सन्दर्भ के छ भनेर बुझ्न\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## सत्र १: असिन्क समर्थन प्रयोगशाला — पहिलो प्रश्न\n", + "\n", + "`async-support-lab` सत्र सुरु गर्नुहोस् र ठूलो वेब स्क्र्यापरको लागि टेलिमेट्री-अनुकूल asyncio ढाँचाहरूको बारेमा सोध्नुहोस्। ग्राफलाई पहिले नै asyncio, aiohttp, र अनुगमन अभ्यासहरूको ज्ञान छ, त्यसैले उत्तरले अघिल्लो कुराकानीलाई प्रतिबिम्बित गर्दै नयाँ प्रश्नको लागि उत्तर अनुकूलित गर्नुपर्छ।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## पहिलो संवादपछि सत्र १ को मेमोरी जाँच गर्नुहोस्\n", + "\n", + "प्रारम्भिक प्रश्नपछि तुरुन्तै `show_history(session_1)` चलाउँदा, Cognee ले Redis मा प्रॉम्प्ट र पूरा गरिएको उत्तर लेखेको पुष्टि हुन्छ। तपाईंले एक प्रविष्टि देख्नुहुनेछ जसमा समवर्तीता मार्गदर्शन समावेश छ।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## सत्र १: डाटा मोडेलहरूमा पुनरावलोकन\n", + "\n", + "अब हामी सोध्छौं, \"म कहिले dataclasses को सट्टा Pydantic छनोट गर्नुपर्छ?\" उही सत्र आईडी प्रयोग गरेर। Cognee ले Python का सिद्धान्तहरू र FastAPI सम्बन्धित अघिल्लो कुराकानीहरूलाई जोडेर विस्तृत सल्लाह दिनुपर्छ—देखाउँदै कि नामित सत्रभित्र सन्दर्भ निरन्तरता राख्छ।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## सत्र १ को इतिहासमा दुवै पालोहरू समावेश भएको पुष्टि गर्नुहोस्\n", + "\n", + "अर्को `show_history(session_1)` कलले दुईवटा प्रश्न-उत्तर प्रविष्टिहरू देखाउनुपर्छ। यो Mem0 प्रयोगशालाको \"स्मृति पुनरावर्तन\" चरणसँग मेल खान्छ र थप पालोहरूले एउटै प्रतिलिपि विस्तार गर्ने प्रमाणित गर्दछ।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## सत्र २: डिजाइन समीक्षा थ्रेड — नयाँ सत्र\n", + "\n", + "थ्रेडहरू बीच अलगाव देखाउनको लागि हामी `design-review-session` सुरु गर्छौं र घटनाको समीक्षाको लागि लगिङ मार्गदर्शन माग्छौं। यद्यपि आधारभूत ज्ञान आधार उस्तै छ, नयाँ सत्र आईडीले प्रतिलिपिहरू अलग राख्छ।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## समीक्षा सत्र २ इतिहास\n", + "\n", + "`show_history(session_2)` ले केवल डिजाइन-समीक्षा प्रॉम्प्ट/प्रतिक्रिया जोडी सूचीबद्ध गर्नुपर्छ। यसलाई सत्र १ सँग तुलना गर्नुहोस् ताकि Cognee ले साझा ज्ञान ग्राफ पुन: प्रयोग गर्दा स्वतन्त्र प्रतिलिपिहरू कसरी राख्छ भन्ने देखाउन सकियोस्।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## सारांश\n", + "\n", + "बधाई छ! तपाईंले आफ्नो कोडिङ सहायकलाई Cognee द्वारा संचालित वास्तविक दीर्घकालीन स्मृति तह प्रदान गर्नुभएको छ।\n", + "\n", + "यस ट्यूटोरियलमा, तपाईंले कच्चा विकासकर्ता सामग्री (कोड, दस्तावेज, च्याटहरू) लिइराख्नुभयो र यसलाई ग्राफ + भेक्टर स्मृतिमा परिणत गर्नुभयो जसलाई तपाईंको एजेन्टले खोज्न, तर्क गर्न, र निरन्तर सुधार गर्न सक्छ।\n", + "\n", + "तपाईंले के सिक्नुभयो\n", + "\n", + "1. **कच्चा पाठबाट AI स्मृतिमा**: Cognee ले असंरचित डाटालाई कसरी ग्रहण गर्छ र संयुक्त भेक्टर + ज्ञान ग्राफ आर्किटेक्चर प्रयोग गरेर यसलाई बौद्धिक, खोजयोग्य स्मृतिमा परिणत गर्छ।\n", + "\n", + "2. **ग्राफ समृद्धि memify संग**: आधारभूत ग्राफ सिर्जनालाई पार गरेर, memify प्रयोग गरेर तपाईंको विद्यमान ग्राफमा व्युत्पन्न तथ्यहरू र समृद्ध सम्बन्धहरू थप्ने तरिका।\n", + "\n", + "3. **धेरै खोज रणनीतिहरू**: तपाईंको एजेन्टलाई आवश्यक पर्ने अनुसार विभिन्न खोज प्रकार (ग्राफ-सचेत Q&A, RAG-शैली पूरा, अन्तर्दृष्टि, कच्चा टुक्रा, कोड खोज, आदि) प्रयोग गरेर स्मृति सोधपुछ गर्ने तरिका।\n", + "\n", + "4. **दृश्य अन्वेषण**: ग्राफ भिजुअलाइजेसन र Cognee UI प्रयोग गरेर Cognee ले निर्माण गरेको कुरा निरीक्षण र डिबग गर्ने तरिका, ताकि तपाईंले ज्ञान कसरी संरचित छ भनेर देख्न सक्नुहुन्छ।\n", + "\n", + "5. **सत्र-सचेत स्मृति**: सत्र-प्रति सन्दर्भलाई स्थायी अर्थपूर्ण स्मृतिसँग संयोजन गर्ने तरिका ताकि एजेन्टहरूले प्रयोगकर्ताहरू बीच जानकारी चुहावट नगरी विभिन्न रनहरूमा सम्झन सकून्।\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## मुख्य बुँदाहरू\n", + "1. एम्बेडिङद्वारा समर्थित ज्ञान ग्राफको रूपमा मेमोरी\n", + "\n", + " - **संरचित बुझाइ**: Cognee ले भेक्टर स्टोर र ग्राफ स्टोरलाई संयोजन गर्छ, जसले गर्दा तपाईंको डाटा अर्थद्वारा खोज्न मिल्ने र सम्बन्धद्वारा जोडिएको हुन्छ। Cognee ले डिफल्ट रूपमा फाइल-आधारित डाटाबेसहरू प्रयोग गर्छ (भेक्टरको लागि LanceDB, ग्राफ डाटाबेसको लागि Kuzu)।\n", + "\n", + " - **सम्बन्ध-जानकारी पुनःप्राप्ति**: उत्तरहरू केवल \"समान पाठ\" मा मात्र होइन, तर इकाइहरू कसरी सम्बन्धित छन् भन्ने आधारमा पनि आधारित हुन सक्छ।\n", + "\n", + " - **जीवित मेमोरी**: मेमोरी तह विकसित हुन्छ, बढ्छ, र एकजुट ग्राफको रूपमा सोधपुछ गर्न मिल्ने रहन्छ।\n", + "\n", + "2. खोज र तर्क मोडहरू\n", + " - **हाइब्रिड पुनःप्राप्ति**: खोजले भेक्टर समानता, ग्राफ संरचना, र LLM तर्कलाई मिश्रण गर्छ, कच्चा चंक खोजदेखि ग्राफ-जानकारी प्रश्न उत्तरसम्म।\n", + "\n", + " - **काम अनुसार मोड मिलाउनुहोस्**: प्राकृतिक भाषामा उत्तर चाहिएको बेला completion-style मोड प्रयोग गर्नुहोस्, र कच्चा सन्दर्भ वा आफ्नै तर्क चलाउन चंक/सारांश/ग्राफ मोड प्रयोग गर्नुहोस्।\n", + "\n", + "3. व्यक्तिगत, सत्र-जानकारी एजेन्टहरू\n", + " - **सत्र सन्दर्भ + दीर्घकालीन मेमोरी**: Cognee ले छोटो-कालीन \"थ्रेड\" सन्दर्भलाई दीर्घकालीन, प्रयोगकर्ता- वा संगठन-स्तरको मेमोरीबाट अलग राख्छ।\n", + "\n", + "## वास्तविक-विश्व अनुप्रयोगहरू\n", + "\n", + "1. **भर्टिकल एआई एजेन्टहरू**\n", + "\n", + " यस नोटबुकको ढाँचालाई प्रयोग गरेर Cognee को पुनःप्राप्ति र तर्क कोरको रूपमा डोमेन-जानकारी कोपाइलटहरू निर्माण गर्नुहोस्:\n", + "\n", + "- **डेभलपर कोपाइलटहरू**: कोड समीक्षा, घटना विश्लेषण, र आर्किटेक्चर सहायकहरू जसले कोड, API, डिजाइन डक, र टिकटहरूलाई एकल मेमोरी ग्राफको रूपमा पार गर्छन्।\n", + "\n", + "- **ग्राहक-सामना गर्ने कोपाइलटहरू**: समर्थन वा सफलता एजेन्टहरू जसले उत्पादन डक, FAQ, CRM नोट्स, र विगतका टिकटहरूबाट ग्राफ-जानकारी पुनःप्राप्ति र उद्धृत उत्तरहरू निकाल्छन्।\n", + "\n", + "- **आन्तरिक विशेषज्ञ कोपाइलटहरू**: नीति, कानूनी, वा सुरक्षा सहायकहरू जसले अलग-अलग PDF हरूको सट्टा परस्पर सम्बन्धित नियम, दिशानिर्देश, र ऐतिहासिक निर्णयहरूमा तर्क गर्छन्।\n", + "\n", + " Cognee लाई एआई एजेन्टहरूको लागि स्थायी, सटीक मेमोरीको रूपमा स्पष्ट रूपमा स्थान दिइएको छ, जसले तपाईंको एजेन्टको पछाडि एक जीवित ज्ञान ग्राफ प्रदान गर्दछ र भेक्टर स्टोर र कस्टम ग्राफ कोडको अस्थायी संयोजनलाई प्रतिस्थापन गर्दछ।\n", + "\n", + "2. **डाटा साइलोहरूलाई एक मेमोरीमा एकीकृत गर्नुहोस्**\n", + "\n", + " उही दृष्टिकोणले छरिएका स्रोतहरूमा एकीकृत मेमोरी तह निर्माण गर्न पनि मद्दत गर्छ:\n", + "\n", + "- **साइलोबाट एक ग्राफमा**: संरचित (जस्तै, डाटाबेसहरू) र असंरचित डाटा (जस्तै, डक, च्याट) लाई एम्बेडिङद्वारा समर्थित एकल ग्राफमा समाहित गर्नुहोस्, प्रत्येक प्रणालीको लागि अलग-अलग सूचकांकहरूको सट्टा।\n", + "\n", + "- **उद्धृत उत्तरहरूसहित क्रस-स्रोत तर्क**: सबै कुरामा बहु-चरण तर्क चलाउनुहोस्—ग्राफमार्फत \"जोड्नुहोस्\" लग, मेट्रिक्स, र डकहरू—र अझै पनि प्रमाणसहितका उत्तरहरू फर्काउनुहोस्।\n", + "\n", + "- **ज्ञान केन्द्रहरू**: बैंकिङ वा शिक्षा जस्ता डोमेनहरूको लागि, Cognee पहिले नै PDF, आन्तरिक प्रणालीहरू, र एप डाटालाई एक ज्ञान ग्राफमा एकीकृत गर्न प्रयोग भइरहेको छ, जसले एजेन्टहरूलाई सटीक, उद्धृत सन्दर्भसहित प्रश्नहरूको उत्तर दिन सक्षम बनाउँछ।\n", + "\n", + "## आगामी कदमहरू\n", + "\n", + "तपाईंले कोर मेमोरी लूप कार्यान्वयन गर्नुभएको छ। यहाँ तपाईं आफैंले प्रयास गर्न सक्ने केही प्राकृतिक विस्तारहरू छन् (विवरणका लागि [Cognee दस्तावेज](https://docs.cognee.ai/) हेर्नुहोस्):\n", + "\n", + "1. **समय-जानकारी प्रयोग गरेर परीक्षण गर्नुहोस्**: पाठबाट घटनाहरू र समय-छापहरू निकाल्न समय-जानकारी सक्षम गर्नुहोस्।\n", + "\n", + "2. **ओन्टोलोजी-चालित तर्क प्रस्तुत गर्नुहोस्**: तपाईंको डोमेनको लागि OWL ओन्टोलोजी परिभाषित गर्नुहोस्। Cognee को ओन्टोलोजी समर्थन प्रयोग गर्नुहोस् ताकि निकालिएका इकाइहरू र सम्बन्धहरू त्यो स्किमामा आधारित हुन्छन्, ग्राफको गुणस्तर र डोमेन-विशिष्ट उत्तरहरू सुधार गर्दै।\n", + "\n", + "3. **प्रतिक्रिया लूप थप्नुहोस्**: वास्तविक प्रयोगकर्ता प्रतिक्रियाबाट ग्राफ एज वजनहरू समायोजन गर्न Cognee लाई अनुमति दिनुहोस्, ताकि पुनःप्राप्ति समयसँगै सुधार हुन्छ, स्थिर रहँदैन।\n", + "\n", + "4. **व्यक्तिगतकरण र सत्र व्यवहारको लागि ट्युन गर्नुहोस्**: प्रयोगकर्ता ID, टेनन्टहरू, र डाटासेटहरू प्रयोग गरेर प्रत्येक व्यक्ति वा टोलीलाई साझा मेमोरी इन्जिनमा आफ्नै दृश्य दिनुहोस्।\n", + "\n", + "5. **अझ जटिल एजेन्टहरूमा विस्तार गर्नुहोस्**: बहु-एजेन्ट प्रणालीहरू निर्माण गर्न Cognee लाई एजेन्ट फ्रेमवर्कमा प्लग गर्नुहोस्, जसले एउटै मेमोरी तह साझा गर्छ। *Microsoft Agent Framework x Cognee प्लगइन चाँडै आउँदैछ।*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**अस्वीकरण**: \nयो दस्तावेज AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरेर अनुवाद गरिएको छ। हामी शुद्धताको लागि प्रयास गर्छौं, तर कृपया ध्यान दिनुहोस् कि स्वचालित अनुवादमा त्रुटिहरू वा अशुद्धताहरू हुन सक्छ। यसको मूल भाषा मा रहेको दस्तावेजलाई आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीको लागि, व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न हुने कुनै पनि गलतफहमी वा गलत व्याख्याको लागि हामी जिम्मेवार हुने छैनौं।\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:42:55+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "ne" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/ne/13-agent-memory/README.md b/translations/ne/13-agent-memory/README.md index a826ba8e2..9f434fb4a 100644 --- a/translations/ne/13-agent-memory/README.md +++ b/translations/ne/13-agent-memory/README.md @@ -1,8 +1,8 @@ **अस्वीकरण**: -यो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरी अनुवाद गरिएको हो। हामी यथासम्भव शुद्धताको प्रयास गर्छौं, तर कृपया ध्यान दिनुहोस् कि स्वचालित अनुवादहरूमा त्रुटिहरू वा अशुद्धताहरू हुन सक्छन्। यसको मूल भाषामा रहेको मूल दस्तावेज़लाई आधिकारिक स्रोत मानिनुपर्छ। महत्त्वपूर्ण जानकारीको लागि, व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न हुने कुनै पनि गलतफहमी वा गलत व्याख्याको लागि हामी जिम्मेवार हुनेछैनौं। \ No newline at end of file +यो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरेर अनुवाद गरिएको छ। हामी सटीकताको लागि प्रयास गर्छौं, तर कृपया ध्यान दिनुहोस् कि स्वचालित अनुवादमा त्रुटिहरू वा अशुद्धताहरू हुन सक्छ। यसको मूल भाषा मा रहेको मूल दस्तावेज़लाई आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीको लागि, व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न हुने कुनै पनि गलतफहमी वा गलत व्याख्याको लागि हामी जिम्मेवार हुनेछैनौं। + \ No newline at end of file diff --git a/translations/nl/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/nl/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..277414d56 --- /dev/null +++ b/translations/nl/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# AI-agenten bouwen met blijvend geheugen met behulp van Cognee\n", + "\n", + "Deze notebook laat zien hoe je intelligente AI-agenten kunt bouwen met geavanceerde geheugenmogelijkheden met behulp van [**cognee**](https://www.cognee.ai/) - een open source AI-geheugen dat kennisgrafieken, semantisch zoeken en sessiebeheer combineert om contextbewuste AI-systemen te creëren.\n", + "\n", + "## 🎯 Leerdoelen\n", + "\n", + "Aan het einde van deze tutorial begrijp je hoe je:\n", + "- **Kennisgrafieken ondersteund door embeddings bouwt**: Ongeordende tekst omzet in gestructureerde, doorzoekbare kennis\n", + "- **Sessiegeheugen implementeert**: Meerdere gespreksrondes creëert met automatische contextbehoud\n", + "- **Gesprekken bewaart**: Belangrijke interacties optioneel opslaat in langetermijngeheugen voor toekomstig gebruik\n", + "- **Vraagt met natuurlijke taal**: Historische context gebruikt en toepast in nieuwe gesprekken\n", + "- **Geheugen visualiseert**: De relaties in de kennisgrafiek van je agent verkent\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Wat Je Gaat Bouwen\n", + "\n", + "In deze tutorial maken we een **Coding Assistant** met blijvend geheugen die:\n", + "\n", + "### 1. **Kennisbank Constructie**\n", + " - Ontwikkelaarsprofielen en expertise-informatie verwerkt\n", + " - Principes en best practices van Python-programmeren verwerkt\n", + " - Historische gesprekken tussen ontwikkelaars en AI-assistenten opslaat\n", + "\n", + "### 2. **Sessie-bewuste Gesprekken**\n", + " - Context behoudt over meerdere vragen binnen dezelfde sessie\n", + " - Automatisch elk vraag/antwoord-paar cachet voor efficiënte terugwinning\n", + " - Coherente, contextuele antwoorden biedt op basis van gespreksgeschiedenis\n", + "\n", + "### 3. **Langetermijngeheugen**\n", + " - Belangrijke gesprekken opslaat in een langetermijngeheugen\n", + " - Relevante herinneringen uit de kennisbank en eerdere sessies ophaalt om nieuwe interacties te informeren\n", + " - Een groeiende kennisbank opbouwt die in de loop van de tijd verbetert\n", + "\n", + "### 4. **Intelligente Geheugenopvraging**\n", + " - Grafiek-bewuste semantische zoekopdrachten gebruikt om relevante informatie te vinden in alle opgeslagen kennis\n", + " - Zoekopdrachten filtert op datasubgroepen (ontwikkelaarsinfo vs. principes)\n", + " - Meerdere gegevensbronnen combineert om uitgebreide antwoorden te bieden\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Vereisten & Installatie\n", + "\n", + "### Systeemvereisten\n", + "\n", + "Voordat je begint, zorg ervoor dat je het volgende hebt:\n", + "\n", + "1. **Python-omgeving**\n", + " - Python 3.9 of hoger\n", + " - Virtuele omgeving (aanbevolen)\n", + " \n", + "2. **Redis Cache** (Vereist voor sessiebeheer)\n", + " - Lokale Redis: `docker run -d -p 6379:6379 redis`\n", + " - Of gebruik een beheerde Redis-service\n", + " \n", + "3. **LLM API-toegang**\n", + " - OpenAI API-sleutel of andere providers (zie [documentatie](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Databaseconfiguratie**\n", + " - Standaard is geen configuratie nodig. Cognee gebruikt bestandsgebaseerde databases (LanceDB en Kuzu)\n", + " - Optioneel kun je Azure AI Search instellen als vectoropslag (zie [documentatie](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Omgevingsconfiguratie\n", + "\n", + "Maak een `.env`-bestand in je projectmap met de volgende variabelen:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Begrijpen van Cognee's Geheugenarchitectuur\n", + "\n", + "### Hoe Cognee Werkt\n", + "\n", + "Cognee biedt een geavanceerd geheugensysteem dat verder gaat dan eenvoudige key-value opslag:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Belangrijke Componenten:\n", + "\n", + "1. **Kennisgrafiek**: Slaat entiteiten, relaties en semantische verbindingen op\n", + "2. **Vector-Embeddings**: Maakt semantisch zoeken mogelijk in alle opgeslagen informatie\n", + "3. **Sessiecache**: Behoudt de gesprekscontext binnen en tussen sessies\n", + "4. **NodeSets**: Organiseren gegevens in logische categorieën voor gerichte opvraging\n", + "\n", + "### Geheugentypen in Deze Tutorial:\n", + "\n", + "- **Persistent Geheugen**: Langdurige opslag in de kennisgrafiek\n", + "- **Sessiegeheugen**: Tijdelijke gesprekscontext in Redis-cache\n", + "- **Semantisch Geheugen**: Vector-gebaseerd zoeken naar overeenkomsten in alle data\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Vereiste pakketten installeren\n", + "\n", + "Installeer Cognee met Redis-ondersteuning voor sessiebeheer:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Initialiseer omgeving en laad bibliotheken\n", + "\n", + "Zorg ervoor dat:\n", + "1. Redis actief is (bijvoorbeeld via Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Omgevingsvariabelen zijn ingesteld voordat cachemodules worden geïmporteerd\n", + "3. Indien nodig, de kernel opnieuw opstarten en de cellen in volgorde uitvoeren\n", + "\n", + "De volgende cel zal:\n", + "1. Omgevingsvariabelen laden uit `.env`\n", + "2. Cognee configureren met je LLM-instellingen\n", + "3. Caching inschakelen voor sessiebeheer\n", + "4. Controleren of alle componenten correct zijn verbonden\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Opslagmappen configureren\n", + "\n", + "Cognee gebruikt twee aparte mappen voor zijn operaties:\n", + "- **Data Root**: Slaat geïmporteerde documenten en verwerkte data op\n", + "- **System Root**: Bevat de kennisgrafiekdatabase en systeemmetadata\n", + "\n", + "We zullen voor deze tutorial geïsoleerde mappen aanmaken als volgt:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Geheugenstatus resetten\n", + "\n", + "Voordat we beginnen met het bouwen van ons geheugensysteem, laten we ervoor zorgen dat we met een schone lei beginnen.\n", + "\n", + "> 💡 **Tip**: Je kunt deze stap overslaan als je bestaande herinneringen van je eerdere sessies wilt behouden wanneer je dit notebook later gebruikt.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Deel 1: Het opbouwen van de kennisbank\n", + "\n", + "### Gegevensbronnen voor onze ontwikkelaarassistent\n", + "\n", + "We zullen drie soorten gegevens verzamelen om een uitgebreide kennisbank te creëren:\n", + "\n", + "1. **Ontwikkelaarsprofiel**: Persoonlijke expertise en technische achtergrond\n", + "2. **Python Best Practices**: The Zen of Python met praktische richtlijnen\n", + "3. **Historische gesprekken**: Eerdere Q&A-sessies tussen ontwikkelaars en AI-assistenten\n", + "\n", + "Deze diverse gegevens stellen onze agent in staat om:\n", + "- De technische context van de gebruiker te begrijpen\n", + "- Best practices toe te passen in aanbevelingen\n", + "- Te leren van eerdere succesvolle interacties\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Verwerk gegevens tot een kennisgrafiek\n", + "\n", + "Nu gaan we onze ruwe tekst omzetten in een gestructureerd geheugen. Dit proces:\n", + "\n", + "1. **Voegt gegevens toe aan NodeSets**: Organiseert informatie in logische categorieën\n", + " - `developer_data`: Ontwikkelaarsprofiel en gesprekken\n", + " - `principles_data`: Python best practices en richtlijnen\n", + "\n", + "2. **Voert Cognify Pipeline uit**: Extraheert entiteiten, relaties en creëert embeddings\n", + " - Identificeert sleutelconcepten\n", + " - Maakt semantische verbindingen tussen gerelateerde informatie\n", + " - Genereert vector-embeddings\n", + "\n", + "Dit kan even duren terwijl de LLM de tekst verwerkt en de grafiekstructuur opbouwt:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Visualiseer de Kennisgrafiek\n", + "\n", + "Laten we de structuur van onze kennisgrafiek verkennen. De visualisatie toont:\n", + "- **Knopen**: Entiteiten die uit de tekst zijn gehaald (concepten, technologieën, personen)\n", + "- **Randen**: Relaties en verbindingen tussen entiteiten\n", + "- **Clusters**: Gerelateerde concepten gegroepeerd op semantische gelijkenis\n", + "\n", + "Open het gegenereerde HTML-bestand in je browser om de grafiek interactief te verkennen:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Verrijk Geheugen met Memify\n", + "\n", + "De functie `memify()` analyseert de kennisgrafiek en genereert intelligente regels over de data. Dit proces:\n", + "- Herkent patronen en best practices\n", + "- Creëert uitvoerbare richtlijnen op basis van de inhoud\n", + "- Legt verbanden tussen verschillende kennisgebieden\n", + "\n", + "Deze regels helpen de agent om beter geïnformeerde beslissingen te nemen bij het beantwoorden van vragen. Het vastleggen van een tweede visualisatie helpt je te vergelijken hoe de grafiek dichter wordt zodra deze verrijkt is.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Deel 2: Intelligente Geheugenopvraging\n", + "\n", + "### Demonstratie 1: Kennisintegratie over Documenten heen\n", + "\n", + "Nu onze kennisgrafiek is opgebouwd, laten we testen hoe Cognee informatie uit meerdere bronnen combineert om complexe vragen te beantwoorden.\n", + "\n", + "De eerste query demonstreert:\n", + "- **Semantisch begrip**: Het vinden van relevante concepten, zelfs als ze niet expliciet worden genoemd\n", + "- **Kruisverwijzing**: Het combineren van ontwikkelaarsprofielen met Python-principes\n", + "- **Contextueel redeneren**: Het toepassen van best practices op specifieke implementaties\n", + "\n", + "### Demonstratie 2: Gefilterd Zoeken met NodeSets\n", + "\n", + "De tweede query laat zien hoe je specifieke subsets van de kennisgrafiek kunt targeten:\n", + "- Gebruikt de `node_name` parameter om alleen binnen `principles_data` te zoeken\n", + "- Biedt gerichte antwoorden uit een specifieke kennisdomein\n", + "- Handig wanneer je domeinspecifieke informatie nodig hebt\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Deel 3: Sessiebeheer Instellen\n", + "\n", + "### Gespreksgeheugen Inschakelen\n", + "\n", + "Sessiebeheer is essentieel om context te behouden over meerdere interacties. Hier zullen we:\n", + "\n", + "1. **Gebruikerscontext Initialiseren**: Een gebruikersprofiel aanmaken of ophalen voor sessietracking\n", + "2. **Cache Engine Configureren**: Verbinden met Redis om gespreksgeschiedenis op te slaan\n", + "3. **Sessies Variabelen Inschakelen**: Contextvariabelen instellen die blijven bestaan over meerdere vragen\n", + "\n", + "> ⚠️ **Belangrijk**: Dit vereist dat Redis actief is en `CACHING=true` in je omgeving is ingesteld\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Hulpfunctie: Bekijk sessiegeschiedenis\n", + "\n", + "Deze hulpfunctie stelt ons in staat om de gespreksgeschiedenis opgeslagen in Redis te bekijken. Het is handig voor:\n", + "- Het debuggen van sessiebeheer\n", + "- Controleren of gesprekken worden opgeslagen\n", + "- Begrijpen welke context beschikbaar is voor de agent\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Sessie 1: Async Support Lab — Eerste Vraag\n", + "\n", + "Start de sessie `async-support-lab` door te vragen naar telemetrie-vriendelijke asyncio-patronen voor een grootschalige webscraper. De grafiek is al bekend met asyncio, aiohttp en monitoringpraktijken, dus het antwoord moet eerdere gesprekken weerspiegelen terwijl het wordt afgestemd op de nieuwe vraag.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Inspecteer het geheugen van Sessie 1 na de eerste uitwisseling\n", + "\n", + "Het uitvoeren van `show_history(session_1)` direct na de eerste vraag bevestigt dat Cognee zowel de prompt als de voltooiing in Redis heeft opgeslagen. Je zou één invoer moeten zien met de richtlijnen voor gelijktijdigheid.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Sessie 1: Vervolg op Datamodellen\n", + "\n", + "Vervolgens vragen we: \"Wanneer moet ik kiezen voor dataclasses in plaats van Pydantic?\" met gebruik van dezelfde sessie-id. Cognee zou de Python-principes en eerdere FastAPI-gesprekken moeten combineren om genuanceerd advies te geven—waarbij wordt aangetoond dat context binnen een benoemde sessie wordt meegenomen.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Bevestig dat de geschiedenis van sessie 1 beide beurten bevat\n", + "\n", + "Een andere `show_history(session_1)` oproep zou twee vraag-en-antwoord items moeten tonen. Dit komt overeen met de \"geheugenherhaling\" stap van het Mem0-lab en bewijst dat extra beurten hetzelfde transcript uitbreiden.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Sessie 2: Ontwerpreview-thread — Nieuwe sessie\n", + "\n", + "Om isolatie tussen threads te laten zien, starten we `design-review-session` en vragen we om logboekrichtlijnen voor incidentreviews. Hoewel de onderliggende kennisbasis hetzelfde is, zorgt de nieuwe sessie-id ervoor dat transcripties gescheiden blijven.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Beoordelingssessie 2 Geschiedenis\n", + "\n", + "`show_history(session_2)` zou alleen het ontwerpbeoordelingsprompt/antwoordpaar moeten weergeven. Vergelijk het met Sessie 1 om te benadrukken hoe Cognee onafhankelijke transcripties behoudt terwijl het de gedeelde kennisgrafiek hergebruikt.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Samenvatting\n", + "\n", + "Gefeliciteerd! Je hebt je code-assistent zojuist een echte langetermijngeheugenlaag gegeven, aangedreven door Cognee.\n", + "\n", + "In deze tutorial heb je ruwe ontwikkelaarsinhoud (code, documentatie, chats) omgezet in een grafiek + vectorgeheugen waarmee je agent kan zoeken, redeneren en continu verbeteren.\n", + "\n", + "Wat je hebt geleerd\n", + "\n", + "1. **Van ruwe tekst naar AI-geheugen**: Hoe Cognee ongestructureerde data verwerkt en omzet in intelligent, doorzoekbaar geheugen met behulp van een gecombineerde vector- en kennisgrafiekarchitectuur.\n", + "\n", + "2. **Grafiekverrijking met memify**: Hoe je verder kunt gaan dan basisgrafiekcreatie en memify kunt gebruiken om afgeleide feiten en rijkere relaties toe te voegen aan je bestaande grafiek.\n", + "\n", + "3. **Meerdere zoekstrategieën**: Hoe je geheugen kunt doorzoeken met verschillende zoektypen (grafiekbewuste Q&A, RAG-stijl aanvulling, inzichten, ruwe fragmenten, codezoekopdrachten, enz.) afhankelijk van wat je agent nodig heeft.\n", + "\n", + "4. **Visuele verkenning**: Hoe je kunt inspecteren en debuggen wat Cognee heeft gebouwd met behulp van grafiekvisualisaties en de Cognee UI, zodat je daadwerkelijk kunt zien hoe kennis is gestructureerd.\n", + "\n", + "5. **Sessie-bewust geheugen**: Hoe je sessiecontext kunt combineren met persistent semantisch geheugen, zodat agents zich sessie-overstijgend kunnen herinneren zonder informatie tussen gebruikers te lekken.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Belangrijkste punten\n", + "1. Geheugen als een Kennisgrafiek ondersteund door Embeddings\n", + "\n", + " - **Gestructureerd begrip**: Cognee combineert een vectoropslag en een grafiekopslag, zodat je gegevens zowel door betekenis doorzoekbaar zijn als verbonden door relaties. Standaard gebruikt Cognee bestand-gebaseerde databases (LanceDB voor vector-, Kuzu voor grafiekdatabase).\n", + "\n", + " - **Relatiebewuste opvraging**: Antwoorden kunnen niet alleen gebaseerd zijn op \"vergelijkbare tekst\", maar ook op hoe entiteiten met elkaar in verband staan.\n", + "\n", + " - **Levend geheugen**: De geheugenslaag evolueert, groeit en blijft doorzoekbaar als één verbonden grafiek.\n", + "\n", + "2. Zoek- en redeneermodi\n", + " - **Hybride opvraging**: zoeken combineert vectorovereenkomst, grafiekstructuur en LLM-redenering, van ruwe chunk-opzoeking tot grafiekbewuste vraagbeantwoording.\n", + "\n", + " - **Pas de modus aan de taak aan**: Gebruik completion-stijl modi wanneer je natuurlijke taalantwoorden wilt, en chunk-/samenvatting-/grafiekmodi wanneer je agent ruwe context nodig heeft of zijn eigen redenering moet sturen.\n", + "\n", + "3. Gepersonaliseerde, sessiebewuste agents\n", + " - **Sessiecontext + langetermijngeheugen**: Cognee houdt kortetermijn \"thread\"-context gescheiden van langdurig, gebruikers- of organisatieniveau geheugen.\n", + "\n", + "## Toepassingen in de praktijk\n", + "\n", + "1. **Verticale AI-agents**\n", + "\n", + " Gebruik het patroon uit dit notebook om domeinslimme copilots te ondersteunen die bovenop Cognee draaien als hun kern voor opvraging en redenering:\n", + "\n", + "- **Ontwikkelaars-copilots**: Code review, incidentanalyse en architectuurassistenten die code, API's, ontwerpdocumenten en tickets doorzoeken als één geheugenkaart.\n", + "\n", + "- **Klantenservice-copilots**: Support- of succesagents die productdocumentatie, FAQ's, CRM-notities en eerdere tickets gebruiken met grafiekbewuste opvraging en onderbouwde antwoorden.\n", + "\n", + "- **Interne expert-copilots**: Beleids-, juridische of beveiligingsassistenten die redeneren over onderling verbonden regels, richtlijnen en historische beslissingen in plaats van geïsoleerde PDF's.\n", + "\n", + " Cognee is expliciet gepositioneerd als een persistent, accuraat geheugen voor AI-agents, en biedt een levend kennisgrafiek die achter je agent past en ad-hoc combinaties van vectoropslag en aangepaste grafiekcode vervangt.\n", + "\n", + "2. **Data-silo's verenigen tot één geheugen**\n", + "\n", + " Dezelfde aanpak helpt je ook om een verenigde geheugenslaag te bouwen over verspreide bronnen:\n", + "\n", + "- **Van silo's naar één grafiek**: Importeer gestructureerde (bijv. databases) en ongestructureerde gegevens (bijv. documenten, chats) in één grafiek ondersteund door embeddings, in plaats van aparte indices voor elk systeem.\n", + "\n", + "- **Redeneren over bronnen met citaten**: Voer meerstapsredeneringen uit over alles—\"combineer\" logs, statistieken en documenten via de grafiek—en geef nog steeds onderbouwde antwoorden met herkomst.\n", + "\n", + "- **Kenniscentra**: Voor domeinen zoals bankieren of onderwijs wordt Cognee al gebruikt om PDF's, interne systemen en app-gegevens te verenigen in één kennisgrafiek met vectors, zodat agents vragen kunnen beantwoorden met precieze, onderbouwde context.\n", + "\n", + "## Volgende stappen\n", + "\n", + "Je hebt de kerngeheugenlus geïmplementeerd. Hier zijn natuurlijke uitbreidingen die je zelf kunt proberen (zie [Cognee documentatie](https://docs.cognee.ai/) voor details):\n", + "\n", + "1. **Experimenteer met tijdsbewustzijn**: Schakel tijds-cognify in om gebeurtenissen en tijdstempels uit tekst te extraheren.\n", + "\n", + "2. **Introduceer op ontologie gebaseerde redenering**: Definieer een OWL-ontologie voor je domein. Gebruik Cognee's ontologie-ondersteuning zodat geëxtraheerde entiteiten en relaties in dat schema zijn verankerd, wat de grafiekkwaliteit en domeinspecifieke antwoorden verbetert.\n", + "\n", + "3. **Voeg een feedbacklus toe**: Laat Cognee grafiekrandgewichten aanpassen op basis van echte gebruikersfeedback, zodat opvraging in de loop van de tijd verbetert in plaats van statisch te blijven.\n", + "\n", + "4. **Afstemmen op personalisatie & sessiegedrag**: Gebruik gebruikers-ID's, tenants en datasets om elke persoon of team hun eigen weergave over de gedeelde geheugenslaag te geven.\n", + "\n", + "5. **Schaal uit naar complexere agents**: Sluit Cognee aan op agent-frameworks om multi-agent systemen te bouwen die allemaal dezelfde geheugenslaag delen. *Microsoft Agent Framework x Cognee plugin komt binnenkort.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Disclaimer**: \nDit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:08:27+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "nl" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/nl/13-agent-memory/README.md b/translations/nl/13-agent-memory/README.md index 754fc674d..8b3afa182 100644 --- a/translations/nl/13-agent-memory/README.md +++ b/translations/nl/13-agent-memory/README.md @@ -1,18 +1,18 @@ -# Geheugen voor AI-agenten +# Geheugen voor AI-agenten [![Agent Memory](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.nl.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Bij het bespreken van de unieke voordelen van het creëren van AI-agenten worden vooral twee dingen besproken: de mogelijkheid om tools te gebruiken om taken uit te voeren en de mogelijkheid om in de loop van de tijd te verbeteren. Geheugen vormt de basis voor het creëren van zelfverbeterende agenten die betere ervaringen kunnen bieden aan onze gebruikers. +Bij het bespreken van de unieke voordelen van het creëren van AI-agenten worden vooral twee dingen besproken: de mogelijkheid om tools te gebruiken om taken uit te voeren en de mogelijkheid om in de loop van de tijd te verbeteren. Geheugen vormt de basis voor het creëren van zelfverbeterende agenten die betere ervaringen voor onze gebruikers kunnen bieden. -In deze les bekijken we wat geheugen betekent voor AI-agenten en hoe we het kunnen beheren en gebruiken voor het voordeel van onze applicaties. +In deze les bekijken we wat geheugen is voor AI-agenten en hoe we het kunnen beheren en gebruiken voor het voordeel van onze applicaties. ## Introductie @@ -24,21 +24,29 @@ Deze les behandelt: • **AI-agenten zelfverbeterend maken**: Hoe geheugen agenten in staat stelt te leren van eerdere interacties en in de loop van de tijd te verbeteren. +## Beschikbare implementaties + +Deze les bevat twee uitgebreide notebook-tutorials: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Implementeert geheugen met Mem0 en Azure AI Search binnen het Semantic Kernel-framework. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Implementeert gestructureerd geheugen met Cognee, waarbij automatisch een kennisgrafiek wordt opgebouwd ondersteund door embeddings, grafieken worden gevisualiseerd en intelligent wordt opgehaald. + ## Leerdoelen Na het voltooien van deze les weet je hoe je: • **Verschillende soorten AI-agentgeheugen kunt onderscheiden**, waaronder werkgeheugen, kortetermijn- en langetermijngeheugen, evenals gespecialiseerde vormen zoals persona- en episodisch geheugen. -• **Kortetermijn- en langetermijngeheugen kunt implementeren en beheren voor AI-agenten** met behulp van het Semantic Kernel-framework, tools zoals Mem0 en Whiteboard-geheugen, en integratie met Azure AI Search. +• **Kortetermijn- en langetermijngeheugen voor AI-agenten kunt implementeren en beheren** met behulp van het Semantic Kernel-framework, waarbij tools zoals Mem0, Cognee, Whiteboard-geheugen en integratie met Azure AI Search worden benut. -• **De principes achter zelfverbeterende AI-agenten kunt begrijpen** en hoe robuuste geheugenbeheersystemen bijdragen aan continu leren en aanpassen. +• **De principes achter zelfverbeterende AI-agenten begrijpt** en hoe robuuste geheugenbeheersystemen bijdragen aan continu leren en aanpassen. ## Begrijpen van AI-agentgeheugen -In essentie verwijst **geheugen voor AI-agenten naar de mechanismen die hen in staat stellen informatie te behouden en op te roepen**. Deze informatie kan specifieke details over een gesprek, gebruikersvoorkeuren, eerdere acties of zelfs geleerde patronen omvatten. +In essentie verwijst **geheugen voor AI-agenten naar de mechanismen waarmee ze informatie kunnen onthouden en oproepen**. Deze informatie kan specifieke details over een gesprek, gebruikersvoorkeuren, eerdere acties of zelfs geleerde patronen omvatten. -Zonder geheugen zijn AI-applicaties vaak stateless, wat betekent dat elke interactie opnieuw begint. Dit leidt tot een repetitieve en frustrerende gebruikerservaring waarbij de agent eerdere context of voorkeuren "vergeet". +Zonder geheugen zijn AI-toepassingen vaak stateless, wat betekent dat elke interactie opnieuw begint. Dit leidt tot een repetitieve en frustrerende gebruikerservaring waarbij de agent eerdere context of voorkeuren "vergeet". ### Waarom is geheugen belangrijk? @@ -58,61 +66,60 @@ Het doel van het implementeren van geheugen is om agenten meer **betrouwbaar en #### Werkgeheugen -Zie dit als een stuk kladpapier dat een agent gebruikt tijdens een enkele, lopende taak of denkproces. Het bevat directe informatie die nodig is om de volgende stap te berekenen. +Zie dit als een stukje kladpapier dat een agent gebruikt tijdens een enkele, lopende taak of denkproces. Het bevat directe informatie die nodig is om de volgende stap te berekenen. Voor AI-agenten vangt werkgeheugen vaak de meest relevante informatie uit een gesprek op, zelfs als de volledige chatgeschiedenis lang of ingekort is. Het richt zich op het extraheren van belangrijke elementen zoals vereisten, voorstellen, beslissingen en acties. -**Voorbeeld van werkgeheugen** +**Voorbeeld werkgeheugen** Bij een reisboekingsagent kan werkgeheugen de huidige aanvraag van de gebruiker vastleggen, zoals "Ik wil een reis naar Parijs boeken". Deze specifieke vereiste wordt in de directe context van de agent gehouden om de huidige interactie te sturen. #### Kortetermijngeheugen -Dit type geheugen behoudt informatie gedurende de duur van een enkel gesprek of sessie. Het is de context van het huidige gesprek, waardoor de agent kan verwijzen naar eerdere wendingen in de dialoog. +Dit type geheugen bewaart informatie gedurende een enkel gesprek of sessie. Het is de context van het huidige gesprek, waardoor de agent kan verwijzen naar eerdere beurten in de dialoog. -**Voorbeeld van kortetermijngeheugen** +**Voorbeeld kortetermijngeheugen** -Als een gebruiker vraagt: "Hoeveel kost een vlucht naar Parijs?" en vervolgens vervolgt met "Hoe zit het met accommodatie daar?", zorgt kortetermijngeheugen ervoor dat de agent weet dat "daar" verwijst naar "Parijs" binnen hetzelfde gesprek. +Als een gebruiker vraagt: "Hoeveel kost een vlucht naar Parijs?" en vervolgens vraagt: "Wat zijn de mogelijkheden voor accommodatie daar?", zorgt kortetermijngeheugen ervoor dat de agent weet dat "daar" verwijst naar "Parijs" binnen hetzelfde gesprek. #### Langetermijngeheugen -Dit is informatie die blijft bestaan over meerdere gesprekken of sessies. Het stelt agenten in staat gebruikersvoorkeuren, historische interacties of algemene kennis over langere perioden te onthouden. Dit is belangrijk voor personalisatie. +Dit is informatie die blijft bestaan over meerdere gesprekken of sessies. Het stelt agenten in staat om gebruikersvoorkeuren, historische interacties of algemene kennis over langere perioden te onthouden. Dit is belangrijk voor personalisatie. -**Voorbeeld van langetermijngeheugen** +**Voorbeeld langetermijngeheugen** -Langetermijngeheugen kan opslaan dat "Ben houdt van skiën en buitenactiviteiten, drinkt graag koffie met uitzicht op de bergen en wil geavanceerde skipistes vermijden vanwege een eerdere blessure". Deze informatie, geleerd uit eerdere interacties, beïnvloedt aanbevelingen in toekomstige reisplanningssessies, waardoor ze sterk gepersonaliseerd worden. +Een langetermijngeheugen kan opslaan dat "Ben houdt van skiën en buitenactiviteiten, drinkt graag koffie met uitzicht op de bergen en wil geavanceerde skipistes vermijden vanwege een eerdere blessure". Deze informatie, geleerd uit eerdere interacties, beïnvloedt aanbevelingen in toekomstige reisplanningssessies, waardoor ze sterk gepersonaliseerd worden. #### Persona-geheugen -Dit gespecialiseerde type geheugen helpt een agent een consistente "persoonlijkheid" of "persona" te ontwikkelen. Het stelt de agent in staat details over zichzelf of zijn beoogde rol te onthouden, waardoor interacties vloeiender en gerichter worden. - -**Voorbeeld van persona-geheugen** +Dit gespecialiseerde type geheugen helpt een agent een consistente "persoonlijkheid" of "persona" te ontwikkelen. Het stelt de agent in staat om details over zichzelf of zijn beoogde rol te onthouden, waardoor interacties vloeiender en gerichter worden. -Als de reisagent is ontworpen als een "expert in ski-planning", kan persona-geheugen deze rol versterken, waardoor de antwoorden van de agent worden afgestemd op de toon en kennis van een expert. +**Voorbeeld persona-geheugen** +Als de reisagent is ontworpen als een "expert ski-planner", kan persona-geheugen deze rol versterken, waardoor de antwoorden van de agent aansluiten bij de toon en kennis van een expert. #### Workflow/Episodisch geheugen Dit geheugen slaat de reeks stappen op die een agent neemt tijdens een complexe taak, inclusief successen en mislukkingen. Het is alsof specifieke "episodes" of eerdere ervaringen worden onthouden om ervan te leren. -**Voorbeeld van episodisch geheugen** +**Voorbeeld episodisch geheugen** -Als de agent probeerde een specifieke vlucht te boeken, maar dit mislukte vanwege onbeschikbaarheid, kan episodisch geheugen deze mislukking registreren, zodat de agent alternatieve vluchten kan proberen of de gebruiker op een meer geïnformeerde manier kan informeren tijdens een volgende poging. +Als de agent probeerde een specifieke vlucht te boeken, maar dit mislukte vanwege onbeschikbaarheid, kan episodisch geheugen deze mislukking registreren, waardoor de agent alternatieve vluchten kan proberen of de gebruiker op een meer geïnformeerde manier kan informeren tijdens een volgende poging. #### Entiteit-geheugen -Dit omvat het extraheren en onthouden van specifieke entiteiten (zoals mensen, plaatsen of dingen) en gebeurtenissen uit gesprekken. Het stelt de agent in staat een gestructureerd begrip op te bouwen van belangrijke elementen die worden besproken. +Dit omvat het extraheren en onthouden van specifieke entiteiten (zoals mensen, plaatsen of dingen) en gebeurtenissen uit gesprekken. Het stelt de agent in staat om een gestructureerd begrip van belangrijke elementen te ontwikkelen. -**Voorbeeld van entiteit-geheugen** +**Voorbeeld entiteit-geheugen** -Uit een gesprek over een eerdere reis kan de agent "Parijs", "Eiffeltoren" en "diner bij Le Chat Noir restaurant" als entiteiten extraheren. In een toekomstige interactie kan de agent "Le Chat Noir" onthouden en aanbieden om daar een nieuwe reservering te maken. +Uit een gesprek over een eerdere reis kan de agent "Parijs," "Eiffeltoren," en "diner bij Le Chat Noir restaurant" als entiteiten extraheren. In een toekomstige interactie kan de agent "Le Chat Noir" herinneren en aanbieden om daar een nieuwe reservering te maken. #### Gestructureerde RAG (Retrieval Augmented Generation) -Hoewel RAG een bredere techniek is, wordt "Gestructureerde RAG" benadrukt als een krachtige geheugentechnologie. Het haalt dense, gestructureerde informatie uit verschillende bronnen (gesprekken, e-mails, afbeeldingen) en gebruikt deze om precisie, recall en snelheid in antwoorden te verbeteren. In tegenstelling tot klassieke RAG, die uitsluitend vertrouwt op semantische overeenkomsten, werkt Gestructureerde RAG met de inherente structuur van informatie. +Hoewel RAG een bredere techniek is, wordt "Gestructureerde RAG" benadrukt als een krachtige geheugentechnologie. Het haalt dense, gestructureerde informatie uit verschillende bronnen (gesprekken, e-mails, afbeeldingen) en gebruikt dit om precisie, recall en snelheid in antwoorden te verbeteren. In tegenstelling tot klassieke RAG, die uitsluitend vertrouwt op semantische overeenkomsten, werkt Gestructureerde RAG met de inherente structuur van informatie. -**Voorbeeld van gestructureerde RAG** +**Voorbeeld gestructureerde RAG** -In plaats van alleen trefwoorden te matchen, kan Gestructureerde RAG vluchtgegevens (bestemming, datum, tijd, luchtvaartmaatschappij) uit een e-mail halen en deze op een gestructureerde manier opslaan. Dit maakt nauwkeurige vragen mogelijk, zoals "Welke vlucht heb ik geboekt naar Parijs op dinsdag?" +In plaats van alleen trefwoorden te matchen, kan Gestructureerde RAG vluchtgegevens (bestemming, datum, tijd, luchtvaartmaatschappij) uit een e-mail halen en deze op een gestructureerde manier opslaan. Dit maakt precieze vragen mogelijk zoals "Welke vlucht heb ik geboekt naar Parijs op dinsdag?" ## Implementeren en opslaan van geheugen @@ -120,15 +127,25 @@ Het implementeren van geheugen voor AI-agenten omvat een systematisch proces van ### Gespecialiseerde geheugentools -Een manier om agentgeheugen op te slaan en te beheren is door gebruik te maken van gespecialiseerde tools zoals Mem0. Mem0 werkt als een persistente geheugenslaag, waardoor agenten relevante interacties kunnen onthouden, gebruikersvoorkeuren en feitelijke context kunnen opslaan, en kunnen leren van successen en mislukkingen in de loop van de tijd. Het idee hier is dat stateless agenten veranderen in stateful agenten. +#### Mem0 + +Een manier om agentgeheugen op te slaan en te beheren is door gebruik te maken van gespecialiseerde tools zoals Mem0. Mem0 werkt als een persistent geheugenniveau, waardoor agenten relevante interacties kunnen onthouden, gebruikersvoorkeuren en feitelijke context kunnen opslaan en kunnen leren van successen en mislukkingen in de loop van de tijd. Het idee hier is dat stateless agenten stateful worden. + +Het werkt via een **twee-fasen geheugenpijplijn: extractie en update**. Eerst worden berichten die aan de thread van een agent worden toegevoegd naar de Mem0-service gestuurd, die een Large Language Model (LLM) gebruikt om gespreksgeschiedenis samen te vatten en nieuwe herinneringen te extraheren. Vervolgens bepaalt een LLM-gestuurde updatefase of deze herinneringen moeten worden toegevoegd, gewijzigd of verwijderd, en slaat ze op in een hybride datastore die vector-, grafiek- en key-value-databases kan omvatten. Dit systeem ondersteunt ook verschillende geheugentypes en kan grafiekgeheugen opnemen voor het beheren van relaties tussen entiteiten. + +#### Cognee + +Een andere krachtige benadering is het gebruik van **Cognee**, een open-source semantisch geheugen voor AI-agenten dat gestructureerde en ongestructureerde gegevens transformeert in querybare kennisgrafieken ondersteund door embeddings. Cognee biedt een **dual-store architectuur** die vector-similariteitszoekopdrachten combineert met grafiekrelaties, waardoor agenten niet alleen begrijpen welke informatie vergelijkbaar is, maar ook hoe concepten met elkaar verbonden zijn. + +Het blinkt uit in **hybride retrieval** die vector-similariteit, grafiekstructuur en LLM-redenering combineert - van ruwe chunk-opzoeking tot grafiekbewuste vraagbeantwoording. Het systeem onderhoudt **levend geheugen** dat evolueert en groeit terwijl het querybaar blijft als één verbonden grafiek, en ondersteunt zowel kortetermijnsessiecontext als langetermijnpersistent geheugen. -Het werkt via een **twee-fasen geheugenpijplijn: extractie en update**. Eerst worden berichten die aan de thread van een agent worden toegevoegd naar de Mem0-service gestuurd, die een Large Language Model (LLM) gebruikt om gespreksgeschiedenis samen te vatten en nieuwe herinneringen te extraheren. Vervolgens bepaalt een LLM-gestuurde updatefase of deze herinneringen moeten worden toegevoegd, gewijzigd of verwijderd, en worden ze opgeslagen in een hybride datastore die vector-, graf- en key-value-databases kan omvatten. Dit systeem ondersteunt ook verschillende geheugentypen en kan grafgeheugen opnemen voor het beheren van relaties tussen entiteiten. +De Cognee notebook-tutorial ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) demonstreert het bouwen van deze uniforme geheugenslaag, met praktische voorbeelden van het opnemen van diverse gegevensbronnen, het visualiseren van de kennisgrafiek en het uitvoeren van zoekopdrachten met verschillende strategieën afgestemd op specifieke behoeften van agenten. ### Geheugen opslaan met RAG Naast gespecialiseerde geheugentools zoals Mem0 kun je robuuste zoekservices zoals **Azure AI Search gebruiken als backend voor het opslaan en ophalen van herinneringen**, vooral voor gestructureerde RAG. -Dit stelt je in staat om de antwoorden van je agent te baseren op je eigen gegevens, wat zorgt voor relevantere en nauwkeurigere antwoorden. Azure AI Search kan worden gebruikt om gebruikersspecifieke reisherinneringen, productcatalogi of andere domeinspecifieke kennis op te slaan. +Dit stelt je in staat om de antwoorden van je agent te baseren op je eigen gegevens, waardoor relevantere en nauwkeurigere antwoorden worden gegarandeerd. Azure AI Search kan worden gebruikt om gebruikersspecifieke reisherinneringen, productcatalogi of andere domeinspecifieke kennis op te slaan. Azure AI Search ondersteunt mogelijkheden zoals **Gestructureerde RAG**, die uitblinkt in het extraheren en ophalen van dense, gestructureerde informatie uit grote datasets zoals gespreksgeschiedenissen, e-mails of zelfs afbeeldingen. Dit biedt "supermenselijke precisie en recall" vergeleken met traditionele tekstchunking- en embeddingbenaderingen. @@ -138,23 +155,25 @@ Een veelvoorkomend patroon voor zelfverbeterende agenten is het introduceren van 1. **Waardevolle informatie te identificeren**: Bepalen of een deel van het gesprek de moeite waard is om op te slaan als algemene kennis of een specifieke gebruikersvoorkeur. -2. **Extractie en samenvatting**: De essentiële les of voorkeur uit het gesprek destilleren. +2. **Extraheren en samenvatten**: De essentiële leerpunten of voorkeuren uit het gesprek destilleren. 3. **Opslaan in een kennisbank**: Deze geëxtraheerde informatie bewaren, vaak in een vectordatabase, zodat deze later kan worden opgehaald. -4. **Toekomstige vragen aanvullen**: Wanneer de gebruiker een nieuwe vraag stelt, haalt de kennisagent relevante opgeslagen informatie op en voegt deze toe aan de prompt van de gebruiker, waardoor cruciale context wordt geboden aan de primaire agent (vergelijkbaar met RAG). +4. **Toekomstige vragen aanvullen**: Wanneer de gebruiker een nieuwe vraag stelt, haalt de kennisagent relevante opgeslagen informatie op en voegt deze toe aan de prompt van de gebruiker, waardoor cruciale context aan de primaire agent wordt geboden (vergelijkbaar met RAG). ### Optimalisaties voor geheugen -• **Latentiebeheer**: Om vertragingen in gebruikersinteracties te voorkomen, kan aanvankelijk een goedkoper, sneller model worden gebruikt om snel te controleren of informatie waardevol is om op te slaan of op te halen, waarbij alleen het complexere extractie-/ophaalproces wordt ingeschakeld wanneer nodig. +• **Latentiebeheer**: Om vertragingen in gebruikersinteracties te voorkomen, kan aanvankelijk een goedkoper, sneller model worden gebruikt om snel te controleren of informatie waardevol is om op te slaan of op te halen, waarbij het complexere extractie-/ophaalproces alleen wordt ingeschakeld wanneer nodig. • **Onderhoud van de kennisbank**: Voor een groeiende kennisbank kan minder vaak gebruikte informatie naar "koude opslag" worden verplaatst om kosten te beheren. ## Meer vragen over agentgeheugen? -Word lid van de [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) om andere leerlingen te ontmoeten, kantooruren bij te wonen en je vragen over AI-agenten beantwoord te krijgen. +Word lid van de [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) om andere leerlingen te ontmoeten, spreekuren bij te wonen en je vragen over AI-agenten beantwoord te krijgen. --- + **Disclaimer**: -Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling. \ No newline at end of file +Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling. + \ No newline at end of file diff --git a/translations/no/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/no/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..f6f4030b7 --- /dev/null +++ b/translations/no/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Bygge AI-agenter med vedvarende minne ved hjelp av Cognee\n", + "\n", + "Denne notatboken viser hvordan man kan bygge intelligente AI-agenter med avanserte minnefunksjoner ved hjelp av [**cognee**](https://www.cognee.ai/) - en åpen kildekode AI-minne som kombinerer kunnskapsgrafer, semantisk søk og sesjonsstyring for å skape kontekstbevisste AI-systemer.\n", + "\n", + "## 🎯 Læringsmål\n", + "\n", + "Ved slutten av denne veiledningen vil du forstå hvordan du:\n", + "- **Bygger kunnskapsgrafer støttet av embeddings**: Gjør ustrukturert tekst om til strukturert, søkbar kunnskap\n", + "- **Implementerer sesjonsminne**: Opprett flervendte samtaler med automatisk kontekstbevaring\n", + "- **Lagrer samtaler**: Valgfritt lagre viktige interaksjoner i langtidsminne for fremtidig bruk\n", + "- **Utfører spørringer med naturlig språk**: Få tilgang til og utnytt historisk kontekst i nye samtaler\n", + "- **Visualiserer minne**: Utforsk relasjonene i agentens kunnskapsgraf\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Hva du skal bygge\n", + "\n", + "I denne veiledningen skal vi lage en **Kodeassistent** med vedvarende minne som:\n", + "\n", + "### 1. **Konstruksjon av kunnskapsbase**\n", + " - Tar inn informasjon om utviklerprofil og ekspertise\n", + " - Behandler prinsipper og beste praksis for Python-programmering\n", + " - Lagrer historiske samtaler mellom utviklere og AI-assistenter\n", + "\n", + "### 2. **Samtaler med sesjonskontekst**\n", + " - Opprettholder kontekst på tvers av flere spørsmål i samme sesjon\n", + " - Automatisk lagrer hvert spørsmål/svar-par for effektiv gjenfinning\n", + " - Gir sammenhengende, kontekstuelle svar basert på samtalehistorikk\n", + "\n", + "### 3. **Langtidsminne**\n", + " - Lagrer viktige samtaler i et langtidsminne\n", + " - Henter relevante minner fra kunnskapsbasen og tidligere sesjoner for å informere nye interaksjoner\n", + " - Bygger en voksende kunnskapsbase som forbedres over tid\n", + "\n", + "### 4. **Intelligent minnehenting**\n", + " - Bruker grafbevisst semantisk søk for å finne relevant informasjon på tvers av all lagret kunnskap\n", + " - Filtrerer søk etter datasubgrupper (utviklerinfo vs. prinsipper)\n", + " - Kombinerer flere datakilder for å gi omfattende svar\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Forutsetninger og oppsett\n", + "\n", + "### Systemkrav\n", + "\n", + "Før du starter, sørg for at du har:\n", + "\n", + "1. **Python-miljø**\n", + " - Python 3.9 eller nyere\n", + " - Virtuelt miljø (anbefales)\n", + " \n", + "2. **Redis Cache** (Påkrevd for sesjonshåndtering)\n", + " - Lokal Redis: `docker run -d -p 6379:6379 redis`\n", + " - Eller bruk en administrert Redis-tjeneste\n", + " \n", + "3. **LLM API-tilgang**\n", + " - OpenAI API-nøkkel eller andre leverandører (se [dokumentasjon](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Databasekonfigurasjon**\n", + " - Ingen konfigurasjon nødvendig som standard. Cognee bruker filbaserte databaser (LanceDB og Kuzu)\n", + " - Valgfritt kan du sette opp Azure AI Search som en vektorlagring (se [dokumentasjon](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Miljøkonfigurasjon\n", + "\n", + "Opprett en `.env`-fil i prosjektmappen din med følgende variabler:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Forstå Cognees minnearkitektur\n", + "\n", + "### Hvordan Cognee fungerer\n", + "\n", + "Cognee tilbyr et avansert minnssystem som går utover enkel nøkkel-verdi-lagring:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Hovedkomponenter:\n", + "\n", + "1. **Kunnskapsgraf**: Lagrer enheter, relasjoner og semantiske forbindelser\n", + "2. **Vektorinbedding**: Muliggjør semantisk søk på tvers av all lagret informasjon\n", + "3. **Sesjonsbuffer**: Opprettholder samtalekontekst innenfor og på tvers av sesjoner\n", + "4. **NodeSets**: Organiserer data i logiske kategorier for målrettet gjenfinning\n", + "\n", + "### Minne-typer i denne veiledningen:\n", + "\n", + "- **Vedvarende minne**: Langtidslagring i kunnskapsgrafen\n", + "- **Sesjonsminne**: Midlertidig samtalekontekst i Redis-buffer\n", + "- **Semantisk minne**: Vektorbasert likhetssøk på tvers av all data\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Installer nødvendige pakker\n", + "\n", + "Installer Cognee med Redis-støtte for øktadministrasjon:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Initialiser miljøet og last inn biblioteker\n", + "\n", + "Sørg for at:\n", + "1. Redis kjører (f.eks. via Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Miljøvariabler er satt før du importerer cache-moduler\n", + "3. Om nødvendig, start kjernen på nytt og kjør cellene i rekkefølge\n", + "\n", + "Den følgende cellen vil:\n", + "1. Laste inn miljøvariabler fra `.env`\n", + "2. Konfigurere Cognee med dine LLM-innstillinger\n", + "3. Aktivere caching for øktstyring\n", + "4. Validere at alle komponenter er riktig tilkoblet\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Konfigurer lagringskataloger\n", + "\n", + "Cognee bruker to separate kataloger for sine operasjoner:\n", + "- **Data Root**: Lagrer importerte dokumenter og bearbeidede data\n", + "- **System Root**: Inneholder kunnskapsgrafdatabasen og systemmetadata\n", + "\n", + "Vi skal opprette isolerte kataloger for denne veiledningen som følger:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Tilbakestill minnetilstand\n", + "\n", + "Før vi begynner å bygge vårt minnesystem, la oss sørge for at vi starter med blanke ark.\n", + "\n", + "> 💡 **Tips**: Du kan hoppe over dette trinnet hvis du ønsker å bevare eksisterende minner fra tidligere kjøringer når du bruker denne notatboken senere.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Del 1: Bygge kunnskapsbasen\n", + "\n", + "### Datakilder for vår utviklerassistent\n", + "\n", + "Vi vil bruke tre typer data for å lage en omfattende kunnskapsbase:\n", + "\n", + "1. **Utviklerprofil**: Personlig ekspertise og teknisk bakgrunn\n", + "2. **Beste praksis for Python**: The Zen of Python med praktiske retningslinjer\n", + "3. **Historiske samtaler**: Tidligere spørsmål og svar mellom utviklere og AI-assistenter\n", + "\n", + "Denne varierte dataen gjør det mulig for agenten vår å:\n", + "- Forstå brukerens tekniske kontekst\n", + "- Anvende beste praksis i anbefalinger\n", + "- Lære av tidligere vellykkede interaksjoner\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Prosesser data til kunnskapsgraf\n", + "\n", + "Nå skal vi transformere råteksten vår til en strukturert hukommelse. Denne prosessen:\n", + "\n", + "1. **Legger data til NodeSets**: Organiserer informasjon i logiske kategorier\n", + " - `developer_data`: Utviklerprofil og samtaler\n", + " - `principles_data`: Beste praksis og retningslinjer for Python\n", + "\n", + "2. **Kjører Cognify Pipeline**: Ekstraherer enheter, relasjoner og lager embeddings\n", + " - Identifiserer nøkkelkonsepter\n", + " - Skaper semantiske forbindelser mellom relatert informasjon\n", + " - Genererer vektorembeddings\n", + "\n", + "Dette kan ta noen øyeblikk mens LLM prosesserer teksten og bygger grafstrukturen:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Visualiser kunnskapsgrafen\n", + "\n", + "La oss utforske strukturen til kunnskapsgrafen vår. Visualiseringen viser:\n", + "- **Noder**: Enheter hentet fra teksten (konsepter, teknologier, personer)\n", + "- **Kanter**: Forhold og forbindelser mellom enheter\n", + "- **Klynger**: Relaterte konsepter gruppert etter semantisk likhet\n", + "\n", + "Åpne den genererte HTML-filen i nettleseren din for å utforske grafen interaktivt:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Berik hukommelsen med Memify\n", + "\n", + "Funksjonen `memify()` analyserer kunnskapsgrafen og genererer intelligente regler om dataene. Denne prosessen:\n", + "- Identifiserer mønstre og beste praksis\n", + "- Lager handlingsrettede retningslinjer basert på innholdet\n", + "- Etablerer sammenhenger mellom ulike kunnskapsområder\n", + "\n", + "Disse reglene hjelper agenten med å ta mer informerte beslutninger når den svarer på spørsmål. Å fange en andre visualisering hjelper deg med å sammenligne hvordan grafen blir tettere når den er beriket.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Del 2: Intelligent minnehenting\n", + "\n", + "### Demonstrasjon 1: Tverrdokument kunnskapsintegrasjon\n", + "\n", + "Nå som vår kunnskapsgraf er bygget, la oss teste hvordan Cognee kombinerer informasjon fra flere kilder for å svare på komplekse spørsmål.\n", + "\n", + "Den første forespørselen demonstrerer:\n", + "- **Semantisk forståelse**: Finne relevante konsepter selv når de ikke er eksplisitt nevnt\n", + "- **Tverrhenvisning**: Kombinere utviklerprofil med Python-prinsipper\n", + "- **Kontekstuell resonnement**: Anvende beste praksis på spesifikke implementeringer\n", + "\n", + "### Demonstrasjon 2: Filtrert søk med NodeSets\n", + "\n", + "Den andre forespørselen viser hvordan man kan målrette spesifikke delsett av kunnskapsgrafen:\n", + "- Bruker `node_name`-parameteren for å søke kun innenfor `principles_data`\n", + "- Gir fokuserte svar fra et spesifikt kunnskapsområde\n", + "- Nyttig når du trenger informasjon som er spesifikk for et domene\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Del 3: Oppsett av øktadministrasjon\n", + "\n", + "### Aktivere samtaleminne\n", + "\n", + "Øktadministrasjon er avgjørende for å opprettholde kontekst gjennom flere interaksjoner. Her skal vi:\n", + "\n", + "1. **Initialisere brukerkontekst**: Opprette eller hente en brukerprofil for sporing av økter\n", + "2. **Konfigurere cache-motor**: Koble til Redis for lagring av samtalehistorikk\n", + "3. **Aktivere øktvariabler**: Sette opp kontekstvariabler som vedvarer gjennom forespørsler\n", + "\n", + "> ⚠️ **Viktig**: Dette krever at Redis kjører og `CACHING=true` i ditt miljø\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Hjelpefunksjon: Vis Økt Historikk\n", + "\n", + "Denne hjelpefunksjonen lar oss inspisere samtalehistorikken som er lagret i Redis. Den er nyttig for:\n", + "- Feilsøking av økthåndtering\n", + "- Verifisere at samtaler blir bufret\n", + "- Forstå hvilken kontekst som er tilgjengelig for agenten\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Sesjon 1: Async Support Lab — Første Spørsmål\n", + "\n", + "Start `async-support-lab`-sesjonen ved å spørre om telemetrivennlige asyncio-mønstre for en massiv webskraper. Grafen kjenner allerede til asyncio, aiohttp og overvåkingspraksis, så svaret bør gjenspeile tidligere samtaler samtidig som det tilpasses det nye spørsmålet.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Inspiser minnet for sesjon 1 etter den første utvekslingen\n", + "\n", + "Å kjøre `show_history(session_1)` umiddelbart etter det innledende spørsmålet bekrefter at Cognee skrev både prompten og fullføringen inn i Redis. Du bør se én oppføring med veiledning for samtidighet.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Økt 1: Oppfølging på datamodeller\n", + "\n", + "Deretter spør vi: \"Når bør jeg velge dataclasses fremfor Pydantic?\" ved å bruke samme økt-ID. Cognee bør sette sammen Python-prinsippene og tidligere FastAPI-samtaler for å gi nyansert råd—og vise at konteksten videreføres innenfor en navngitt økt.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Bekreft at historikken for økt 1 inneholder begge turene\n", + "\n", + "En ny `show_history(session_1)`-kall bør vise to spørsmål-og-svar-oppføringer. Dette samsvarer med Mem0-laboratoriets \"minnegjennomspilling\"-steg og beviser at flere turer utvider samme transkripsjon.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Økt 2: Designgjennomgangstråd — Ny økt\n", + "\n", + "For å vise isolasjon mellom tråder starter vi `design-review-session` og ber om veiledning for logging av hendelsesgjennomganger. Selv om den underliggende kunnskapsbasen er den samme, holder den nye økt-ID-en transkripsjonene adskilt.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Gjennomgang av økt 2 Historikk\n", + "\n", + "`show_history(session_2)` skal kun vise design-gjennomgangens prompt/svar-par. Sammenlign det med økt 1 for å fremheve hvordan Cognee holder uavhengige transkripsjoner samtidig som den gjenbruker den delte kunnskapsgrafen.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Sammendrag\n", + "\n", + "Gratulerer! Du har nettopp gitt din kodeassistent et ekte langtidsminnelag drevet av Cognee.\n", + "\n", + "I denne veiledningen tok du rått utviklerinnhold (kode, dokumentasjon, samtaler) og gjorde det om til en graf + vektorminne som agenten din kan søke i, resonnere over og kontinuerlig forbedre.\n", + "\n", + "Hva du har lært\n", + "\n", + "1. **Fra råtekst til AI-minne**: Hvordan Cognee tar inn ustrukturert data og gjør det om til intelligent, søkbart minne ved hjelp av en kombinert vektor- og kunnskapsgrafarkitektur.\n", + "\n", + "2. **Grafberikelse med memify**: Hvordan gå utover grunnleggende grafopprettelse og bruke memify til å legge til avledede fakta og rikere relasjoner på toppen av din eksisterende graf.\n", + "\n", + "3. **Flere søkestrategier**: Hvordan søke i minnet med ulike søketyper (grafbevisst Q&A, RAG-stil fullføring, innsikter, rå tekstbiter, kodesøk, osv.) avhengig av hva agenten din trenger.\n", + "\n", + "4. **Visuell utforskning**: Hvordan inspisere og feilsøke det Cognee har bygget ved hjelp av grafvisualiseringer og Cognee UI, slik at du faktisk kan se hvordan kunnskapen er strukturert.\n", + "\n", + "5. **Øktbevisst minne**: Hvordan kombinere kontekst fra hver økt med vedvarende semantisk minne, slik at agenter kan huske på tvers av økter uten å lekke informasjon mellom brukere.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Viktige punkter\n", + "1. Minne som en kunnskapsgraf støttet av embeddings\n", + "\n", + " - **Strukturert forståelse**: Cognee kombinerer en vektorlager og en grafdatabase slik at dataene dine både er søkbare etter mening og koblet gjennom relasjoner. Cognee bruker filbaserte databaser som standard (LanceDB for vektor-, Kuzu for grafdatabase).\n", + "\n", + " - **Relasjonsbevisst gjenfinning**: Svar kan baseres ikke bare på \"lignende tekst\", men også på hvordan enheter er relatert.\n", + "\n", + " - **Levende minne**: Minnelaget utvikler seg, vokser og forblir søkbart som en sammenkoblet graf.\n", + "\n", + "2. Søke- og resonneringsmoduser\n", + " - **Hybrid gjenfinning**: Søket kombinerer vektorsimilaritet, grafstruktur og LLM-resonnering, fra rå datablokk-oppslag til grafbevisst spørsmål-svar.\n", + "\n", + " - **Tilpass modus til oppgaven**: Bruk fullføringsmoduser når du ønsker naturlige språkbaserte svar, og blokk-/sammendrags-/grafmoduser når agenten din trenger rå kontekst eller skal drive sin egen resonnering.\n", + "\n", + "3. Personlige, sesjonsbevisste agenter\n", + " - **Sesjonskontekst + langtidsminne**: Cognee holder kortsiktig \"tråd\"-kontekst adskilt fra langvarig, bruker- eller organisasjonsnivåminne.\n", + "\n", + "## Virkelige bruksområder\n", + "\n", + "1. **Vertikale AI-agenter**\n", + "\n", + " Bruk mønsteret fra denne notatboken for å drive domenespesifikke copiloter som bruker Cognee som sin kjerne for gjenfinning og resonnering:\n", + "\n", + "- **Utvikler-copiloter**: Kodegjennomgang, hendelsesanalyse og arkitekturassistenter som navigerer gjennom kode, API-er, design-dokumenter og billetter som en enkelt minnegraf.\n", + "\n", + "- **Kundeorienterte copiloter**: Støtte- eller suksessagenter som henter informasjon fra produktdokumenter, vanlige spørsmål, CRM-notater og tidligere billetter med grafbevisst gjenfinning og siterte svar.\n", + "\n", + "- **Interne ekspert-copiloter**: Policy-, juridiske- eller sikkerhetsassistenter som resonerer over sammenkoblede regler, retningslinjer og historiske beslutninger i stedet for isolerte PDF-er.\n", + "\n", + " Cognee er eksplisitt posisjonert som et vedvarende, nøyaktig minne for AI-agenter, og tilbyr en levende kunnskapsgraf som kan integreres bak agenten din og erstatte ad-hoc kombinasjoner av vektorlager og tilpasset grafkode.\n", + "\n", + "2. **Forene datasiloer til ett minne**\n", + "\n", + " Den samme tilnærmingen hjelper deg også med å bygge et samlet minnelag på tvers av spredte kilder:\n", + "\n", + "- **Fra siloer til én graf**: Importer strukturerte (f.eks. databaser) og ustrukturerte data (f.eks. dokumenter, chatter) til en enkelt graf støttet av embeddings, i stedet for separate indekser for hvert system.\n", + "\n", + "- **Tverrkilde-resonnering med siteringer**: Utfør flerstegsresonnering over alt—\"koble sammen\" logger, målinger og dokumenter via grafen—og returner fortsatt begrunnede svar med kildehenvisning.\n", + "\n", + "- **Kunnskapshuber**: For domener som bank eller utdanning brukes Cognee allerede til å forene PDF-er, interne systemer og appdata i én kunnskapsgraf med vektorer, slik at agenter kan svare på spørsmål med presis, sitert kontekst.\n", + "\n", + "## Neste steg\n", + "\n", + "Du har implementert den grunnleggende minnesløyfen. Her er naturlige utvidelser du kan prøve på egen hånd (se [Cognee-dokumentasjon](https://docs.cognee.ai/) for detaljer):\n", + "\n", + "1. **Eksperimenter med tidsbevissthet**: Aktiver tidsmessig cognify for å trekke ut hendelser og tidsstempler fra tekst.\n", + "\n", + "2. **Introduser ontologidrevet resonnering**: Definer en OWL-ontologi for ditt domene. Bruk Cognee sin ontologistøtte slik at uttrukne enheter og relasjoner er forankret i det skjemaet, noe som forbedrer grafkvaliteten og domenespesifikke svar.\n", + "\n", + "3. **Legg til en tilbakemeldingssløyfe**: La Cognee justere grafkantvekter basert på reelle brukertilbakemeldinger, slik at gjenfinning forbedres over tid i stedet for å forbli statisk.\n", + "\n", + "4. **Tilpass for personalisering og sesjonsatferd**: Bruk bruker-ID-er, leietakere og datasett for å gi hver person eller team sitt eget syn på den delte minnemotoren.\n", + "\n", + "5. **Skaler opp til mer komplekse agenter**: Koble Cognee til agentrammeverk for å bygge multi-agent-systemer som alle deler det samme minnelaget. *Microsoft Agent Framework x Cognee-plugin kommer snart.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Ansvarsfraskrivelse**: \nDette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:03:57+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "no" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/no/13-agent-memory/README.md b/translations/no/13-agent-memory/README.md index ec42475e1..c5b52dd5d 100644 --- a/translations/no/13-agent-memory/README.md +++ b/translations/no/13-agent-memory/README.md @@ -1,48 +1,56 @@ -# Hukommelse for AI-agenter +# Minne for AI-agenter [![Agent Memory](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.no.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Når vi diskuterer de unike fordelene ved å lage AI-agenter, er det to ting som ofte nevnes: evnen til å bruke verktøy for å utføre oppgaver og evnen til å forbedre seg over tid. Hukommelse er grunnlaget for å skape selvforbedrende agenter som kan gi bedre opplevelser for brukerne våre. +Når vi diskuterer de unike fordelene ved å lage AI-agenter, er det to ting som ofte nevnes: evnen til å bruke verktøy for å fullføre oppgaver og evnen til å forbedre seg over tid. Minne er grunnlaget for å skape selvforbedrende agenter som kan gi bedre opplevelser for brukerne våre. -I denne leksjonen skal vi se på hva hukommelse er for AI-agenter, hvordan vi kan administrere den, og hvordan vi kan bruke den til fordel for applikasjonene våre. +I denne leksjonen skal vi se på hva minne er for AI-agenter, og hvordan vi kan administrere og bruke det til fordel for applikasjonene våre. ## Introduksjon -Denne leksjonen dekker: +Denne leksjonen vil dekke: -• **Forstå AI-agentens hukommelse**: Hva hukommelse er og hvorfor det er viktig for agenter. +• **Forståelse av AI-agentminne**: Hva minne er og hvorfor det er essensielt for agenter. -• **Implementere og lagre hukommelse**: Praktiske metoder for å legge til hukommelsesfunksjoner i AI-agenter, med fokus på kortsiktig og langsiktig hukommelse. +• **Implementering og lagring av minne**: Praktiske metoder for å legge til minnefunksjoner i AI-agenter, med fokus på korttids- og langtidsminne. -• **Gjøre AI-agenter selvforbedrende**: Hvordan hukommelse gjør det mulig for agenter å lære av tidligere interaksjoner og forbedre seg over tid. +• **Gjøre AI-agenter selvforbedrende**: Hvordan minne gjør det mulig for agenter å lære av tidligere interaksjoner og forbedre seg over tid. + +## Tilgjengelige implementeringer + +Denne leksjonen inkluderer to omfattende notatbokveiledninger: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Implementerer minne ved hjelp av Mem0 og Azure AI Search med Semantic Kernel-rammeverket. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Implementerer strukturert minne ved hjelp av Cognee, som automatisk bygger en kunnskapsgraf støttet av embeddings, visualiserer grafen og muliggjør intelligent gjenfinning. ## Læringsmål -Etter å ha fullført denne leksjonen, vil du kunne: +Etter å ha fullført denne leksjonen, vil du vite hvordan du: -• **Skille mellom ulike typer AI-agentens hukommelse**, inkludert arbeids-, kortsiktig og langsiktig hukommelse, samt spesialiserte former som persona- og episodisk hukommelse. +• **Skiller mellom ulike typer AI-agentminne**, inkludert arbeidsminne, korttidsminne og langtidsminne, samt spesialiserte former som personaminne og episodisk minne. -• **Implementere og administrere kortsiktig og langsiktig hukommelse for AI-agenter** ved hjelp av Semantic Kernel-rammeverket, verktøy som Mem0 og Whiteboard-hukommelse, og integrering med Azure AI Search. +• **Implementerer og administrerer korttids- og langtidsminne for AI-agenter** ved hjelp av Semantic Kernel-rammeverket, med verktøy som Mem0, Cognee, Whiteboard-minne og integrering med Azure AI Search. -• **Forstå prinsippene bak selvforbedrende AI-agenter** og hvordan robuste hukommelsessystemer bidrar til kontinuerlig læring og tilpasning. +• **Forstår prinsippene bak selvforbedrende AI-agenter** og hvordan robuste minnehåndteringssystemer bidrar til kontinuerlig læring og tilpasning. -## Forstå AI-agentens hukommelse +## Forståelse av AI-agentminne -I sin kjerne refererer **hukommelse for AI-agenter til mekanismer som lar dem beholde og hente frem informasjon**. Denne informasjonen kan være spesifikke detaljer om en samtale, brukerpreferanser, tidligere handlinger eller til og med lærte mønstre. +I bunn og grunn refererer **minne for AI-agenter til mekanismene som lar dem beholde og hente frem informasjon**. Denne informasjonen kan være spesifikke detaljer om en samtale, brukerpreferanser, tidligere handlinger eller til og med lærte mønstre. -Uten hukommelse er AI-applikasjoner ofte tilstandsløse, noe som betyr at hver interaksjon starter fra scratch. Dette fører til en repetitiv og frustrerende brukeropplevelse der agenten "glemmer" tidligere kontekst eller preferanser. +Uten minne er AI-applikasjoner ofte tilstandsløse, noe som betyr at hver interaksjon starter fra bunnen av. Dette fører til en repeterende og frustrerende brukeropplevelse der agenten "glemmer" tidligere kontekst eller preferanser. -### Hvorfor er hukommelse viktig? +### Hvorfor er minne viktig? -En agents intelligens er nært knyttet til dens evne til å huske og bruke tidligere informasjon. Hukommelse gjør det mulig for agenter å være: +En agents intelligens er nært knyttet til dens evne til å huske og bruke tidligere informasjon. Minne gjør det mulig for agenter å være: • **Reflekterende**: Lære av tidligere handlinger og resultater. @@ -52,27 +60,27 @@ En agents intelligens er nært knyttet til dens evne til å huske og bruke tidli • **Autonome**: Operere mer selvstendig ved å trekke på lagret kunnskap. -Målet med å implementere hukommelse er å gjøre agenter mer **pålitelige og kapable**. +Målet med å implementere minne er å gjøre agenter mer **pålitelige og kapable**. -### Typer hukommelse +### Typer av minne -#### Arbeidshukommelse +#### Arbeidsminne Tenk på dette som et stykke kladdepapir en agent bruker under en enkelt, pågående oppgave eller tankeprosess. Det holder umiddelbar informasjon som trengs for å beregne neste steg. -For AI-agenter fanger arbeidshukommelse ofte den mest relevante informasjonen fra en samtale, selv om hele samtalehistorikken er lang eller avkortet. Den fokuserer på å trekke ut nøkkelpunkter som krav, forslag, beslutninger og handlinger. +For AI-agenter fanger arbeidsminne ofte opp den mest relevante informasjonen fra en samtale, selv om hele samtalehistorikken er lang eller avkortet. Det fokuserer på å trekke ut nøkkelpunkter som krav, forslag, beslutninger og handlinger. -**Eksempel på arbeidshukommelse** +**Eksempel på arbeidsminne** -I en reisebestillingsagent kan arbeidshukommelsen fange brukerens nåværende forespørsel, som "Jeg vil bestille en tur til Paris". Dette spesifikke kravet holdes i agentens umiddelbare kontekst for å styre den nåværende interaksjonen. +I en reisebestillingsagent kan arbeidsminne fange opp brukerens nåværende forespørsel, som "Jeg vil bestille en tur til Paris". Dette spesifikke kravet holdes i agentens umiddelbare kontekst for å styre den nåværende interaksjonen. #### Korttidsminne -Denne typen hukommelse beholder informasjon for varigheten av en enkelt samtale eller økt. Det er konteksten for den nåværende chatten, som lar agenten referere til tidligere vendinger i dialogen. +Denne typen minne beholder informasjon i løpet av en enkelt samtale eller økt. Det er konteksten for den nåværende chatten, som gjør det mulig for agenten å referere til tidligere deler av dialogen. **Eksempel på korttidsminne** -Hvis en bruker spør: "Hvor mye koster en flyreise til Paris?" og deretter følger opp med "Hva med overnatting der?", sørger korttidsminnet for at agenten vet at "der" refererer til "Paris" i den samme samtalen. +Hvis en bruker spør: "Hvor mye koster en flyreise til Paris?" og deretter følger opp med "Hva med overnatting der?", sørger korttidsminne for at agenten vet at "der" refererer til "Paris" i samme samtale. #### Langtidsminne @@ -80,57 +88,67 @@ Dette er informasjon som vedvarer på tvers av flere samtaler eller økter. Det **Eksempel på langtidsminne** -Et langtidsminne kan lagre at "Ben liker ski og utendørsaktiviteter, foretrekker kaffe med fjellutsikt, og vil unngå avanserte skibakker på grunn av en tidligere skade". Denne informasjonen, lært fra tidligere interaksjoner, påvirker anbefalinger i fremtidige reiseplanleggingsøkter, og gjør dem svært personlige. +Et langtidsminne kan lagre at "Ben liker ski og utendørsaktiviteter, foretrekker kaffe med fjellutsikt, og vil unngå avanserte skibakker på grunn av en tidligere skade". Denne informasjonen, lært fra tidligere interaksjoner, påvirker anbefalinger i fremtidige reiseplanleggingsøkter, noe som gjør dem svært personaliserte. -#### Persona-hukommelse +#### Personaminne -Denne spesialiserte hukommelsestypen hjelper en agent med å utvikle en konsistent "personlighet" eller "persona". Det lar agenten huske detaljer om seg selv eller sin tiltenkte rolle, og gjør interaksjoner mer flytende og fokuserte. +Denne spesialiserte typen minne hjelper en agent med å utvikle en konsistent "personlighet" eller "persona". Det lar agenten huske detaljer om seg selv eller sin tiltenkte rolle, noe som gjør interaksjoner mer flytende og fokuserte. -**Eksempel på persona-hukommelse** +**Eksempel på personaminne** -Hvis reiseagenten er designet for å være en "ekspert på skiplanlegging", kan persona-hukommelsen forsterke denne rollen, og påvirke svarene til å samsvare med en eksperts tone og kunnskap. +Hvis reiseagenten er designet for å være en "ekspert på skiplanlegging", kan personaminne forsterke denne rollen, og påvirke svarene slik at de samsvarer med tonen og kunnskapen til en ekspert. -#### Arbeidsflyt-/episodisk hukommelse +#### Arbeidsflyt-/episodisk minne -Denne hukommelsen lagrer sekvensen av trinn en agent tar under en kompleks oppgave, inkludert suksesser og feil. Det er som å huske spesifikke "episoder" eller tidligere erfaringer for å lære av dem. +Dette minnet lagrer rekkefølgen av trinn en agent tar under en kompleks oppgave, inkludert suksesser og feil. Det er som å huske spesifikke "episoder" eller tidligere erfaringer for å lære av dem. -**Eksempel på episodisk hukommelse** +**Eksempel på episodisk minne** -Hvis agenten forsøkte å bestille en spesifikk flyreise, men det mislyktes på grunn av utilgjengelighet, kan episodisk hukommelse registrere denne feilen, slik at agenten kan prøve alternative flyreiser eller informere brukeren om problemet på en mer informert måte ved et senere forsøk. +Hvis agenten forsøkte å bestille en spesifikk flyreise, men det mislyktes på grunn av utilgjengelighet, kan episodisk minne registrere denne feilen, slik at agenten kan prøve alternative flyreiser eller informere brukeren om problemet på en mer informert måte ved et senere forsøk. -#### Enhetshukommelse +#### Enhetsminne Dette innebærer å trekke ut og huske spesifikke enheter (som personer, steder eller ting) og hendelser fra samtaler. Det lar agenten bygge en strukturert forståelse av nøkkelpunktene som diskuteres. -**Eksempel på enhetshukommelse** +**Eksempel på enhetsminne** Fra en samtale om en tidligere tur kan agenten trekke ut "Paris", "Eiffeltårnet" og "middag på Le Chat Noir restaurant" som enheter. I en fremtidig interaksjon kan agenten huske "Le Chat Noir" og tilby å gjøre en ny reservasjon der. #### Strukturert RAG (Retrieval Augmented Generation) -Mens RAG er en bredere teknikk, fremheves "strukturert RAG" som en kraftig hukommelsesteknologi. Den trekker ut tett, strukturert informasjon fra ulike kilder (samtaler, e-poster, bilder) og bruker den til å forbedre presisjon, gjenkalling og hastighet i svarene. I motsetning til klassisk RAG som kun baserer seg på semantisk likhet, arbeider strukturert RAG med den iboende strukturen i informasjonen. +Selv om RAG er en bredere teknikk, fremheves "Strukturert RAG" som en kraftig minneteknologi. Den trekker ut tett, strukturert informasjon fra ulike kilder (samtaler, e-poster, bilder) og bruker det for å forbedre presisjon, gjenfinning og hastighet i svarene. I motsetning til klassisk RAG som kun baserer seg på semantisk likhet, arbeider Strukturert RAG med den iboende strukturen i informasjonen. **Eksempel på strukturert RAG** -I stedet for bare å matche nøkkelord, kan strukturert RAG analysere flydetaljer (destinasjon, dato, tid, flyselskap) fra en e-post og lagre dem på en strukturert måte. Dette muliggjør presise forespørsler som "Hvilket fly bestilte jeg til Paris på tirsdag?" +I stedet for bare å matche nøkkelord, kan Strukturert RAG analysere flydetaljer (destinasjon, dato, tid, flyselskap) fra en e-post og lagre dem på en strukturert måte. Dette muliggjør presise forespørsler som "Hvilket fly bestilte jeg til Paris på tirsdag?" + +## Implementering og lagring av minne + +Å implementere minne for AI-agenter innebærer en systematisk prosess med **minnehåndtering**, som inkluderer generering, lagring, gjenfinning, integrering, oppdatering og til og med "glemming" (eller sletting) av informasjon. Gjenfinning er en spesielt viktig del. + +### Spesialiserte minneverktøy + +#### Mem0 + +En måte å lagre og administrere agentminne på er ved å bruke spesialiserte verktøy som Mem0. Mem0 fungerer som et vedvarende minnelag, som lar agenter huske relevante interaksjoner, lagre brukerpreferanser og faktakontekst, og lære av suksesser og feil over tid. Ideen her er at tilstandsløse agenter blir til tilstandsfulle. -## Implementere og lagre hukommelse +Det fungerer gjennom en **tofaset minneprosess: utvinning og oppdatering**. Først sendes meldinger lagt til en agents tråd til Mem0-tjenesten, som bruker en Large Language Model (LLM) for å oppsummere samtalehistorikk og trekke ut nye minner. Deretter bestemmer en LLM-drevet oppdateringsfase om disse minnene skal legges til, endres eller slettes, og lagrer dem i en hybrid datalagring som kan inkludere vektor-, graf- og nøkkel-verdi-databaser. Dette systemet støtter også ulike minnetyper og kan inkludere grafminne for å administrere relasjoner mellom enheter. -Å implementere hukommelse for AI-agenter innebærer en systematisk prosess med **hukommelsesadministrasjon**, som inkluderer generering, lagring, henting, integrering, oppdatering og til og med "glemming" (eller sletting) av informasjon. Henting er en spesielt viktig del. +#### Cognee -### Spesialiserte hukommelsesverktøy +En annen kraftig tilnærming er å bruke **Cognee**, en åpen kildekode for semantisk minne for AI-agenter som transformerer strukturert og ustrukturert data til søkbare kunnskapsgrafer støttet av embeddings. Cognee tilbyr en **to-lags arkitektur** som kombinerer vektorsøk med grafrelasjoner, slik at agenter kan forstå ikke bare hva informasjon er lik, men hvordan konsepter henger sammen. -En måte å lagre og administrere agentens hukommelse på er ved å bruke spesialiserte verktøy som Mem0. Mem0 fungerer som et vedvarende hukommelseslag, som lar agenter huske relevante interaksjoner, lagre brukerpreferanser og faktuell kontekst, og lære av suksesser og feil over tid. Ideen her er at tilstandsløse agenter blir til tilstandsfulle. +Den utmerker seg i **hybrid gjenfinning** som blander vektorsøk, grafstruktur og LLM-resonnering - fra rå datainnhenting til grafbevisst spørsmål-svar. Systemet opprettholder **levende minne** som utvikler seg og vokser mens det forblir søkbart som én sammenkoblet graf, og støtter både kortsiktig øktkontekst og langsiktig vedvarende minne. -Det fungerer gjennom en **to-fase hukommelsesprosess: utvinning og oppdatering**. Først sendes meldinger lagt til en agents tråd til Mem0-tjenesten, som bruker en Large Language Model (LLM) for å oppsummere samtalehistorikk og trekke ut nye minner. Deretter bestemmer en LLM-drevet oppdateringsfase om disse minnene skal legges til, endres eller slettes, og lagrer dem i en hybrid datalagring som kan inkludere vektor-, graf- og nøkkel-verdi-databaser. Dette systemet støtter også ulike hukommelsestyper og kan inkludere grafhukommelse for å administrere relasjoner mellom enheter. +Cognee-notatboken ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) demonstrerer hvordan man bygger dette enhetlige minnelaget, med praktiske eksempler på å hente inn ulike datakilder, visualisere kunnskapsgrafen og søke med ulike strategier tilpasset spesifikke agentbehov. -### Lagring av hukommelse med RAG +### Lagring av minne med RAG -Utover spesialiserte hukommelsesverktøy som Mem0, kan du bruke robuste søketjenester som **Azure AI Search som backend for lagring og henting av minner**, spesielt for strukturert RAG. +I tillegg til spesialiserte minneverktøy som Mem0, kan du bruke robuste søketjenester som **Azure AI Search som backend for lagring og gjenfinning av minner**, spesielt for strukturert RAG. -Dette lar deg forankre agentens svar med dine egne data, og sikrer mer relevante og nøyaktige svar. Azure AI Search kan brukes til å lagre bruker-spesifikke reise-minner, produktkataloger eller annen domenespesifikk kunnskap. +Dette lar deg forankre agentens svar med dine egne data, og sikrer mer relevante og nøyaktige svar. Azure AI Search kan brukes til å lagre bruker-spesifikke reiseopplevelser, produktkataloger eller annen domenespesifikk kunnskap. -Azure AI Search støtter funksjoner som **strukturert RAG**, som utmerker seg ved å trekke ut og hente tett, strukturert informasjon fra store datasett som samtalehistorikk, e-poster eller til og med bilder. Dette gir "supermenneskelig presisjon og gjenkalling" sammenlignet med tradisjonelle tekstchunking- og embedding-tilnærminger. +Azure AI Search støtter funksjoner som **Strukturert RAG**, som utmerker seg i å trekke ut og gjenfinne tett, strukturert informasjon fra store datasett som samtalehistorikk, e-poster eller til og med bilder. Dette gir "supermenneskelig presisjon og gjenfinning" sammenlignet med tradisjonelle tekstchunking- og embedding-tilnærminger. ## Gjøre AI-agenter selvforbedrende @@ -138,23 +156,25 @@ Et vanlig mønster for selvforbedrende agenter innebærer å introdusere en **"k 1. **Identifisere verdifull informasjon**: Bestemme om noen del av samtalen er verdt å lagre som generell kunnskap eller en spesifikk brukerpreferanse. -2. **Trekk ut og oppsummer**: Destillere den essensielle læringen eller preferansen fra samtalen. +2. **Trekke ut og oppsummere**: Destillere essensiell læring eller preferanse fra samtalen. 3. **Lagre i en kunnskapsbase**: Bevare denne uttrukne informasjonen, ofte i en vektordatabase, slik at den kan hentes frem senere. 4. **Forsterke fremtidige forespørsler**: Når brukeren starter en ny forespørsel, henter kunnskapsagenten relevant lagret informasjon og legger den til brukerens prompt, og gir viktig kontekst til den primære agenten (ligner på RAG). -### Optimaliseringer for hukommelse +### Optimaliseringer for minne -• **Latenshåndtering**: For å unngå å bremse brukerinteraksjoner, kan en billigere, raskere modell brukes først for raskt å sjekke om informasjon er verdt å lagre eller hente, og kun aktivere den mer komplekse utvinnings-/hentingsprosessen når det er nødvendig. +• **Latenshåndtering**: For å unngå å bremse brukerinteraksjoner, kan en billigere, raskere modell brukes først for raskt å sjekke om informasjon er verdt å lagre eller hente, og kun utløse den mer komplekse utvinnings-/gjenfinningsprosessen når det er nødvendig. -• **Vedlikehold av kunnskapsbase**: For en voksende kunnskapsbase kan mindre brukt informasjon flyttes til "kald lagring" for å redusere kostnader. +• **Vedlikehold av kunnskapsbase**: For en voksende kunnskapsbase kan mindre brukt informasjon flyttes til "kald lagring" for å håndtere kostnader. -## Har du flere spørsmål om agentens hukommelse? +## Har du flere spørsmål om agentminne? -Bli med på [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) for å møte andre lærende, delta på kontortimer og få svar på spørsmålene dine om AI-agenter. +Bli med i [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) for å møte andre elever, delta på kontortid og få svar på spørsmålene dine om AI-agenter. --- + **Ansvarsfraskrivelse**: -Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør betraktes som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. \ No newline at end of file +Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen. + \ No newline at end of file diff --git a/translations/pa/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/pa/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..623fb4284 --- /dev/null +++ b/translations/pa/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# ਕੋਗਨੀ ਦੀ ਵਰਤੋਂ ਨਾਲ ਸਥਾਈ ਮੈਮੋਰੀ ਵਾਲੇ AI ਏਜੰਟ ਬਣਾਉਣਾ\n", + "\n", + "ਇਹ ਨੋਟਬੁੱਕ ਦਿਖਾਉਂਦੀ ਹੈ ਕਿ ਕਿਵੇਂ [**cognee**](https://www.cognee.ai/) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਸੁਧਰੇ ਹੋਏ ਮੈਮੋਰੀ ਸਮਰੱਥਾਵਾਂ ਵਾਲੇ ਬੁੱਧੀਮਾਨ AI ਏਜੰਟ ਬਣਾਏ ਜਾ ਸਕਦੇ ਹਨ। ਕੋਗਨੀ ਇੱਕ ਖੁੱਲ੍ਹਾ ਸਰੋਤ AI ਮੈਮੋਰੀ ਹੈ ਜੋ ਗਿਆਨ ਗ੍ਰਾਫ, ਸੈਮੈਂਟਿਕ ਖੋਜ, ਅਤੇ ਸੈਸ਼ਨ ਪ੍ਰਬੰਧਨ ਨੂੰ ਜੋੜ ਕੇ ਸੰਦਰਭ-ਜਾਗਰੂਕ AI ਸਿਸਟਮ ਬਣਾਉਂਦੀ ਹੈ।\n", + "\n", + "## 🎯 ਸਿੱਖਣ ਦੇ ਉਦੇਸ਼\n", + "\n", + "ਇਸ ਟਿਊਟੋਰਿਅਲ ਦੇ ਅੰਤ ਤੱਕ, ਤੁਸੀਂ ਇਹ ਸਮਝ ਪਾ ਲਵੋਗੇ ਕਿ ਕਿਵੇਂ:\n", + "- **ਐਮਬੈਡਿੰਗ ਨਾਲ ਸਹਾਇਕ ਗਿਆਨ ਗ੍ਰਾਫ ਬਣਾਉਣਾ**: ਅਸੰਰਚਿਤ ਪਾਠ ਨੂੰ ਸੰਰਚਿਤ, ਪੁੱਛਗਿੱਛ ਯੋਗ ਗਿਆਨ ਵਿੱਚ ਬਦਲਣਾ\n", + "- **ਸੈਸ਼ਨ ਮੈਮੋਰੀ ਲਾਗੂ ਕਰਨਾ**: ਆਟੋਮੈਟਿਕ ਸੰਦਰਭ ਰੱਖਣ ਵਾਲੀਆਂ ਬਹੁ-ਵਾਰਤਾਲਾਪੀ ਗੱਲਬਾਤਾਂ ਬਣਾਉਣਾ\n", + "- **ਗੱਲਬਾਤਾਂ ਨੂੰ ਸਥਾਈ ਬਣਾਉਣਾ**: ਭਵਿੱਖ ਵਿੱਚ ਹਵਾਲੇ ਲਈ ਮਹੱਤਵਪੂਰਨ ਗੱਲਬਾਤਾਂ ਨੂੰ ਲੰਬੇ ਸਮੇਂ ਦੀ ਮੈਮੋਰੀ ਵਿੱਚ ਸਟੋਰ ਕਰਨਾ\n", + "- **ਕੁਦਰਤੀ ਭਾਸ਼ਾ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਪੁੱਛਗਿੱਛ ਕਰਨਾ**: ਨਵੀਆਂ ਗੱਲਬਾਤਾਂ ਵਿੱਚ ਇਤਿਹਾਸਕ ਸੰਦਰਭ ਨੂੰ ਪਹੁੰਚਣਾ ਅਤੇ ਇਸਦਾ ਲਾਭ ਲੈਣਾ\n", + "- **ਮੈਮੋਰੀ ਨੂੰ ਵਿਜੁਅਲਾਈਜ਼ ਕਰਨਾ**: ਆਪਣੇ ਏਜੰਟ ਦੇ ਗਿਆਨ ਗ੍ਰਾਫ ਵਿੱਚ ਰਿਸ਼ਤਿਆਂ ਦੀ ਪੜਚੋਲ ਕਰਨਾ\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ ਤੁਸੀਂ ਕੀ ਬਣਾਉਗੇ\n", + "\n", + "ਇਸ ਟਿਊਟੋਰਿਅਲ ਵਿੱਚ, ਅਸੀਂ ਇੱਕ **ਕੋਡਿੰਗ ਸਹਾਇਕ** ਬਣਾਉਣ ਜਾ ਰਹੇ ਹਾਂ ਜਿਸ ਵਿੱਚ ਟਿਕਾਊ ਯਾਦਸ਼ਕਤੀ ਹੋਵੇਗੀ ਜੋ:\n", + "\n", + "### 1. **ਜਾਣਕਾਰੀ ਅਧਾਰ ਬਣਾਉਣਾ**\n", + " - ਡਿਵੈਲਪਰ ਪ੍ਰੋਫਾਈਲ ਅਤੇ ਮਾਹਰਤਾ ਜਾਣਕਾਰੀ ਨੂੰ ਸਮਝਦਾ ਹੈ\n", + " - ਪਾਇਥਨ ਪ੍ਰੋਗਰਾਮਿੰਗ ਦੇ ਸਿਧਾਂਤ ਅਤੇ ਵਧੀਆ ਤਰੀਕਿਆਂ ਨੂੰ ਪ੍ਰਕਿਰਿਆ ਕਰਦਾ ਹੈ\n", + " - ਡਿਵੈਲਪਰ ਅਤੇ AI ਸਹਾਇਕਾਂ ਦੇ ਵਿਚਕਾਰ ਪਿਛਲੇ ਗੱਲਬਾਤਾਂ ਨੂੰ ਸਟੋਰ ਕਰਦਾ ਹੈ\n", + "\n", + "### 2. **ਸੈਸ਼ਨ-ਅਵੇਅਰ ਗੱਲਬਾਤਾਂ**\n", + " - ਇੱਕੋ ਸੈਸ਼ਨ ਵਿੱਚ ਕਈ ਸਵਾਲਾਂ ਦੇ ਦੌਰਾਨ ਸੰਦਰਭ ਨੂੰ ਕਾਇਮ ਰੱਖਦਾ ਹੈ\n", + " - ਹਰ ਸਵਾਲ/ਜਵਾਬ ਜੋੜੇ ਨੂੰ ਸੁਚਾਰੂ ਰੀਤਿ ਨਾਲ ਸਟੋਰ ਕਰਦਾ ਹੈ\n", + " - ਗੱਲਬਾਤ ਦੇ ਇਤਿਹਾਸ ਦੇ ਅਧਾਰ 'ਤੇ ਸੰਗਤ, ਸੰਦਰਭਤ ਜਵਾਬ ਦਿੰਦਾ ਹੈ\n", + "\n", + "### 3. **ਲੰਬੇ ਸਮੇਂ ਦੀ ਯਾਦਸ਼ਕਤੀ**\n", + " - ਮਹੱਤਵਪੂਰਨ ਗੱਲਬਾਤਾਂ ਨੂੰ ਲੰਬੇ ਸਮੇਂ ਦੀ ਯਾਦ ਵਿੱਚ ਸਟੋਰ ਕਰਦਾ ਹੈ\n", + " - ਨਵੇਂ ਇੰਟਰੈਕਸ਼ਨ ਨੂੰ ਜਾਣਕਾਰੀ ਦੇਣ ਲਈ ਗਿਆਨ ਅਧਾਰ ਅਤੇ ਪਿਛਲੇ ਸੈਸ਼ਨਾਂ ਤੋਂ ਸਬੰਧਤ ਯਾਦਾਂ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰਦਾ ਹੈ\n", + " - ਇੱਕ ਵਧਦੀ ਹੋਈ ਗਿਆਨ ਅਧਾਰ ਬਣਾਉਂਦਾ ਹੈ ਜੋ ਸਮੇਂ ਦੇ ਨਾਲ ਬਿਹਤਰ ਹੁੰਦਾ ਹੈ\n", + "\n", + "### 4. **ਸਮਰਥ ਯਾਦ ਪ੍ਰਾਪਤੀ**\n", + " - ਸਾਰੇ ਸਟੋਰ ਕੀਤੇ ਗਿਆਨ ਵਿੱਚ ਸਬੰਧਤ ਜਾਣਕਾਰੀ ਲੱਭਣ ਲਈ ਗ੍ਰਾਫ-ਅਵੇਅਰ ਸੈਮੈਂਟਿਕ ਖੋਜ ਵਰਤਦਾ ਹੈ\n", + " - ਡਾਟਾ ਉਪ-ਗਰੁੱਪਾਂ (ਡਿਵੈਲਪਰ ਜਾਣਕਾਰੀ ਵਿਰੁੱਧ ਸਿਧਾਂਤ) ਦੁਆਰਾ ਖੋਜਾਂ ਨੂੰ ਫਿਲਟਰ ਕਰਦਾ ਹੈ\n", + " - ਕਈ ਡਾਟਾ ਸਰੋਤਾਂ ਨੂੰ ਜੋੜ ਕੇ ਵਿਸਤ੍ਰਿਤ ਜਵਾਬ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 ਪੂਰਵ ਸ਼ਰਤਾਂ ਅਤੇ ਸੈਟਅੱਪ\n", + "\n", + "### ਸਿਸਟਮ ਦੀਆਂ ਲੋੜਾਂ\n", + "\n", + "ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ, ਇਹ ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਤੁਹਾਡੇ ਕੋਲ ਇਹ ਹਨ:\n", + "\n", + "1. **ਪਾਇਥਨ ਮਾਹੌਲ**\n", + " - Python 3.9 ਜਾਂ ਇਸ ਤੋਂ ਉੱਚਾ ਵਰਜਨ\n", + " - ਵਰਚੁਅਲ ਮਾਹੌਲ (ਸਿਫਾਰਸ਼ ਕੀਤੀ ਗਈ)\n", + "\n", + "2. **Redis ਕੈਸ਼** (ਸੈਸ਼ਨ ਮੈਨੇਜਮੈਂਟ ਲਈ ਲਾਜ਼ਮੀ)\n", + " - ਲੋਕਲ Redis: `docker run -d -p 6379:6379 redis`\n", + " - ਜਾਂ ਕਿਸੇ ਮੈਨੇਜਡ Redis ਸੇਵਾ ਦੀ ਵਰਤੋਂ ਕਰੋ\n", + "\n", + "3. **LLM API ਐਕਸੈਸ**\n", + " - OpenAI API ਕੁੰਜੀ ਜਾਂ ਹੋਰ ਪ੍ਰਦਾਤਾ (ਵੇਖੋ [ਦਸਤਾਵੇਜ਼](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **ਡਾਟਾਬੇਸ ਸੰਰਚਨਾ**\n", + " - ਮੂਲ ਰੂਪ ਵਿੱਚ ਕੋਈ ਸੰਰਚਨਾ ਦੀ ਲੋੜ ਨਹੀਂ। Cognee ਫਾਈਲ-ਅਧਾਰਿਤ ਡਾਟਾਬੇਸ (LanceDB ਅਤੇ Kuzu) ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ।\n", + " - ਵਿਕਲਪਕ ਤੌਰ 'ਤੇ, ਤੁਸੀਂ Azure AI Search ਨੂੰ ਇੱਕ ਵੈਕਟਰ ਸਟੋਰ ਵਜੋਂ ਸੈਟਅੱਪ ਕਰ ਸਕਦੇ ਹੋ (ਵੇਖੋ [ਦਸਤਾਵੇਜ਼](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### ਮਾਹੌਲ ਸੰਰਚਨਾ\n", + "\n", + "ਆਪਣੇ ਪ੍ਰੋਜੈਕਟ ਡਾਇਰੈਕਟਰੀ ਵਿੱਚ `.env` ਫਾਈਲ ਬਣਾਓ ਜਿਸ ਵਿੱਚ ਹੇਠਾਂ ਦਿੱਤੇ ਵਰੀਏਬਲ ਹੋਣ:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ ਕੋਗਨੀ ਦੀ ਮੈਮੋਰੀ ਆਰਕੀਟੈਕਚਰ ਨੂੰ ਸਮਝਣਾ\n", + "\n", + "### ਕੋਗਨੀ ਕਿਵੇਂ ਕੰਮ ਕਰਦਾ ਹੈ\n", + "\n", + "ਕੋਗਨੀ ਇੱਕ ਉੱਚ-ਸਤਹੀ ਮੈਮੋਰੀ ਸਿਸਟਮ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ ਜੋ ਸਧਾਰਨ ਕੁੰਜੀ-ਮੁੱਲ ਸਟੋਰੇਜ ਤੋਂ ਅੱਗੇ ਜਾਂਦਾ ਹੈ:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### ਮੁੱਖ ਹਿੱਸੇ:\n", + "\n", + "1. **ਨਾਲਜ ਗ੍ਰਾਫ**: ਇਕਾਈਆਂ, ਸੰਬੰਧਾਂ ਅਤੇ ਸੈਮੈਂਟਿਕ ਕਨੈਕਸ਼ਨ ਸਟੋਰ ਕਰਦਾ ਹੈ\n", + "2. **ਵੇਕਟਰ ਐਮਬੈਡਿੰਗਸ**: ਸਟੋਰ ਕੀਤੀ ਸਾਰੀ ਜਾਣਕਾਰੀ ਵਿੱਚ ਸੈਮੈਂਟਿਕ ਖੋਜ ਨੂੰ ਯੋਗ ਬਣਾਉਂਦਾ ਹੈ\n", + "3. **ਸੈਸ਼ਨ ਕੈਸ਼**: ਸੈਸ਼ਨ ਦੇ ਅੰਦਰ ਅਤੇ ਸੈਸ਼ਨ ਦੇ ਪਾਰ ਗੱਲਬਾਤ ਦੇ ਸੰਦਰਭ ਨੂੰ ਬਣਾਈ ਰੱਖਦਾ ਹੈ\n", + "4. **ਨੋਡਸੈਟਸ**: ਡਾਟਾ ਨੂੰ ਲਾਜ਼ਮੀ ਸ਼੍ਰੇਣੀਆਂ ਵਿੱਚ ਸੰਗਠਿਤ ਕਰਦਾ ਹੈ ਤਾਂ ਜੋ ਟਾਰਗਟ ਰੀਟਰੀਵਲ ਹੋ ਸਕੇ\n", + "\n", + "### ਇਸ ਟਿਊਟੋਰਿਅਲ ਵਿੱਚ ਮੈਮੋਰੀ ਦੇ ਕਿਸਮਾਂ:\n", + "\n", + "- **ਪ੍ਰਸਿਸਟੈਂਟ ਮੈਮੋਰੀ**: ਨਾਲਜ ਗ੍ਰਾਫ ਵਿੱਚ ਲੰਬੇ ਸਮੇਂ ਦੀ ਸਟੋਰੇਜ\n", + "- **ਸੈਸ਼ਨ ਮੈਮੋਰੀ**: Redis ਕੈਸ਼ ਵਿੱਚ ਅਸਥਾਈ ਗੱਲਬਾਤ ਸੰਦਰਭ\n", + "- **ਸੈਮੈਂਟਿਕ ਮੈਮੋਰੀ**: ਸਾਰੇ ਡਾਟਾ ਵਿੱਚ ਵੇਕਟਰ-ਅਧਾਰਿਤ ਸਮਾਨਤਾ ਖੋਜ\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 ਲੋੜੀਂਦੇ ਪੈਕੇਜ ਇੰਸਟਾਲ ਕਰੋ\n", + "\n", + "Redis ਸਹਾਇਤਾ ਨਾਲ ਸੈਸ਼ਨ ਮੈਨੇਜਮੈਂਟ ਲਈ Cognee ਇੰਸਟਾਲ ਕਰੋ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 ਮਾਹੌਲ ਸ਼ੁਰੂ ਕਰੋ ਅਤੇ ਲਾਇਬ੍ਰੇਰੀਆਂ ਲੋਡ ਕਰੋ\n", + "\n", + "ਯਕੀਨੀ ਬਣਾਓ:\n", + "1. ਰੇਡਿਸ ਚੱਲ ਰਿਹਾ ਹੈ (ਉਦਾਹਰਣ ਲਈ, ਡਾਕਰ ਰਾਹੀਂ: `docker run -d -p 6379:6379 redis`)\n", + "2. ਕੈਸ਼ ਮੋਡੀਊਲਾਂ ਨੂੰ ਇੰਪੋਰਟ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵਾਤਾਵਰਣ ਵੈਰੀਏਬਲ ਸੈੱਟ ਕੀਤੇ ਗਏ ਹਨ\n", + "3. ਜੇ ਲੋੜ ਹੋਵੇ, ਤਾਂ ਕਰਨਲ ਨੂੰ ਰੀਸਟਾਰਟ ਕਰੋ ਅਤੇ ਸੈੱਲਾਂ ਨੂੰ ਕ੍ਰਮਵਾਰ ਚਲਾਓ\n", + "\n", + "ਹੇਠਾਂ ਦਿੱਤਾ ਸੈੱਲ ਇਹ ਕਰੇਗਾ:\n", + "1. `.env` ਤੋਂ ਵਾਤਾਵਰਣ ਵੈਰੀਏਬਲ ਲੋਡ ਕਰੋ\n", + "2. ਤੁਹਾਡੇ LLM ਸੈਟਿੰਗਾਂ ਨਾਲ Cognee ਨੂੰ ਕਨਫਿਗਰ ਕਰੋ\n", + "3. ਸੈਸ਼ਨ ਪ੍ਰਬੰਧਨ ਲਈ ਕੈਸ਼ਿੰਗ ਨੂੰ ਯੋਗ ਕਰੋ\n", + "4. ਸਾਰੇ ਕੰਪੋਨੈਂਟਾਂ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ ਕਿ ਉਹ ਠੀਕ ਤਰ੍ਹਾਂ ਜੁੜੇ ਹੋਏ ਹਨ\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 ਸਟੋਰੇਜ ਡਾਇਰੈਕਟਰੀਆਂ ਕਨਫਿਗਰ ਕਰੋ\n", + "\n", + "Cognee ਆਪਣੇ ਕੰਮਾਂ ਲਈ ਦੋ ਵੱਖ-ਵੱਖ ਡਾਇਰੈਕਟਰੀਆਂ ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ:\n", + "- **ਡਾਟਾ ਰੂਟ**: ਇੰਟੇਕਟ ਕੀਤੇ ਦਸਤਾਵੇਜ਼ਾਂ ਅਤੇ ਪ੍ਰਕਿਰਿਆਸ਼ੀਲ ਡਾਟਾ ਨੂੰ ਸਟੋਰ ਕਰਦਾ ਹੈ\n", + "- **ਸਿਸਟਮ ਰੂਟ**: ਨੋਲੇਜ ਗ੍ਰਾਫ ਡੇਟਾਬੇਸ ਅਤੇ ਸਿਸਟਮ ਮੈਟਾਡੇਟਾ ਨੂੰ ਰੱਖਦਾ ਹੈ\n", + "\n", + "ਅਸੀਂ ਇਸ ਟਿਊਟੋਰਿਅਲ ਲਈ ਹੇਠਾਂ ਦਿੱਤੇ ਤਰੀਕੇ ਨਾਲ ਅਲੱਗ ਡਾਇਰੈਕਟਰੀਆਂ ਬਣਾਵਾਂਗੇ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 ਮੈਮੋਰੀ ਸਥਿਤੀ ਰੀਸੈਟ ਕਰੋ\n", + "\n", + "ਸਾਡੀ ਮੈਮੋਰੀ ਸਿਸਟਮ ਬਣਾਉਣ ਦੀ ਸ਼ੁਰੂਆਤ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ, ਆਓ ਯਕੀਨੀ ਬਣਾਈਏ ਕਿ ਅਸੀਂ ਸਾਫ਼ ਸ਼ੁਰੂਆਤ ਕਰ ਰਹੇ ਹਾਂ।\n", + "\n", + "> 💡 **ਸੁਝਾਅ**: ਜੇ ਤੁਸੀਂ ਇਸ ਨੋਟਬੁੱਕ ਨੂੰ ਬਾਅਦ ਵਿੱਚ ਵਰਤਦੇ ਸਮੇਂ ਆਪਣੀਆਂ ਪਿਛਲੀਆਂ ਰਨ ਤੋਂ ਮੌਜੂਦਾ ਮੈਮੋਰੀਆਂ ਸੰਭਾਲ ਕੇ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਤੁਸੀਂ ਇਹ ਕਦਮ ਛੱਡ ਸਕਦੇ ਹੋ।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 ਭਾਗ 1: ਗਿਆਨ ਅਧਾਰ ਬਣਾਉਣਾ\n", + "\n", + "### ਸਾਡੇ ਡਿਵੈਲਪਰ ਸਹਾਇਕ ਲਈ ਡਾਟਾ ਸਰੋਤ\n", + "\n", + "ਅਸੀਂ ਇੱਕ ਵਿਆਪਕ ਗਿਆਨ ਅਧਾਰ ਬਣਾਉਣ ਲਈ ਤਿੰਨ ਕਿਸਮਾਂ ਦੇ ਡਾਟਾ ਨੂੰ ਸ਼ਾਮਲ ਕਰਾਂਗੇ:\n", + "\n", + "1. **ਡਿਵੈਲਪਰ ਪ੍ਰੋਫਾਈਲ**: ਨਿੱਜੀ ਮਹਾਰਤ ਅਤੇ ਤਕਨੀਕੀ ਪਿਛੋਕੜ\n", + "2. **ਪਾਇਥਨ ਬਿਹਤਰ ਅਭਿਆਸ**: ਪਾਇਥਨ ਦੇ ਜ਼ੈਨ ਨਾਲ ਪ੍ਰਯੋਗਤਮਕ ਦਿਸ਼ਾ-ਨਿਰਦੇਸ਼\n", + "3. **ਇਤਿਹਾਸਕ ਗੱਲਬਾਤਾਂ**: ਡਿਵੈਲਪਰਾਂ ਅਤੇ AI ਸਹਾਇਕਾਂ ਦੇ ਵਿਚਕਾਰ ਪਿਛਲੇ ਪ੍ਰਸ਼ਨ-ਉੱਤਰ ਸੈਸ਼ਨ\n", + "\n", + "ਇਹ ਵੱਖ-ਵੱਖ ਡਾਟਾ ਸਾਡੇ ਏਜੰਟ ਨੂੰ ਇਹ ਸਮਝਣ ਵਿੱਚ ਸਹਾਇਕ ਬਣਾਉਂਦਾ ਹੈ:\n", + "- ਯੂਜ਼ਰ ਦੇ ਤਕਨੀਕੀ ਸੰਦਰਭ ਨੂੰ ਸਮਝਣਾ\n", + "- ਸਿਫਾਰਸ਼ਾਂ ਵਿੱਚ ਬਿਹਤਰ ਅਭਿਆਸ ਲਾਗੂ ਕਰਨਾ\n", + "- ਪਿਛਲੇ ਸਫਲ ਸੰਵਾਦਾਂ ਤੋਂ ਸਿੱਖਣਾ\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 ਡਾਟਾ ਨੂੰ ਨੋਲਿਜ ਗ੍ਰਾਫ ਵਿੱਚ ਪ੍ਰੋਸੈਸ ਕਰੋ\n", + "\n", + "ਹੁਣ ਅਸੀਂ ਆਪਣੇ ਕੱਚੇ ਟੈਕਸਟ ਨੂੰ ਇੱਕ ਢਾਂਚੇਬੱਧ ਯਾਦ ਵਿੱਚ ਬਦਲਾਂਗੇ। ਇਹ ਪ੍ਰਕਿਰਿਆ:\n", + "\n", + "1. **ਡਾਟਾ ਨੂੰ NodeSets ਵਿੱਚ ਸ਼ਾਮਲ ਕਰਦੀ ਹੈ**: ਜਾਣਕਾਰੀ ਨੂੰ ਤਰਕਸੰਗਤ ਸ਼੍ਰੇਣੀਆਂ ਵਿੱਚ ਸੰਗਠਿਤ ਕਰਦੀ ਹੈ\n", + " - `developer_data`: ਡਿਵੈਲਪਰ ਪ੍ਰੋਫਾਈਲ ਅਤੇ ਗੱਲਬਾਤਾਂ\n", + " - `principles_data`: ਪਾਇਥਨ ਦੀਆਂ ਵਧੀਆ ਪ੍ਰਥਾਵਾਂ ਅਤੇ ਦਿਸ਼ਾ-ਨਿਰਦੇਸ਼\n", + "\n", + "2. **Cognify Pipeline ਚਲਾਉਂਦੀ ਹੈ**: ਇਕਾਈਆਂ, ਸੰਬੰਧਾਂ ਨੂੰ ਕੱਢਦੀ ਹੈ ਅਤੇ embeddings ਬਣਾਉਂਦੀ ਹੈ\n", + " - ਮੁੱਖ ਧਾਰਨਾਵਾਂ ਦੀ ਪਹਿਚਾਣ ਕਰਦੀ ਹੈ\n", + " - ਸੰਬੰਧਿਤ ਜਾਣਕਾਰੀ ਦੇ ਵਿਚਕਾਰ ਅਰਥਪੂਰਨ ਕਨੈਕਸ਼ਨ ਬਣਾਉਂਦੀ ਹੈ\n", + " - ਵੈਕਟਰ embeddings ਤਿਆਰ ਕਰਦੀ ਹੈ\n", + "\n", + "ਇਸ ਵਿੱਚ ਕੁਝ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ ਜਦੋਂ LLM ਟੈਕਸਟ ਨੂੰ ਪ੍ਰੋਸੈਸ ਕਰਦਾ ਹੈ ਅਤੇ ਗ੍ਰਾਫ ਢਾਂਚਾ ਬਣਾਉਂਦਾ ਹੈ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 ਗਿਆਨ ਗ੍ਰਾਫ ਨੂੰ ਦਿਖਾਓ\n", + "\n", + "ਆਓ ਆਪਣੇ ਗਿਆਨ ਗ੍ਰਾਫ ਦੀ ਬਣਤਰ ਦੀ ਜਾਂਚ ਕਰੀਏ। ਵਿਜੁਅਲਾਈਜ਼ੇਸ਼ਨ ਇਹ ਦਿਖਾਉਂਦਾ ਹੈ:\n", + "- **ਨੋਡਸ**: ਪਾਠ ਵਿੱਚੋਂ ਕੱਢੀਆਂ ਗਈਆਂ ਇਕਾਈਆਂ (ਧਾਰਨਾਵਾਂ, ਤਕਨਾਲੋਜੀਆਂ, ਲੋਕ)\n", + "- **ਐਜਸ**: ਇਕਾਈਆਂ ਦੇ ਵਿਚਕਾਰ ਸੰਬੰਧ ਅਤੇ ਕਨੈਕਸ਼ਨ\n", + "- **ਕਲੱਸਟਰਸ**: ਸੈਮੈਂਟਿਕ ਸਮਾਨਤਾ ਦੁਆਰਾ ਸਮੂਹਬੱਧ ਸੰਬੰਧਤ ਧਾਰਨਾਵਾਂ\n", + "\n", + "ਗ੍ਰਾਫ ਨੂੰ ਇੰਟਰਐਕਟਿਵ ਤਰੀਕੇ ਨਾਲ ਵੇਖਣ ਲਈ ਬਣਾਈ ਗਈ HTML ਫਾਈਲ ਨੂੰ ਆਪਣੇ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹੋ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 ਮੈਮੋਰੀ ਨੂੰ ਮਜ਼ਬੂਤ ਬਣਾਓ Memify ਨਾਲ\n", + "\n", + "`memify()` ਫੰਕਸ਼ਨ ਗਿਆਨ ਗ੍ਰਾਫ ਦਾ ਵਿਸ਼ਲੇਸ਼ਣ ਕਰਦਾ ਹੈ ਅਤੇ ਡਾਟਾ ਬਾਰੇ ਸਮਝਦਾਰ ਨਿਯਮ ਬਣਾਉਂਦਾ ਹੈ। ਇਹ ਪ੍ਰਕਿਰਿਆ:\n", + "- ਪੈਟਰਨ ਅਤੇ ਸਭ ਤੋਂ ਵਧੀਆ ਅਭਿਆਸਾਂ ਦੀ ਪਛਾਣ ਕਰਦੀ ਹੈ\n", + "- ਸਮੱਗਰੀ ਦੇ ਆਧਾਰ 'ਤੇ ਕਾਰਵਾਈਯੋਗ ਦਿਸ਼ਾ-ਨਿਰਦੇਸ਼ ਬਣਾਉਂਦੀ ਹੈ\n", + "- ਵੱਖ-ਵੱਖ ਗਿਆਨ ਖੇਤਰਾਂ ਦੇ ਵਿਚਕਾਰ ਸੰਬੰਧ ਸਥਾਪਿਤ ਕਰਦੀ ਹੈ\n", + "\n", + "ਇਹ ਨਿਯਮ ਏਜੰਟ ਨੂੰ ਸਵਾਲਾਂ ਦੇ ਜਵਾਬ ਦਿੰਦੇ ਸਮੇਂ ਹੋਰ ਜਾਣਕਾਰੀਪੂਰਕ ਫੈਸਲੇ ਲੈਣ ਵਿੱਚ ਮਦਦ ਕਰਦੇ ਹਨ। ਦੂਜੀ ਵਿਜੁਅਲਾਈਜ਼ੇਸ਼ਨ ਕੈਪਚਰ ਕਰਨਾ ਤੁਹਾਨੂੰ ਇਹ ਤੁਲਨਾ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰਦਾ ਹੈ ਕਿ ਗ੍ਰਾਫ ਕਿਵੇਂ ਮਜ਼ਬੂਤ ਹੁੰਦਾ ਹੈ ਜਦੋਂ ਇਸਨੂੰ ਮਜ਼ਬੂਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 ਭਾਗ 2: ਸਮਰੱਥ ਯਾਦਦਾਸ਼ਤ ਪ੍ਰਾਪਤੀ\n", + "\n", + "### ਡੈਮੋ 1: ਕਾਗਜ਼ਾਤਾਂ ਦੇ ਪਾਰ ਗਿਆਨ ਦਾ ਇਕੱਠ\n", + "\n", + "ਹੁਣ ਜਦੋਂ ਸਾਡਾ ਗਿਆਨ ਗ੍ਰਾਫ ਤਿਆਰ ਹੋ ਗਿਆ ਹੈ, ਆਓ ਵੇਖੀਏ ਕਿ Cognee ਕਿਵੇਂ ਕਈ ਸਰੋਤਾਂ ਤੋਂ ਜਾਣਕਾਰੀ ਨੂੰ ਜੋੜ ਕੇ ਜਟਿਲ ਸਵਾਲਾਂ ਦੇ ਜਵਾਬ ਦਿੰਦਾ ਹੈ।\n", + "\n", + "ਪਹਿਲੀ ਕਵੈਰੀ ਇਹ ਦਰਸਾਉਂਦੀ ਹੈ:\n", + "- **ਸਮਾਂਝਦਾਰ ਸਮਝ**: ਸਬੰਧਤ ਧਾਰਨਾਵਾਂ ਲੱਭਣਾ ਭਾਵੇਂ ਉਹ ਸਿੱਧੇ ਤੌਰ 'ਤੇ ਜ਼ਿਕਰ ਨਾ ਕੀਤੀਆਂ ਗਈਆਂ ਹੋਣ\n", + "- **ਕ੍ਰਾਸ-ਰੈਫਰੈਂਸਿੰਗ**: ਡਿਵੈਲਪਰ ਪ੍ਰੋਫਾਈਲ ਨੂੰ Python ਦੇ ਸਿਧਾਂਤਾਂ ਨਾਲ ਜੋੜਨਾ\n", + "- **ਸੰਦਰਭਕ ਤਰਕ**: ਖਾਸ ਇੰਪਲੀਮੈਂਟੇਸ਼ਨ ਲਈ ਵਧੀਆ ਅਭਿਆਸ ਲਾਗੂ ਕਰਨਾ\n", + "\n", + "### ਡੈਮੋ 2: NodeSets ਨਾਲ ਫਿਲਟਰ ਕੀਤੀ ਖੋਜ\n", + "\n", + "ਦੂਜੀ ਕਵੈਰੀ ਇਹ ਦਰਸਾਉਂਦੀ ਹੈ ਕਿ ਗਿਆਨ ਗ੍ਰਾਫ ਦੇ ਖਾਸ ਹਿੱਸਿਆਂ ਨੂੰ ਕਿਵੇਂ ਨਿਸ਼ਾਨਾ ਬਣਾਇਆ ਜਾ ਸਕਦਾ ਹੈ:\n", + "- `node_name` ਪੈਰਾਮੀਟਰ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਸਿਰਫ਼ `principles_data` ਵਿੱਚ ਖੋਜ ਕਰਦਾ ਹੈ\n", + "- ਖਾਸ ਗਿਆਨ ਖੇਤਰ ਤੋਂ ਕੇਂਦਰਿਤ ਜਵਾਬ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ\n", + "- ਜਦੋਂ ਤੁਹਾਨੂੰ ਖੇਤਰ-ਵਿਸ਼ੇਸ਼ ਜਾਣਕਾਰੀ ਦੀ ਲੋੜ ਹੋਵੇ, ਤਾਂ ਇਹ ਲਾਭਦਾਇਕ ਹੈ\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 ਭਾਗ 3: ਸੈਸ਼ਨ ਮੈਨੇਜਮੈਂਟ ਸੈਟਅੱਪ\n", + "\n", + "### ਗੱਲਬਾਤ ਦੀ ਯਾਦਸ਼ਕਤੀ ਚਾਲੂ ਕਰਨਾ\n", + "\n", + "ਸੈਸ਼ਨ ਮੈਨੇਜਮੈਂਟ ਕਈ ਵਾਰ ਦੀ ਗੱਲਬਾਤਾਂ ਵਿੱਚ ਸੰਦਰਭ ਬਣਾਈ ਰੱਖਣ ਲਈ ਬਹੁਤ ਜ਼ਰੂਰੀ ਹੈ। ਇੱਥੇ ਅਸੀਂ ਇਹ ਕਰਾਂਗੇ:\n", + "\n", + "1. **ਯੂਜ਼ਰ ਸੰਦਰਭ ਸ਼ੁਰੂ ਕਰੋ**: ਸੈਸ਼ਨ ਟ੍ਰੈਕਿੰਗ ਲਈ ਯੂਜ਼ਰ ਪ੍ਰੋਫਾਈਲ ਬਣਾਓ ਜਾਂ ਪ੍ਰਾਪਤ ਕਰੋ\n", + "2. **ਕੈਸ਼ ਇੰਜਨ ਕਨਫਿਗਰ ਕਰੋ**: ਗੱਲਬਾਤ ਦੇ ਇਤਿਹਾਸ ਨੂੰ ਸਟੋਰ ਕਰਨ ਲਈ Redis ਨਾਲ ਕਨੈਕਟ ਕਰੋ\n", + "3. **ਸੈਸ਼ਨ ਵੈਰੀਏਬਲ ਚਾਲੂ ਕਰੋ**: ਸੰਦਰਭ ਵੈਰੀਏਬਲ ਸੈਟਅੱਪ ਕਰੋ ਜੋ ਪ੍ਰਸ਼ਨਾਂ ਦੇ ਵਿਚਕਾਰ ਬਣੇ ਰਹਿੰਦੇ ਹਨ\n", + "\n", + "> ⚠️ **ਮਹੱਤਵਪੂਰਨ**: ਇਸ ਲਈ Redis ਚੱਲ ਰਿਹਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ ਅਤੇ ਤੁਹਾਡੇ ਵਾਤਾਵਰਣ ਵਿੱਚ `CACHING=true` ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ ਸਹਾਇਕ ਫੰਕਸ਼ਨ: ਸੈਸ਼ਨ ਇਤਿਹਾਸ ਵੇਖੋ\n", + "\n", + "ਇਹ ਯੂਟਿਲਿਟੀ ਫੰਕਸ਼ਨ ਸਾਨੂੰ Redis ਵਿੱਚ ਸਟੋਰ ਕੀਤੀ ਗਈ ਗੱਲਬਾਤ ਦੇ ਇਤਿਹਾਸ ਦੀ ਜਾਂਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਹੇਠਾਂ ਦਿੱਤੇ ਲਈ ਲਾਭਦਾਇਕ ਹੈ:\n", + "- ਸੈਸ਼ਨ ਪ੍ਰਬੰਧਨ ਦੀ ਡਿਬੱਗਿੰਗ\n", + "- ਇਹ ਪੱਕਾ ਕਰਨਾ ਕਿ ਗੱਲਬਾਤਾਂ ਕੈਸ਼ ਕੀਤੀਆਂ ਜਾ ਰਹੀਆਂ ਹਨ\n", + "- ਸਮਝਣਾ ਕਿ ਏਜੰਟ ਲਈ ਕਿਹੜਾ ਸੰਦਰਭ ਉਪਲਬਧ ਹੈ\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## ਸੈਸ਼ਨ 1: ਐਸਿੰਕ ਸਪੋਰਟ ਲੈਬ — ਪਹਿਲਾ ਸਵਾਲ\n", + "\n", + "`async-support-lab` ਸੈਸ਼ਨ ਦੀ ਸ਼ੁਰੂਆਤ ਇਸ ਸਵਾਲ ਨਾਲ ਕਰੋ ਕਿ ਵੱਡੇ ਵੈੱਬ ਸਕ੍ਰੇਪਰ ਲਈ ਟੈਲੀਮੇਟਰੀ-ਫ੍ਰੈਂਡਲੀ asyncio ਪੈਟਰਨ ਕੀ ਹਨ। ਗ੍ਰਾਫ ਪਹਿਲਾਂ ਹੀ asyncio, aiohttp, ਅਤੇ ਮਾਨੀਟਰਿੰਗ ਪ੍ਰੈਕਟਿਸਜ਼ ਬਾਰੇ ਜਾਣਦਾ ਹੈ, ਇਸ ਲਈ ਜਵਾਬ ਪਹਿਲਾਂ ਦੀਆਂ ਗੱਲਬਾਤਾਂ ਨੂੰ ਧਿਆਨ ਵਿੱਚ ਰੱਖਦੇ ਹੋਏ ਨਵੇਂ ਸਵਾਲ ਲਈ ਖਾਸ ਤੌਰ 'ਤੇ ਤਿਆਰ ਕੀਤਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## ਪਹਿਲੇ ਸਵਾਲ ਦੇ ਬਾਅਦ ਸੈਸ਼ਨ 1 ਦੀ ਮੈਮੋਰੀ ਦੀ ਜਾਂਚ ਕਰੋ\n", + "\n", + "ਪਹਿਲੇ ਸਵਾਲ ਦੇ ਤੁਰੰਤ ਬਾਅਦ `show_history(session_1)` ਚਲਾਉਣ ਨਾਲ ਇਹ ਪੱਕਾ ਹੁੰਦਾ ਹੈ ਕਿ Cognee ਨੇ ਪ੍ਰਾਰੰਭਿਕ ਸਵਾਲ ਅਤੇ ਜਵਾਬ ਦੋਵੇਂ Redis ਵਿੱਚ ਲਿਖੇ ਹਨ। ਤੁਹਾਨੂੰ ਇੱਕ ਐਂਟਰੀ concurrency guidance ਨਾਲ ਦੇਖਣੀ ਚਾਹੀਦੀ ਹੈ।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## ਸੈਸ਼ਨ 1: ਡਾਟਾ ਮਾਡਲਾਂ 'ਤੇ ਫਾਲੋ-ਅੱਪ\n", + "\n", + "ਅਗਲਾ ਸਵਾਲ ਹੈ, \"ਮੈਨੂੰ ਕਦੋਂ dataclasses ਦੀ ਬਜਾਏ Pydantic ਚੁਣਨਾ ਚਾਹੀਦਾ ਹੈ?\" ਇਸੇ ਸੈਸ਼ਨ ਆਈਡੀ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ। Cognee ਨੂੰ Python ਦੇ ਸਿਧਾਂਤਾਂ ਅਤੇ ਪਹਿਲਾਂ ਹੋਈਆਂ FastAPI ਗੱਲਬਾਤਾਂ ਨੂੰ ਜੋੜ ਕੇ ਵਿਸਥਾਰਪੂਰਵਕ ਸਲਾਹ ਦੇਣੀ ਚਾਹੀਦੀ ਹੈ—ਇਸ ਗੱਲ ਨੂੰ ਦਰਸਾਉਂਦਿਆਂ ਕਿ ਨਾਂਵਰ ਸੈਸ਼ਨ ਦੇ ਅੰਦਰ ਸੰਦਰਭ ਜਾਰੀ ਰਹਿੰਦਾ ਹੈ।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## ਸੈਸ਼ਨ 1 ਦੇ ਇਤਿਹਾਸ ਵਿੱਚ ਦੋਵੇਂ ਪਾਸੇ ਦੀ ਗੱਲਬਾਤ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ\n", + "\n", + "ਇੱਕ ਹੋਰ ਵਾਰ `show_history(session_1)` ਕਾਲ ਕਰਨ ਨਾਲ ਦੋ ਪ੍ਰਸ਼ਨ ਅਤੇ ਉੱਤਰ ਦੇ ਐਂਟਰੀਜ਼ ਦਿਖਾਈ ਦੇਣੇ ਚਾਹੀਦੇ ਹਨ। ਇਹ Mem0 ਲੈਬ ਦੇ \"ਮੈਮੋਰੀ ਰੀਪਲੇ\" ਕਦਮ ਨਾਲ ਮੇਲ ਖਾਂਦਾ ਹੈ ਅਤੇ ਸਾਬਤ ਕਰਦਾ ਹੈ ਕਿ ਵਾਧੂ ਗੱਲਬਾਤਾਂ ਇੱਕੋ ਟ੍ਰਾਂਸਕ੍ਰਿਪਟ ਨੂੰ ਅੱਗੇ ਵਧਾਉਂਦੀਆਂ ਹਨ।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## ਸੈਸ਼ਨ 2: ਡਿਜ਼ਾਈਨ ਰਿਵਿਊ ਥ੍ਰੈਡ — ਨਵੀਂ ਸੈਸ਼ਨ\n", + "\n", + "ਥ੍ਰੈਡਾਂ ਦੇ ਵਿਚਕਾਰ ਅਲੱਗਾਵ ਦਿਖਾਉਣ ਲਈ ਅਸੀਂ `design-review-session` ਚਲਾਉਂਦੇ ਹਾਂ ਅਤੇ ਘਟਨਾ ਸਮੀਖਿਆਵਾਂ ਲਈ ਲੌਗਿੰਗ ਮਾਰਗਦਰਸ਼ਨ ਮੰਗਦੇ ਹਾਂ। ਹਾਲਾਂਕਿ ਅਧਾਰਭੂਤ ਗਿਆਨ ਅਧਾਰ ਇੱਕੋ ਜਿਹਾ ਹੈ, ਨਵਾਂ ਸੈਸ਼ਨ ਆਈਡੀ ਟ੍ਰਾਂਸਕ੍ਰਿਪਟਾਂ ਨੂੰ ਵੱਖਰਾ ਰੱਖਦਾ ਹੈ।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## ਸੈਸ਼ਨ 2 ਇਤਿਹਾਸ ਦੀ ਸਮੀਖਿਆ\n", + "\n", + "`show_history(session_2)` ਸਿਰਫ ਡਿਜ਼ਾਈਨ-ਸਮੀਖਿਆ ਪ੍ਰੰਪਟ/ਜਵਾਬ ਜੋੜੇ ਨੂੰ ਹੀ ਦਿਖਾਉਣਾ ਚਾਹੀਦਾ ਹੈ। ਇਸਨੂੰ ਸੈਸ਼ਨ 1 ਨਾਲ ਤੁਲਨਾ ਕਰੋ ਤਾਂ ਜੋ ਇਹ ਦਰਸਾਇਆ ਜਾ ਸਕੇ ਕਿ Cognee ਕਿਵੇਂ ਸਾਂਝੇ ਗਿਆਨ ਗ੍ਰਾਫ ਨੂੰ ਦੁਬਾਰਾ ਵਰਤਦੇ ਹੋਏ ਸੁਤੰਤਰ ਤਰਾਂ ਟ੍ਰਾਂਸਕ੍ਰਿਪਟਸ ਰੱਖਦਾ ਹੈ।\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## ਸਾਰ\n", + "\n", + "ਵਧਾਈ ਹੋਵੇ! ਤੁਸੀਂ ਆਪਣੇ ਕੋਡਿੰਗ ਸਹਾਇਕ ਨੂੰ Cognee ਦੀ ਮਦਦ ਨਾਲ ਇੱਕ ਅਸਲੀ ਲੰਬੇ ਸਮੇਂ ਦੀ ਯਾਦ ਦੀ ਪਰਤ ਦਿੱਤੀ ਹੈ।\n", + "\n", + "ਇਸ ਟਿਊਟੋਰੀਅਲ ਵਿੱਚ ਤੁਸੀਂ ਕੱਚੇ ਡਿਵੈਲਪਰ ਸਮੱਗਰੀ (ਕੋਡ, ਦਸਤਾਵੇਜ਼, ਗੱਲਬਾਤਾਂ) ਨੂੰ ਇੱਕ ਗ੍ਰਾਫ + ਵੈਕਟਰ ਯਾਦ ਵਿੱਚ ਬਦਲਿਆ, ਜਿਸਨੂੰ ਤੁਹਾਡਾ ਏਜੰਟ ਖੋਜ ਸਕਦਾ ਹੈ, ਸਮਝ ਸਕਦਾ ਹੈ, ਅਤੇ ਲਗਾਤਾਰ ਸੁਧਾਰ ਸਕਦਾ ਹੈ।\n", + "\n", + "ਤੁਸੀਂ ਕੀ ਸਿੱਖਿਆ\n", + "\n", + "1. **ਕੱਚੇ ਟੈਕਸਟ ਤੋਂ AI ਯਾਦ ਤੱਕ**: Cognee ਕਿਵੇਂ ਅਸੰਰਚਿਤ ਡਾਟਾ ਨੂੰ ਲੈ ਕੇ ਇਸਨੂੰ ਸਮਝਦਾਰ, ਖੋਜਯੋਗ ਯਾਦ ਵਿੱਚ ਬਦਲਦਾ ਹੈ, ਜੋ ਕਿ ਵੈਕਟਰ + ਨੌਲਿਜ ਗ੍ਰਾਫ ਆਰਕੀਟੈਕਚਰ ਦੇ ਸਹਿਯੋਗ ਨਾਲ ਹੁੰਦਾ ਹੈ।\n", + "\n", + "2. **ਮੈਮੀਫਾਈ ਨਾਲ ਗ੍ਰਾਫ ਸੰਵਰਧਨ**: ਬੇਸਿਕ ਗ੍ਰਾਫ ਬਣਾਉਣ ਤੋਂ ਅੱਗੇ ਜਾ ਕੇ ਮੈਮੀਫਾਈ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਮੌਜੂਦਾ ਗ੍ਰਾਫ 'ਤੇ ਨਿਕਲੇ ਹੋਏ ਤੱਥ ਅਤੇ ਹੋਰ ਗਹਿਰੇ ਸੰਬੰਧ ਜੋੜਨ ਦਾ ਤਰੀਕਾ।\n", + "\n", + "3. **ਕਈ ਖੋਜ ਰਣਨੀਤੀਆਂ**: ਵੱਖ-ਵੱਖ ਖੋਜ ਪ੍ਰਕਾਰਾਂ (ਗ੍ਰਾਫ-ਅਵੇਅਰ Q&A, RAG-ਸਟਾਈਲ ਕੰਪਲੀਸ਼ਨ, ਅੰਦਰੂਨੀ ਜਾਣਕਾਰੀ, ਕੱਚੇ ਚੰਕਸ, ਕੋਡ ਖੋਜ ਆਦਿ) ਨਾਲ ਯਾਦ ਨੂੰ ਕਿਵੇਂ ਪੁੱਛਣਾ ਹੈ, ਇਹ ਤੁਹਾਡੇ ਏਜੰਟ ਦੀ ਲੋੜਾਂ 'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ।\n", + "\n", + "4. **ਦ੍ਰਿਸ਼ਮਾਨ ਪੜਚੋਲ**: ਗ੍ਰਾਫ ਵਿਜੁਅਲਾਈਜ਼ੇਸ਼ਨ ਅਤੇ Cognee UI ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਜੋ Cognee ਨੇ ਬਣਾਇਆ ਹੈ ਉਸਨੂੰ ਕਿਵੇਂ ਜਾਂਚਣਾ ਅਤੇ ਡਿਬੱਗ ਕਰਨਾ ਹੈ, ਤਾਂ ਜੋ ਤੁਸੀਂ ਅਸਲ ਵਿੱਚ ਦੇਖ ਸਕੋ ਕਿ ਗਿਆਨ ਕਿਵੇਂ ਸੰਰਚਿਤ ਹੈ।\n", + "\n", + "5. **ਸੈਸ਼ਨ-ਅਵੇਅਰ ਯਾਦ**: ਪ੍ਰਤੀ ਸੈਸ਼ਨ ਸੰਦਰਭ ਨੂੰ ਸਥਾਈ ਸੈਮੈਂਟਿਕ ਯਾਦ ਨਾਲ ਜੋੜਨ ਦਾ ਤਰੀਕਾ, ਤਾਂ ਜੋ ਏਜੰਟ ਵੱਖ-ਵੱਖ ਯੂਜ਼ਰਾਂ ਦੇ ਵਿਚਕਾਰ ਜਾਣਕਾਰੀ ਲੀਕ ਕੀਤੇ ਬਿਨਾਂ ਦੌਰਾਨ ਯਾਦ ਰੱਖ ਸਕਣ।\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## ਮੁੱਖ ਗੱਲਾਂ\n", + "1. ਮੈਮੋਰੀ ਨੂੰ ਨੋਲਿਜ ਗ੍ਰਾਫ ਵਜੋਂ ਵਰਤਣਾ, ਜੋ ਐਮਬੈਡਿੰਗ ਨਾਲ ਸਹਾਇਕ ਹੈ\n", + "\n", + " - **ਸੰਰਚਿਤ ਸਮਝ**: Cognee ਇੱਕ ਵੈਕਟਰ ਸਟੋਰ ਅਤੇ ਗ੍ਰਾਫ ਸਟੋਰ ਨੂੰ ਜੋੜਦਾ ਹੈ ਤਾਂ ਜੋ ਤੁਹਾਡਾ ਡਾਟਾ ਅਰਥ ਦੇ ਅਧਾਰ 'ਤੇ ਖੋਜਯੋਗ ਹੋਵੇ ਅਤੇ ਰਿਸ਼ਤਿਆਂ ਦੁਆਰਾ ਜੁੜਿਆ ਹੋਵੇ। Cognee ਡਿਫਾਲਟ ਰੂਪ ਵਿੱਚ ਫਾਈਲ-ਅਧਾਰਿਤ ਡਾਟਾਬੇਸ ਵਰਤਦਾ ਹੈ (ਵੈਕਟਰ ਲਈ LanceDB, ਗ੍ਰਾਫ ਡਾਟਾਬੇਸ ਲਈ Kuzu)।\n", + "\n", + " - **ਰਿਸ਼ਤਾ-ਜਾਗਰੂਕ ਰਿਟਰੀਵਲ**: ਜਵਾਬ ਸਿਰਫ \"ਮਿਲਦੇ-ਜੁਲਦੇ ਟੈਕਸਟ\" 'ਤੇ ਹੀ ਨਹੀਂ, ਸਗੋਂ ਇਹ ਵੀ ਕਿ ਇਕਾਈਆਂ ਕਿਵੇਂ ਜੁੜੀਆਂ ਹਨ, ਇਸ 'ਤੇ ਅਧਾਰਿਤ ਹੋ ਸਕਦੇ ਹਨ।\n", + "\n", + " - **ਜੀਵੰਤ ਮੈਮੋਰੀ**: ਮੈਮੋਰੀ ਲੇਅਰ ਵਿਕਸਿਤ ਹੁੰਦੀ ਹੈ, ਵਧਦੀ ਹੈ, ਅਤੇ ਇੱਕ ਜੁੜੇ ਗ੍ਰਾਫ ਵਜੋਂ ਸਵਾਲ ਕਰਨ ਯੋਗ ਰਹਿੰਦੀ ਹੈ।\n", + "\n", + "2. ਖੋਜ ਅਤੇ ਤਰਕ ਦੇ ਮੋਡ\n", + " - **ਹਾਈਬ੍ਰਿਡ ਰਿਟਰੀਵਲ**: ਖੋਜ ਵੈਕਟਰ ਸਮਾਨਤਾ, ਗ੍ਰਾਫ ਸਟ੍ਰਕਚਰ, ਅਤੇ LLM ਤਰਕ ਨੂੰ ਮਿਲਾਉਂਦੀ ਹੈ, ਕੱਚੇ ਚੰਕ ਲੁਕਅੱਪ ਤੋਂ ਗ੍ਰਾਫ-ਜਾਗਰੂਕ ਸਵਾਲ ਜਵਾਬ ਤੱਕ।\n", + "\n", + " - **ਕੰਮ ਦੇ ਅਨੁਸਾਰ ਮੋਡ ਚੁਣੋ**: ਜਦੋਂ ਤੁਹਾਨੂੰ ਕੁਦਰਤੀ ਭਾਸ਼ਾ ਦੇ ਜਵਾਬ ਚਾਹੀਦੇ ਹਨ ਤਾਂ ਕੰਪਲੀਸ਼ਨ-ਸਟਾਈਲ ਮੋਡ ਵਰਤੋ, ਅਤੇ ਜਦੋਂ ਤੁਹਾਡਾ ਏਜੰਟ ਕੱਚੇ ਸੰਦਰਭ ਜਾਂ ਆਪਣੇ ਤਰਕ ਨੂੰ ਚਲਾਉਣ ਲਈ ਚਾਹੁੰਦਾ ਹੈ ਤਾਂ ਚੰਕ/ਸੰਖੇਪ/ਗ੍ਰਾਫ ਮੋਡ ਵਰਤੋ।\n", + "\n", + "3. ਨਿੱਜੀਕਰਤ, ਸੈਸ਼ਨ-ਜਾਗਰੂਕ ਏਜੰਟ\n", + " - **ਸੈਸ਼ਨ ਸੰਦਰਭ + ਲੰਬੇ ਸਮੇਂ ਦੀ ਮੈਮੋਰੀ**: Cognee ਛੋਟੇ ਸਮੇਂ ਦੇ \"ਥ੍ਰੈਡ\" ਸੰਦਰਭ ਨੂੰ ਲੰਬੇ ਸਮੇਂ ਦੀ, ਯੂਜ਼ਰ- ਜਾਂ ਸੰਗਠਨ-ਪੱਧਰ ਦੀ ਮੈਮੋਰੀ ਤੋਂ ਵੱਖ ਰੱਖਦਾ ਹੈ।\n", + "\n", + "## ਅਸਲ ਦੁਨੀਆ ਦੇ ਐਪਲੀਕੇਸ਼ਨ\n", + "\n", + "1. **ਵਰਟੀਕਲ AI ਏਜੰਟ**\n", + "\n", + " ਇਸ ਨੋਟਬੁੱਕ ਦੇ ਪੈਟਰਨ ਨੂੰ ਵਰਤ ਕੇ ਡੋਮੇਨ-ਸਮਾਰਟ ਕੋਪਾਇਲਟਸ ਨੂੰ ਪਾਵਰ ਕਰੋ ਜੋ Cognee ਦੇ ਰਿਟਰੀਵਲ ਅਤੇ ਤਰਕ ਦੇ ਕੋਰ 'ਤੇ ਕੰਮ ਕਰਦੇ ਹਨ:\n", + "\n", + "- **ਡਿਵੈਲਪਰ ਕੋਪਾਇਲਟਸ**: ਕੋਡ ਰਿਵਿਊ, ਇਨਸਿਡੈਂਟ ਵਿਸ਼ਲੇਸ਼ਣ, ਅਤੇ ਆਰਕੀਟੈਕਚਰ ਸਹਾਇਕ ਜੋ ਕੋਡ, APIs, ਡਿਜ਼ਾਈਨ ਡੌਕਸ, ਅਤੇ ਟਿਕਟਸ ਨੂੰ ਇੱਕ ਮੈਮੋਰੀ ਗ੍ਰਾਫ ਵਜੋਂ ਪਾਰ ਕਰਦੇ ਹਨ।\n", + "\n", + "- **ਗਾਹਕ-ਸੰਬੰਧਤ ਕੋਪਾਇਲਟਸ**: ਸਪੋਰਟ ਜਾਂ ਸਫਲਤਾ ਏਜੰਟ ਜੋ ਉਤਪਾਦ ਡੌਕਸ, FAQs, CRM ਨੋਟਸ, ਅਤੇ ਪਿਛਲੇ ਟਿਕਟਸ ਤੋਂ ਗ੍ਰਾਫ-ਜਾਗਰੂਕ ਰਿਟਰੀਵਲ ਅਤੇ ਸੰਦਰਭਿਤ ਜਵਾਬ ਖਿੱਚਦੇ ਹਨ।\n", + "\n", + "- **ਅੰਦਰੂਨੀ ਵਿਸ਼ੇਸ਼ਗਿਆ ਕੋਪਾਇਲਟਸ**: ਨੀਤੀ, ਕਾਨੂੰਨੀ, ਜਾਂ ਸੁਰੱਖਿਆ ਸਹਾਇਕ ਜੋ ਅਲੱਗ-ਅਲੱਗ PDFs ਦੀ ਬਜਾਏ ਜੁੜੇ ਹੋਏ ਨਿਯਮਾਂ, ਦਿਸ਼ਾ-ਨਿਰਦੇਸ਼ਾਂ, ਅਤੇ ਇਤਿਹਾਸਕ ਫੈਸਲਿਆਂ 'ਤੇ ਤਰਕ ਕਰਦੇ ਹਨ।\n", + "\n", + " Cognee ਨੂੰ AI ਏਜੰਟਸ ਲਈ ਸਥਾਈ, ਸਹੀ ਮੈਮੋਰੀ ਵਜੋਂ ਸਪਸ਼ਟ ਤੌਰ 'ਤੇ ਪੋਜ਼ ਕੀਤਾ ਗਿਆ ਹੈ, ਜੋ ਇੱਕ ਜੀਵੰਤ ਨੋਲਿਜ ਗ੍ਰਾਫ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ ਜੋ ਤੁਹਾਡੇ ਏਜੰਟ ਦੇ ਪਿੱਛੇ ਫਿੱਟ ਹੁੰਦਾ ਹੈ ਅਤੇ ਵੈਕਟਰ ਸਟੋਰ ਅਤੇ ਕਸਟਮ ਗ੍ਰਾਫ ਕੋਡ ਦੇ ਐਡ-ਹੌਕ ਕੌਂਬੀਨੇਸ਼ਨ ਨੂੰ ਬਦਲਦਾ ਹੈ।\n", + "\n", + "2. **ਡਾਟਾ ਸਿਲੋਜ਼ ਨੂੰ ਇੱਕ ਮੈਮੋਰੀ ਵਿੱਚ ਇਕੱਠਾ ਕਰਨਾ**\n", + "\n", + " ਇਹੀ ਪਹੁੰਚ ਤੁਹਾਨੂੰ ਵੱਖ-ਵੱਖ ਸਰੋਤਾਂ 'ਤੇ ਇੱਕਜੁਟ ਮੈਮੋਰੀ ਲੇਅਰ ਬਣਾਉਣ ਵਿੱਚ ਵੀ ਮਦਦ ਕਰਦੀ ਹੈ:\n", + "\n", + "- **ਸਿਲੋਜ਼ ਤੋਂ ਇੱਕ ਗ੍ਰਾਫ ਤੱਕ**: ਸੰਰਚਿਤ (ਜਿਵੇਂ ਕਿ ਡਾਟਾਬੇਸ) ਅਤੇ ਅਸੰਰਚਿਤ ਡਾਟਾ (ਜਿਵੇਂ ਕਿ ਡੌਕਸ, ਚੈਟਸ) ਨੂੰ ਇੱਕ ਗ੍ਰਾਫ ਵਿੱਚ ਐਮਬੈਡਿੰਗ ਦੁਆਰਾ ਪਾਠਿਤ ਕਰੋ, ਹਰ ਸਿਸਟਮ ਲਈ ਵੱਖ-ਵੱਖ ਇੰਡੈਕਸ ਦੀ ਬਜਾਏ।\n", + "\n", + "- **ਸੰਦਰਭ ਦੇ ਨਾਲ ਸਰੋਤਾਂ ਦੇ ਪਾਰ ਤਰਕ**: ਹਰ ਚੀਜ਼ 'ਤੇ ਮਲਟੀ-ਸਟੈਪ ਤਰਕ ਚਲਾਓ—ਲੌਗਸ, ਮੈਟ੍ਰਿਕਸ, ਅਤੇ ਡੌਕਸ ਨੂੰ ਗ੍ਰਾਫ ਦੁਆਰਾ \"ਜੋੜੋ\"—ਅਤੇ ਫਿਰ ਵੀ ਸੰਦਰਭ ਦੇ ਨਾਲ ਜਵਾਬ ਵਾਪਸ ਕਰੋ।\n", + "\n", + "- **ਨੋਲਿਜ ਹੱਬਸ**: ਬੈਂਕਿੰਗ ਜਾਂ ਸਿੱਖਿਆ ਵਰਗੇ ਖੇਤਰਾਂ ਲਈ, Cognee ਪਹਿਲਾਂ ਹੀ PDFs, ਅੰਦਰੂਨੀ ਸਿਸਟਮ, ਅਤੇ ਐਪ ਡਾਟਾ ਨੂੰ ਇੱਕ ਨੋਲਿਜ ਗ੍ਰਾਫ ਵਿੱਚ ਇਕੱਠਾ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ ਜਿਸ ਵਿੱਚ ਵੈਕਟਰ ਹੁੰਦੇ ਹਨ ਤਾਂ ਜੋ ਏਜੰਟ ਸ正ੀ, ਸੰਦਰਭਿਤ ਸੰਦਰਭ ਦੇ ਨਾਲ ਸਵਾਲਾਂ ਦੇ ਜਵਾਬ ਦੇ ਸਕਣ।\n", + "\n", + "## ਅਗਲੇ ਕਦਮ\n", + "\n", + "ਤੁਸੀਂ ਕੋਰ ਮੈਮੋਰੀ ਲੂਪ ਨੂੰ ਲਾਗੂ ਕਰ ਲਿਆ ਹੈ। ਇੱਥੇ ਕੁਝ ਕੁਦਰਤੀ ਵਧਾਵੇ ਹਨ ਜੋ ਤੁਸੀਂ ਆਪਣੇ ਆਪ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਸਕਦੇ ਹੋ (ਵੇਖੋ [Cognee ਦਸਤਾਵੇਜ਼](https://docs.cognee.ai/) ਵਿਸਥਾਰ ਲਈ):\n", + "\n", + "1. **ਟੈਂਪੋਰਲ ਜਾਗਰੂਕਤਾ ਨਾਲ ਪ੍ਰਯੋਗ ਕਰੋ**: ਟੈਂਪੋਰਲ ਕੌਗਨਿਫਾਈ ਚਾਲੂ ਕਰੋ ਤਾਂ ਜੋ ਟੈਕਸਟ ਤੋਂ ਘਟਨਾਵਾਂ ਅਤੇ ਟਾਈਮਸਟੈਂਪਸ ਨਿਕਾਲੇ ਜਾ ਸਕਣ।\n", + "\n", + "2. **ਓਨਟੋਲੋਜੀ-ਚਲਿਤ ਤਰਕ ਸ਼ੁਰੂ ਕਰੋ**: ਆਪਣੇ ਖੇਤਰ ਲਈ ਇੱਕ OWL ਓਨਟੋਲੋਜੀ ਪਰਿਭਾਸ਼ਿਤ ਕਰੋ। Cognee ਦੇ ਓਨਟੋਲੋਜੀ ਸਹਾਇਤਾ ਨੂੰ ਵਰਤੋ ਤਾਂ ਜੋ ਨਿਕਾਲੇ ਗਏ ਇਕਾਈਆਂ ਅਤੇ ਰਿਸ਼ਤੇ ਉਸ ਸਕੀਮਾ ਵਿੱਚ ਜੁੜੇ ਹੋਣ, ਗ੍ਰਾਫ ਦੀ ਗੁਣਵੱਤਾ ਅਤੇ ਖੇਤਰ-ਵਿਸ਼ੇਸ਼ ਜਵਾਬਾਂ ਨੂੰ ਸੁਧਾਰਦੇ ਹੋਏ।\n", + "\n", + "3. **ਫੀਡਬੈਕ ਲੂਪ ਸ਼ਾਮਲ ਕਰੋ**: Cognee ਨੂੰ ਅਸਲੀ ਯੂਜ਼ਰ ਫੀਡਬੈਕ ਤੋਂ ਗ੍ਰਾਫ ਐਜ ਵਜ਼ਨ ਨੂੰ ਸਮਾਅਨ ਕਰਨ ਦਿਓ, ਤਾਂ ਜੋ ਰਿਟਰੀਵਲ ਸਮੇਂ ਦੇ ਨਾਲ ਸੁਧਾਰਦਾ ਰਹੇ, ਸਥਿਰ ਨਾ ਰਹੇ।\n", + "\n", + "4. **ਨਿੱਜੀਕਰਨ ਅਤੇ ਸੈਸ਼ਨ ਵਿਹਾਰ ਲਈ ਟਿਊਨ ਕਰੋ**: ਯੂਜ਼ਰ IDs, ਟੈਨੈਂਟਸ, ਅਤੇ ਡਾਟਾਸੈਟਸ ਨੂੰ ਵਰਤੋ ਤਾਂ ਜੋ ਹਰ ਵਿਅਕਤੀ ਜਾਂ ਟੀਮ ਨੂੰ ਸਾਂਝੇ ਮੈਮੋਰੀ ਇੰਜਨ 'ਤੇ ਆਪਣਾ ਦ੍ਰਿਸ਼ਟੀਕੋਣ ਮਿਲੇ।\n", + "\n", + "5. **ਵਧੇਰੇ ਜਟਿਲ ਏਜੰਟਸ ਲਈ ਸਕੇਲ ਕਰੋ**: Cognee ਨੂੰ ਏਜੰਟ ਫਰੇਮਵਰਕਸ ਵਿੱਚ ਪਲੱਗ ਕਰੋ ਤਾਂ ਜੋ ਬਹੁ-ਏਜੰਟ ਸਿਸਟਮ ਬਣਾਏ ਜਾ ਸਕਣ ਜੋ ਸਾਰੇ ਇੱਕੋ ਮੈਮੋਰੀ ਲੇਅਰ ਨੂੰ ਸਾਂਝਾ ਕਰਦੇ ਹਨ। *Microsoft Agent Framework x Cognee plugin ਜਲਦੀ ਆ ਰਿਹਾ ਹੈ।*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**ਅਸਵੀਕਰਤਾ**: \nਇਹ ਦਸਤਾਵੇਜ਼ AI ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀ ਹੋਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸੁਚਤਤਾਵਾਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਮੂਲ ਦਸਤਾਵੇਜ਼ ਨੂੰ ਇਸਦੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਅਧਿਕਾਰਤ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਅਸੀਂ ਇਸ ਅਨੁਵਾਦ ਦੀ ਵਰਤੋਂ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਗਲਤ ਫਹਿਮੀ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆ ਲਈ ਜ਼ਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ।\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:45:39+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "pa" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/pa/13-agent-memory/README.md b/translations/pa/13-agent-memory/README.md index e38c92432..ff77a1d50 100644 --- a/translations/pa/13-agent-memory/README.md +++ b/translations/pa/13-agent-memory/README.md @@ -1,134 +1,142 @@ -# AI ਏਜੰਟਾਂ ਲਈ ਮੈਮੋਰੀ -[![Agent Memory](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.pa.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) +# ਏਆਈ ਏਜੰਟਾਂ ਲਈ ਮੈਮੋਰੀ +[![ਏਜੰਟ ਮੈਮੋਰੀ](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.pa.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -ਜਦੋਂ AI ਏਜੰਟਾਂ ਬਣਾਉਣ ਦੇ ਵਿਸ਼ੇਸ਼ ਫਾਇਦਿਆਂ ਦੀ ਗੱਲ ਕੀਤੀ ਜਾਂਦੀ ਹੈ, ਤਾਂ ਮੁੱਖ ਤੌਰ 'ਤੇ ਦੋ ਚੀਜ਼ਾਂ 'ਤੇ ਚਰਚਾ ਹੁੰਦੀ ਹੈ: ਟਾਸਕ ਪੂਰੇ ਕਰਨ ਲਈ ਟੂਲਜ਼ ਨੂੰ ਕਾਲ ਕਰਨ ਦੀ ਸਮਰਥਾ ਅਤੇ ਸਮੇਂ ਦੇ ਨਾਲ ਸੁਧਾਰ ਕਰਨ ਦੀ ਯੋਗਤਾ। ਮੈਮੋਰੀ ਉਹ ਅਧਾਰ ਹੈ ਜਿਸ 'ਤੇ ਸਵੈ-ਸੁਧਾਰ ਕਰਨ ਵਾਲੇ ਏਜੰਟ ਬਣਾਏ ਜਾਂਦੇ ਹਨ ਜੋ ਸਾਡੇ ਯੂਜ਼ਰਾਂ ਲਈ ਵਧੀਆ ਅਨੁਭਵ ਪੈਦਾ ਕਰ ਸਕਦੇ ਹਨ। +ਜਦੋਂ ਏਆਈ ਏਜੰਟਾਂ ਬਣਾਉਣ ਦੇ ਵਿਲੱਖਣ ਫਾਇਦਿਆਂ ਬਾਰੇ ਗੱਲ ਕੀਤੀ ਜਾਂਦੀ ਹੈ, ਤਾਂ ਮੁੱਖ ਤੌਰ 'ਤੇ ਦੋ ਗੱਲਾਂ 'ਤੇ ਚਰਚਾ ਹੁੰਦੀ ਹੈ: ਟਾਸਕ ਪੂਰੇ ਕਰਨ ਲਈ ਟੂਲ ਕਾਲ ਕਰਨ ਦੀ ਸਮਰੱਥਾ ਅਤੇ ਸਮੇਂ ਦੇ ਨਾਲ ਸੁਧਾਰ ਕਰਨ ਦੀ ਯੋਗਤਾ। ਮੈਮੋਰੀ ਇੱਕ ਸਵੈ-ਸੁਧਾਰਕ ਏਜੰਟ ਬਣਾਉਣ ਦੀ ਬੁਨਿਆਦ ਹੈ ਜੋ ਸਾਡੇ ਯੂਜ਼ਰਾਂ ਲਈ ਵਧੀਆ ਤਜਰਬੇ ਪੈਦਾ ਕਰ ਸਕੇ। -ਇਸ ਪਾਠ ਵਿੱਚ, ਅਸੀਂ ਦੇਖਾਂਗੇ ਕਿ AI ਏਜੰਟਾਂ ਲਈ ਮੈਮੋਰੀ ਕੀ ਹੈ ਅਤੇ ਅਸੀਂ ਇਸਨੂੰ ਕਿਵੇਂ ਪ੍ਰਬੰਧਿਤ ਕਰ ਸਕਦੇ ਹਾਂ ਅਤੇ ਇਸਨੂੰ ਆਪਣੇ ਐਪਲੀਕੇਸ਼ਨਾਂ ਦੇ ਫਾਇਦੇ ਲਈ ਕਿਵੇਂ ਵਰਤ ਸਕਦੇ ਹਾਂ। +ਇਸ ਪਾਠ ਵਿੱਚ, ਅਸੀਂ ਦੇਖਾਂਗੇ ਕਿ ਏਆਈ ਏਜੰਟਾਂ ਲਈ ਮੈਮੋਰੀ ਕੀ ਹੈ ਅਤੇ ਅਸੀਂ ਇਸਨੂੰ ਕਿਵੇਂ ਪ੍ਰਬੰਧਿਤ ਅਤੇ ਵਰਤ ਸਕਦੇ ਹਾਂ ਤਾਂ ਜੋ ਸਾਡੇ ਐਪਲੀਕੇਸ਼ਨਾਂ ਨੂੰ ਲਾਭ ਹੋਵੇ। -## ਪਰਚੇ +## ਪਰਿਚਯ ਇਸ ਪਾਠ ਵਿੱਚ ਇਹ ਕਵਰ ਕੀਤਾ ਜਾਵੇਗਾ: -• **AI ਏਜੰਟ ਮੈਮੋਰੀ ਨੂੰ ਸਮਝਣਾ**: ਮੈਮੋਰੀ ਕੀ ਹੈ ਅਤੇ ਇਹ ਏਜੰਟਾਂ ਲਈ ਕਿਉਂ ਜ਼ਰੂਰੀ ਹੈ। +• **ਏਆਈ ਏਜੰਟ ਮੈਮੋਰੀ ਦੀ ਸਮਝ**: ਮੈਮੋਰੀ ਕੀ ਹੈ ਅਤੇ ਇਹ ਏਜੰਟਾਂ ਲਈ ਕਿਉਂ ਜ਼ਰੂਰੀ ਹੈ। -• **ਮੈਮੋਰੀ ਨੂੰ ਲਾਗੂ ਕਰਨਾ ਅਤੇ ਸਟੋਰ ਕਰਨਾ**: ਆਪਣੇ AI ਏਜੰਟਾਂ ਵਿੱਚ ਮੈਮੋਰੀ ਸਮਰਥਾ ਸ਼ਾਮਲ ਕਰਨ ਦੇ ਵਿਹੰਗਮ ਤਰੀਕੇ, ਜਿਨ੍ਹਾਂ ਵਿੱਚ ਸ਼ਾਰਟ-ਟਰਮ ਅਤੇ ਲਾਂਗ-ਟਰਮ ਮੈਮੋਰੀ 'ਤੇ ਧਿਆਨ ਦਿੱਤਾ ਗਿਆ ਹੈ। +• **ਮੈਮੋਰੀ ਲਾਗੂ ਕਰਨਾ ਅਤੇ ਸਟੋਰ ਕਰਨਾ**: ਤੁਹਾਡੇ ਏਆਈ ਏਜੰਟਾਂ ਵਿੱਚ ਮੈਮੋਰੀ ਸਮਰੱਥਾਵਾਂ ਸ਼ਾਮਲ ਕਰਨ ਦੇ ਪ੍ਰੈਕਟਿਕਲ ਤਰੀਕੇ, ਖਾਸ ਕਰਕੇ ਸ਼ਾਰਟ-ਟਰਮ ਅਤੇ ਲਾਂਗ-ਟਰਮ ਮੈਮੋਰੀ 'ਤੇ ਧਿਆਨ ਦੇਣ। -• **AI ਏਜੰਟਾਂ ਨੂੰ ਸਵੈ-ਸੁਧਾਰਕ ਬਣਾਉਣਾ**: ਮੈਮੋਰੀ ਕਿਵੇਂ ਪਿਛਲੇ ਇੰਟਰੈਕਸ਼ਨ ਤੋਂ ਸਿੱਖਣ ਅਤੇ ਸਮੇਂ ਦੇ ਨਾਲ ਸੁਧਾਰ ਕਰਨ ਵਿੱਚ ਏਜੰਟਾਂ ਦੀ ਮਦਦ ਕਰਦੀ ਹੈ। +• **ਏਆਈ ਏਜੰਟਾਂ ਨੂੰ ਸਵੈ-ਸੁਧਾਰਕ ਬਣਾਉਣਾ**: ਮੈਮੋਰੀ ਕਿਵੇਂ ਏਜੰਟਾਂ ਨੂੰ ਪਿਛਲੇ ਇੰਟਰੈਕਸ਼ਨ ਤੋਂ ਸਿੱਖਣ ਅਤੇ ਸਮੇਂ ਦੇ ਨਾਲ ਸੁਧਾਰ ਕਰਨ ਯੋਗ ਬਣਾਉਂਦੀ ਹੈ। -## ਸਿੱਖਣ ਦੇ ਲਕਸ਼ +## ਉਪਲਬਧ ਇੰਪਲੀਮੈਂਟੇਸ਼ਨ + +ਇਸ ਪਾਠ ਵਿੱਚ ਦੋ ਵਿਸਤ੍ਰਿਤ ਨੋਟਬੁੱਕ ਟਿਊਟੋਰੀਅਲ ਸ਼ਾਮਲ ਹਨ: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: ਮੈਮੋਰੀ ਨੂੰ Mem0 ਅਤੇ Azure AI Search ਨਾਲ Semantic Kernel ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਲਾਗੂ ਕਰਦਾ ਹੈ। -ਇਸ ਪਾਠ ਨੂੰ ਪੂਰਾ ਕਰਨ ਤੋਂ ਬਾਅਦ, ਤੁਸੀਂ ਇਹ ਜਾਣ ਸਕੋਗੇ: +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Cognee ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਸਟ੍ਰਕਚਰਡ ਮੈਮੋਰੀ ਲਾਗੂ ਕਰਦਾ ਹੈ, ਜੋ ਕਿ ਇੰਬੈਡਿੰਗ ਦੁਆਰਾ ਸਮਰਥਿਤ ਨੋਲੇਜ ਗ੍ਰਾਫ ਬਣਾਉਂਦਾ ਹੈ, ਗ੍ਰਾਫ ਨੂੰ ਵਿਜੁਅਲਾਈਜ਼ ਕਰਦਾ ਹੈ, ਅਤੇ ਸਮਾਰਟ ਰੀਟਰੀਵਲ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ। + +## ਸਿੱਖਣ ਦੇ ਲਕਸ਼ -• **AI ਏਜੰਟ ਮੈਮੋਰੀ ਦੇ ਵੱਖ-ਵੱਖ ਪ੍ਰਕਾਰਾਂ ਵਿੱਚ ਅੰਤਰ ਕਰਨਾ**, ਜਿਵੇਂ ਕਿ ਵਰਕਿੰਗ, ਸ਼ਾਰਟ-ਟਰਮ, ਅਤੇ ਲਾਂਗ-ਟਰਮ ਮੈਮੋਰੀ, ਅਤੇ ਵਿਸ਼ੇਸ਼ਕ੍ਰਿਤ ਰੂਪਾਂ ਜਿਵੇਂ ਕਿ ਪੇਰਸੋਨਾ ਅਤੇ ਐਪੀਸੋਡਿਕ ਮੈਮੋਰੀ। +ਇਹ ਪਾਠ ਪੂਰਾ ਕਰਨ ਤੋਂ ਬਾਅਦ, ਤੁਸੀਂ ਇਹ ਜਾਣ ਸਕੋਗੇ: -• **AI ਏਜੰਟਾਂ ਲਈ ਸ਼ਾਰਟ-ਟਰਮ ਅਤੇ ਲਾਂਗ-ਟਰਮ ਮੈਮੋਰੀ ਨੂੰ ਲਾਗੂ ਅਤੇ ਪ੍ਰਬੰਧਿਤ ਕਰਨਾ** ਸੈਮੈਂਟਿਕ ਕਰਨਲ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰਕੇ, ਜਿਵੇਂ ਕਿ Mem0 ਅਤੇ ਵਾਈਟਬੋਰਡ ਮੈਮੋਰੀ ਵਰਗੇ ਟੂਲਜ਼ ਦੀ ਵਰਤੋਂ ਕਰਨਾ, ਅਤੇ Azure AI Search ਨਾਲ ਇੰਟੀਗ੍ਰੇਸ਼ਨ। +• **ਏਆਈ ਏਜੰਟ ਮੈਮੋਰੀ ਦੇ ਵੱਖ-ਵੱਖ ਪ੍ਰਕਾਰਾਂ ਵਿੱਚ ਅੰਤਰ ਕਰਨਾ**, ਜਿਸ ਵਿੱਚ ਵਰਕਿੰਗ, ਸ਼ਾਰਟ-ਟਰਮ, ਅਤੇ ਲਾਂਗ-ਟਰਮ ਮੈਮੋਰੀ ਸ਼ਾਮਲ ਹਨ, ਨਾਲ ਹੀ ਵਿਸ਼ੇਸ਼ ਰੂਪਾਂ ਜਿਵੇਂ ਕਿ ਪੇਰਸੋਨਾ ਅਤੇ ਐਪੀਸੋਡਿਕ ਮੈਮੋਰੀ। -• **ਸਵੈ-ਸੁਧਾਰਕ AI ਏਜੰਟਾਂ ਦੇ ਮੂਲ ਸਿਧਾਂਤਾਂ ਨੂੰ ਸਮਝਣਾ** ਅਤੇ ਕਿਵੇਂ ਮਜ਼ਬੂਤ ਮੈਮੋਰੀ ਪ੍ਰਬੰਧਨ ਪ੍ਰਣਾਲੀਆਂ ਨਿਰੰਤਰ ਸਿੱਖਣ ਅਤੇ ਅਨੁਕੂਲਤਾ ਵਿੱਚ ਯੋਗਦਾਨ ਪਾਉਂਦੀਆਂ ਹਨ। +• **Semantic Kernel ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਏਆਈ ਏਜੰਟਾਂ ਲਈ ਸ਼ਾਰਟ-ਟਰਮ ਅਤੇ ਲਾਂਗ-ਟਰਮ ਮੈਮੋਰੀ ਲਾਗੂ ਅਤੇ ਪ੍ਰਬੰਧਿਤ ਕਰਨਾ**, ਜਿਵੇਂ ਕਿ Mem0, Cognee, Whiteboard ਮੈਮੋਰੀ, ਅਤੇ Azure AI Search ਨਾਲ ਇੰਟੀਗ੍ਰੇਸ਼ਨ। -## AI ਏਜੰਟ ਮੈਮੋਰੀ ਨੂੰ ਸਮਝਣਾ +• **ਸਵੈ-ਸੁਧਾਰਕ ਏਆਈ ਏਜੰਟਾਂ ਦੇ ਮੂਲ ਸਿਧਾਂਤਾਂ ਨੂੰ ਸਮਝਣਾ** ਅਤੇ ਮਜ਼ਬੂਤ ਮੈਮੋਰੀ ਪ੍ਰਬੰਧਨ ਪ੍ਰਣਾਲੀਆਂ ਕਿਵੇਂ ਨਿਰੰਤਰ ਸਿੱਖਣ ਅਤੇ ਅਨੁਕੂਲਤਾ ਵਿੱਚ ਯੋਗਦਾਨ ਪਾਉਂਦੀਆਂ ਹਨ। -ਮੂਲ ਤੌਰ 'ਤੇ, **AI ਏਜੰਟਾਂ ਲਈ ਮੈਮੋਰੀ ਉਹ ਮਕੈਨਿਜ਼ਮ ਹੈ ਜੋ ਉਨ੍ਹਾਂ ਨੂੰ ਜਾਣਕਾਰੀ ਨੂੰ ਰੱਖਣ ਅਤੇ ਯਾਦ ਕਰਨ ਦੀ ਯੋਗਤਾ ਦਿੰਦਾ ਹੈ**। ਇਹ ਜਾਣਕਾਰੀ ਗੱਲਬਾਤ ਦੇ ਖਾਸ ਵੇਰਵੇ, ਯੂਜ਼ਰ ਦੀਆਂ ਪਸੰਦਾਂ, ਪਿਛਲੇ ਕਾਰਵਾਈਆਂ, ਜਾਂ ਸਿੱਖੇ ਪੈਟਰਨ ਹੋ ਸਕਦੇ ਹਨ। +## ਏਆਈ ਏਜੰਟ ਮੈਮੋਰੀ ਦੀ ਸਮਝ -ਮੈਮੋਰੀ ਤੋਂ ਬਿਨਾਂ, AI ਐਪਲੀਕੇਸ਼ਨ ਅਕਸਰ ਸਟੇਟਲੈਸ ਹੁੰਦੇ ਹਨ, ਜਿਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਹਰ ਇੰਟਰੈਕਸ਼ਨ ਨਵੇਂ ਸਿਰੇ ਤੋਂ ਸ਼ੁਰੂ ਹੁੰਦਾ ਹੈ। ਇਸ ਨਾਲ ਦੁਹਰਾਅ ਅਤੇ ਨਿਰਾਸ਼ਾਜਨਕ ਯੂਜ਼ਰ ਅਨੁਭਵ ਹੁੰਦਾ ਹੈ ਜਿੱਥੇ ਏਜੰਟ ਪਿਛਲੇ ਸੰਦਰਭ ਜਾਂ ਪਸੰਦਾਂ ਨੂੰ "ਭੁੱਲ" ਜਾਂਦਾ ਹੈ। +ਮੂਲ ਰੂਪ ਵਿੱਚ, **ਏਆਈ ਏਜੰਟਾਂ ਲਈ ਮੈਮੋਰੀ ਉਹ ਮਕੈਨਿਜ਼ਮ ਹਨ ਜੋ ਉਨ੍ਹਾਂ ਨੂੰ ਜਾਣਕਾਰੀ ਰੱਖਣ ਅਤੇ ਯਾਦ ਕਰਨ ਦੇ ਯੋਗ ਬਣਾਉਂਦੇ ਹਨ**। ਇਹ ਜਾਣਕਾਰੀ ਗੱਲਬਾਤ ਦੇ ਖਾਸ ਵੇਰਵੇ, ਯੂਜ਼ਰ ਦੀਆਂ ਪਸੰਦਾਂ, ਪਿਛਲੇ ਕਾਰਜਾਂ, ਜਾਂ ਸਿੱਖੇ ਪੈਟਰਨ ਹੋ ਸਕਦੇ ਹਨ। -### ਮੈਮੋਰੀ ਕਿਉਂ ਜ਼ਰੂਰੀ ਹੈ? +ਮੈਮੋਰੀ ਤੋਂ ਬਿਨਾਂ, ਏਆਈ ਐਪਲੀਕੇਸ਼ਨ ਅਕਸਰ ਸਟੇਟਲੈੱਸ ਹੁੰਦੇ ਹਨ, ਜਿਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਹਰ ਇੰਟਰੈਕਸ਼ਨ ਨਵੇਂ ਸਿਰੇ ਤੋਂ ਸ਼ੁਰੂ ਹੁੰਦਾ ਹੈ। ਇਸ ਨਾਲ ਇੱਕ ਦੁਹਰਾਉਣ ਵਾਲਾ ਅਤੇ ਨਿਰਾਸ਼ਾਜਨਕ ਯੂਜ਼ਰ ਅਨੁਭਵ ਹੁੰਦਾ ਹੈ ਜਿੱਥੇ ਏਜੰਟ ਪਿਛਲੇ ਸੰਦਰਭ ਜਾਂ ਪਸੰਦਾਂ ਨੂੰ "ਭੁੱਲ" ਜਾਂਦਾ ਹੈ। -ਏਜੰਟ ਦੀ ਬੁੱਧੀਮਾਨੀ ਉਸਦੀ ਪਿਛਲੀ ਜਾਣਕਾਰੀ ਨੂੰ ਯਾਦ ਕਰਨ ਅਤੇ ਵਰਤਣ ਦੀ ਯੋਗਤਾ ਨਾਲ ਗਹਿਰਾਈ ਨਾਲ ਜੁੜੀ ਹੋਈ ਹੈ। ਮੈਮੋਰੀ ਏਜੰਟਾਂ ਨੂੰ ਇਹ ਬਣਾਉਂਦੀ ਹੈ: +### ਮੈਮੋਰੀ ਕਿਉਂ ਮਹੱਤਵਪੂਰਨ ਹੈ? -• **ਚਿੰਤਨਸ਼ੀਲ**: ਪਿਛਲੇ ਕਾਰਵਾਈਆਂ ਅਤੇ ਨਤੀਜਿਆਂ ਤੋਂ ਸਿੱਖਣਾ। +ਏਜੰਟ ਦੀ ਬੁੱਧੀਮਾਨਤਾ ਇਸ ਦੀ ਯੋਗਤਾ ਨਾਲ ਗਹਿਰਾਈ ਨਾਲ ਜੁੜੀ ਹੋਈ ਹੈ ਕਿ ਉਹ ਪਿਛਲੀ ਜਾਣਕਾਰੀ ਨੂੰ ਯਾਦ ਕਰ ਸਕੇ ਅਤੇ ਵਰਤ ਸਕੇ। ਮੈਮੋਰੀ ਏਜੰਟਾਂ ਨੂੰ ਇਹ ਯੋਗ ਬਣਾਉਂਦੀ ਹੈ: -• **ਇੰਟਰੈਕਟਿਵ**: ਚਰਚਾ ਦੇ ਦੌਰਾਨ ਸੰਦਰਭ ਨੂੰ ਕਾਇਮ ਰੱਖਣਾ। +• **ਵਿਚਾਰਸ਼ੀਲ**: ਪਿਛਲੇ ਕਾਰਜਾਂ ਅਤੇ ਨਤੀਜਿਆਂ ਤੋਂ ਸਿੱਖਣਾ। -• **ਪ੍ਰੋਐਕਟਿਵ ਅਤੇ ਰੀਐਕਟਿਵ**: ਪਿਛਲੇ ਡਾਟਾ ਦੇ ਆਧਾਰ 'ਤੇ ਜ਼ਰੂਰਤਾਂ ਦਾ ਅੰਦਾਜ਼ਾ ਲਗਾਉਣਾ ਜਾਂ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਪ੍ਰਤੀਕ੍ਰਿਆ ਦੇਣਾ। +• **ਇੰਟਰੈਕਟਿਵ**: ਚਾਲੂ ਗੱਲਬਾਤ ਦੇ ਦੌਰਾਨ ਸੰਦਰਭ ਨੂੰ ਕਾਇਮ ਰੱਖਣਾ। -• **ਸਵੈ-ਚਾਲਕ**: ਸਟੋਰ ਕੀਤੀ ਜਾਣਕਾਰੀ 'ਤੇ ਆਧਾਰਿਤ ਵਧੇਰੇ ਸਵੈ-ਨਿਰਭਰ ਹੋਣਾ। +• **ਪ੍ਰੋਐਕਟਿਵ ਅਤੇ ਰੀਐਕਟਿਵ**: ਇਤਿਹਾਸਕ ਡਾਟਾ ਦੇ ਆਧਾਰ 'ਤੇ ਜ਼ਰੂਰਤਾਂ ਦਾ ਅਨੁਮਾਨ ਲਗਾਉਣਾ ਜਾਂ ਉਚਿਤ ਤਰੀਕੇ ਨਾਲ ਪ੍ਰਤੀਕਿਰਿਆ ਦੇਣਾ। -ਮੈਮੋਰੀ ਨੂੰ ਲਾਗੂ ਕਰਨ ਦਾ ਉਦੇਸ਼ ਏਜੰਟਾਂ ਨੂੰ ਵਧੇਰੇ **ਭਰੋਸੇਯੋਗ ਅਤੇ ਯੋਗ** ਬਣਾਉਣਾ ਹੈ। +• **ਸਵੈ-ਨਿਰਭਰ**: ਸਟੋਰ ਕੀਤੀ ਗਿਆਨ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਵਧੇਰੇ ਸਵੈ-ਨਿਰਭਰਤਾ ਨਾਲ ਕੰਮ ਕਰਨਾ। -### ਮੈਮੋਰੀ ਦੇ ਪ੍ਰਕਾਰ +ਮੈਮੋਰੀ ਲਾਗੂ ਕਰਨ ਦਾ ਮਕਸਦ ਏਜੰਟਾਂ ਨੂੰ ਵਧੇਰੇ **ਭਰੋਸੇਯੋਗ ਅਤੇ ਸਮਰੱਥ** ਬਣਾਉਣਾ ਹੈ। -#### ਵਰਕਿੰਗ ਮੈਮੋਰੀ +### ਮੈਮੋਰੀ ਦੇ ਪ੍ਰਕਾਰ -ਇਸਨੂੰ ਇੱਕ ਟੁਕੜੇ ਕਾਗਜ਼ ਵਾਂਗ ਸੋਚੋ ਜੋ ਏਜੰਟ ਇੱਕ ongoing ਟਾਸਕ ਜਾਂ ਸੋਚਣ ਦੀ ਪ੍ਰਕਿਰਿਆ ਦੌਰਾਨ ਵਰਤਦਾ ਹੈ। ਇਹ ਤੁਰੰਤ ਜਾਣਕਾਰੀ ਰੱਖਦਾ ਹੈ ਜੋ ਅਗਲੇ ਕਦਮ ਦੀ ਗਣਨਾ ਕਰਨ ਲਈ ਜ਼ਰੂਰੀ ਹੈ। +#### ਵਰਕਿੰਗ ਮੈਮੋਰੀ -AI ਏਜੰਟਾਂ ਲਈ, ਵਰਕਿੰਗ ਮੈਮੋਰੀ ਅਕਸਰ ਗੱਲਬਾਤ ਤੋਂ ਸਭ ਤੋਂ ਸਬੰਧਤ ਜਾਣਕਾਰੀ ਨੂੰ ਕੈਪਚਰ ਕਰਦੀ ਹੈ, ਭਾਵੇਂ ਪੂਰੀ ਚੈਟ ਹਿਸਟਰੀ ਲੰਬੀ ਜਾਂ ਕੱਟੀ ਹੋਈ ਹੋਵੇ। ਇਹ ਮੁੱਖ ਤੱਤਾਂ ਨੂੰ ਕੈਪਚਰ ਕਰਨ 'ਤੇ ਧਿਆਨ ਦਿੰਦੀ ਹੈ ਜਿਵੇਂ ਕਿ ਜ਼ਰੂਰਤਾਂ, ਪ੍ਰਸਤਾਵਾਂ, ਫੈਸਲੇ, ਅਤੇ ਕਾਰਵਾਈਆਂ। +ਇਸਨੂੰ ਇੱਕ ਕਾਗਜ਼ ਦੇ ਟੁਕੜੇ ਵਾਂਗ ਸੋਚੋ ਜੋ ਇੱਕ ਏਜੰਟ ਇੱਕੋ ਸਮੇਂ ਚੱਲ ਰਹੇ ਟਾਸਕ ਜਾਂ ਸੋਚਣ ਦੀ ਪ੍ਰਕਿਰਿਆ ਦੌਰਾਨ ਵਰਤਦਾ ਹੈ। ਇਹ ਤੁਰੰਤ ਜਾਣਕਾਰੀ ਰੱਖਦਾ ਹੈ ਜੋ ਅਗਲੇ ਕਦਮ ਦੀ ਗਣਨਾ ਕਰਨ ਲਈ ਲੋੜੀਂਦੀ ਹੁੰਦੀ ਹੈ। -**ਵਰਕਿੰਗ ਮੈਮੋਰੀ ਉਦਾਹਰਨ** +ਏਆਈ ਏਜੰਟਾਂ ਲਈ, ਵਰਕਿੰਗ ਮੈਮੋਰੀ ਅਕਸਰ ਗੱਲਬਾਤ ਤੋਂ ਸਭ ਤੋਂ ਪ੍ਰਸੰਗਿਕ ਜਾਣਕਾਰੀ ਕੈਪਚਰ ਕਰਦੀ ਹੈ, ਭਾਵੇਂ ਪੂਰੀ ਚੈਟ ਇਤਿਹਾਸ ਲੰਬਾ ਜਾਂ ਕੱਟਿਆ ਹੋਇਆ ਹੋਵੇ। ਇਹ ਮੁੱਖ ਤੱਤਾਂ ਨੂੰ ਕੈਪਚਰ ਕਰਨ 'ਤੇ ਧਿਆਨ ਕੇਂਦਰਿਤ ਕਰਦੀ ਹੈ ਜਿਵੇਂ ਕਿ ਲੋੜਾਂ, ਪ੍ਰਸਤਾਵਾਂ, ਫੈਸਲੇ, ਅਤੇ ਕਾਰਵਾਈਆਂ। -ਇੱਕ ਟ੍ਰੈਵਲ ਬੁਕਿੰਗ ਏਜੰਟ ਵਿੱਚ, ਵਰਕਿੰਗ ਮੈਮੋਰੀ ਯੂਜ਼ਰ ਦੀ ਮੌਜੂਦਾ ਬੇਨਤੀ ਨੂੰ ਕੈਪਚਰ ਕਰ ਸਕਦੀ ਹੈ, ਜਿਵੇਂ ਕਿ "ਮੈਂ ਪੈਰਿਸ ਦੀ ਯਾਤਰਾ ਬੁੱਕ ਕਰਨਾ ਚਾਹੁੰਦਾ ਹਾਂ"। ਇਹ ਖਾਸ ਜ਼ਰੂਰਤ ਮੌਜੂਦਾ ਇੰਟਰੈਕਸ਼ਨ ਨੂੰ ਗਾਈਡ ਕਰਨ ਲਈ ਏਜੰਟ ਦੇ ਤੁਰੰਤ ਸੰਦਰਭ ਵਿੱਚ ਰੱਖੀ ਜਾਂਦੀ ਹੈ। +**ਵਰਕਿੰਗ ਮੈਮੋਰੀ ਉਦਾਹਰਨ** -#### ਸ਼ਾਰਟ ਟਰਮ ਮੈਮੋਰੀ +ਇੱਕ ਟਰੈਵਲ ਬੁਕਿੰਗ ਏਜੰਟ ਵਿੱਚ, ਵਰਕਿੰਗ ਮੈਮੋਰੀ ਯੂਜ਼ਰ ਦੀ ਮੌਜੂਦਾ ਬੇਨਤੀ ਕੈਪਚਰ ਕਰ ਸਕਦੀ ਹੈ, ਜਿਵੇਂ ਕਿ "ਮੈਂ ਪੈਰਿਸ ਦੀ ਯਾਤਰਾ ਬੁਕ ਕਰਨਾ ਚਾਹੁੰਦਾ ਹਾਂ"। ਇਹ ਖਾਸ ਲੋੜ ਮੌਜੂਦਾ ਇੰਟਰੈਕਸ਼ਨ ਨੂੰ ਗਾਈਡ ਕਰਨ ਲਈ ਏਜੰਟ ਦੇ ਤੁਰੰਤ ਸੰਦਰਭ ਵਿੱਚ ਰੱਖੀ ਜਾਂਦੀ ਹੈ। -ਇਹ ਪ੍ਰਕਾਰ ਦੀ ਮੈਮੋਰੀ ਇੱਕ ਗੱਲਬਾਤ ਜਾਂ ਸੈਸ਼ਨ ਦੇ ਦੌਰਾਨ ਜਾਣਕਾਰੀ ਨੂੰ ਰੱਖਦੀ ਹੈ। ਇਹ ਮੌਜੂਦਾ ਚੈਟ ਦਾ ਸੰਦਰਭ ਹੈ, ਜੋ ਏਜੰਟ ਨੂੰ ਡਾਇਲਾਗ ਵਿੱਚ ਪਿਛਲੇ ਟਰਨਾਂ ਦਾ ਹਵਾਲਾ ਦੇਣ ਦੀ ਯੋਗਤਾ ਦਿੰਦੀ ਹੈ। +#### ਸ਼ਾਰਟ ਟਰਮ ਮੈਮੋਰੀ -**ਸ਼ਾਰਟ ਟਰਮ ਮੈਮੋਰੀ ਉਦਾਹਰਨ** +ਇਹ ਪ੍ਰਕਾਰ ਦੀ ਮੈਮੋਰੀ ਇੱਕ ਗੱਲਬਾਤ ਜਾਂ ਸੈਸ਼ਨ ਦੇ ਦੌਰਾਨ ਜਾਣਕਾਰੀ ਨੂੰ ਰੱਖਦੀ ਹੈ। ਇਹ ਮੌਜੂਦਾ ਚੈਟ ਦਾ ਸੰਦਰਭ ਹੈ, ਜੋ ਏਜੰਟ ਨੂੰ ਗੱਲਬਾਤ ਦੇ ਪਿਛਲੇ ਮੋੜਾਂ ਨੂੰ ਯਾਦ ਕਰਨ ਦੇ ਯੋਗ ਬਣਾਉਂਦੀ ਹੈ। -ਜੇਕਰ ਯੂਜ਼ਰ ਪੁੱਛਦਾ ਹੈ, "ਪੈਰਿਸ ਲਈ ਫਲਾਈਟ ਦੀ ਕੀਮਤ ਕਿੰਨੀ ਹੋਵੇਗੀ?" ਅਤੇ ਫਿਰ ਅੱਗੇ ਪੁੱਛਦਾ ਹੈ "ਉਥੇ ਰਹਿਣ ਦੀ ਸਹੂਲਤ ਬਾਰੇ ਕੀ?", ਤਾਂ ਸ਼ਾਰਟ-ਟਰਮ ਮੈਮੋਰੀ ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦੀ ਹੈ ਕਿ ਏਜੰਟ ਜਾਣਦਾ ਹੈ "ਉਥੇ" ਦਾ ਹਵਾਲਾ "ਪੈਰਿਸ" ਨੂੰ ਹੈ। +**ਸ਼ਾਰਟ ਟਰਮ ਮੈਮੋਰੀ ਉਦਾਹਰਨ** -#### ਲਾਂਗ ਟਰਮ ਮੈਮੋਰੀ +ਜੇਕਰ ਕੋਈ ਯੂਜ਼ਰ ਪੁੱਛਦਾ ਹੈ, "ਪੈਰਿਸ ਲਈ ਫਲਾਈਟ ਦੀ ਕੀਮਤ ਕਿੰਨੀ ਹੋਵੇਗੀ?" ਅਤੇ ਫਿਰ ਅਗਲੇ ਸਵਾਲ ਵਿੱਚ ਕਹਿੰਦਾ ਹੈ "ਉਥੇ ਰਹਿਣ ਲਈ ਕੀ ਵਿਕਲਪ ਹਨ?", ਤਾਂ ਸ਼ਾਰਟ ਟਰਮ ਮੈਮੋਰੀ ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦੀ ਹੈ ਕਿ ਏਜੰਟ ਜਾਣਦਾ ਹੈ "ਉਥੇ" ਦਾ ਮਤਲਬ "ਪੈਰਿਸ" ਹੈ। -ਇਹ ਉਹ ਜਾਣਕਾਰੀ ਹੈ ਜੋ ਕਈ ਗੱਲਬਾਤਾਂ ਜਾਂ ਸੈਸ਼ਨਾਂ ਦੇ ਦੌਰਾਨ ਕਾਇਮ ਰਹਿੰਦੀ ਹੈ। ਇਹ ਏਜੰਟਾਂ ਨੂੰ ਯੂਜ਼ਰ ਦੀਆਂ ਪਸੰਦਾਂ, ਇਤਿਹਾਸਕ ਇੰਟਰੈਕਸ਼ਨ, ਜਾਂ ਆਮ ਗਿਆਨ ਨੂੰ ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਯਾਦ ਰੱਖਣ ਦੀ ਯੋਗਤਾ ਦਿੰਦੀ ਹੈ। ਇਹ ਵਿਅਕਤੀਗਤ ਕਰਨ ਲਈ ਮਹੱਤਵਪੂਰਨ ਹੈ। +#### ਲਾਂਗ ਟਰਮ ਮੈਮੋਰੀ -**ਲਾਂਗ ਟਰਮ ਮੈਮੋਰੀ ਉਦਾਹਰਨ** +ਇਹ ਉਹ ਜਾਣਕਾਰੀ ਹੈ ਜੋ ਕਈ ਗੱਲਬਾਤਾਂ ਜਾਂ ਸੈਸ਼ਨਾਂ ਵਿੱਚ ਕਾਇਮ ਰਹਿੰਦੀ ਹੈ। ਇਹ ਏਜੰਟਾਂ ਨੂੰ ਯੂਜ਼ਰ ਦੀਆਂ ਪਸੰਦਾਂ, ਇਤਿਹਾਸਕ ਇੰਟਰੈਕਸ਼ਨ, ਜਾਂ ਆਮ ਗਿਆਨ ਨੂੰ ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਯਾਦ ਰੱਖਣ ਦੇ ਯੋਗ ਬਣਾਉਂਦੀ ਹੈ। ਇਹ ਨਿੱਜੀਕਰਨ ਲਈ ਮਹੱਤਵਪੂਰਨ ਹੈ। -ਲਾਂਗ-ਟਰਮ ਮੈਮੋਰੀ ਇਹ ਸਟੋਰ ਕਰ ਸਕਦੀ ਹੈ ਕਿ "ਬੈਨ ਨੂੰ ਸਕੀਇੰਗ ਅਤੇ ਬਾਹਰੀ ਗਤੀਵਿਧੀਆਂ ਪਸੰਦ ਹਨ, ਮਾਊਂਟੇਨ ਵਿਊ ਨਾਲ ਕੌਫੀ ਪਸੰਦ ਹੈ, ਅਤੇ ਪਿਛਲੇ ਚੋਟ ਦੇ ਕਾਰਨ ਅਡਵਾਂਸਡ ਸਕੀ ਸਲੋਪਸ ਤੋਂ ਬਚਣਾ ਚਾਹੁੰਦਾ ਹੈ"। ਇਹ ਜਾਣਕਾਰੀ, ਪਿਛਲੇ ਇੰਟਰੈਕਸ਼ਨ ਤੋਂ ਸਿੱਖੀ ਗਈ, ਭਵਿੱਖ ਦੇ ਯਾਤਰਾ ਯੋਜਨਾ ਸੈਸ਼ਨਾਂ ਵਿੱਚ ਸਿਫਾਰਸ਼ਾਂ ਨੂੰ ਬਹੁਤ ਹੀ ਵਿਅਕਤੀਗਤ ਬਣਾਉਂਦੀ ਹੈ। +**ਲਾਂਗ ਟਰਮ ਮੈਮੋਰੀ ਉਦਾਹਰਨ** -#### ਪੇਰਸੋਨਾ ਮੈਮੋਰੀ +ਲਾਂਗ ਟਰਮ ਮੈਮੋਰੀ ਇਹ ਯਾਦ ਰੱਖ ਸਕਦੀ ਹੈ ਕਿ "ਬੈਨ ਨੂੰ ਸਕੀਇੰਗ ਅਤੇ ਬਾਹਰੀ ਗਤੀਵਿਧੀਆਂ ਪਸੰਦ ਹਨ, ਕਾਫੀ ਪਹਾੜੀ ਦ੍ਰਿਸ਼ ਦੇ ਨਾਲ ਪਸੰਦ ਹੈ, ਅਤੇ ਪਿਛਲੇ ਸੱਟ ਕਾਰਨ ਅਡਵਾਂਸਡ ਸਕੀ ਸਲੋਪ ਤੋਂ ਬਚਣਾ ਚਾਹੁੰਦਾ ਹੈ"। ਇਹ ਜਾਣਕਾਰੀ, ਪਿਛਲੇ ਇੰਟਰੈਕਸ਼ਨ ਤੋਂ ਸਿੱਖੀ ਗਈ, ਭਵਿੱਖ ਦੇ ਯਾਤਰਾ ਯੋਜਨਾ ਸੈਸ਼ਨਾਂ ਵਿੱਚ ਸਿਫਾਰਸ਼ਾਂ ਨੂੰ ਬਹੁਤ ਨਿੱਜੀ ਬਣਾਉਂਦੀ ਹੈ। -ਇਹ ਵਿਸ਼ੇਸ਼ਕ੍ਰਿਤ ਮੈਮੋਰੀ ਪ੍ਰਕਾਰ ਏਜੰਟ ਨੂੰ ਇੱਕ ਸਥਿਰ "ਪ੍ਰਸਨਾਲਿਟੀ" ਜਾਂ "ਪੇਰਸੋਨਾ" ਵਿਕਸਿਤ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰਦਾ ਹੈ। ਇਹ ਏਜੰਟ ਨੂੰ ਆਪਣੇ ਬਾਰੇ ਜਾਂ ਆਪਣੇ ਇਰਾਦੇ ਵਾਲੇ ਰੋਲ ਬਾਰੇ ਵੇਰਵੇ ਯਾਦ ਰੱਖਣ ਦੀ ਯੋਗਤਾ ਦਿੰਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਇੰਟਰੈਕਸ਼ਨ ਵਧੇਰੇ ਸੁਗਮ ਅਤੇ ਕੇਂਦਰਿਤ ਹੁੰਦੇ ਹਨ। +#### ਪੇਰਸੋਨਾ ਮੈਮੋਰੀ -**ਪੇਰਸੋਨਾ ਮੈਮੋਰੀ ਉਦਾਹਰਨ** +ਇਹ ਵਿਸ਼ੇਸ਼ ਮੈਮੋਰੀ ਪ੍ਰਕਾਰ ਇੱਕ ਏਜੰਟ ਨੂੰ ਇੱਕ ਸਥਿਰ "ਪ੍ਰਸਨਾਲਿਟੀ" ਜਾਂ "ਪੇਰਸੋਨਾ" ਵਿਕਸਿਤ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰਦੀ ਹੈ। ਇਹ ਏਜੰਟ ਨੂੰ ਆਪਣੇ ਬਾਰੇ ਜਾਂ ਆਪਣੇ ਇਰਾਦੇ ਵਾਲੇ ਭੂਮਿਕਾ ਬਾਰੇ ਵੇਰਵੇ ਯਾਦ ਰੱਖਣ ਦੇ ਯੋਗ ਬਣਾਉਂਦੀ ਹੈ, ਜਿਸ ਨਾਲ ਇੰਟਰੈਕਸ਼ਨ ਵਧੇਰੇ ਸਹਜ ਅਤੇ ਕੇਂਦਰਿਤ ਹੁੰਦੇ ਹਨ। -ਜੇਕਰ ਟ੍ਰੈਵਲ ਏਜੰਟ ਨੂੰ "ਸਕੀ ਪਲਾਨਿੰਗ ਦਾ ਮਾਹਰ" ਬਣਨ ਲਈ ਡਿਜ਼ਾਈਨ ਕੀਤਾ ਗਿਆ ਹੈ, ਤਾਂ ਪੇਰਸੋਨਾ ਮੈਮੋਰੀ ਇਸ ਰੋਲ ਨੂੰ ਮਜ਼ਬੂਤ ​​ਕਰ ਸਕਦੀ ਹੈ, ਜਿਸ ਨਾਲ ਇਸਦੇ ਜਵਾਬ ਇੱਕ ਮਾਹਰ ਦੇ ਟੋਨ ਅਤੇ ਗਿਆਨ ਦੇ ਨਾਲ ਸੰਗਤ ਬਣ ਜਾਂਦੇ ਹਨ। +**ਪੇਰਸੋਨਾ ਮੈਮੋਰੀ ਉਦਾਹਰਨ** -#### ਵਰਕਫਲੋ/ਐਪੀਸੋਡਿਕ ਮੈਮੋਰੀ +ਜੇਕਰ ਟਰੈਵਲ ਏਜੰਟ ਨੂੰ "ਸਕੀ ਪਲਾਨਿੰਗ ਦੇ ਮਾਹਿਰ" ਵਜੋਂ ਡਿਜ਼ਾਈਨ ਕੀਤਾ ਗਿਆ ਹੈ, ਤਾਂ ਪੇਰਸੋਨਾ ਮੈਮੋਰੀ ਇਸ ਭੂਮਿਕਾ ਨੂੰ ਮਜ਼ਬੂਤ ਕਰ ਸਕਦੀ ਹੈ, ਜਿਸ ਨਾਲ ਇਸਦੇ ਜਵਾਬ ਮਾਹਿਰ ਦੇ ਲਹਿਜ਼ੇ ਅਤੇ ਗਿਆਨ ਦੇ ਨਾਲ ਸੰਗਤ ਬਣਾਉਂਦੇ ਹਨ। -ਇਹ ਮੈਮੋਰੀ ਇੱਕ ਜਟਿਲ ਟਾਸਕ ਦੌਰਾਨ ਏਜੰਟ ਦੁਆਰਾ ਕੀਤੇ ਕਦਮਾਂ ਦੇ ਕ੍ਰਮ ਨੂੰ ਸਟੋਰ ਕਰਦੀ ਹੈ, ਜਿਸ ਵਿੱਚ ਸਫਲਤਾਵਾਂ ਅਤੇ ਅਸਫਲਤਾਵਾਂ ਸ਼ਾਮਲ ਹਨ। ਇਹ ਪਿਛਲੇ "ਐਪੀਸੋਡ" ਜਾਂ ਅਨੁਭਵਾਂ ਨੂੰ ਯਾਦ ਰੱਖਣ ਵਾਂਗ ਹੈ। +#### ਵਰਕਫਲੋ/ਐਪੀਸੋਡਿਕ ਮੈਮੋਰੀ -**ਐਪੀਸੋਡਿਕ ਮੈਮੋਰੀ ਉਦਾਹਰਨ** +ਇਹ ਮੈਮੋਰੀ ਇੱਕ ਜਟਿਲ ਟਾਸਕ ਦੌਰਾਨ ਇੱਕ ਏਜੰਟ ਦੁਆਰਾ ਕੀਤੇ ਗਏ ਕਦਮਾਂ ਦੇ ਕ੍ਰਮ ਨੂੰ ਸਟੋਰ ਕਰਦੀ ਹੈ, ਜਿਸ ਵਿੱਚ ਸਫਲਤਾ ਅਤੇ ਅਸਫਲਤਾ ਸ਼ਾਮਲ ਹਨ। ਇਹ ਪਿਛਲੇ "ਐਪੀਸੋਡ" ਜਾਂ ਤਜਰਬਿਆਂ ਨੂੰ ਯਾਦ ਰੱਖਣ ਵਾਂਗ ਹੈ। -ਜੇਕਰ ਏਜੰਟ ਨੇ ਇੱਕ ਖਾਸ ਫਲਾਈਟ ਬੁੱਕ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਪਰ ਇਹ ਅਨੁਪਲਬਧਤਾ ਦੇ ਕਾਰਨ ਫੇਲ੍ਹ ਹੋ ਗਈ, ਤਾਂ ਐਪੀਸੋਡਿਕ ਮੈਮੋਰੀ ਇਸ ਅਸਫਲਤਾ ਨੂੰ ਰਿਕਾਰਡ ਕਰ ਸਕਦੀ ਹੈ, ਜਿਸ ਨਾਲ ਏਜੰਟ ਨੂੰ ਵਿਅਕਤੀਗਤ ਤਰੀਕੇ ਨਾਲ ਦੂਜੀਆਂ ਫਲਾਈਟਾਂ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਜਾਂ ਯੂਜ਼ਰ ਨੂੰ ਇਸ ਮੁੱਦੇ ਬਾਰੇ ਜਾਣਕਾਰੀ ਦੇਣ ਦੀ ਯੋਗਤਾ ਮਿਲਦੀ ਹੈ। +**ਐਪੀਸੋਡਿਕ ਮੈਮੋਰੀ ਉਦਾਹਰਨ** -#### ਐਨਟੀਟੀ ਮੈਮੋਰੀ +ਜੇਕਰ ਏਜੰਟ ਨੇ ਇੱਕ ਖਾਸ ਫਲਾਈਟ ਬੁਕ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਪਰ ਇਹ ਅਨੁਪਲਬਧਤਾ ਕਾਰਨ ਫੇਲ੍ਹ ਹੋ ਗਈ, ਤਾਂ ਐਪੀਸੋਡਿਕ ਮੈਮੋਰੀ ਇਸ ਅਸਫਲਤਾ ਨੂੰ ਦਰਜ ਕਰ ਸਕਦੀ ਹੈ, ਜਿਸ ਨਾਲ ਏਜੰਟ ਬਦਲਵਾਂ ਫਲਾਈਟਾਂ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਸਕਦਾ ਹੈ ਜਾਂ ਅਗਲੇ ਯਤਨ ਦੌਰਾਨ ਯੂਜ਼ਰ ਨੂੰ ਇਸ ਮੁੱਦੇ ਬਾਰੇ ਵਧੇਰੇ ਜਾਣਕਾਰੀ ਦੇ ਸਕਦਾ ਹੈ। -ਇਸ ਵਿੱਚ ਗੱਲਬਾਤਾਂ ਤੋਂ ਵਿਸ਼ੇਸ਼ ਐਨਟੀਟੀਆਂ (ਜਿਵੇਂ ਕਿ ਲੋਕ, ਸਥਾਨ, ਜਾਂ ਚੀਜ਼ਾਂ) ਅਤੇ ਘਟਨਾਵਾਂ ਨੂੰ ਕੈਪਚਰ ਅਤੇ ਯਾਦ ਰੱਖਣਾ ਸ਼ਾਮਲ ਹੈ। ਇਹ ਏਜੰਟ ਨੂੰ ਚਰਚਾ ਕੀਤੇ ਗਏ ਮੁੱਖ ਤੱਤਾਂ ਦੀ ਸਟ੍ਰਕਚਰਡ ਸਮਝ ਬਣਾਉਣ ਦੀ ਯੋਗਤਾ ਦਿੰਦਾ ਹੈ। +#### ਐਂਟਿਟੀ ਮੈਮੋਰੀ -**ਐਨਟੀਟੀ ਮੈਮੋਰੀ ਉਦਾਹਰਨ** +ਇਸ ਵਿੱਚ ਗੱਲਬਾਤਾਂ ਤੋਂ ਖਾਸ ਐਂਟਿਟੀਆਂ (ਜਿਵੇਂ ਕਿ ਲੋਕ, ਸਥਾਨ, ਜਾਂ ਚੀਜ਼ਾਂ) ਅਤੇ ਘਟਨਾਵਾਂ ਨੂੰ ਕੈਪਚਰ ਅਤੇ ਯਾਦ ਰੱਖਣਾ ਸ਼ਾਮਲ ਹੈ। ਇਹ ਏਜੰਟ ਨੂੰ ਚਰਚਾ ਕੀਤੇ ਗਏ ਮੁੱਖ ਤੱਤਾਂ ਦੀ ਸਟ੍ਰਕਚਰਡ ਸਮਝ ਬਣਾਉਣ ਦੇ ਯੋਗ ਬਣਾਉਂਦੀ ਹੈ। -ਪਿਛਲੇ ਯਾਤਰਾ ਬਾਰੇ ਗੱਲਬਾਤ ਤੋਂ, ਏਜੰਟ "ਪੈਰਿਸ," "ਐਫਲ ਟਾਵਰ," ਅਤੇ "Le Chat Noir ਰੈਸਟੋਰੈਂਟ ਵਿੱਚ ਡਿਨਰ" ਨੂੰ ਐਨਟੀਟੀਆਂ ਵਜੋਂ ਕੈਪਚਰ ਕਰ ਸਕਦਾ ਹੈ। ਭਵਿੱਖ ਦੇ ਇੰਟਰੈਕਸ਼ਨ ਵਿੱਚ, ਏਜੰਟ "Le Chat Noir" ਨੂੰ ਯਾਦ ਕਰ ਸਕਦਾ ਹੈ ਅਤੇ ਉੱਥੇ ਨਵੀਂ ਰਿਜ਼ਰਵੇਸ਼ਨ ਕਰਨ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰ ਸਕਦਾ ਹੈ। +**ਐਂਟਿਟੀ ਮੈਮੋਰੀ ਉਦਾਹਰਨ** -#### ਸਟ੍ਰਕਚਰਡ RAG (ਰੀਟਰੀਵਲ ਆਗਮੈਂਟਡ ਜਨਰੇਸ਼ਨ) +ਇੱਕ ਪਿਛਲੇ ਯਾਤਰਾ ਬਾਰੇ ਗੱਲਬਾਤ ਤੋਂ, ਏਜੰਟ "ਪੈਰਿਸ," "ਐਫਲ ਟਾਵਰ," ਅਤੇ "Le Chat Noir ਰੈਸਟੋਰੈਂਟ ਵਿੱਚ ਡਿਨਰ" ਨੂੰ ਐਂਟਿਟੀਆਂ ਵਜੋਂ ਕੈਪਚਰ ਕਰ ਸਕਦਾ ਹੈ। ਭਵਿੱਖ ਦੇ ਇੰਟਰੈਕਸ਼ਨ ਵਿੱਚ, ਏਜੰਟ "Le Chat Noir" ਨੂੰ ਯਾਦ ਕਰ ਸਕਦਾ ਹੈ ਅਤੇ ਉੱਥੇ ਨਵੀਂ ਰਿਜ਼ਰਵੇਸ਼ਨ ਕਰਨ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰ ਸਕਦਾ ਹੈ। -ਜਦੋਂ ਕਿ RAG ਇੱਕ ਵਿਆਪਕ ਤਕਨੀਕ ਹੈ, "ਸਟ੍ਰਕਚਰਡ RAG" ਨੂੰ ਇੱਕ ਸ਼ਕਤੀਸ਼ਾਲੀ ਮੈਮੋਰੀ ਤਕਨਾਲੋਜੀ ਵਜੋਂ ਹਾਈਲਾਈਟ ਕੀਤਾ ਗਿਆ ਹੈ। ਇਹ ਵੱਖ-ਵੱਖ ਸਰੋਤਾਂ (ਗੱਲਬਾਤਾਂ, ਈਮੇਲ, ਚਿੱਤਰ) ਤੋਂ ਸੰਘਣੀ, ਸਟ੍ਰਕਚਰਡ ਜਾਣਕਾਰੀ ਕੈਪਚਰ ਕਰਦਾ ਹੈ ਅਤੇ ਜਵਾਬਾਂ ਵਿੱਚ ਸਹੀਪਨ, ਯਾਦਸ਼ਕਤੀ, ਅਤੇ ਗਤੀ ਨੂੰ ਵਧਾਉਣ ਲਈ ਇਸਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ। +#### ਸਟ੍ਰਕਚਰਡ RAG (ਰੀਟਰੀਵਲ ਆਗਮੈਂਟਡ ਜਨਰੇਸ਼ਨ) -**ਸਟ੍ਰਕਚਰਡ RAG ਉਦਾਹਰਨ** +ਜਦਕਿ RAG ਇੱਕ ਵਿਆਪਕ ਤਕਨੀਕ ਹੈ, "ਸਟ੍ਰਕਚਰਡ RAG" ਨੂੰ ਇੱਕ ਸ਼ਕਤੀਸ਼ਾਲੀ ਮੈਮੋਰੀ ਤਕਨੀਕ ਵਜੋਂ ਉਜਾਗਰ ਕੀਤਾ ਗਿਆ ਹੈ। ਇਹ ਵੱਖ-ਵੱਖ ਸਰੋਤਾਂ (ਗੱਲਬਾਤਾਂ, ਈਮੇਲਾਂ, ਚਿੱਤਰਾਂ) ਤੋਂ ਸੰਘਣੀ, ਸਟ੍ਰਕਚਰਡ ਜਾਣਕਾਰੀ ਕੈਪਚਰ ਕਰਦਾ ਹੈ ਅਤੇ ਇਸਨੂੰ ਜਵਾਬਾਂ ਵਿੱਚ ਸਹੀਪਨ, ਰੀਕਾਲ, ਅਤੇ ਗਤੀਸ਼ੀਲਤਾ ਵਧਾਉਣ ਲਈ ਵਰਤਦਾ ਹੈ। ਕਲਾਸਿਕ RAG ਦੇ ਵਿਰੁੱਧ, ਜੋ ਸਿਰਫ ਸੈਮੈਂਟਿਕ ਸਮਾਨਤਾ 'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ, ਸਟ੍ਰਕਚਰਡ RAG ਜਾਣਕਾਰੀ ਦੀ ਅੰਦਰੂਨੀ ਸਟ੍ਰਕਚਰ ਨਾਲ ਕੰਮ ਕਰਦਾ ਹੈ। -ਸਿਰਫ ਕੀਵਰਡਾਂ ਨੂੰ ਮੈਚ ਕਰਨ ਦੀ ਬਜਾਏ, ਸਟ੍ਰਕਚਰਡ RAG ਈਮੇਲ ਤੋਂ ਫਲਾਈਟ ਵੇਰਵੇ (ਗੰਤੀ ਸਥਾਨ, ਮਿਤੀ, ਸਮਾਂ, ਏਅਰਲਾਈਨ) ਨੂੰ ਪਾਰਸ ਕਰ ਸਕਦਾ ਹੈ ਅਤੇ ਇਸਨੂੰ ਸਟ੍ਰਕਚਰਡ ਤਰੀਕੇ ਨਾਲ ਸਟੋਰ ਕਰ ਸਕਦਾ ਹੈ। ਇਹ ਸਹੀ ਪੁੱਛਗਿੱਛਾਂ ਦੀ ਯੋਗਤਾ ਦਿੰਦਾ ਹੈ ਜਿਵੇਂ ਕਿ "ਮੈਂ ਮੰਗਲਵਾਰ ਨੂੰ ਪੈਰਿਸ ਲਈ ਕਿਹੜੀ ਫਲਾਈਟ ਬੁੱਕ ਕੀਤੀ?" +**ਸਟ੍ਰਕਚਰਡ RAG ਉਦਾਹਰਨ** -## ਮੈਮੋਰੀ ਨੂੰ ਲਾਗੂ ਕਰਨਾ ਅਤੇ ਸਟੋਰ ਕਰਨਾ +ਸਿਰਫ ਕੀਵਰਡ ਮੈਚ ਕਰਨ ਦੀ ਬਜਾਏ, ਸਟ੍ਰਕਚਰਡ RAG ਇੱਕ ਈਮੇਲ ਤੋਂ ਫਲਾਈਟ ਵੇਰਵੇ (ਗੰਤੀਵਾਰ, ਮਿਤੀ, ਸਮਾਂ, ਏਅਰਲਾਈਨ) ਨੂੰ ਪਾਰਸ ਕਰ ਸਕਦਾ ਹੈ ਅਤੇ ਇਸਨੂੰ ਸਟ੍ਰਕਚਰਡ ਤਰੀਕੇ ਨਾਲ ਸਟੋਰ ਕਰ ਸਕਦਾ ਹੈ। ਇਹ ਸਹੀ ਸਵਾਲਾਂ ਲਈ ਯੋਗ ਬਣਾਉਂਦਾ ਹੈ ਜਿਵੇਂ ਕਿ "ਮੈਂ ਮੰਗਲਵਾਰ ਨੂੰ ਪੈਰਿਸ ਲਈ ਕਿਹੜੀ ਫਲਾਈਟ ਬੁਕ ਕੀਤੀ ਸੀ?" -AI ਏਜੰਟਾਂ ਲਈ ਮੈਮੋਰੀ ਲਾਗੂ ਕਰਨਾ **ਮੈਮੋਰੀ ਪ੍ਰਬੰਧਨ** ਦੀ ਇੱਕ ਵਿਵਸਥਿਤ ਪ੍ਰਕਿਰਿਆ ਸ਼ਾਮਲ ਕਰਦਾ ਹੈ, ਜਿਸ ਵਿੱਚ ਜਾਣਕਾਰੀ ਪੈਦਾ ਕਰਨਾ, ਸਟੋਰ ਕਰਨਾ, ਰੀਟਰੀਵ ਕਰਨਾ, ਇੰਟੀਗ੍ਰੇਟ ਕਰਨਾ, ਅਪਡੇਟ ਕਰਨਾ, ਅਤੇ "ਭੁੱਲਣਾ" (ਜਾਂ ਮਿਟਾਉਣਾ) ਸ਼ਾਮਲ ਹੈ। ਰੀਟਰੀਵਲ ਇੱਕ ਖਾਸ ਤੌਰ 'ਤੇ ਮਹੱਤਵਪੂਰਨ ਪਹਲੂ ਹੈ। +## ਮੈਮੋਰੀ ਲਾਗੂ ਕਰਨਾ ਅਤੇ ਸਟੋਰ ਕਰਨਾ -### ਵਿਸ਼ੇਸ਼ਕ੍ਰਿਤ ਮੈਮੋਰੀ ਟੂਲਜ਼ +ਏਆਈ ਏਜੰਟਾਂ ਲਈ ਮੈਮੋਰੀ ਲਾਗੂ ਕਰਨਾ **ਮੈਮੋਰੀ ਪ੍ਰਬੰਧਨ** ਦੀ ਇੱਕ ਵਿਵਸਥਿਤ ਪ੍ਰਕਿਰਿਆ ਸ਼ਾਮਲ ਕਰਦਾ ਹੈ, ਜਿਸ ਵਿੱਚ ਜਾਣਕਾਰੀ ਪੈਦਾ ਕਰਨਾ, ਸਟੋਰ ਕਰਨਾ, ਰੀਟਰੀਵ ਕਰਨਾ, ਇੰਟੀਗ੍ਰੇਟ ਕਰਨਾ, ਅਪਡੇਟ ਕਰਨਾ, ਅਤੇ ਇੱਥੋਂ ਤੱਕ ਕਿ "ਭੁੱਲਣਾ" (ਜਾਂ ਮਿਟਾਉਣਾ) ਸ਼ਾਮਲ ਹੈ। ਰੀਟਰੀਵਲ ਖਾਸ ਤੌਰ 'ਤੇ ਇੱਕ ਮਹੱਤਵਪੂਰਨ ਪਹਲੂ ਹੈ। -ਏਜੰਟ ਮੈਮੋਰੀ ਨੂੰ ਸਟੋਰ ਅਤੇ ਪ੍ਰਬੰਧਿਤ ਕਰਨ ਦਾ ਇੱਕ ਤਰੀਕਾ ਵਿਸ਼ੇਸ਼ਕ੍ਰਿਤ ਟੂਲਜ਼ ਜਿਵੇਂ ਕਿ Mem0 ਦੀ ਵਰਤੋਂ ਕਰਨਾ ਹੈ। Mem0 ਇੱਕ ਪERSISTENT ਮੈਮੋਰੀ ਲੇਅਰ ਵਜੋਂ ਕੰਮ ਕਰਦਾ ਹੈ, ਜੋ ਏਜੰਟਾਂ ਨੂੰ ਸਬੰਧਤ ਇੰਟਰੈਕਸ਼ਨ ਯਾਦ ਕਰਨ, ਯੂਜ਼ਰ ਪਸੰਦਾਂ ਅਤੇ ਤੱਥਾਤਮਕ ਸੰਦਰਭ ਸਟੋਰ ਕਰਨ, ਅਤੇ ਸਮੇਂ ਦੇ ਨਾਲ ਸਫਲਤਾਵਾਂ ਅਤੇ ਅਸਫਲਤਾਵਾਂ ਤੋਂ ਸਿੱਖਣ ਦੀ ਯੋਗਤਾ ਦਿੰਦਾ ਹੈ। ਇੱਥੇ ਵਿਚਾਰ ਇਹ ਹੈ ਕਿ ਸਟੇਟਲੈਸ ਏਜੰਟਾਂ ਨੂੰ ਸਟੇਟਫੁਲ ਬਣਾਇਆ ਜਾਵੇ। +### ਵਿਸ਼ੇਸ਼ ਮੈਮੋਰੀ ਟੂਲ -ਇਹ **ਦੋ-ਫੇਜ਼ ਮੈਮੋਰੀ ਪਾਈਪਲਾਈਨ: ਐਕਸਟ੍ਰੈਕਸ਼ਨ ਅਤੇ ਅਪਡੇਟ** ਦੁਆਰਾ ਕੰਮ ਕਰਦਾ ਹੈ। ਪਹਿਲਾਂ, ਏਜੰਟ ਦੇ ਥ੍ਰੈਡ ਵਿੱਚ ਸ਼ਾਮਲ ਕੀਤੇ ਗਏ ਸੁਨੇਹੇ Mem0 ਸੇਵਾ ਨੂੰ ਭੇਜੇ ਜਾਂਦੇ ਹਨ, ਜੋ ਗੱਲਬਾਤ ਦੀ ਹਿਸਟਰੀ ਨੂੰ ਸੰਖੇਪ ਕਰਨ ਅਤੇ ਨਵੀਆਂ ਮੈਮੋਰੀਆਂ ਕੈਪਚਰ ਕਰਨ ਲਈ ਇੱਕ ਵੱਡੇ ਭਾਸ਼ਾ ਮਾਡਲ (LLM) ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ। ਇਸਦੇ ਬਾਅਦ, ਇੱਕ LLM-ਚਲਿਤ ਅਪਡੇਟ ਫੇਜ਼ ਇਹ ਨਿਰਧਾਰਤ ਕਰਦਾ ਹੈ ਕਿ ਕੀ ਇਹ ਮੈਮੋਰੀਆਂ ਸ਼ਾਮਲ, ਸੋਧ, ਜਾਂ ਮਿਟਾਈਆਂ ਜਾਣੀਆਂ ਚਾਹੀਦੀਆਂ ਹਨ, ਅਤੇ ਇਹਨਾਂ ਨੂੰ ਇੱਕ ਹਾਈਬ੍ਰਿਡ ਡਾਟਾ ਸਟੋਰ ਵਿੱਚ ਸਟੋਰ ਕਰਦਾ ਹੈ ਜੋ ਵੈਕਟਰ, ਗ੍ਰਾਫ, ਅਤੇ ਕੀ-ਵੈਲਯੂ ਡਾਟਾਬੇਸ ਸ਼ਾਮਲ ਕਰ ਸਕਦਾ ਹੈ। ਇਹ ਪ੍ਰਣਾਲੀ ਵੱਖ-ਵੱਖ ਮੈਮੋਰੀ ਪ੍ਰਕਾਰਾਂ ਦਾ ਸਮਰਥਨ ਕਰਦੀ ਹੈ ਅਤੇ ਗ੍ਰਾਫ ਮੈਮੋਰੀ ਨੂੰ ਸ਼ਾਮਲ ਕਰ ਸਕਦੀ ਹੈ ਜੋ ਐਨਟੀਟੀਆਂ ਦੇ ਵਿਚਕਾਰ ਸੰਬੰਧਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਦੀ ਹੈ। +#### Mem0 -### RAG ਨਾਲ ਮੈਮੋਰੀ ਸਟੋਰ ਕਰਨਾ +ਏਜੰਟ ਮੈਮੋਰੀ ਨੂੰ ਸਟੋਰ ਅਤੇ ਪ੍ਰਬੰਧਿਤ ਕਰਨ ਦਾ ਇੱਕ ਤਰੀਕਾ ਵਿਸ਼ੇਸ਼ ਟੂਲਾਂ ਜਿਵੇਂ ਕਿ Mem0 ਦੀ ਵਰਤੋਂ ਕਰਨਾ ਹੈ। Mem0 ਇੱਕ ਸਥਾਈ ਮੈਮੋਰੀ ਲੇਅਰ ਵਜੋਂ ਕੰਮ ਕਰਦਾ ਹੈ, ਜੋ ਏਜੰਟਾਂ ਨੂੰ ਪ੍ਰਸੰਗਿਕ ਇੰਟਰੈਕਸ਼ਨ ਯਾਦ ਕਰਨ, ਯੂਜ਼ਰ ਦੀਆਂ ਪਸੰਦਾਂ ਅਤੇ ਤੱਥਾਤਮਕ ਸੰਦਰਭ ਸਟੋਰ ਕਰਨ, ਅਤੇ ਸਮੇਂ ਦੇ ਨਾਲ ਸਫਲਤਾਵਾਂ ਅਤੇ ਅਸਫਲਤਾਵਾਂ ਤੋਂ ਸਿੱਖਣ ਦੇ ਯੋਗ ਬਣਾਉਂਦਾ ਹੈ। ਇੱਥੇ ਵਿਚਾਰ ਇਹ ਹੈ ਕਿ ਸਟੇਟਲੈੱਸ ਏਜੰਟਾਂ ਨੂੰ ਸਟੇਟਫੁਲ ਬਣਾਇਆ ਜਾਵੇ। -ਵਿਸ਼ੇਸ਼ਕ੍ਰਿਤ ਮੈਮੋਰੀ ਟੂਲਜ਼ ਜਿਵੇਂ ਕਿ Mem0 ਤੋਂ ਇਲਾਵਾ, ਤੁਸੀਂ **Azure AI Search** ਵਰਗੇ ਮਜ਼ਬ +ਇਹ **ਦੋ-ਚਰਣ ਮੈਮੋਰੀ ਪਾਈਪਲਾਈਨ: ਐਕਸਟ੍ਰੈਕਸ਼ਨ ਅਤੇ ਅਪਡੇਟ** ਰਾਹੀਂ ਕੰਮ ਕਰਦਾ ਹੈ। ਪਹਿਲਾਂ, ਏਜੰਟ ਦੇ ਥ੍ਰੈਡ ਵਿੱਚ ਸ਼ਾਮਲ ਕੀਤੇ ਗਏ ਸੁਨੇਹੇ Mem0 ਸੇਵਾ ਨੂੰ ਭੇਜੇ ਜਾਂਦੇ ਹਨ, ਜੋ ਗੱਲਬਾਤ ਦੇ ਇਤਿਹਾਸ ਨੂੰ ਸੰਖੇਪ ਕਰਨ ਅਤੇ ਨਵੀਆਂ ਮੈਮੋਰੀਆਂ ਕੈਪਚਰ ਕਰਨ ਲਈ ਇੱਕ ਵੱਡੇ ਭਾਸ਼ਾ --- -**ਅਸਵੀਕਰਤੀ**: -ਇਹ ਦਸਤਾਵੇਜ਼ AI ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਹਾਲਾਂਕਿ ਅਸੀਂ ਸਹੀਤਾ ਲਈ ਯਤਨਸ਼ੀਲ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸੁੱਤੀਆਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਇਸ ਦਸਤਾਵੇਜ਼ ਦਾ ਮੂਲ ਰੂਪ ਇਸਦੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਅਧਿਕਾਰਤ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਸ ਅਨੁਵਾਦ ਦੀ ਵਰਤੋਂ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਗਲਤਫਹਿਮੀ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆ ਲਈ ਅਸੀਂ ਜ਼ਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ। \ No newline at end of file + +**ਅਸਵੀਕਰਤਾ**: +ਇਹ ਦਸਤਾਵੇਜ਼ AI ਅਨੁਵਾਦ ਸੇਵਾ [Co-op Translator](https://github.com/Azure/co-op-translator) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅਨੁਵਾਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਦੋਂ ਕਿ ਅਸੀਂ ਸਹੀ ਹੋਣ ਦਾ ਯਤਨ ਕਰਦੇ ਹਾਂ, ਕਿਰਪਾ ਕਰਕੇ ਧਿਆਨ ਦਿਓ ਕਿ ਸਵੈਚਾਲਿਤ ਅਨੁਵਾਦਾਂ ਵਿੱਚ ਗਲਤੀਆਂ ਜਾਂ ਅਸੁੱਤੀਆਂ ਹੋ ਸਕਦੀਆਂ ਹਨ। ਇਸ ਦੀ ਮੂਲ ਭਾਸ਼ਾ ਵਿੱਚ ਮੂਲ ਦਸਤਾਵੇਜ਼ ਨੂੰ ਅਧਿਕਾਰਤ ਸਰੋਤ ਮੰਨਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਲਈ, ਪੇਸ਼ੇਵਰ ਮਨੁੱਖੀ ਅਨੁਵਾਦ ਦੀ ਸਿਫਾਰਸ਼ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਸ ਅਨੁਵਾਦ ਦੀ ਵਰਤੋਂ ਤੋਂ ਪੈਦਾ ਹੋਣ ਵਾਲੇ ਕਿਸੇ ਵੀ ਗਲਤਫਹਿਮੀ ਜਾਂ ਗਲਤ ਵਿਆਖਿਆ ਲਈ ਅਸੀਂ ਜ਼ਿੰਮੇਵਾਰ ਨਹੀਂ ਹਾਂ। + \ No newline at end of file diff --git a/translations/pcm/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/pcm/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..080df19fc --- /dev/null +++ b/translations/pcm/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# How to Build AI Agents wey get Persistent Memory wit Cognee\n", + "\n", + "Dis notebook go show how to take build smart AI agents wey sabi memory well well using [**cognee**](https://www.cognee.ai/) - na open source AI memory wey join knowledge graphs, semantic search, and session management to create AI systems wey sabi context.\n", + "\n", + "## 🎯 Wetin You Go Learn\n", + "\n", + "By the time you finish dis tutorial, you go sabi how to:\n", + "- **Build Knowledge Graphs wey dey Backed by Embeddings**: Change text wey no get structure into structured knowledge wey you fit query\n", + "- **Implement Session Memory**: Create multi-turn conversations wey go dey keep context automatically\n", + "- **Keep Conversations for Future**: Store important interactions for long-term memory if you want am\n", + "- **Query wit Natural Language**: Use historical context for new conversations\n", + "- **See Memory Visuals**: Check how your agent's knowledge graph dey connect\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Wetin You Go Build\n", + "\n", + "For dis tutorial, we go create one **Coding Assistant** wey get memory wey no dey loss, wey fit do di following:\n", + "\n", + "### 1. **Build Knowledge Base**\n", + " - Go fit collect developer profile and di kain expertise wey dem get\n", + " - Go sabi process Python programming principles and di best ways to take use am\n", + " - Go dey store old conversations wey don happen between developers and AI assistants\n", + "\n", + "### 2. **Session-Aware Conversations**\n", + " - Go fit remember context for di same session even if na multiple questions\n", + " - Go dey automatically save each question/answer pair so e go dey easy to find later\n", + " - Go dey give correct and meaningful response based on di conversation wey don happen before\n", + "\n", + "### 3. **Long-term Memory**\n", + " - Go dey keep important conversations for long-term memory\n", + " - Go fit bring out relevant memories from di knowledge base and past sessions to help for new interactions\n", + " - Go dey build di knowledge base small small so e go dey better as time dey go\n", + "\n", + "### 4. **Intelligent Memory Retrieval**\n", + " - Go use graph-aware semantic search to find di correct information from all di knowledge wey e don store\n", + " - Go fit filter di search by di kain data group (like developer info or principles)\n", + " - Go dey combine different data sources to give complete and correct answers\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Wetin You Need & How to Set Up\n", + "\n", + "### System Requirements\n", + "\n", + "Before you start, make sure say you get:\n", + "\n", + "1. **Python Environment**\n", + " - Python 3.9 or higher\n", + " - Virtual environment (e good make you use am)\n", + "\n", + "2. **Redis Cache** (You go need am for Session Management)\n", + " - Local Redis: `docker run -d -p 6379:6379 redis`\n", + " - Or make you use managed Redis service\n", + "\n", + "3. **LLM API Access**\n", + " - OpenAI API key or other providers (check [documentation](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Database Configuration**\n", + " - By default, you no need configure anything. Cognee dey use file-based databases (LanceDB and Kuzu)\n", + " - If you wan, you fit set up Azure AI Search as vector store (check [documentation](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Environment Configuration\n", + "\n", + "Create `.env` file for your project directory wey go get these variables:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Understanding Cognee Memory Architecture\n", + "\n", + "### How Cognee Dey Work\n", + "\n", + "Cognee get one kind beta memory system wey pass just ordinary key-value storage:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Di Main Parts:\n", + "\n", + "1. **Knowledge Graph**: E dey store entities, relationships, and semantic connections\n", + "2. **Vector Embeddings**: E dey make semantic search possible for all di information wey dem store\n", + "3. **Session Cache**: E dey keep conversation context for inside and between sessions\n", + "4. **NodeSets**: E dey arrange data into logical categories so retrieval go dey easy\n", + "\n", + "### Di Kain Memory We Go Talk About for Dis Tutorial:\n", + "\n", + "- **Persistent Memory**: Na long-term storage for di knowledge graph\n", + "- **Session Memory**: Na temporary conversation context wey dey for Redis cache\n", + "- **Semantic Memory**: Na vector-based similarity search wey dey work for all di data\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Install Di Package Wey You Need\n", + "\n", + "Install Cognee wey get Redis support for session management:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Set Up Environment and Load Libraries\n", + "\n", + "Make sure say:\n", + "1. Redis dey run (e.g., if you wan use Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. You don set environment variables before you import cache modules\n", + "3. If e need, restart di kernel and run di cells one by one for correct order\n", + "\n", + "Di cell wey dey follow go do di following:\n", + "1. Load environment variables from `.env`\n", + "2. Configure Cognee wit your LLM settings\n", + "3. Enable caching for session management\n", + "4. Check say all di components connect well well\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Configure Storage Directories\n", + "\n", + "Cognee dey use two diffren directories for di work wey e dey do: \n", + "- **Data Root**: Na here e dey store di documents wey e don collect and di data wey e don process. \n", + "- **System Root**: Na here e dey keep di knowledge graph database and di system metadata. \n", + "\n", + "We go create separate directories for dis tutorial like dis: \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Reset Memory State\n", + "\n", + "Before we go start to build our memory system, make we make sure say we dey start afresh.\n", + "\n", + "> 💡 **Tip**: You fit skip dis step if you wan keep di memories wey dey already from di runs wey you don do before when you go use dis notebook later.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Part 1: How to Build Di Knowledge Base\n", + "\n", + "### Data We Go Use for Our Developer Assistant\n", + "\n", + "We go collect three kain data to build beta knowledge base:\n", + "\n", + "1. **Developer Profile**: Di person skill and wetin dem sabi for tech\n", + "2. **Python Best Practices**: Di Zen of Python wit practical guidelines\n", + "3. **Historical Conversations**: Old Q&A wey don happen between developers and AI assistants\n", + "\n", + "Dis kain data go help our agent to:\n", + "- Sabi di user technical level\n", + "- Use best practices for di advice wey e go give\n", + "- Learn from di past interactions wey don work well\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Process Data into Knowledge Graph\n", + "\n", + "Now we go change our raw text into structured memory. Dis process:\n", + "\n", + "1. **Add data to NodeSets**: E go arrange information into correct categories\n", + " - `developer_data`: Developer profile and wetin dem talk\n", + " - `principles_data`: Python best practices and guidelines\n", + "\n", + "2. **Run Cognify Pipeline**: E go extract entities, relationships, and create embeddings\n", + " - E go find key concepts\n", + " - E go connect related information semantically\n", + " - E go generate vector embeddings\n", + "\n", + "Dis one fit take small time as LLM dey process di text and dey build di graph structure:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 See Di Knowledge Graph\n", + "\n", + "Make we check how di knowledge graph be. Di visualization go show:\n", + "- **Nodes**: Entities wey dem comot from di text (concepts, technologies, people)\n", + "- **Edges**: Di relationships and connections wey dey between di entities\n", + "- **Clusters**: Related concepts wey dem group based on semantic similarity\n", + "\n", + "Open di HTML file wey dem generate for your browser to fit explore di graph well well:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Add Memory wit Memify\n", + "\n", + "Di `memify()` function dey check di knowledge graph and e dey create smart rules about di data. Dis process:\n", + "- E dey find patterns and di best way to do things\n", + "- E dey make guidelines wey you fit use based on di content\n", + "- E dey connect different knowledge areas together\n", + "\n", + "Dis rules go help di agent sabi better how to answer questions. If you capture second visualization, e go help you see how di graph don get more connections after e don enrich am.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Part 2: Intelligent Memory Retrieval\n", + "\n", + "### Demonstration 1: Cross-Document Knowledge Integration\n", + "\n", + "Now wey we don build di knowledge graph, make we test how Cognee dey join information from different sources to fit answer complex questions.\n", + "\n", + "Di first query go show:\n", + "- **Semantic understanding**: How e dey find di correct concepts even if dem no talk am directly\n", + "- **Cross-referencing**: How e dey join developer profile with Python principles\n", + "- **Contextual reasoning**: How e dey use best practices for specific implementations\n", + "\n", + "### Demonstration 2: Filtered Search with NodeSets\n", + "\n", + "Di second query go show how you fit target specific parts of di knowledge graph:\n", + "- E dey use `node_name` parameter to search only inside `principles_data`\n", + "- E dey give focused answers from one particular knowledge area\n", + "- E dey useful when you need information wey dey specific to one domain\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Part 3: Session Management Setup\n", + "\n", + "### How to Make Conversation Memory Work\n", + "\n", + "Session management dey very important to keep context for plenty interactions. For here we go:\n", + "\n", + "1. **Start User Context**: Create or find user profile wey go help track session\n", + "2. **Set Cache Engine**: Connect am to Redis to store conversation history\n", + "3. **Turn On Session Variables**: Arrange context variables wey go dey stay for all queries\n", + "\n", + "> ⚠️ **Important**: This one need make Redis dey run and `CACHING=true` for your environment\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Helper Function: View Session History\n", + "\n", + "Dis function go help us check di tok wey don dey store for Redis. E dey useful for:\n", + "- Debug di way session dey work\n", + "- Make sure say di tok dem dey save well\n", + "- Understand di kind context wey di agent fit use\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Session 1: Async Support Lab — First Question\n", + "\n", + "Start the `async-support-lab` session by ask how person fit use telemetry-friendly asyncio patterns for one big web scraper. Di graph don already sabi asyncio, aiohttp, and monitoring practices, so di answer suppose match wetin dem don talk before but e go still fit di new question.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Check Session 1 Memory After Di Fes Tok\n", + "\n", + "If you run `show_history(session_1)` just afta di first question, e go show say Cognee don put di prompt and di answer inside Redis. You go see one entry wey get di concurrency guidance.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Session 1: Follow-up on Data Models\n", + "\n", + "Next we go ask, \"Wen I go fit choose dataclasses or Pydantic?\" we go use di same session id. Cognee go join di Python principles plus di FastAPI talk wey we don do before to give better advice—show say context dey continue inside one session wey get name.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Confirm Session 1 History Get Both Turns\n", + "\n", + "Another `show_history(session_1)` call go show two Q&A entries. Dis one match di Mem0 lab \"memory replay\" step and e show say extra turns dey add to di same transcript.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Session 2: Design Review Thread — Fresh Session\n", + "\n", + "To show say threads dey separate, we go start `design-review-session` and ask for logging guidance for incident reviews. Even though di knowledge base wey dey under dey di same, di new session id go keep transcripts separate.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Review Session 2 History\n", + "\n", + "`show_history(session_2)` suppose show only di design-review prompt/response pair. Compare am wit Session 1 to show how Cognee dey keep separate transcripts but still dey use di shared knowledge graph.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "Congrats! You don give your coding assistant real long-term memory layer wey dey powered by Cognee.\n", + "\n", + "For dis tutorial, you carry raw developer content (code, docs, chats) turn am into graph + vector memory wey your agent fit search, reason on top, and dey improve steady.\n", + "\n", + "Wetin You Don Learn\n", + "\n", + "1. **From raw text to AI memory**: How Cognee dey take unstructured data turn am into smart, searchable memory using combined vector + knowledge graph architecture.\n", + "\n", + "2. **Graph enrichment with memify**: How you fit go beyond just creating graph and use memify take add extra facts and better relationships on top your graph wey don already dey.\n", + "\n", + "3. **Multiple search strategies**: How to query memory with different search types (graph-aware Q&A, RAG-style completion, insights, raw chunks, code search, etc.) based on wetin your agent need.\n", + "\n", + "4. **Visual exploration**: How to check and debug wetin Cognee don build using graph visualizations and the Cognee UI, so you fit see how knowledge take dey structured.\n", + "\n", + "5. **Session-aware memory**: How to join per-session context with persistent semantic memory so agents fit remember across runs without leaking information between users.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Key Takeaways\n", + "1. Memory as Knowledge Graph wey dey use Embeddings\n", + "\n", + " - **Beta understanding**: Cognee dey join vector store and graph store so your data go dey searchable by meaning and e go still connect by relationships. Cognee dey use file-based databases by default (LanceDB for vector-, Kuzu for graph database).\n", + "\n", + " - **Relationship-aware retrieval**: Answers no go just base on “similar text,” but e go also consider how entities take relate.\n", + "\n", + " - **Living memory**: The memory layer dey evolve, grow, and e go still dey queryable as one connected graph.\n", + "\n", + "2. Search & Reasoning Modes\n", + " - **Hybrid retrieval**: Search dey mix vector similarity, graph structure, and LLM reasoning, from raw chunk lookup to graph-aware question answering.\n", + "\n", + " - **Fit the mode to the job**: Use completion-style modes if you want natural language answers, and chunk/summary/graph modes if your agent need raw context or wan drive im own reasoning.\n", + "\n", + "3. Personalized, Session-Aware Agents\n", + " - **Session context + long-term memory**: Cognee dey keep short-term “thread” context separate from long-lived, user- or org-level memory.\n", + "\n", + "## Real-World Applications\n", + "\n", + "1. **Vertical AI Agents**\n", + "\n", + " Use the pattern wey dey this notebook to power domain-smart copilots wey go dey on top of Cognee as their retrieval and reasoning core:\n", + "\n", + "- **Developer copilots**: Code review, incident analysis, and architecture assistants wey fit waka through code, APIs, design docs, and tickets as one memory graph.\n", + "\n", + "- **Customer-facing copilots**: Support or success agents wey dey pull from product docs, FAQs, CRM notes, and past tickets with graph-aware retrieval and cited answers.\n", + "\n", + "- **Internal expert copilots**: Policy, legal, or security assistants wey dey reason over interconnected rules, guidelines, and historical decisions instead of isolated PDFs.\n", + "\n", + " Cognee dey positioned as persistent, accurate memory for AI agents, wey dey provide living knowledge graph wey fit dey behind your agent and replace ad-hoc combinations of vector stores and custom graph code.\n", + "\n", + "2. **Unifying Data Silos into One Memory**\n", + "\n", + " This same approach go help you build one unified memory layer across scattered sources:\n", + "\n", + "- **From silos to one graph**: Ingest structured (e.g., databases) and unstructured data (e.g., docs, chats) into one single graph wey dey backed by embeddings, instead of separate indices for each system.\n", + "\n", + "- **Cross-source reasoning with citations**: Run multi-step reasoning over everything—“join” logs, metrics, and docs via the graph—and still return grounded answers with provenance.\n", + "\n", + "- **Knowledge hubs**: For domains like banking or education, Cognee don already dey used to unify PDFs, internal systems, and app data into one knowledge graph with vectors so agents fit answer questions with precise, cited context.\n", + "\n", + "## Next Steps\n", + "\n", + "You don implement the core memory loop. These na natural extensions wey you fit try on your own (see [Cognee documentation](https://docs.cognee.ai/) for details):\n", + "\n", + "1. **Experiment with temporal awareness**: Turn on temporal cognify to extract events and timestamps from text.\n", + "\n", + "2. **Introduce ontology-driven reasoning**: Define an OWL ontology for your domain. Use Cognee’s ontology support so extracted entities and relations go dey grounded in that schema, wey go improve graph quality and domain-specific answers.\n", + "\n", + "3. **Add a feedback loop**: Make Cognee dey adjust graph edge weights from real user feedback, so retrieval go dey improve over time instead of staying static.\n", + "\n", + "4. **Tune for personalization & session behavior**: Use user IDs, tenants, and datasets to give each person or team their own view over the shared memory engine.\n", + "\n", + "5. **Scale out to more complex agents**: Plug Cognee into agent frameworks to build multi-agent systems wey all go dey share the same memory layer. *Microsoft Agent Framework x Cognee plugin dey come soon.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Disclaimer**: \nDis dokyument don use AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator) do di translation. Even as we dey try make am correct, abeg make you sabi say machine translation fit get mistake or no dey accurate well. Di original dokyument wey dey for im native language na di main source wey you go trust. For important information, e better make professional human translation dey use. We no go fit take blame for any misunderstanding or wrong interpretation wey fit happen because you use dis translation.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:54:43+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "pcm" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/pcm/13-agent-memory/README.md b/translations/pcm/13-agent-memory/README.md index 7c57ce1b1..590484153 100644 --- a/translations/pcm/13-agent-memory/README.md +++ b/translations/pcm/13-agent-memory/README.md @@ -1,8 +1,8 @@ **Disclaimer**: -Dis dokyument don use AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator) do di translation. Even as we dey try make am accurate, abeg sabi say automated translations fit get mistake or no dey correct well. Di original dokyument for im native language na di main source wey you go fit trust. For important information, e good make professional human translation dey use. We no go fit take blame for any misunderstanding or wrong interpretation wey fit happen because you use dis translation. +Dis dokyument don use AI translation service [Co-op Translator](https://github.com/Azure/co-op-translator) do di translation. Even as we dey try make am correct, abeg sabi say machine translation fit get mistake or no dey accurate well. Di original dokyument for im native language na di main source wey you go fit trust. For important information, e good make professional human translation dey use. We no go fit take blame for any misunderstanding or wrong interpretation wey fit happen because you use dis translation. \ No newline at end of file diff --git a/translations/pl/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/pl/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..cba926420 --- /dev/null +++ b/translations/pl/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Tworzenie agentów AI z trwałą pamięcią za pomocą Cognee\n", + "\n", + "Ten notatnik pokazuje, jak budować inteligentne agenty AI z zaawansowanymi możliwościami pamięci, korzystając z [**cognee**](https://www.cognee.ai/) - otwartoźródłowej pamięci AI, która łączy grafy wiedzy, wyszukiwanie semantyczne i zarządzanie sesjami, aby tworzyć systemy AI świadome kontekstu.\n", + "\n", + "## 🎯 Cele nauki\n", + "\n", + "Po ukończeniu tego samouczka będziesz rozumieć, jak:\n", + "- **Budować grafy wiedzy wspierane przez osadzenia**: Przekształcać nieustrukturyzowany tekst w ustrukturyzowaną, zapytaniową wiedzę\n", + "- **Wdrażać pamięć sesji**: Tworzyć wieloetapowe rozmowy z automatycznym zachowaniem kontekstu\n", + "- **Przechowywać rozmowy**: Opcjonalnie zapisywać ważne interakcje w pamięci długoterminowej do przyszłego wykorzystania\n", + "- **Zapytania w języku naturalnym**: Uzyskiwać dostęp do historycznego kontekstu i wykorzystywać go w nowych rozmowach\n", + "- **Wizualizować pamięć**: Eksplorować relacje w grafie wiedzy Twojego agenta\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Co Zbudujesz\n", + "\n", + "W tym poradniku stworzymy **Asystenta Kodowania** z trwałą pamięcią, który:\n", + "\n", + "### 1. **Tworzenie Bazy Wiedzy**\n", + " - Pobiera informacje o profilu i doświadczeniu programisty\n", + " - Przetwarza zasady i najlepsze praktyki programowania w Pythonie\n", + " - Przechowuje historyczne rozmowy między programistami a asystentami AI\n", + "\n", + "### 2. **Rozmowy Świadome Sesji**\n", + " - Utrzymuje kontekst w ramach wielu pytań w tej samej sesji\n", + " - Automatycznie zapisuje każdą parę pytanie/odpowiedź dla efektywnego wyszukiwania\n", + " - Dostarcza spójne, kontekstowe odpowiedzi na podstawie historii rozmowy\n", + "\n", + "### 3. **Długoterminowa Pamięć**\n", + " - Zachowuje ważne rozmowy w długoterminowej pamięci\n", + " - Wydobywa istotne wspomnienia z bazy wiedzy i poprzednich sesji, aby wzbogacić nowe interakcje\n", + " - Buduje rosnącą bazę wiedzy, która z czasem się ulepsza\n", + "\n", + "### 4. **Inteligentne Wyszukiwanie Pamięci**\n", + " - Wykorzystuje semantyczne wyszukiwanie oparte na grafach, aby znaleźć istotne informacje w całej przechowywanej wiedzy\n", + " - Filtruje wyszukiwania według podgrup danych (informacje o programiście vs. zasady)\n", + " - Łączy różne źródła danych, aby dostarczyć kompleksowe odpowiedzi\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Wymagania wstępne i konfiguracja\n", + "\n", + "### Wymagania systemowe\n", + "\n", + "Przed rozpoczęciem upewnij się, że masz:\n", + "\n", + "1. **Środowisko Python**\n", + " - Python 3.9 lub nowszy\n", + " - Wirtualne środowisko (zalecane)\n", + " \n", + "2. **Redis Cache** (Wymagane do zarządzania sesjami)\n", + " - Lokalny Redis: `docker run -d -p 6379:6379 redis`\n", + " - Lub skorzystaj z zarządzanej usługi Redis\n", + " \n", + "3. **Dostęp do API LLM**\n", + " - Klucz API OpenAI lub innych dostawców (zobacz [dokumentację](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Konfiguracja bazy danych**\n", + " - Domyślnie nie jest wymagana żadna konfiguracja. Cognee korzysta z baz danych opartych na plikach (LanceDB i Kuzu)\n", + " - Opcjonalnie możesz skonfigurować Azure AI Search jako magazyn wektorów (zobacz [dokumentację](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Konfiguracja środowiska\n", + "\n", + "Utwórz plik `.env` w katalogu swojego projektu z następującymi zmiennymi:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Zrozumienie Architektury Pamięci Cognee\n", + "\n", + "### Jak działa Cognee\n", + "\n", + "Cognee oferuje zaawansowany system pamięci, który wykracza poza prostą pamięć klucz-wartość:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Kluczowe elementy:\n", + "\n", + "1. **Graf wiedzy**: Przechowuje jednostki, relacje i połączenia semantyczne \n", + "2. **Wektory osadzeń**: Umożliwiają wyszukiwanie semantyczne w całej przechowywanej informacji \n", + "3. **Pamięć sesji**: Utrzymuje kontekst rozmowy w trakcie i pomiędzy sesjami \n", + "4. **NodeSets**: Organizują dane w logiczne kategorie dla ukierunkowanego wyszukiwania \n", + "\n", + "### Rodzaje pamięci w tym samouczku:\n", + "\n", + "- **Pamięć trwała**: Długoterminowe przechowywanie w grafie wiedzy \n", + "- **Pamięć sesji**: Tymczasowy kontekst rozmowy w pamięci podręcznej Redis \n", + "- **Pamięć semantyczna**: Wyszukiwanie podobieństw oparte na wektorach w całych danych \n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Zainstaluj wymagane pakiety\n", + "\n", + "Zainstaluj Cognee z obsługą Redis do zarządzania sesjami:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Inicjalizacja środowiska i ładowanie bibliotek\n", + "\n", + "Upewnij się, że:\n", + "1. Redis jest uruchomiony (np. za pomocą Dockera: `docker run -d -p 6379:6379 redis`)\n", + "2. Zmienne środowiskowe są ustawione przed zaimportowaniem modułów pamięci podręcznej\n", + "3. Jeśli to konieczne, zrestartuj kernel i uruchom komórki w odpowiedniej kolejności\n", + "\n", + "Poniższa komórka:\n", + "1. Załaduje zmienne środowiskowe z pliku `.env`\n", + "2. Skonfiguruje Cognee z ustawieniami Twojego LLM\n", + "3. Włączy pamięć podręczną do zarządzania sesją\n", + "4. Zweryfikuje, czy wszystkie komponenty są poprawnie połączone\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Konfiguracja katalogów przechowywania\n", + "\n", + "Cognee używa dwóch oddzielnych katalogów do swoich operacji:\n", + "- **Data Root**: Przechowuje zaimportowane dokumenty i przetworzone dane\n", + "- **System Root**: Zawiera bazę danych grafu wiedzy oraz metadane systemowe\n", + "\n", + "W tym samouczku utworzymy odizolowane katalogi w następujący sposób:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Zresetuj stan pamięci\n", + "\n", + "Zanim zaczniemy budować nasz system pamięci, upewnijmy się, że zaczynamy od zera.\n", + "\n", + "> 💡 **Wskazówka**: Możesz pominąć ten krok, jeśli chcesz zachować istniejące wspomnienia z poprzednich uruchomień tego notatnika.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Część 1: Tworzenie bazy wiedzy\n", + "\n", + "### Źródła danych dla naszego asystenta programisty\n", + "\n", + "Wykorzystamy trzy rodzaje danych, aby stworzyć kompleksową bazę wiedzy:\n", + "\n", + "1. **Profil programisty**: Osobista wiedza i doświadczenie techniczne \n", + "2. **Najlepsze praktyki w Pythonie**: Zasady Zen of Python z praktycznymi wskazówkami \n", + "3. **Historyczne rozmowy**: Poprzednie sesje pytań i odpowiedzi między programistami a asystentami AI \n", + "\n", + "Ta różnorodność danych pozwala naszemu agentowi: \n", + "- Zrozumieć techniczny kontekst użytkownika \n", + "- Stosować najlepsze praktyki w rekomendacjach \n", + "- Uczyć się na podstawie wcześniejszych udanych interakcji \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Przetwarzanie danych na graf wiedzy\n", + "\n", + "Teraz przekształcimy nasz surowy tekst w uporządkowaną pamięć. Ten proces:\n", + "\n", + "1. **Dodaje dane do NodeSets**: Organizuje informacje w logiczne kategorie\n", + " - `developer_data`: Profil dewelopera i rozmowy\n", + " - `principles_data`: Najlepsze praktyki i wytyczne dotyczące Pythona\n", + "\n", + "2. **Uruchamia pipeline Cognify**: Wydobywa encje, relacje i tworzy osadzenia\n", + " - Identyfikuje kluczowe pojęcia\n", + " - Tworzy semantyczne powiązania między powiązanymi informacjami\n", + " - Generuje osadzenia wektorowe\n", + "\n", + "Może to zająć chwilę, ponieważ LLM przetwarza tekst i buduje strukturę grafu:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Wizualizacja Grafu Wiedzy\n", + "\n", + "Przyjrzyjmy się strukturze naszego grafu wiedzy. Wizualizacja pokazuje:\n", + "- **Węzły**: Jednostki wyodrębnione z tekstu (pojęcia, technologie, osoby)\n", + "- **Krawędzie**: Relacje i powiązania między jednostkami\n", + "- **Klastry**: Powiązane pojęcia pogrupowane według podobieństwa semantycznego\n", + "\n", + "Otwórz wygenerowany plik HTML w przeglądarce, aby interaktywnie eksplorować graf:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Wzbogacanie pamięci za pomocą Memify\n", + "\n", + "Funkcja `memify()` analizuje graf wiedzy i generuje inteligentne reguły dotyczące danych. Ten proces:\n", + "- Identyfikuje wzorce i najlepsze praktyki\n", + "- Tworzy praktyczne wytyczne na podstawie treści\n", + "- Ustanawia powiązania między różnymi obszarami wiedzy\n", + "\n", + "Te reguły pomagają agentowi podejmować bardziej świadome decyzje podczas odpowiadania na pytania. Uchwycenie drugiej wizualizacji pozwala porównać, jak graf staje się gęstszy po wzbogaceniu.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Część 2: Inteligentne Wyszukiwanie w Pamięci\n", + "\n", + "### Demonstracja 1: Integracja Wiedzy z Różnych Dokumentów\n", + "\n", + "Teraz, gdy nasz graf wiedzy jest zbudowany, przetestujmy, jak Cognee łączy informacje z wielu źródeł, aby odpowiedzieć na złożone pytania.\n", + "\n", + "Pierwsze zapytanie pokazuje:\n", + "- **Zrozumienie semantyczne**: Znajdowanie odpowiednich pojęć, nawet jeśli nie są one wyraźnie wspomniane\n", + "- **Kros-referencje**: Łączenie profilu dewelopera z zasadami Pythona\n", + "- **Rozumowanie kontekstowe**: Stosowanie najlepszych praktyk do konkretnych implementacji\n", + "\n", + "### Demonstracja 2: Filtrowane Wyszukiwanie z NodeSets\n", + "\n", + "Drugie zapytanie pokazuje, jak skierować wyszukiwanie na konkretne podzbiory grafu wiedzy:\n", + "- Wykorzystuje parametr `node_name`, aby przeszukiwać tylko w obrębie `principles_data`\n", + "- Dostarcza skoncentrowanych odpowiedzi z określonej dziedziny wiedzy\n", + "- Przydatne, gdy potrzebujesz informacji specyficznych dla danej domeny\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Część 3: Konfiguracja zarządzania sesją\n", + "\n", + "### Włączanie pamięci rozmowy\n", + "\n", + "Zarządzanie sesją jest kluczowe dla utrzymania kontekstu w trakcie wielu interakcji. Tutaj wykonamy:\n", + "\n", + "1. **Inicjalizację kontekstu użytkownika**: Utwórz lub pobierz profil użytkownika do śledzenia sesji\n", + "2. **Konfigurację silnika pamięci podręcznej**: Połącz się z Redis w celu przechowywania historii rozmów\n", + "3. **Włączanie zmiennych sesji**: Skonfiguruj zmienne kontekstowe, które będą trwałe w trakcie zapytań\n", + "\n", + "> ⚠️ **Ważne**: Wymaga uruchomionego Redis i ustawienia `CACHING=true` w Twoim środowisku\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Funkcja pomocnicza: Wyświetl historię sesji\n", + "\n", + "Ta funkcja narzędziowa pozwala nam sprawdzić historię rozmów przechowywaną w Redis. Jest przydatna do:\n", + "- Debugowania zarządzania sesjami\n", + "- Weryfikacji, czy rozmowy są buforowane\n", + "- Zrozumienia, jaki kontekst jest dostępny dla agenta\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Sesja 1: Laboratorium wsparcia asynchronicznego — Pierwsze pytanie\n", + "\n", + "Rozpocznij sesję `async-support-lab`, pytając o wzorce asyncio przyjazne dla telemetrii dla ogromnego web scrapera. Graf już zna asyncio, aiohttp i praktyki monitorowania, więc odpowiedź powinna odzwierciedlać wcześniejsze rozmowy, dostosowując się do nowego zapytania.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Sprawdź pamięć sesji 1 po pierwszej wymianie\n", + "\n", + "Uruchomienie `show_history(session_1)` bezpośrednio po początkowym pytaniu potwierdza, że Cognee zapisał zarówno pytanie, jak i odpowiedź w Redis. Powinieneś zobaczyć jeden wpis z wytycznymi dotyczącymi współbieżności.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Sesja 1: Kontynuacja modeli danych\n", + "\n", + "Następnie pytamy: \"Kiedy powinienem wybrać dataclasses zamiast Pydantic?\" używając tego samego identyfikatora sesji. Cognee powinno połączyć zasady Pythona z wcześniejszymi rozmowami o FastAPI, aby dostarczyć szczegółowych porad—pokazując, że kontekst przenosi się w ramach nazwanej sesji.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Potwierdź, że historia sesji 1 zawiera oba etapy\n", + "\n", + "Kolejne wywołanie `show_history(session_1)` powinno ujawnić dwa wpisy Q&A. To odpowiada krokowi \"odtwarzania pamięci\" w laboratorium Mem0 i potwierdza, że dodatkowe etapy są dodawane do tego samego transkryptu.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Sesja 2: Wątek Przeglądu Projektu — Nowa Sesja\n", + "\n", + "Aby pokazać izolację między wątkami, uruchamiamy `design-review-session` i prosimy o wskazówki dotyczące logowania dla przeglądów incydentów. Mimo że podstawowa baza wiedzy jest taka sama, nowy identyfikator sesji utrzymuje transkrypcje oddzielnie.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Przegląd Sesji 2 Historia\n", + "\n", + "`show_history(session_2)` powinno wyświetlać jedynie parę zapytanie/odpowiedź z przeglądu projektu. Porównaj to z Sesją 1, aby podkreślić, jak Cognee utrzymuje niezależne transkrypty, jednocześnie wykorzystując wspólny graf wiedzy.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Podsumowanie\n", + "\n", + "Gratulacje! Właśnie dodałeś swojemu asystentowi kodowania warstwę długoterminowej pamięci zasilaną przez Cognee.\n", + "\n", + "W tym samouczku przekształciłeś surowe treści deweloperskie (kod, dokumentację, czaty) w graf + pamięć wektorową, którą Twój agent może przeszukiwać, analizować i stale ulepszać.\n", + "\n", + "Czego się nauczyłeś:\n", + "\n", + "1. **Od surowego tekstu do pamięci AI**: Jak Cognee przetwarza nieustrukturyzowane dane i zamienia je w inteligentną, przeszukiwalną pamięć, wykorzystując połączoną architekturę wektorową i grafu wiedzy.\n", + "\n", + "2. **Wzbogacanie grafu za pomocą memify**: Jak wyjść poza podstawowe tworzenie grafu i użyć memify do dodawania wywnioskowanych faktów i bogatszych relacji do istniejącego grafu.\n", + "\n", + "3. **Różne strategie wyszukiwania**: Jak przeszukiwać pamięć za pomocą różnych typów wyszukiwania (Q&A z uwzględnieniem grafu, uzupełnianie w stylu RAG, wglądy, surowe fragmenty, wyszukiwanie kodu itp.) w zależności od potrzeb Twojego agenta.\n", + "\n", + "4. **Wizualna eksploracja**: Jak sprawdzać i debugować to, co stworzył Cognee, za pomocą wizualizacji grafu i interfejsu Cognee, aby faktycznie zobaczyć, jak wiedza jest zorganizowana.\n", + "\n", + "5. **Pamięć uwzględniająca sesje**: Jak łączyć kontekst sesji z trwałą pamięcią semantyczną, aby agenci mogli pamiętać między uruchomieniami, nie ujawniając informacji między użytkownikami.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Kluczowe informacje\n", + "1. Pamięć jako graf wiedzy wspierany przez osadzenia\n", + "\n", + " - **Strukturalne zrozumienie**: Cognee łączy magazyn wektorów i magazyn grafów, dzięki czemu Twoje dane są zarówno wyszukiwalne pod względem znaczenia, jak i powiązane relacjami. Domyślnie Cognee korzysta z baz danych opartych na plikach (LanceDB dla magazynu wektorów, Kuzu dla bazy grafów).\n", + "\n", + " - **Świadomość relacji w wyszukiwaniu**: Odpowiedzi mogą być oparte nie tylko na „podobnym tekście”, ale także na tym, jak jednostki są ze sobą powiązane.\n", + "\n", + " - **Żywa pamięć**: Warstwa pamięci ewoluuje, rośnie i pozostaje dostępna jako jeden połączony graf.\n", + "\n", + "2. Tryby wyszukiwania i rozumowania\n", + " - **Hybrydowe wyszukiwanie**: wyszukiwanie łączy podobieństwo wektorów, strukturę grafu i rozumowanie LLM, od surowego wyszukiwania fragmentów po odpowiadanie na pytania uwzględniające graf.\n", + "\n", + " - **Dostosowanie trybu do zadania**: Używaj trybów w stylu uzupełniania, gdy potrzebujesz odpowiedzi w języku naturalnym, oraz trybów fragmentów/podsumowań/grafów, gdy Twój agent potrzebuje surowego kontekstu lub chce prowadzić własne rozumowanie.\n", + "\n", + "3. Spersonalizowani agenci świadomi sesji\n", + " - **Kontekst sesji + pamięć długoterminowa**: Cognee oddziela krótkoterminowy kontekst „wątku” od długoterminowej pamięci na poziomie użytkownika lub organizacji.\n", + "\n", + "## Zastosowania w rzeczywistości\n", + "\n", + "1. **Pionowe agenty AI**\n", + "\n", + " Wykorzystaj wzorzec z tego notatnika, aby stworzyć inteligentne asystenty domenowe, które opierają się na Cognee jako rdzeniu wyszukiwania i rozumowania:\n", + "\n", + "- **Asystenci dla programistów**: Przegląd kodu, analiza incydentów i asystenci architektury, którzy przeszukują kod, API, dokumenty projektowe i zgłoszenia jako jeden graf pamięci.\n", + "\n", + "- **Asystenci dla klientów**: Agenci wsparcia lub sukcesu, którzy korzystają z dokumentacji produktów, FAQ, notatek CRM i wcześniejszych zgłoszeń, oferując wyszukiwanie uwzględniające graf i odpowiedzi z cytatami.\n", + "\n", + "- **Wewnętrzni eksperci**: Asystenci ds. polityki, prawa lub bezpieczeństwa, którzy rozumują na podstawie powiązanych zasad, wytycznych i decyzji historycznych, zamiast izolowanych plików PDF.\n", + "\n", + " Cognee jest wyraźnie pozycjonowane jako trwała, dokładna pamięć dla agentów AI, zapewniając żywy graf wiedzy, który zastępuje doraźne kombinacje magazynów wektorów i niestandardowego kodu grafów.\n", + "\n", + "2. **Łączenie silosów danych w jedną pamięć**\n", + "\n", + " To samo podejście pomaga również stworzyć jednolitą warstwę pamięci z rozproszonych źródeł:\n", + "\n", + "- **Od silosów do jednego grafu**: Importuj dane strukturalne (np. bazy danych) i niestrukturalne (np. dokumenty, czaty) do jednego grafu wspieranego przez osadzenia, zamiast oddzielnych indeksów dla każdego systemu.\n", + "\n", + "- **Rozumowanie między źródłami z cytatami**: Przeprowadzaj wieloetapowe rozumowanie na podstawie wszystkiego—„łącz” logi, metryki i dokumenty za pomocą grafu—i nadal zwracaj odpowiedzi z uzasadnieniem i źródłem.\n", + "\n", + "- **Centra wiedzy**: W takich dziedzinach jak bankowość czy edukacja, Cognee jest już używane do łączenia plików PDF, systemów wewnętrznych i danych aplikacji w jeden graf wiedzy z wektorami, dzięki czemu agenci mogą odpowiadać na pytania z precyzyjnym, cytowanym kontekstem.\n", + "\n", + "## Kolejne kroki\n", + "\n", + "Zaimplementowałeś podstawową pętlę pamięci. Oto naturalne rozszerzenia, które możesz wypróbować samodzielnie (zobacz [dokumentację Cognee](https://docs.cognee.ai/) dla szczegółów):\n", + "\n", + "1. **Eksperymentuj ze świadomością czasową**: Włącz temporal cognify, aby wyodrębniać wydarzenia i znaczniki czasu z tekstu.\n", + "\n", + "2. **Wprowadź rozumowanie oparte na ontologii**: Zdefiniuj ontologię OWL dla swojej dziedziny. Skorzystaj z wsparcia ontologii Cognee, aby wyodrębnione jednostki i relacje były osadzone w tym schemacie, poprawiając jakość grafu i odpowiedzi specyficzne dla domeny.\n", + "\n", + "3. **Dodaj pętlę opinii**: Pozwól Cognee dostosowywać wagi krawędzi grafu na podstawie rzeczywistych opinii użytkowników, aby wyszukiwanie poprawiało się z czasem, zamiast pozostawać statyczne.\n", + "\n", + "4. **Dostosuj do personalizacji i zachowań sesji**: Używaj identyfikatorów użytkowników, najemców i zestawów danych, aby każda osoba lub zespół miała własny widok na wspólny silnik pamięci.\n", + "\n", + "5. **Rozszerz na bardziej złożonych agentów**: Podłącz Cognee do frameworków agentów, aby stworzyć systemy wieloagentowe, które wszystkie korzystają z tej samej warstwy pamięci. *Microsoft Agent Framework x Cognee plugin już wkrótce.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Zastrzeżenie**: \nTen dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż staramy się zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za źródło autorytatywne. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:51:52+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "pl" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/pl/13-agent-memory/README.md b/translations/pl/13-agent-memory/README.md index c547c6c1c..a4c3e1604 100644 --- a/translations/pl/13-agent-memory/README.md +++ b/translations/pl/13-agent-memory/README.md @@ -1,160 +1,180 @@ -# Pamięć dla agentów AI -[![Pamięć agenta](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.pl.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) +# Pamięć dla Agentów AI +[![Pamięć Agenta](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.pl.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Podczas omawiania unikalnych korzyści związanych z tworzeniem agentów AI, najczęściej poruszane są dwie kwestie: zdolność do korzystania z narzędzi w celu realizacji zadań oraz zdolność do samodoskonalenia się. Pamięć jest podstawą tworzenia samodoskonalących się agentów, którzy mogą zapewniać lepsze doświadczenia dla użytkowników. +Podczas omawiania unikalnych korzyści tworzenia Agentów AI, najczęściej poruszane są dwie kwestie: zdolność do korzystania z narzędzi w celu realizacji zadań oraz zdolność do samodoskonalenia się w czasie. Pamięć jest fundamentem tworzenia samodoskonalących się agentów, którzy mogą zapewniać lepsze doświadczenia użytkownikom. -W tej lekcji przyjrzymy się, czym jest pamięć dla agentów AI, jak można ją zarządzać i wykorzystywać na korzyść naszych aplikacji. +W tej lekcji przyjrzymy się, czym jest pamięć dla Agentów AI, jak można ją zarządzać i wykorzystywać na korzyść naszych aplikacji. -## Wprowadzenie +## Wprowadzenie -Ta lekcja obejmuje: +W tej lekcji omówimy: -• **Zrozumienie pamięci agenta AI**: Czym jest pamięć i dlaczego jest kluczowa dla agentów. +• **Zrozumienie pamięci Agenta AI**: Czym jest pamięć i dlaczego jest kluczowa dla agentów. -• **Implementacja i przechowywanie pamięci**: Praktyczne metody dodawania funkcji pamięci do agentów AI, z naciskiem na pamięć krótkoterminową i długoterminową. +• **Implementacja i przechowywanie pamięci**: Praktyczne metody dodawania funkcji pamięci do agentów AI, z naciskiem na pamięć krótkoterminową i długoterminową. -• **Tworzenie samodoskonalących się agentów AI**: Jak pamięć umożliwia agentom uczenie się na podstawie wcześniejszych interakcji i doskonalenie się z czasem. +• **Tworzenie samodoskonalących się Agentów AI**: Jak pamięć pozwala agentom uczyć się na podstawie wcześniejszych interakcji i poprawiać swoje działanie w czasie. -## Cele nauki +## Dostępne Implementacje -Po ukończeniu tej lekcji będziesz wiedzieć, jak: +Ta lekcja zawiera dwa kompleksowe samouczki w formie notebooków: -• **Rozróżniać różne typy pamięci agenta AI**, w tym pamięć roboczą, krótkoterminową, długoterminową oraz specjalistyczne formy, takie jak pamięć osobowości i epizodyczna. +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Implementuje pamięć za pomocą Mem0 i Azure AI Search w ramach Semantic Kernel. -• **Implementować i zarządzać pamięcią krótkoterminową i długoterminową dla agentów AI** przy użyciu frameworka Semantic Kernel, wykorzystując narzędzia takie jak Mem0 i pamięć Whiteboard oraz integrując je z Azure AI Search. +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Implementuje ustrukturyzowaną pamięć za pomocą Cognee, automatycznie budując graf wiedzy wspierany przez osadzenia, wizualizując graf i inteligentnie wyszukując informacje. -• **Zrozumieć zasady działania samodoskonalących się agentów AI** i jak solidne systemy zarządzania pamięcią przyczyniają się do ciągłego uczenia się i adaptacji. +## Cele Nauki -## Zrozumienie pamięci agenta AI +Po ukończeniu tej lekcji będziesz wiedzieć, jak: -W swojej istocie **pamięć dla agentów AI odnosi się do mechanizmów umożliwiających im przechowywanie i przywoływanie informacji**. Informacje te mogą dotyczyć szczegółów rozmowy, preferencji użytkownika, wcześniejszych działań czy nawet wzorców, które agent nauczył się rozpoznawać. +• **Rozróżniać różne typy pamięci Agenta AI**, w tym pamięć roboczą, krótkoterminową, długoterminową oraz specjalistyczne formy, takie jak pamięć osobowości i epizodyczna. -Bez pamięci aplikacje AI są często bezstanowe, co oznacza, że każda interakcja zaczyna się od zera. Prowadzi to do powtarzalnych i frustrujących doświadczeń użytkownika, gdzie agent "zapomina" wcześniejszy kontekst lub preferencje. +• **Implementować i zarządzać pamięcią krótkoterminową i długoterminową dla Agentów AI** przy użyciu Semantic Kernel, wykorzystując narzędzia takie jak Mem0, Cognee, Whiteboard memory oraz integrację z Azure AI Search. -### Dlaczego pamięć jest ważna? +• **Zrozumieć zasady działania samodoskonalących się Agentów AI** i jak solidne systemy zarządzania pamięcią przyczyniają się do ciągłego uczenia się i adaptacji. -Inteligencja agenta jest ściśle związana z jego zdolnością do przywoływania i wykorzystywania wcześniejszych informacji. Pamięć pozwala agentom być: +## Zrozumienie Pamięci Agenta AI -• **Refleksyjnymi**: Uczyć się na podstawie wcześniejszych działań i wyników. +W swojej istocie **pamięć dla Agentów AI odnosi się do mechanizmów pozwalających im na przechowywanie i przypominanie informacji**. Mogą to być szczegóły rozmowy, preferencje użytkownika, wcześniejsze działania czy nawet wyuczone wzorce. -• **Interaktywnymi**: Utrzymywać kontekst w trakcie trwającej rozmowy. +Bez pamięci aplikacje AI są często bezstanowe, co oznacza, że każda interakcja zaczyna się od zera. Prowadzi to do powtarzalnych i frustrujących doświadczeń użytkownika, gdzie agent "zapomina" wcześniejszy kontekst lub preferencje. -• **Proaktywnymi i reaktywnymi**: Przewidywać potrzeby lub odpowiednio reagować na podstawie danych historycznych. +### Dlaczego Pamięć Jest Ważna? -• **Autonomicznymi**: Działać bardziej niezależnie, korzystając z przechowywanej wiedzy. +Inteligencja agenta jest ściśle związana z jego zdolnością do przypominania i wykorzystywania wcześniejszych informacji. Pamięć pozwala agentom być: -Celem implementacji pamięci jest uczynienie agentów bardziej **wiarygodnymi i zdolnymi**. +• **Refleksyjnymi**: Uczyć się na podstawie wcześniejszych działań i wyników. -### Rodzaje pamięci +• **Interaktywnymi**: Utrzymywać kontekst w trakcie trwającej rozmowy. -#### Pamięć robocza +• **Proaktywnymi i reaktywnymi**: Przewidywać potrzeby lub odpowiednio reagować na podstawie danych historycznych. -Można ją porównać do kartki papieru, którą agent wykorzystuje podczas jednego, bieżącego zadania lub procesu myślowego. Przechowuje ona natychmiastowe informacje potrzebne do wykonania kolejnego kroku. +• **Autonomicznymi**: Działać bardziej niezależnie, korzystając z przechowywanej wiedzy. -Dla agentów AI pamięć robocza często przechwytuje najbardziej istotne informacje z rozmowy, nawet jeśli pełna historia czatu jest długa lub skrócona. Skupia się na wyodrębnianiu kluczowych elementów, takich jak wymagania, propozycje, decyzje i działania. +Celem implementacji pamięci jest uczynienie agentów bardziej **wiarygodnymi i zdolnymi**. -**Przykład pamięci roboczej** +### Rodzaje Pamięci -W przypadku agenta rezerwacji podróży pamięć robocza może przechwycić bieżące żądanie użytkownika, takie jak "Chcę zarezerwować wycieczkę do Paryża". To konkretne wymaganie jest przechowywane w bieżącym kontekście agenta, aby poprowadzić interakcję. +#### Pamięć Robocza -#### Pamięć krótkoterminowa +Można ją porównać do kartki papieru, na której agent zapisuje informacje potrzebne do wykonania bieżącego zadania lub procesu myślowego. Przechowuje ona natychmiastowe informacje potrzebne do obliczenia kolejnego kroku. -Ten typ pamięci przechowuje informacje na czas trwania jednej rozmowy lub sesji. Jest to kontekst bieżącego czatu, który pozwala agentowi odwoływać się do wcześniejszych wypowiedzi w dialogu. +Dla Agentów AI pamięć robocza często przechowuje najbardziej istotne informacje z rozmowy, nawet jeśli pełna historia czatu jest długa lub skrócona. Skupia się na wyodrębnianiu kluczowych elementów, takich jak wymagania, propozycje, decyzje i działania. -**Przykład pamięci krótkoterminowej** +**Przykład Pamięci Roboczej** -Jeśli użytkownik zapyta: "Ile kosztowałby lot do Paryża?" a następnie doda: "A co z zakwaterowaniem tam?", pamięć krótkoterminowa zapewnia, że agent wie, iż "tam" odnosi się do "Paryża" w tej samej rozmowie. +W przypadku agenta rezerwacji podróży pamięć robocza może przechowywać bieżące żądanie użytkownika, takie jak "Chcę zarezerwować wycieczkę do Paryża". To konkretne wymaganie jest przechowywane w kontekście agenta, aby poprowadzić bieżącą interakcję. -#### Pamięć długoterminowa +#### Pamięć Krótkoterminowa -To informacje, które utrzymują się przez wiele rozmów lub sesji. Pozwala agentom pamiętać preferencje użytkownika, wcześniejsze interakcje lub ogólną wiedzę przez dłuższy czas. Jest to kluczowe dla personalizacji. +Ten rodzaj pamięci przechowuje informacje na czas trwania jednej rozmowy lub sesji. Jest to kontekst bieżącego czatu, pozwalający agentowi odwoływać się do wcześniejszych wypowiedzi w dialogu. -**Przykład pamięci długoterminowej** +**Przykład Pamięci Krótkoterminowej** -Pamięć długoterminowa może przechowywać informacje, takie jak "Ben lubi narciarstwo i aktywności na świeżym powietrzu, preferuje kawę z widokiem na góry i unika zaawansowanych stoków narciarskich z powodu wcześniejszej kontuzji". Te informacje, zdobyte podczas wcześniejszych interakcji, wpływają na rekomendacje w przyszłych sesjach planowania podróży, czyniąc je bardziej spersonalizowanymi. +Jeśli użytkownik pyta: "Ile kosztowałby lot do Paryża?" a następnie dodaje: "A co z zakwaterowaniem tam?", pamięć krótkoterminowa zapewnia, że agent wie, że "tam" odnosi się do "Paryża" w tej samej rozmowie. -#### Pamięć osobowości +#### Pamięć Długoterminowa -Ten specjalistyczny typ pamięci pomaga agentowi rozwijać spójną "osobowość" lub "rolę". Pozwala agentowi pamiętać szczegóły o sobie lub swojej zamierzonej roli, co sprawia, że interakcje są bardziej płynne i skoncentrowane. +To informacje, które są przechowywane przez wiele rozmów lub sesji. Pozwala agentom pamiętać preferencje użytkownika, wcześniejsze interakcje lub ogólną wiedzę przez dłuższy czas. Jest to kluczowe dla personalizacji. -**Przykład pamięci osobowości** +**Przykład Pamięci Długoterminowej** -Jeśli agent podróży został zaprojektowany jako "ekspert w planowaniu narciarskim", pamięć osobowości może wzmacniać tę rolę, wpływając na jego odpowiedzi, aby były zgodne z tonem i wiedzą eksperta. +Pamięć długoterminowa może przechowywać informacje, że "Ben lubi narciarstwo i aktywności na świeżym powietrzu, preferuje kawę z widokiem na góry i unika zaawansowanych stoków narciarskich z powodu wcześniejszej kontuzji". Te informacje, zdobyte podczas wcześniejszych interakcji, wpływają na rekomendacje w przyszłych sesjach planowania podróży, czyniąc je bardziej spersonalizowanymi. -#### Pamięć epizodyczna +#### Pamięć Osobowości -Ta pamięć przechowuje sekwencję kroków, które agent podejmuje podczas realizacji złożonego zadania, w tym sukcesy i porażki. Jest to jak zapamiętywanie konkretnych "epizodów" lub wcześniejszych doświadczeń, aby się z nich uczyć. +Ten specjalistyczny rodzaj pamięci pomaga agentowi rozwijać spójną "osobowość" lub "rolę". Pozwala agentowi pamiętać szczegóły o sobie lub swojej zamierzonej roli, co sprawia, że interakcje są bardziej płynne i skoncentrowane. -**Przykład pamięci epizodycznej** +**Przykład Pamięci Osobowości** -Jeśli agent próbował zarezerwować konkretny lot, ale nie udało się to z powodu braku dostępności, pamięć epizodyczna mogłaby zapisać tę porażkę, pozwalając agentowi spróbować alternatywnych lotów lub poinformować użytkownika o problemie w bardziej świadomy sposób podczas kolejnej próby. +Jeśli agent podróży został zaprojektowany jako "ekspert w planowaniu narciarskim", pamięć osobowości może wzmacniać tę rolę, wpływając na jego odpowiedzi, aby były zgodne z tonem i wiedzą eksperta. -#### Pamięć encji +#### Pamięć Epizodyczna/Przepływu Pracy -Dotyczy wyodrębniania i zapamiętywania konkretnych encji (takich jak osoby, miejsca czy rzeczy) oraz wydarzeń z rozmów. Pozwala agentowi budować strukturalne zrozumienie kluczowych elementów omawianych. +Ta pamięć przechowuje sekwencję kroków, które agent podejmuje podczas złożonego zadania, w tym sukcesy i porażki. To jak zapamiętywanie konkretnych "epizodów" lub wcześniejszych doświadczeń, aby się z nich uczyć. -**Przykład pamięci encji** +**Przykład Pamięci Epizodycznej** -Z rozmowy o wcześniejszej podróży agent może wyodrębnić "Paryż", "Wieża Eiffla" i "kolacja w restauracji Le Chat Noir" jako encje. W przyszłej interakcji agent mógłby przypomnieć sobie "Le Chat Noir" i zaproponować nową rezerwację tam. +Jeśli agent próbował zarezerwować konkretny lot, ale nie udało się to z powodu braku dostępności, pamięć epizodyczna mogłaby zapisać tę porażkę, pozwalając agentowi spróbować alternatywnych lotów lub poinformować użytkownika o problemie w bardziej świadomy sposób podczas kolejnej próby. -#### Strukturalny RAG (Retrieval Augmented Generation) +#### Pamięć Encji -Choć RAG jest szerszą techniką, "Strukturalny RAG" wyróżnia się jako potężna technologia pamięci. Wyodrębnia gęste, strukturalne informacje z różnych źródeł (rozmów, e-maili, obrazów) i wykorzystuje je do zwiększenia precyzji, przywoływania i szybkości odpowiedzi. W przeciwieństwie do klasycznego RAG, który opiera się wyłącznie na podobieństwie semantycznym, Strukturalny RAG działa na podstawie wewnętrznej struktury informacji. +Dotyczy wyodrębniania i zapamiętywania konkretnych encji (takich jak osoby, miejsca czy rzeczy) oraz zdarzeń z rozmów. Pozwala agentowi budować ustrukturyzowane rozumienie kluczowych elementów omawianych w rozmowie. -**Przykład Strukturalnego RAG** +**Przykład Pamięci Encji** -Zamiast dopasowywać tylko słowa kluczowe, Strukturalny RAG mógłby przeanalizować szczegóły lotu (cel podróży, data, czas, linia lotnicza) z e-maila i przechowywać je w uporządkowany sposób. Umożliwia to precyzyjne zapytania, takie jak "Jaki lot zarezerwowałem do Paryża we wtorek?" +Z rozmowy o wcześniejszej podróży agent może wyodrębnić "Paryż", "Wieża Eiffla" i "kolacja w restauracji Le Chat Noir" jako encje. W przyszłej interakcji agent mógłby przypomnieć sobie "Le Chat Noir" i zaproponować ponowną rezerwację tam. -## Implementacja i przechowywanie pamięci +#### Ustrukturyzowany RAG (Retrieval Augmented Generation) -Implementacja pamięci dla agentów AI obejmuje systematyczny proces **zarządzania pamięcią**, który obejmuje generowanie, przechowywanie, przywoływanie, integrowanie, aktualizowanie, a nawet "zapominanie" (czyli usuwanie) informacji. Szczególnie istotnym aspektem jest przywoływanie. +Chociaż RAG jest szerszą techniką, "Ustrukturyzowany RAG" jest wyróżniany jako potężna technologia pamięci. Wyodrębnia gęste, ustrukturyzowane informacje z różnych źródeł (rozmów, e-maili, obrazów) i wykorzystuje je do zwiększenia precyzji, przypominania i szybkości odpowiedzi. W przeciwieństwie do klasycznego RAG, który opiera się wyłącznie na semantycznym podobieństwie, Ustrukturyzowany RAG działa z wrodzoną strukturą informacji. -### Specjalistyczne narzędzia pamięci +**Przykład Ustrukturyzowanego RAG** -Jednym ze sposobów przechowywania i zarządzania pamięcią agenta jest użycie specjalistycznych narzędzi, takich jak Mem0. Mem0 działa jako warstwa pamięci trwałej, umożliwiając agentom przywoływanie istotnych interakcji, przechowywanie preferencji użytkownika i kontekstu faktów oraz uczenie się na podstawie sukcesów i porażek z czasem. Idea polega na tym, że agenci bezstanowi stają się stanowi. +Zamiast tylko dopasowywać słowa kluczowe, Ustrukturyzowany RAG mógłby przeanalizować szczegóły lotu (cel, data, czas, linia lotnicza) z e-maila i przechowywać je w ustrukturyzowany sposób. To pozwala na precyzyjne zapytania, takie jak "Jaki lot zarezerwowałem do Paryża we wtorek?" -Działa to poprzez **dwufazowy proces pamięci: ekstrakcję i aktualizację**. Najpierw wiadomości dodane do wątku agenta są wysyłane do usługi Mem0, która wykorzystuje model językowy (LLM) do podsumowania historii rozmowy i wyodrębnienia nowych wspomnień. Następnie faza aktualizacji sterowana przez LLM decyduje, czy dodać, zmodyfikować lub usunąć te wspomnienia, przechowując je w hybrydowym magazynie danych, który może obejmować bazy danych wektorowe, grafowe i klucz-wartość. System ten obsługuje również różne typy pamięci i może uwzględniać pamięć grafową do zarządzania relacjami między encjami. +## Implementacja i Przechowywanie Pamięci -### Przechowywanie pamięci z RAG +Implementacja pamięci dla Agentów AI obejmuje systematyczny proces **zarządzania pamięcią**, który obejmuje generowanie, przechowywanie, wyszukiwanie, integrowanie, aktualizowanie, a nawet "zapominanie" (lub usuwanie) informacji. Szczególnie istotnym aspektem jest wyszukiwanie. -Oprócz specjalistycznych narzędzi pamięci, takich jak Mem0, można wykorzystać solidne usługi wyszukiwania, takie jak **Azure AI Search jako zaplecze do przechowywania i przywoływania wspomnień**, szczególnie dla Strukturalnego RAG. +### Specjalistyczne Narzędzia Pamięci -Pozwala to na ugruntowanie odpowiedzi agenta w oparciu o własne dane, zapewniając bardziej trafne i dokładne odpowiedzi. Azure AI Search może być używany do przechowywania wspomnień związanych z podróżami użytkownika, katalogów produktów lub dowolnej innej wiedzy specyficznej dla danej dziedziny. +#### Mem0 -Azure AI Search obsługuje funkcje takie jak **Strukturalny RAG**, który doskonale sprawdza się w wyodrębnianiu i przywoływaniu gęstych, strukturalnych informacji z dużych zbiorów danych, takich jak historie rozmów, e-maile czy obrazy. Zapewnia to "nadludzką precyzję i przywoływanie" w porównaniu z tradycyjnymi podejściami do dzielenia tekstu na fragmenty i osadzania. +Jednym ze sposobów przechowywania i zarządzania pamięcią agenta jest użycie specjalistycznych narzędzi, takich jak Mem0. Mem0 działa jako warstwa pamięci trwałej, pozwalając agentom przypominać sobie istotne interakcje, przechowywać preferencje użytkownika i kontekst faktów oraz uczyć się na podstawie sukcesów i porażek w czasie. Idea polega na tym, że agenci bezstanowi stają się stanowi. -## Tworzenie samodoskonalących się agentów AI +Działa to poprzez **dwufazowy proces pamięci: ekstrakcję i aktualizację**. Najpierw wiadomości dodane do wątku agenta są wysyłane do usługi Mem0, która wykorzystuje model językowy (LLM) do podsumowania historii rozmowy i wyodrębnienia nowych wspomnień. Następnie faza aktualizacji napędzana przez LLM decyduje, czy dodać, zmodyfikować, czy usunąć te wspomnienia, przechowując je w hybrydowym magazynie danych, który może obejmować bazy danych wektorowe, grafowe i klucz-wartość. System ten obsługuje również różne typy pamięci i może uwzględniać pamięć grafową do zarządzania relacjami między encjami. -Częstym wzorcem dla samodoskonalących się agentów jest wprowadzenie **"agenta wiedzy"**. Ten oddzielny agent obserwuje główną rozmowę między użytkownikiem a agentem głównym. Jego rola polega na: +#### Cognee -1. **Identyfikacji wartościowych informacji**: Określeniu, czy jakakolwiek część rozmowy jest warta zapisania jako ogólna wiedza lub konkretna preferencja użytkownika. +Innym potężnym podejściem jest użycie **Cognee**, otwartoźródłowej pamięci semantycznej dla Agentów AI, która przekształca dane ustrukturyzowane i nieustrukturyzowane w zapytania w grafach wiedzy wspieranych przez osadzenia. Cognee oferuje **architekturę podwójnego magazynu**, łączącą wyszukiwanie podobieństwa wektorowego z relacjami grafowymi, umożliwiając agentom zrozumienie nie tylko tego, jakie informacje są podobne, ale także jak koncepcje się ze sobą łączą. -2. **Ekstrakcji i podsumowaniu**: Wyodrębnieniu istotnych informacji lub preferencji z rozmowy. +Cognee wyróżnia się **hybrydowym wyszukiwaniem**, które łączy podobieństwo wektorowe, strukturę grafu i rozumowanie LLM - od wyszukiwania surowych fragmentów po pytania uwzględniające graf. System utrzymuje **żywą pamięć**, która ewoluuje i rośnie, pozostając jednocześnie zapytania jako jeden połączony graf, wspierając zarówno kontekst sesji krótkoterminowej, jak i pamięć trwałą długoterminową. -3. **Przechowywaniu w bazie wiedzy**: Zachowaniu wyodrębnionych informacji, często w bazie danych wektorowych, aby można je było później przywołać. +Samouczek notebooka Cognee ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) pokazuje, jak zbudować tę zintegrowaną warstwę pamięci, z praktycznymi przykładami wprowadzania różnych źródeł danych, wizualizacji grafu wiedzy i zapytań z różnymi strategiami wyszukiwania dostosowanymi do potrzeb agenta. -4. **Uzupełnianiu przyszłych zapytań**: Gdy użytkownik inicjuje nowe zapytanie, agent wiedzy przywołuje odpowiednie zapisane informacje i dodaje je do zapytania użytkownika, zapewniając kluczowy kontekst dla agenta głównego (podobnie jak RAG). +### Przechowywanie Pamięci z RAG -### Optymalizacje dla pamięci +Poza specjalistycznymi narzędziami pamięci, takimi jak Mem0, można wykorzystać solidne usługi wyszukiwania, takie jak **Azure AI Search jako zaplecze do przechowywania i wyszukiwania wspomnień**, szczególnie dla ustrukturyzowanego RAG. -• **Zarządzanie opóźnieniami**: Aby uniknąć spowolnienia interakcji użytkownika, można początkowo użyć tańszego, szybszego modelu do szybkiego sprawdzenia, czy warto przechowywać lub przywoływać informacje, a bardziej złożony proces ekstrakcji/przywoływania uruchamiać tylko wtedy, gdy jest to konieczne. +Pozwala to na ugruntowanie odpowiedzi agenta w oparciu o własne dane, zapewniając bardziej trafne i dokładne odpowiedzi. Azure AI Search można używać do przechowywania wspomnień specyficznych dla użytkownika, katalogów produktów lub dowolnej innej wiedzy specyficznej dla danej dziedziny. -• **Utrzymanie bazy wiedzy**: W przypadku rosnącej bazy wiedzy, rzadziej używane informacje można przenieść do "zimnego magazynu", aby zarządzać kosztami. +Azure AI Search obsługuje funkcje takie jak **Ustrukturyzowany RAG**, który wyróżnia się wyodrębnianiem i wyszukiwaniem gęstych, ustrukturyzowanych informacji z dużych zbiorów danych, takich jak historie rozmów, e-maile czy obrazy. Zapewnia to "nadludzką precyzję i przypominanie" w porównaniu z tradycyjnymi podejściami do dzielenia tekstu i osadzania. -## Masz więcej pytań dotyczących pamięci agenta? +## Tworzenie Samodoskonalących się Agentów AI -Dołącz do [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord), aby spotkać się z innymi uczącymi się, uczestniczyć w godzinach konsultacji i uzyskać odpowiedzi na pytania dotyczące agentów AI. +Częstym wzorcem dla samodoskonalących się agentów jest wprowadzenie **"agenta wiedzy"**. Ten oddzielny agent obserwuje główną rozmowę między użytkownikiem a głównym agentem. Jego rola polega na: + +1. **Identyfikacji wartościowych informacji**: Określeniu, czy jakakolwiek część rozmowy jest warta zapisania jako ogólna wiedza lub konkretna preferencja użytkownika. + +2. **Ekstrakcji i podsumowaniu**: Wyodrębnieniu istotnych informacji lub preferencji z rozmowy. + +3. **Przechowywaniu w bazie wiedzy**: Zachowaniu wyodrębnionych informacji, często w bazie danych wektorowych, aby można je było później wyszukać. + +4. **Wzbogacaniu przyszłych zapytań**: Gdy użytkownik inicjuje nowe zapytanie, agent wiedzy wyszukuje odpowiednie przechowywane informacje i dołącza je do zapytania użytkownika, dostarczając kluczowego kontekstu głównemu agentowi (podobnie jak RAG). + +### Optymalizacje dla Pamięci + +• **Zarządzanie opóźnieniami**: Aby uniknąć spowolnienia interakcji użytkownika, można początkowo użyć tańszego, szybszego modelu do szybkiego sprawdzenia, czy informacje są warte przechowywania lub wyszukiwania, a bardziej złożony proces ekstrakcji/wyszukiwania uruchamiać tylko wtedy, gdy jest to konieczne. + +• **Utrzymanie bazy wiedzy**: W przypadku rosnącej bazy wiedzy, rzadziej używane informacje można przenieść do "zimnego magazynu", aby zarządzać kosztami. + +## Masz Więcej Pytań o Pamięć Agenta? + +Dołącz do [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord), aby spotkać się z innymi uczącymi się, uczestniczyć w godzinach konsultacji i uzyskać odpowiedzi na pytania dotyczące Agentów AI. --- + **Zastrzeżenie**: -Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż staramy się zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za źródło autorytatywne. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. \ No newline at end of file +Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż staramy się zapewnić dokładność, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za źródło autorytatywne. W przypadku informacji krytycznych zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia. + \ No newline at end of file diff --git a/translations/pt/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/pt/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..b1c006859 --- /dev/null +++ b/translations/pt/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Construir Agentes de IA com Memória Persistente usando Cognee\n", + "\n", + "Este notebook demonstra como criar agentes de IA inteligentes com capacidades avançadas de memória utilizando [**cognee**](https://www.cognee.ai/) - uma memória de IA de código aberto que combina grafos de conhecimento, pesquisa semântica e gestão de sessões para criar sistemas de IA com consciência de contexto.\n", + "\n", + "## 🎯 Objetivos de Aprendizagem\n", + "\n", + "Ao final deste tutorial, você entenderá como:\n", + "- **Construir Grafos de Conhecimento Baseados em Embeddings**: Transformar texto não estruturado em conhecimento estruturado e consultável\n", + "- **Implementar Memória de Sessão**: Criar conversas de múltiplas interações com retenção automática de contexto\n", + "- **Persistir Conversas**: Armazenar opcionalmente interações importantes em memória de longo prazo para referência futura\n", + "- **Consultar Usando Linguagem Natural**: Acessar e aproveitar o contexto histórico em novas conversas\n", + "- **Visualizar Memória**: Explorar as relações no grafo de conhecimento do seu agente\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ O Que Irá Construir\n", + "\n", + "Neste tutorial, vamos criar um **Assistente de Programação** com memória persistente que:\n", + "\n", + "### 1. **Construção de Base de Conhecimento**\n", + " - Recolhe informações sobre o perfil e a experiência do programador\n", + " - Processa princípios e boas práticas de programação em Python\n", + " - Armazena conversas históricas entre programadores e assistentes de IA\n", + "\n", + "### 2. **Conversas Sensíveis ao Contexto**\n", + " - Mantém o contexto ao longo de várias perguntas na mesma sessão\n", + " - Armazena automaticamente cada par de pergunta/resposta para recuperação eficiente\n", + " - Fornece respostas coerentes e contextuais com base no histórico da conversa\n", + "\n", + "### 3. **Memória de Longo Prazo**\n", + " - Persiste conversas importantes numa memória de longo prazo\n", + " - Recupera memórias relevantes da base de conhecimento e de sessões passadas para informar novas interações\n", + " - Constrói uma base de conhecimento crescente que melhora ao longo do tempo\n", + "\n", + "### 4. **Recuperação Inteligente de Memória**\n", + " - Utiliza pesquisa semântica baseada em grafos para encontrar informações relevantes em todo o conhecimento armazenado\n", + " - Filtra pesquisas por subgrupos de dados (informações do programador vs. princípios)\n", + " - Combina múltiplas fontes de dados para fornecer respostas abrangentes\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Pré-requisitos e Configuração\n", + "\n", + "### Requisitos do Sistema\n", + "\n", + "Antes de começar, certifique-se de ter:\n", + "\n", + "1. **Ambiente Python**\n", + " - Python 3.9 ou superior\n", + " - Ambiente virtual (recomendado)\n", + " \n", + "2. **Cache Redis** (Necessário para Gestão de Sessões)\n", + " - Redis local: `docker run -d -p 6379:6379 redis`\n", + " - Ou utilize um serviço Redis gerido\n", + " \n", + "3. **Acesso à API LLM**\n", + " - Chave de API OpenAI ou outros fornecedores (consulte [documentação](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Configuração de Base de Dados**\n", + " - Nenhuma configuração necessária por padrão. O Cognee utiliza bases de dados baseadas em ficheiros (LanceDB e Kuzu)\n", + " - Opcionalmente, pode configurar o Azure AI Search como um repositório vetorial (consulte [documentação](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Configuração do Ambiente\n", + "\n", + "Crie um ficheiro `.env` no diretório do seu projeto com as seguintes variáveis:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Compreendendo a Arquitetura de Memória do Cognee\n", + "\n", + "### Como o Cognee Funciona\n", + "\n", + "O Cognee oferece um sistema de memória sofisticado que vai além do armazenamento simples de chave-valor:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Componentes Principais:\n", + "\n", + "1. **Knowledge Graph**: Armazena entidades, relações e conexões semânticas\n", + "2. **Vector Embeddings**: Permite pesquisa semântica em todas as informações armazenadas\n", + "3. **Session Cache**: Mantém o contexto da conversa dentro e entre sessões\n", + "4. **NodeSets**: Organizam os dados em categorias lógicas para recuperação direcionada\n", + "\n", + "### Tipos de Memória Neste Tutorial:\n", + "\n", + "- **Memória Persistente**: Armazenamento de longo prazo no knowledge graph\n", + "- **Memória de Sessão**: Contexto temporário de conversação no cache Redis\n", + "- **Memória Semântica**: Pesquisa baseada em similaridade vetorial em todos os dados\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Instalar Pacotes Necessários\n", + "\n", + "Instale o Cognee com suporte ao Redis para gestão de sessões:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Inicializar Ambiente e Carregar Bibliotecas\n", + "\n", + "Certifique-se de que:\n", + "1. O Redis está em execução (por exemplo, via Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. As variáveis de ambiente estão definidas antes de importar os módulos de cache\n", + "3. Se necessário, reinicie o kernel e execute as células na ordem correta\n", + "\n", + "A célula seguinte irá:\n", + "1. Carregar variáveis de ambiente a partir do ficheiro `.env`\n", + "2. Configurar o Cognee com as suas definições de LLM\n", + "3. Ativar o cache para gestão de sessões\n", + "4. Validar que todos os componentes estão devidamente conectados\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Configurar Diretórios de Armazenamento\n", + "\n", + "O Cognee utiliza dois diretórios separados para as suas operações:\n", + "- **Data Root**: Armazena documentos ingeridos e dados processados\n", + "- **System Root**: Contém a base de dados do grafo de conhecimento e metadados do sistema\n", + "\n", + "Vamos criar diretórios isolados para este tutorial da seguinte forma:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Repor o Estado da Memória\n", + "\n", + "Antes de começarmos a construir o nosso sistema de memória, vamos garantir que estamos a começar do zero.\n", + "\n", + "> 💡 **Dica**: Pode ignorar este passo se quiser preservar memórias existentes das suas execuções anteriores ao usar este notebook mais tarde.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Parte 1: Construir a Base de Conhecimento\n", + "\n", + "### Fontes de Dados para o Nosso Assistente de Desenvolvedor\n", + "\n", + "Vamos integrar três tipos de dados para criar uma base de conhecimento abrangente:\n", + "\n", + "1. **Perfil do Desenvolvedor**: Experiência pessoal e formação técnica \n", + "2. **Melhores Práticas em Python**: O Zen do Python com diretrizes práticas \n", + "3. **Conversas Históricas**: Sessões de perguntas e respostas anteriores entre desenvolvedores e assistentes de IA \n", + "\n", + "Estes dados diversificados permitem que o nosso agente: \n", + "- Compreenda o contexto técnico do utilizador \n", + "- Aplique as melhores práticas nas recomendações \n", + "- Aprenda com interações bem-sucedidas anteriores \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Processar Dados em um Grafo de Conhecimento\n", + "\n", + "Agora vamos transformar o nosso texto bruto em uma memória estruturada. Este processo:\n", + "\n", + "1. **Adiciona dados aos NodeSets**: Organiza informações em categorias lógicas\n", + " - `developer_data`: Perfil do desenvolvedor e conversas\n", + " - `principles_data`: Melhores práticas e diretrizes de Python\n", + "\n", + "2. **Executa o Cognify Pipeline**: Extrai entidades, relacionamentos e cria embeddings\n", + " - Identifica conceitos-chave\n", + " - Cria conexões semânticas entre informações relacionadas\n", + " - Gera embeddings vetoriais\n", + "\n", + "Isto pode levar alguns momentos enquanto o LLM processa o texto e constrói a estrutura do grafo:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Visualizar o Grafo de Conhecimento\n", + "\n", + "Vamos explorar a estrutura do nosso grafo de conhecimento. A visualização mostra:\n", + "- **Nós**: Entidades extraídas do texto (conceitos, tecnologias, pessoas)\n", + "- **Arestas**: Relações e conexões entre as entidades\n", + "- **Clusters**: Conceitos relacionados agrupados por similaridade semântica\n", + "\n", + "Abra o ficheiro HTML gerado no seu navegador para explorar o grafo de forma interativa:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Enriquecer a Memória com Memify\n", + "\n", + "A função `memify()` analisa o grafo de conhecimento e gera regras inteligentes sobre os dados. Este processo:\n", + "- Identifica padrões e melhores práticas\n", + "- Cria diretrizes acionáveis com base no conteúdo\n", + "- Estabelece relações entre diferentes áreas de conhecimento\n", + "\n", + "Estas regras ajudam o agente a tomar decisões mais informadas ao responder a perguntas. Capturar uma segunda visualização ajuda a comparar como o grafo se densifica após ser enriquecido.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Parte 2: Recuperação Inteligente de Memória\n", + "\n", + "### Demonstração 1: Integração de Conhecimento entre Documentos\n", + "\n", + "Agora que o nosso grafo de conhecimento está construído, vamos testar como o Cognee combina informações de várias fontes para responder a perguntas complexas.\n", + "\n", + "A primeira consulta demonstra:\n", + "- **Compreensão semântica**: Encontrar conceitos relevantes mesmo quando não mencionados explicitamente\n", + "- **Referenciamento cruzado**: Combinar o perfil do desenvolvedor com princípios de Python\n", + "- **Raciocínio contextual**: Aplicar as melhores práticas a implementações específicas\n", + "\n", + "### Demonstração 2: Pesquisa Filtrada com NodeSets\n", + "\n", + "A segunda consulta mostra como direcionar subconjuntos específicos do grafo de conhecimento:\n", + "- Utiliza o parâmetro `node_name` para pesquisar apenas dentro de `principles_data`\n", + "- Fornece respostas focadas de um domínio de conhecimento específico\n", + "- Útil quando precisa de informações específicas de um domínio\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Parte 3: Configuração da Gestão de Sessões\n", + "\n", + "### Ativar Memória de Conversação\n", + "\n", + "A gestão de sessões é essencial para manter o contexto ao longo de várias interações. Aqui iremos:\n", + "\n", + "1. **Inicializar o Contexto do Utilizador**: Criar ou recuperar um perfil de utilizador para rastreamento da sessão \n", + "2. **Configurar o Motor de Cache**: Ligar ao Redis para armazenar o histórico de conversas \n", + "3. **Ativar Variáveis de Sessão**: Configurar variáveis de contexto que persistem entre consultas \n", + "\n", + "> ⚠️ **Importante**: Isto requer que o Redis esteja em execução e `CACHING=true` no seu ambiente\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Função Auxiliar: Ver Histórico de Sessão\n", + "\n", + "Esta função utilitária permite-nos inspecionar o histórico de conversação armazenado no Redis. É útil para:\n", + "- Depurar a gestão de sessões\n", + "- Verificar se as conversas estão a ser armazenadas em cache\n", + "- Compreender que contexto está disponível para o agente\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Sessão 1: Laboratório de Suporte Assíncrono — Primeira Pergunta\n", + "\n", + "Inicie a sessão `async-support-lab` perguntando sobre padrões de asyncio compatíveis com telemetria para um web scraper em larga escala. O gráfico já conhece asyncio, aiohttp e práticas de monitorização, então a resposta deve refletir conversas anteriores enquanto adapta a resposta à nova pergunta.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Inspecionar a Memória da Sessão 1 Após a Primeira Troca\n", + "\n", + "Executar `show_history(session_1)` imediatamente após a pergunta inicial confirma que o Cognee gravou tanto o prompt quanto a resposta no Redis. Deve ver uma entrada com a orientação de concorrência.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Sessão 1: Acompanhamento sobre Modelos de Dados\n", + "\n", + "A seguir, perguntamos: \"Quando devo escolher dataclasses em vez de Pydantic?\" usando o mesmo ID de sessão. Cognee deve combinar os princípios do Python com conversas anteriores sobre FastAPI para fornecer conselhos detalhados—demonstrando que o contexto é mantido dentro de uma sessão nomeada.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Confirmar que o Histórico da Sessão 1 Contém Ambos os Turnos\n", + "\n", + "Outra chamada a `show_history(session_1)` deve revelar duas entradas de Pergunta e Resposta. Isto corresponde ao passo de \"replay de memória\" do laboratório Mem0 e prova que turnos adicionais prolongam a mesma transcrição.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Sessão 2: Tópico de Revisão de Design — Nova Sessão\n", + "\n", + "Para demonstrar isolamento entre tópicos, iniciamos `design-review-session` e pedimos orientações de registo para revisões de incidentes. Embora a base de conhecimento subjacente seja a mesma, o novo ID de sessão mantém as transcrições separadas.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Revisão da Sessão 2 História\n", + "\n", + "`show_history(session_2)` deve listar apenas o par de solicitação/resposta da revisão de design. Compare com a Sessão 1 para destacar como o Cognee mantém transcrições independentes enquanto reutiliza o grafo de conhecimento compartilhado.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Resumo\n", + "\n", + "Parabéns! Acabou de dar ao seu assistente de programação uma camada de memória de longo prazo alimentada pelo Cognee.\n", + "\n", + "Neste tutorial, pegou conteúdo bruto de desenvolvedores (código, documentos, conversas) e transformou-o numa memória em grafo + vetor que o seu agente pode pesquisar, raciocinar e melhorar continuamente.\n", + "\n", + "O que Aprendeu\n", + "\n", + "1. **De texto bruto a memória de IA**: Como o Cognee processa dados não estruturados e os transforma numa memória inteligente e pesquisável, utilizando uma arquitetura combinada de vetor + grafo de conhecimento.\n", + "\n", + "2. **Enriquecimento de grafos com memify**: Como ir além da criação básica de grafos e usar o memify para adicionar factos derivados e relações mais ricas ao seu grafo existente.\n", + "\n", + "3. **Múltiplas estratégias de pesquisa**: Como consultar a memória com diferentes tipos de pesquisa (Q&A com consciência de grafo, conclusão ao estilo RAG, insights, fragmentos brutos, pesquisa de código, etc.), dependendo das necessidades do seu agente.\n", + "\n", + "4. **Exploração visual**: Como inspecionar e depurar o que o Cognee construiu utilizando visualizações de grafos e a interface do Cognee, para que possa realmente ver como o conhecimento está estruturado.\n", + "\n", + "5. **Memória sensível à sessão**: Como combinar o contexto de cada sessão com uma memória semântica persistente, permitindo que os agentes se lembrem entre execuções sem partilhar informações entre utilizadores.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Principais Conclusões\n", + "1. Memória como um Grafo de Conhecimento suportado por Embeddings\n", + "\n", + " - **Compreensão estruturada**: O Cognee combina um armazenamento vetorial e um armazenamento em grafo, permitindo que os seus dados sejam pesquisáveis tanto por significado quanto conectados por relações. O Cognee utiliza bases de dados baseadas em ficheiros por padrão (LanceDB para armazenamento vetorial, Kuzu para base de dados em grafo).\n", + "\n", + " - **Recuperação consciente de relações**: As respostas podem ser fundamentadas não apenas em \"texto semelhante\", mas também em como as entidades se relacionam.\n", + "\n", + " - **Memória viva**: A camada de memória evolui, cresce e permanece consultável como um grafo conectado.\n", + "\n", + "2. Modos de Pesquisa e Raciocínio\n", + " - **Recuperação híbrida**: A pesquisa combina similaridade vetorial, estrutura de grafo e raciocínio de LLM, desde a pesquisa de fragmentos brutos até respostas a perguntas conscientes do grafo.\n", + "\n", + " - **Ajustar o modo à tarefa**: Utilize modos de estilo de conclusão quando quiser respostas em linguagem natural, e modos de fragmento/resumo/grafo quando o seu agente precisar de contexto bruto ou para conduzir o seu próprio raciocínio.\n", + "\n", + "3. Agentes Personalizados e Conscientes da Sessão\n", + " - **Contexto da sessão + memória de longo prazo**: O Cognee mantém o contexto de \"fio\" de curto prazo separado da memória de longo prazo, ao nível do utilizador ou da organização.\n", + "\n", + "## Aplicações no Mundo Real\n", + "\n", + "1. **Agentes de IA Verticais**\n", + "\n", + " Utilize o padrão deste notebook para criar copilotos inteligentes em domínios específicos que utilizam o Cognee como núcleo de recuperação e raciocínio:\n", + "\n", + "- **Copilotos para programadores**: Revisão de código, análise de incidentes e assistentes de arquitetura que percorrem código, APIs, documentos de design e tickets como um único grafo de memória.\n", + "\n", + "- **Copilotos voltados para o cliente**: Agentes de suporte ou sucesso que extraem informações de documentos de produto, FAQs, notas de CRM e tickets anteriores com recuperação consciente do grafo e respostas citadas.\n", + "\n", + "- **Copilotos especialistas internos**: Assistentes de política, jurídico ou segurança que raciocinam sobre regras interconectadas, diretrizes e decisões históricas em vez de PDFs isolados.\n", + "\n", + " O Cognee posiciona-se explicitamente como uma memória persistente e precisa para agentes de IA, fornecendo um grafo de conhecimento vivo que se integra ao seu agente e substitui combinações ad hoc de armazenamentos vetoriais e código de grafo personalizado.\n", + "\n", + "2. **Unificar Silos de Dados numa Única Memória**\n", + "\n", + " A mesma abordagem também ajuda a construir uma camada de memória unificada a partir de fontes dispersas:\n", + "\n", + "- **De silos para um único grafo**: Ingestão de dados estruturados (por exemplo, bases de dados) e não estruturados (por exemplo, documentos, chats) num único grafo suportado por embeddings, em vez de índices separados para cada sistema.\n", + "\n", + "- **Raciocínio entre fontes com citações**: Realize raciocínios em múltiplas etapas sobre tudo—\"junte\" registos, métricas e documentos através do grafo—e ainda assim devolva respostas fundamentadas com proveniência.\n", + "\n", + "- **Hubs de conhecimento**: Para domínios como banca ou educação, o Cognee já é utilizado para unificar PDFs, sistemas internos e dados de aplicações num único grafo de conhecimento com vetores, permitindo que os agentes respondam a perguntas com contexto preciso e citado.\n", + "\n", + "## Próximos Passos\n", + "\n", + "Já implementou o ciclo de memória principal. Aqui estão extensões naturais que pode experimentar por conta própria (consulte a [documentação do Cognee](https://docs.cognee.ai/) para mais detalhes):\n", + "\n", + "1. **Experimente a consciência temporal**: Ative o \"temporal cognify\" para extrair eventos e marcas temporais do texto.\n", + "\n", + "2. **Introduza raciocínio orientado por ontologia**: Defina uma ontologia OWL para o seu domínio. Utilize o suporte de ontologia do Cognee para que as entidades e relações extraídas sejam fundamentadas nesse esquema, melhorando a qualidade do grafo e as respostas específicas do domínio.\n", + "\n", + "3. **Adicione um ciclo de feedback**: Permita que o Cognee ajuste os pesos das arestas do grafo com base no feedback real dos utilizadores, para que a recuperação melhore ao longo do tempo em vez de permanecer estática.\n", + "\n", + "4. **Ajuste para personalização e comportamento de sessão**: Utilize IDs de utilizador, inquilinos e conjuntos de dados para oferecer a cada pessoa ou equipa a sua própria visão sobre o motor de memória partilhado.\n", + "\n", + "5. **Expanda para agentes mais complexos**: Integre o Cognee em frameworks de agentes para construir sistemas multiagente que partilhem a mesma camada de memória. *O plugin Microsoft Agent Framework x Cognee está a caminho.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Aviso Legal**: \nEste documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos pela precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autoritária. Para informações críticas, recomenda-se uma tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:47:11+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "pt" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/pt/13-agent-memory/README.md b/translations/pt/13-agent-memory/README.md index 21ee2f643..9b2bf9a88 100644 --- a/translations/pt/13-agent-memory/README.md +++ b/translations/pt/13-agent-memory/README.md @@ -1,46 +1,54 @@ # Memória para Agentes de IA -[![Memória de Agente](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.pt.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) +[![Memória do Agente](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.pt.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Ao discutir os benefícios únicos de criar Agentes de IA, dois aspetos são frequentemente mencionados: a capacidade de utilizar ferramentas para realizar tarefas e a capacidade de melhorar ao longo do tempo. A memória é a base para criar agentes autossuficientes que proporcionam melhores experiências aos nossos utilizadores. +Ao discutir os benefícios únicos de criar Agentes de IA, dois pontos principais são abordados: a capacidade de utilizar ferramentas para realizar tarefas e a capacidade de melhorar ao longo do tempo. A memória é a base para criar agentes autossuficientes que proporcionam melhores experiências aos nossos utilizadores. -Nesta lição, vamos explorar o que é a memória para Agentes de IA e como podemos geri-la e utilizá-la em benefício das nossas aplicações. +Nesta lição, vamos explorar o que é memória para Agentes de IA e como podemos geri-la e utilizá-la para beneficiar as nossas aplicações. ## Introdução Esta lição abordará: -• **Compreender a Memória de Agentes de IA**: O que é a memória e por que é essencial para os agentes. +• **Compreender a Memória de Agentes de IA**: O que é memória e por que é essencial para os agentes. • **Implementar e Armazenar Memória**: Métodos práticos para adicionar capacidades de memória aos seus agentes de IA, com foco em memória de curto e longo prazo. • **Tornar os Agentes de IA Autossuficientes**: Como a memória permite que os agentes aprendam com interações anteriores e melhorem ao longo do tempo. +## Implementações Disponíveis + +Esta lição inclui dois tutoriais completos em notebooks: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Implementa memória usando Mem0 e Azure AI Search com o framework Semantic Kernel. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Implementa memória estruturada usando Cognee, construindo automaticamente um grafo de conhecimento baseado em embeddings, visualizando o grafo e realizando recuperação inteligente. + ## Objetivos de Aprendizagem Após completar esta lição, saberá como: -• **Diferenciar entre os vários tipos de memória de agentes de IA**, incluindo memória de trabalho, memória de curto prazo e memória de longo prazo, bem como formas especializadas como memória de persona e memória episódica. +• **Diferenciar entre os vários tipos de memória de agentes de IA**, incluindo memória de trabalho, de curto prazo e de longo prazo, bem como formas especializadas como memória de persona e episódica. -• **Implementar e gerir memória de curto e longo prazo para agentes de IA** utilizando o framework Semantic Kernel, aproveitando ferramentas como Mem0 e memória Whiteboard, e integrando com Azure AI Search. +• **Implementar e gerir memória de curto e longo prazo para agentes de IA** usando o framework Semantic Kernel, aproveitando ferramentas como Mem0, Cognee, memória de quadro branco e integração com Azure AI Search. • **Compreender os princípios por trás de agentes de IA autossuficientes** e como sistemas robustos de gestão de memória contribuem para aprendizagem e adaptação contínuas. ## Compreender a Memória de Agentes de IA -Na sua essência, **a memória para agentes de IA refere-se aos mecanismos que lhes permitem reter e recordar informações**. Estas informações podem incluir detalhes específicos de uma conversa, preferências do utilizador, ações anteriores ou até padrões aprendidos. +No seu núcleo, **memória para agentes de IA refere-se aos mecanismos que lhes permitem reter e recordar informações**. Estas informações podem incluir detalhes específicos sobre uma conversa, preferências do utilizador, ações anteriores ou até padrões aprendidos. -Sem memória, as aplicações de IA são frequentemente sem estado, o que significa que cada interação começa do zero. Isso resulta numa experiência repetitiva e frustrante para o utilizador, onde o agente "esquece" o contexto ou as preferências anteriores. +Sem memória, as aplicações de IA são frequentemente sem estado, o que significa que cada interação começa do zero. Isso leva a uma experiência repetitiva e frustrante para o utilizador, onde o agente "esquece" o contexto ou as preferências anteriores. -### Por que é a Memória Importante? +### Por que a Memória é Importante? A inteligência de um agente está profundamente ligada à sua capacidade de recordar e utilizar informações passadas. A memória permite que os agentes sejam: @@ -48,7 +56,7 @@ A inteligência de um agente está profundamente ligada à sua capacidade de rec • **Interativos**: Manter o contexto ao longo de uma conversa contínua. -• **Proativos e Reativos**: Antecipar necessidades ou responder de forma adequada com base em dados históricos. +• **Proativos e Reativos**: Antecipar necessidades ou responder adequadamente com base em dados históricos. • **Autónomos**: Operar de forma mais independente ao recorrer a conhecimentos armazenados. @@ -58,9 +66,9 @@ O objetivo de implementar memória é tornar os agentes mais **fiáveis e capaze #### Memória de Trabalho -Pense nesta como uma folha de rascunho que um agente utiliza durante uma única tarefa ou processo de pensamento em curso. Contém informações imediatas necessárias para calcular o próximo passo. +Pense nela como um pedaço de papel de rascunho que um agente usa durante uma única tarefa ou processo de pensamento em andamento. Ela mantém informações imediatas necessárias para calcular o próximo passo. -Para agentes de IA, a memória de trabalho frequentemente captura as informações mais relevantes de uma conversa, mesmo que o histórico completo do chat seja longo ou truncado. Foca-se em extrair elementos-chave como requisitos, propostas, decisões e ações. +Para agentes de IA, a memória de trabalho frequentemente captura as informações mais relevantes de uma conversa, mesmo que o histórico completo do chat seja longo ou truncado. Ela foca em extrair elementos-chave como requisitos, propostas, decisões e ações. **Exemplo de Memória de Trabalho** @@ -68,51 +76,50 @@ Num agente de reserva de viagens, a memória de trabalho pode capturar o pedido #### Memória de Curto Prazo -Este tipo de memória retém informações durante a duração de uma única conversa ou sessão. É o contexto do chat atual, permitindo que o agente se refira a interações anteriores no diálogo. +Este tipo de memória retém informações durante uma única conversa ou sessão. É o contexto do chat atual, permitindo que o agente se refira a turnos anteriores no diálogo. **Exemplo de Memória de Curto Prazo** -Se um utilizador perguntar: "Quanto custa um voo para Paris?" e depois seguir com "E quanto à acomodação lá?", a memória de curto prazo garante que o agente saiba que "lá" se refere a "Paris" dentro da mesma conversa. +Se um utilizador perguntar, "Quanto custa um voo para Paris?" e depois seguir com "E quanto à acomodação lá?", a memória de curto prazo garante que o agente saiba que "lá" refere-se a "Paris" dentro da mesma conversa. #### Memória de Longo Prazo -Esta é a informação que persiste ao longo de várias conversas ou sessões. Permite que os agentes se lembrem de preferências do utilizador, interações históricas ou conhecimentos gerais durante períodos prolongados. Isto é importante para personalização. +Esta é a informação que persiste ao longo de várias conversas ou sessões. Permite que os agentes se lembrem de preferências do utilizador, interações históricas ou conhecimentos gerais por períodos prolongados. Isto é importante para personalização. **Exemplo de Memória de Longo Prazo** -Uma memória de longo prazo pode armazenar que "O Ben gosta de esquiar e de atividades ao ar livre, aprecia café com vista para a montanha e quer evitar pistas de esqui avançadas devido a uma lesão anterior". Esta informação, aprendida em interações anteriores, influencia recomendações em futuras sessões de planeamento de viagens, tornando-as altamente personalizadas. +Uma memória de longo prazo pode armazenar que "Ben gosta de esquiar e atividades ao ar livre, prefere café com vista para a montanha e quer evitar pistas de esqui avançadas devido a uma lesão anterior". Esta informação, aprendida em interações anteriores, influencia recomendações em futuras sessões de planeamento de viagens, tornando-as altamente personalizadas. #### Memória de Persona -Este tipo de memória especializado ajuda um agente a desenvolver uma "personalidade" ou "persona" consistente. Permite que o agente se lembre de detalhes sobre si próprio ou sobre o seu papel pretendido, tornando as interações mais fluidas e focadas. +Este tipo de memória especializado ajuda um agente a desenvolver uma "personalidade" ou "persona" consistente. Permite que o agente se lembre de detalhes sobre si mesmo ou sobre o seu papel pretendido, tornando as interações mais fluidas e focadas. **Exemplo de Memória de Persona** - -Se o agente de viagens for projetado para ser um "especialista em planeamento de esqui", a memória de persona pode reforçar este papel, influenciando as suas respostas para se alinharem com o tom e conhecimento de um especialista. +Se o agente de viagens for projetado para ser um "especialista em planeamento de esqui", a memória de persona pode reforçar este papel, influenciando as suas respostas para alinhar-se com o tom e conhecimento de um especialista. #### Memória de Fluxo/Episódica -Esta memória armazena a sequência de passos que um agente toma durante uma tarefa complexa, incluindo sucessos e falhas. É como lembrar "episódios" específicos ou experiências passadas para aprender com eles. +Esta memória armazena a sequência de passos que um agente realiza durante uma tarefa complexa, incluindo sucessos e falhas. É como lembrar "episódios" específicos ou experiências passadas para aprender com eles. **Exemplo de Memória Episódica** -Se o agente tentou reservar um voo específico, mas falhou devido à indisponibilidade, a memória episódica pode registar esta falha, permitindo que o agente tente voos alternativos ou informe o utilizador sobre o problema de forma mais informada numa tentativa subsequente. +Se o agente tentou reservar um voo específico, mas falhou devido à indisponibilidade, a memória episódica pode registrar esta falha, permitindo que o agente tente voos alternativos ou informe o utilizador sobre o problema de forma mais informada numa tentativa subsequente. -#### Memória de Entidades +#### Memória de Entidade Isto envolve extrair e lembrar entidades específicas (como pessoas, lugares ou coisas) e eventos de conversas. Permite que o agente construa uma compreensão estruturada dos elementos-chave discutidos. -**Exemplo de Memória de Entidades** +**Exemplo de Memória de Entidade** De uma conversa sobre uma viagem passada, o agente pode extrair "Paris", "Torre Eiffel" e "jantar no restaurante Le Chat Noir" como entidades. Numa interação futura, o agente pode recordar "Le Chat Noir" e oferecer-se para fazer uma nova reserva lá. #### RAG Estruturado (Geração Aumentada por Recuperação) -Embora o RAG seja uma técnica mais ampla, o "RAG Estruturado" é destacado como uma tecnologia de memória poderosa. Extrai informações densas e estruturadas de várias fontes (conversas, e-mails, imagens) e usa-as para melhorar a precisão, a recuperação e a velocidade nas respostas. Ao contrário do RAG clássico, que depende apenas de similaridade semântica, o RAG Estruturado trabalha com a estrutura inerente da informação. +Embora o RAG seja uma técnica mais ampla, o "RAG Estruturado" é destacado como uma tecnologia de memória poderosa. Ele extrai informações densas e estruturadas de várias fontes (conversas, e-mails, imagens) e usa-as para melhorar a precisão, recuperação e velocidade nas respostas. Diferentemente do RAG clássico que depende apenas de similaridade semântica, o RAG Estruturado trabalha com a estrutura inerente da informação. **Exemplo de RAG Estruturado** -Em vez de apenas corresponder palavras-chave, o RAG Estruturado pode analisar detalhes de voos (destino, data, hora, companhia aérea) de um e-mail e armazená-los de forma estruturada. Isso permite consultas precisas como "Que voo reservei para Paris na terça-feira?" +Em vez de apenas corresponder palavras-chave, o RAG Estruturado pode analisar detalhes de voos (destino, data, hora, companhia aérea) de um e-mail e armazená-los de forma estruturada. Isso permite consultas precisas como "Qual voo reservei para Paris na terça-feira?" ## Implementar e Armazenar Memória @@ -120,17 +127,27 @@ Implementar memória para agentes de IA envolve um processo sistemático de **ge ### Ferramentas Especializadas de Memória -Uma forma de armazenar e gerir a memória de agentes é utilizando ferramentas especializadas como o Mem0. O Mem0 funciona como uma camada de memória persistente, permitindo que os agentes recordem interações relevantes, armazenem preferências do utilizador e contexto factual, e aprendam com sucessos e falhas ao longo do tempo. A ideia aqui é que agentes sem estado se transformem em agentes com estado. +#### Mem0 + +Uma forma de armazenar e gerir memória de agentes é usar ferramentas especializadas como Mem0. Mem0 funciona como uma camada de memória persistente, permitindo que os agentes recordem interações relevantes, armazenem preferências do utilizador e contexto factual, e aprendam com sucessos e falhas ao longo do tempo. A ideia aqui é que agentes sem estado se transformem em agentes com estado. + +Funciona através de um **pipeline de memória em duas fases: extração e atualização**. Primeiro, mensagens adicionadas ao thread de um agente são enviadas ao serviço Mem0, que usa um Modelo de Linguagem Grande (LLM) para resumir o histórico de conversas e extrair novas memórias. Posteriormente, uma fase de atualização orientada por LLM determina se deve adicionar, modificar ou eliminar essas memórias, armazenando-as num repositório de dados híbrido que pode incluir bases de dados de vetor, grafo e chave-valor. Este sistema também suporta vários tipos de memória e pode incorporar memória de grafo para gerir relações entre entidades. + +#### Cognee + +Outra abordagem poderosa é usar **Cognee**, uma memória semântica de código aberto para agentes de IA que transforma dados estruturados e não estruturados em grafos de conhecimento consultáveis, apoiados por embeddings. Cognee fornece uma **arquitetura de armazenamento duplo** que combina pesquisa por similaridade de vetor com relações de grafo, permitindo que os agentes compreendam não apenas o que é semelhante, mas como os conceitos se relacionam entre si. + +Ele destaca-se na **recuperação híbrida**, que combina similaridade de vetor, estrutura de grafo e raciocínio LLM - desde a pesquisa de fragmentos brutos até respostas a perguntas conscientes do grafo. O sistema mantém uma **memória viva** que evolui e cresce enquanto permanece consultável como um grafo conectado, suportando tanto o contexto de sessão de curto prazo quanto a memória persistente de longo prazo. -Funciona através de um **pipeline de memória em duas fases: extração e atualização**. Primeiro, as mensagens adicionadas ao thread de um agente são enviadas para o serviço Mem0, que utiliza um Large Language Model (LLM) para resumir o histórico de conversas e extrair novas memórias. Posteriormente, uma fase de atualização orientada por LLM determina se deve adicionar, modificar ou eliminar essas memórias, armazenando-as num repositório de dados híbrido que pode incluir bases de dados vetoriais, gráficas e de chave-valor. Este sistema também suporta vários tipos de memória e pode incorporar memória gráfica para gerir relações entre entidades. +O tutorial em notebook Cognee ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) demonstra a construção desta camada de memória unificada, com exemplos práticos de ingestão de diversas fontes de dados, visualização do grafo de conhecimento e consulta com diferentes estratégias de pesquisa adaptadas às necessidades específicas do agente. ### Armazenar Memória com RAG -Além de ferramentas especializadas de memória como o Mem0, pode utilizar serviços de pesquisa robustos como o **Azure AI Search como backend para armazenar e recuperar memórias**, especialmente para RAG Estruturado. +Além de ferramentas especializadas de memória como Mem0, pode aproveitar serviços de pesquisa robustos como **Azure AI Search como backend para armazenar e recuperar memórias**, especialmente para RAG estruturado. -Isto permite que fundamente as respostas do seu agente com os seus próprios dados, garantindo respostas mais relevantes e precisas. O Azure AI Search pode ser usado para armazenar memórias específicas do utilizador sobre viagens, catálogos de produtos ou qualquer outro conhecimento específico de domínio. +Isso permite fundamentar as respostas do agente com os seus próprios dados, garantindo respostas mais relevantes e precisas. O Azure AI Search pode ser usado para armazenar memórias específicas do utilizador sobre viagens, catálogos de produtos ou qualquer outro conhecimento específico de domínio. -O Azure AI Search suporta capacidades como **RAG Estruturado**, que se destaca na extração e recuperação de informações densas e estruturadas de grandes conjuntos de dados, como históricos de conversas, e-mails ou até imagens. Isto proporciona "precisão e recuperação sobre-humanas" em comparação com abordagens tradicionais de fragmentação de texto e incorporação. +O Azure AI Search suporta capacidades como **RAG Estruturado**, que destaca-se na extração e recuperação de informações densas e estruturadas de grandes conjuntos de dados como históricos de conversas, e-mails ou até imagens. Isso proporciona "precisão e recuperação super-humanas" em comparação com abordagens tradicionais de fragmentação de texto e embeddings. ## Tornar os Agentes de IA Autossuficientes @@ -138,23 +155,25 @@ Um padrão comum para agentes autossuficientes envolve introduzir um **"agente d 1. **Identificar informações valiosas**: Determinar se alguma parte da conversa vale a pena ser guardada como conhecimento geral ou uma preferência específica do utilizador. -2. **Extrair e resumir**: Destilar o essencial da aprendizagem ou preferência da conversa. +2. **Extrair e resumir**: Destilar o aprendizado ou preferência essencial da conversa. -3. **Armazenar numa base de conhecimento**: Persistir esta informação extraída, frequentemente numa base de dados vetorial, para que possa ser recuperada mais tarde. +3. **Armazenar numa base de conhecimento**: Persistir esta informação extraída, frequentemente numa base de dados de vetor, para que possa ser recuperada mais tarde. -4. **Aumentar consultas futuras**: Quando o utilizador inicia uma nova consulta, o agente de conhecimento recupera informações relevantes armazenadas e adiciona-as ao prompt do utilizador, fornecendo contexto crucial ao agente primário (semelhante ao RAG). +4. **Aumentar consultas futuras**: Quando o utilizador inicia uma nova consulta, o agente de conhecimento recupera informações armazenadas relevantes e adiciona-as ao prompt do utilizador, fornecendo contexto crucial ao agente primário (semelhante ao RAG). ### Otimizações para Memória -• **Gestão de Latência**: Para evitar atrasos nas interações do utilizador, pode ser usado inicialmente um modelo mais barato e rápido para verificar rapidamente se a informação é valiosa para armazenar ou recuperar, invocando apenas o processo de extração/recuperação mais complexo quando necessário. +• **Gestão de Latência**: Para evitar atrasos nas interações do utilizador, um modelo mais barato e rápido pode ser usado inicialmente para verificar rapidamente se a informação é valiosa para armazenar ou recuperar, invocando apenas o processo de extração/recuperação mais complexo quando necessário. • **Manutenção da Base de Conhecimento**: Para uma base de conhecimento em crescimento, informações menos utilizadas podem ser movidas para "armazenamento frio" para gerir custos. ## Tem Mais Perguntas Sobre Memória de Agentes? -Junte-se ao [Discord do Azure AI Foundry](https://aka.ms/ai-agents/discord) para interagir com outros aprendizes, participar em horas de atendimento e obter respostas às suas perguntas sobre Agentes de IA. +Junte-se ao [Discord do Azure AI Foundry](https://aka.ms/ai-agents/discord) para encontrar outros aprendizes, participar de horas de atendimento e obter respostas às suas perguntas sobre Agentes de IA. --- -**Aviso**: -Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos pela precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autoritária. Para informações críticas, recomenda-se uma tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução. \ No newline at end of file + +**Aviso Legal**: +Este documento foi traduzido utilizando o serviço de tradução por IA [Co-op Translator](https://github.com/Azure/co-op-translator). Embora nos esforcemos pela precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original na sua língua nativa deve ser considerado a fonte autoritária. Para informações críticas, recomenda-se uma tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução. + \ No newline at end of file diff --git a/translations/ro/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/ro/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..3a4021896 --- /dev/null +++ b/translations/ro/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Construirea agenților AI cu memorie persistentă folosind Cognee\n", + "\n", + "Acest notebook demonstrează cum să construiești agenți AI inteligenți cu capacități sofisticate de memorie utilizând [**cognee**](https://www.cognee.ai/) - o memorie AI open source care combină grafuri de cunoștințe, căutare semantică și gestionarea sesiunilor pentru a crea sisteme AI conștiente de context.\n", + "\n", + "## 🎯 Obiective de învățare\n", + "\n", + "La finalul acestui tutorial, vei înțelege cum să:\n", + "- **Construiești grafuri de cunoștințe bazate pe embeddings**: Transformă textul nestructurat în cunoștințe structurate și interogabile\n", + "- **Implementezi memoria sesiunii**: Creează conversații multi-turn cu retenție automată a contextului\n", + "- **Păstrezi conversațiile**: Stochează opțional interacțiunile importante în memoria pe termen lung pentru referințe viitoare\n", + "- **Interoghezi folosind limbaj natural**: Accesează și utilizează contextul istoric în conversații noi\n", + "- **Vizualizezi memoria**: Explorează relațiile din graful de cunoștințe al agentului tău\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Ce vei construi\n", + "\n", + "În acest tutorial, vom crea un **Asistent de Programare** cu memorie persistentă care:\n", + "\n", + "### 1. **Construirea bazei de cunoștințe**\n", + " - Preia informații despre profilul și expertiza dezvoltatorului\n", + " - Procesează principii și bune practici de programare în Python\n", + " - Stochează conversații istorice între dezvoltatori și asistenți AI\n", + "\n", + "### 2. **Conversații conștiente de sesiune**\n", + " - Menține contextul pe parcursul mai multor întrebări din aceeași sesiune\n", + " - Cachează automat fiecare pereche întrebare/răspuns pentru o recuperare eficientă\n", + " - Oferă răspunsuri coerente și contextuale bazate pe istoricul conversației\n", + "\n", + "### 3. **Memorie pe termen lung**\n", + " - Păstrează conversațiile importante într-o memorie pe termen lung\n", + " - Recuperează amintiri relevante din baza de cunoștințe și sesiunile anterioare pentru a informa noile interacțiuni\n", + " - Construiește o bază de cunoștințe în continuă creștere care se îmbunătățește în timp\n", + "\n", + "### 4. **Recuperare inteligentă a memoriei**\n", + " - Utilizează căutarea semantică bazată pe grafuri pentru a găsi informații relevante în toate cunoștințele stocate\n", + " - Filtrează căutările pe subgrupuri de date (informații despre dezvoltatori vs. principii)\n", + " - Combină mai multe surse de date pentru a oferi răspunsuri cuprinzătoare\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Cerințe preliminare și configurare\n", + "\n", + "### Cerințe de sistem\n", + "\n", + "Înainte de a începe, asigură-te că ai:\n", + "\n", + "1. **Mediu Python**\n", + " - Python 3.9 sau o versiune mai recentă\n", + " - Mediu virtual (recomandat)\n", + " \n", + "2. **Redis Cache** (Necesar pentru gestionarea sesiunilor)\n", + " - Redis local: `docker run -d -p 6379:6379 redis`\n", + " - Sau folosește un serviciu Redis gestionat\n", + " \n", + "3. **Acces API LLM**\n", + " - Cheie API OpenAI sau alți furnizori (vezi [documentația](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Configurare bază de date**\n", + " - Nicio configurare necesară în mod implicit. Cognee folosește baze de date bazate pe fișiere (LanceDB și Kuzu)\n", + " - Opțional, poți configura Azure AI Search ca un magazin vectorial (vezi [documentația](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Configurare mediu\n", + "\n", + "Creează un fișier `.env` în directorul proiectului tău cu următoarele variabile:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Înțelegerea Arhitecturii Memoriei Cognee\n", + "\n", + "### Cum funcționează Cognee\n", + "\n", + "Cognee oferă un sistem de memorie sofisticat care depășește stocarea simplă de tip cheie-valoare:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Componente cheie:\n", + "\n", + "1. **Grafic de cunoștințe**: Stochează entități, relații și conexiuni semantice\n", + "2. **Vectori de încorporare**: Permite căutarea semantică în toate informațiile stocate\n", + "3. **Cache de sesiune**: Menține contextul conversației în cadrul și între sesiuni\n", + "4. **NodeSets**: Organizează datele în categorii logice pentru recuperare direcționată\n", + "\n", + "### Tipuri de memorie în acest tutorial:\n", + "\n", + "- **Memorie persistentă**: Stocare pe termen lung în graficul de cunoștințe\n", + "- **Memorie de sesiune**: Context temporar al conversației în cache-ul Redis\n", + "- **Memorie semantică**: Căutare bazată pe similaritate vectorială în toate datele\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Instalare Pachete Necesare\n", + "\n", + "Instalează Cognee cu suport Redis pentru gestionarea sesiunilor:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Inițializați Mediul și Încărcați Bibliotecile\n", + "\n", + "Asigurați-vă că:\n", + "1. Redis este pornit (de exemplu, prin Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Variabilele de mediu sunt setate înainte de a importa modulele de cache\n", + "3. Dacă este necesar, reporniți kernelul și rulați celulele în ordine\n", + "\n", + "Celula următoare va:\n", + "1. Încărca variabilele de mediu din `.env`\n", + "2. Configura Cognee cu setările dvs. LLM\n", + "3. Activa cache-ul pentru gestionarea sesiunilor\n", + "4. Valida că toate componentele sunt conectate corect\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Configurarea Directoarelor de Stocare\n", + "\n", + "Cognee utilizează două directoare separate pentru operațiunile sale:\n", + "- **Rădăcina Datelor**: Stochează documentele preluate și datele procesate\n", + "- **Rădăcina Sistemului**: Conține baza de date a grafului de cunoștințe și metadatele sistemului\n", + "\n", + "Vom crea directoare izolate pentru acest tutorial, după cum urmează:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Resetarea stării memoriei\n", + "\n", + "Înainte de a începe să construim sistemul de memorie, să ne asigurăm că pornim de la zero.\n", + "\n", + "> 💡 **Sfat**: Puteți sări peste acest pas dacă doriți să păstrați amintirile existente din rulările anterioare când utilizați acest notebook mai târziu.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Partea 1: Construirea bazei de cunoștințe\n", + "\n", + "### Surse de date pentru asistentul nostru pentru dezvoltatori\n", + "\n", + "Vom utiliza trei tipuri de date pentru a crea o bază de cunoștințe cuprinzătoare:\n", + "\n", + "1. **Profilul dezvoltatorului**: Expertiza personală și experiența tehnică\n", + "2. **Cele mai bune practici în Python**: Zen-ul Python cu linii directoare practice\n", + "3. **Conversații istorice**: Sesiuni anterioare de întrebări și răspunsuri între dezvoltatori și asistenți AI\n", + "\n", + "Aceste date diverse permit agentului nostru să:\n", + "- Înțeleagă contextul tehnic al utilizatorului\n", + "- Aplice cele mai bune practici în recomandări\n", + "- Învățe din interacțiunile de succes anterioare\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Procesează Datele într-un Grafic de Cunoștințe\n", + "\n", + "Acum vom transforma textul brut într-o memorie structurată. Acest proces:\n", + "\n", + "1. **Adaugă date în NodeSets**: Organizează informațiile în categorii logice\n", + " - `developer_data`: Profilul și conversațiile dezvoltatorului\n", + " - `principles_data`: Cele mai bune practici și ghiduri Python\n", + "\n", + "2. **Rulează Cognify Pipeline**: Extrage entități, relații și creează embeddings\n", + " - Identifică conceptele cheie\n", + " - Creează conexiuni semantice între informațiile corelate\n", + " - Generează vector embeddings\n", + "\n", + "Acest proces poate dura câteva momente, pe măsură ce LLM procesează textul și construiește structura graficului:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Vizualizați Graficul de Cunoștințe\n", + "\n", + "Haideți să explorăm structura graficului nostru de cunoștințe. Vizualizarea arată:\n", + "- **Noduri**: Entități extrase din text (concepte, tehnologii, persoane)\n", + "- **Muchii**: Relații și conexiuni între entități\n", + "- **Clustere**: Concepte înrudite grupate după similaritate semantică\n", + "\n", + "Deschideți fișierul HTML generat în browserul dvs. pentru a explora graficul interactiv:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Îmbogățește Memoria cu Memify\n", + "\n", + "Funcția `memify()` analizează graful de cunoștințe și generează reguli inteligente despre date. Acest proces:\n", + "- Identifică tipare și bune practici\n", + "- Creează linii directoare aplicabile bazate pe conținut\n", + "- Stabilește relații între diferite domenii de cunoștințe\n", + "\n", + "Aceste reguli ajută agentul să ia decizii mai informate atunci când răspunde la întrebări. Capturarea unei a doua vizualizări te ajută să compari cum se densifică graful odată ce este îmbogățit.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Partea 2: Recuperarea Inteligentă a Memoriei\n", + "\n", + "### Demonstrația 1: Integrarea Cunoștințelor din Documente Multiple\n", + "\n", + "Acum că graful nostru de cunoștințe este construit, să testăm cum Cognee combină informații din surse multiple pentru a răspunde la întrebări complexe.\n", + "\n", + "Prima interogare demonstrează:\n", + "- **Înțelegere semantică**: Găsirea conceptelor relevante chiar și atunci când nu sunt menționate explicit\n", + "- **Referințe încrucișate**: Combinarea profilului dezvoltatorului cu principiile Python\n", + "- **Raționament contextual**: Aplicarea celor mai bune practici la implementări specifice\n", + "\n", + "### Demonstrația 2: Căutare Filtrată cu NodeSets\n", + "\n", + "A doua interogare arată cum să vizezi subseturi specifice ale grafului de cunoștințe:\n", + "- Folosește parametrul `node_name` pentru a căuta doar în `principles_data`\n", + "- Oferă răspunsuri concentrate dintr-un domeniu specific de cunoștințe\n", + "- Util pentru momentele în care ai nevoie de informații specifice unui domeniu\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Partea 3: Configurarea gestionării sesiunii\n", + "\n", + "### Activarea memoriei conversației\n", + "\n", + "Gestionarea sesiunii este esențială pentru menținerea contextului pe parcursul mai multor interacțiuni. Aici vom:\n", + "\n", + "1. **Inițializa contextul utilizatorului**: Creați sau recuperați un profil de utilizator pentru urmărirea sesiunii\n", + "2. **Configurați motorul de cache**: Conectați-vă la Redis pentru stocarea istoricului conversațiilor\n", + "3. **Activați variabilele de sesiune**: Configurați variabile de context care persistă între interogări\n", + "\n", + "> ⚠️ **Important**: Acest lucru necesită ca Redis să fie activ și `CACHING=true` în mediul dumneavoastră\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Funcție Utilitară: Vizualizare Istoric Sesiune\n", + "\n", + "Această funcție utilitară ne permite să inspectăm istoricul conversațiilor stocat în Redis. Este utilă pentru:\n", + "- Depanarea gestionării sesiunilor\n", + "- Verificarea faptului că conversațiile sunt memorate în cache\n", + "- Înțelegerea contextului disponibil pentru agent\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Sesiunea 1: Laborator de Suport Async — Prima Întrebare\n", + "\n", + "Începe sesiunea `async-support-lab` întrebând despre modele asyncio prietenoase cu telemetria pentru un scraper web masiv. Graful deja cunoaște despre asyncio, aiohttp și practicile de monitorizare, așa că răspunsul ar trebui să reflecte conversațiile anterioare, adaptându-se în același timp la noua întrebare.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Inspectați Memoria Sesiunii 1 După Primul Schimb\n", + "\n", + "Executarea comenzii `show_history(session_1)` imediat după întrebarea inițială confirmă că Cognee a scris atât promptul, cât și completarea în Redis. Ar trebui să vedeți o singură intrare cu ghidajul de concurență.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Sesiunea 1: Urmărire a modelelor de date\n", + "\n", + "Următorul pas este să întrebăm: „Când ar trebui să aleg dataclasses în loc de Pydantic?” folosind același ID de sesiune. Cognee ar trebui să combine principiile Python cu conversațiile anterioare despre FastAPI pentru a oferi sfaturi detaliate—demonstrând că contextul se păstrează într-o sesiune denumită.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Confirmă că Istoricul Sesiunii 1 Conține Ambele Rânduri\n", + "\n", + "O altă apelare `show_history(session_1)` ar trebui să dezvăluie două intrări de tip Întrebare&Răspuns. Acest lucru corespunde pasului de \"reluare a memoriei\" din laboratorul Mem0 și dovedește că rândurile suplimentare extind același transcript.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Sesiunea 2: Fir de Revizuire a Designului — Sesiune Nouă\n", + "\n", + "Pentru a demonstra izolarea între fire, inițiem `design-review-session` și solicităm îndrumări pentru jurnalizarea revizuirilor incidentelor. Deși baza de cunoștințe de bază este aceeași, noul id de sesiune păstrează transcrierile separate.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Revizuirea Sesiunii 2 Istorie\n", + "\n", + "`show_history(session_2)` ar trebui să listeze doar perechea de solicitare/răspuns din revizuirea designului. Compară aceasta cu Sesiunea 1 pentru a evidenția modul în care Cognee păstrează transcrieri independente în timp ce reutilizează graful de cunoștințe partajat.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Rezumat\n", + "\n", + "Felicitări! Tocmai i-ai oferit asistentului tău de codare un strat de memorie pe termen lung, alimentat de Cognee.\n", + "\n", + "În acest tutorial, ai luat conținut brut de dezvoltator (cod, documentație, conversații) și l-ai transformat într-un grafic + memorie vectorială pe care agentul tău o poate căuta, analiza și îmbunătăți continuu.\n", + "\n", + "Ce ai învățat\n", + "\n", + "1. **De la text brut la memorie AI**: Cum Cognee preia date nestructurate și le transformă într-o memorie inteligentă, ușor de căutat, folosind o arhitectură combinată de vectori + grafic de cunoștințe.\n", + "\n", + "2. **Îmbogățirea graficului cu memify**: Cum să depășești crearea de grafice de bază și să folosești memify pentru a adăuga fapte derivate și relații mai bogate peste graficul existent.\n", + "\n", + "3. **Strategii multiple de căutare**: Cum să interoghezi memoria folosind diferite tipuri de căutare (Q&A bazat pe grafic, completare în stil RAG, perspective, fragmente brute, căutare de cod etc.), în funcție de nevoile agentului tău.\n", + "\n", + "4. **Explorare vizuală**: Cum să inspectezi și să depanezi ceea ce a construit Cognee folosind vizualizări de grafice și interfața Cognee, astfel încât să poți vedea efectiv cum este structurată cunoașterea.\n", + "\n", + "5. **Memorie sensibilă la sesiune**: Cum să combini contextul fiecărei sesiuni cu memoria semantică persistentă, astfel încât agenții să poată reține informații între sesiuni fără a scăpa date între utilizatori.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Idei principale\n", + "1. Memorie ca un Grafic de Cunoștințe susținut de Embeddings\n", + "\n", + " - **Înțelegere structurată**: Cognee combină un depozit vectorial și un depozit grafic, astfel încât datele tale să fie atât căutabile după semnificație, cât și conectate prin relații. Cognee folosește baze de date bazate pe fișiere în mod implicit (LanceDB pentru vectori, Kuzu pentru baza de date grafică).\n", + "\n", + " - **Recuperare conștientă de relații**: Răspunsurile pot fi fundamentate nu doar pe „text similar,” ci și pe modul în care entitățile se relaționează.\n", + "\n", + " - **Memorie vie**: Stratul de memorie evoluează, crește și rămâne interogabil ca un grafic conectat.\n", + "\n", + "2. Moduri de Căutare și Raționament\n", + " - **Recuperare hibridă**: căutarea combină similaritatea vectorială, structura graficului și raționamentul LLM, de la căutarea brută a fragmentelor până la răspunsuri la întrebări conștiente de grafic.\n", + "\n", + " - **Adaptează modul la sarcină**: Folosește moduri de tip completare când dorești răspunsuri în limbaj natural și moduri de fragment/sumar/grafic când agentul tău are nevoie de context brut sau să-și conducă propriul raționament.\n", + "\n", + "3. Agenți Personalizați, Conștienți de Sesiune\n", + " - **Context de sesiune + memorie pe termen lung**: Cognee păstrează contextul pe termen scurt al „firului” separat de memoria pe termen lung, la nivel de utilizator sau organizație.\n", + "\n", + "## Aplicații în Lumea Reală\n", + "\n", + "1. **Agenți AI Verticali**\n", + "\n", + " Folosește modelul din acest notebook pentru a alimenta copiloți inteligenți pe domenii care se bazează pe Cognee ca nucleu pentru recuperare și raționament:\n", + "\n", + "- **Copiloți pentru dezvoltatori**: Revizuirea codului, analiza incidentelor și asistenți pentru arhitectură care traversează cod, API-uri, documente de design și tichete ca un singur grafic de memorie.\n", + "\n", + "- **Copiloți orientați către clienți**: Agenți de suport sau succes care extrag informații din documentația produsului, FAQ-uri, notițe CRM și tichete anterioare cu recuperare conștientă de grafic și răspunsuri citate.\n", + "\n", + "- **Copiloți experți interni**: Asistenți pentru politici, juridic sau securitate care raționează pe baza regulilor, ghidurilor și deciziilor istorice interconectate, în loc de PDF-uri izolate.\n", + "\n", + " Cognee este poziționat explicit ca o memorie persistentă și precisă pentru agenții AI, oferind un grafic de cunoștințe viu care se integrează în spatele agentului tău și înlocuiește combinațiile ad-hoc de depozite vectoriale și coduri grafice personalizate.\n", + "\n", + "2. **Unificarea Silozurilor de Date într-o Singură Memorie**\n", + "\n", + " Aceeași abordare te ajută să construiești un strat de memorie unificat din surse dispersate:\n", + "\n", + "- **De la silozuri la un singur grafic**: Încarcă date structurate (de ex., baze de date) și nestructurate (de ex., documente, chat-uri) într-un singur grafic susținut de embeddings, în loc de indici separați pentru fiecare sistem.\n", + "\n", + "- **Raționament între surse cu citări**: Rulează raționamente în mai mulți pași peste tot—„alătură” jurnale, metrici și documente prin grafic—și oferă în continuare răspunsuri fundamentate cu proveniență.\n", + "\n", + "- **Hub-uri de cunoștințe**: Pentru domenii precum banking sau educație, Cognee este deja folosit pentru a unifica PDF-uri, sisteme interne și date din aplicații într-un singur grafic de cunoștințe cu vectori, astfel încât agenții să poată răspunde la întrebări cu context precis și citat.\n", + "\n", + "## Pași Următori\n", + "\n", + "Ai implementat bucla de memorie de bază. Iată extensii naturale pe care le poți încerca pe cont propriu (vezi [documentația Cognee](https://docs.cognee.ai/) pentru detalii):\n", + "\n", + "1. **Experimentează cu conștientizarea temporală**: Activează funcția de cognificare temporală pentru a extrage evenimente și marcaje temporale din text.\n", + "\n", + "2. **Introdu raționamentul bazat pe ontologie**: Definește o ontologie OWL pentru domeniul tău. Folosește suportul pentru ontologie al Cognee astfel încât entitățile și relațiile extrase să fie fundamentate în acea schemă, îmbunătățind calitatea graficului și răspunsurile specifice domeniului.\n", + "\n", + "3. **Adaugă un circuit de feedback**: Permite Cognee să ajusteze greutățile muchiilor graficului pe baza feedback-ului real al utilizatorilor, astfel încât recuperarea să se îmbunătățească în timp în loc să rămână statică.\n", + "\n", + "4. **Optimizează pentru personalizare și comportamentul sesiunii**: Folosește ID-uri de utilizator, chiriași și seturi de date pentru a oferi fiecărei persoane sau echipe propria perspectivă asupra motorului de memorie partajat.\n", + "\n", + "5. **Extinde-te la agenți mai complecși**: Conectează Cognee la cadre de agenți pentru a construi sisteme multi-agent care împărtășesc același strat de memorie. *Microsoft Agent Framework x Cognee plugin va fi disponibil în curând.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Declinare de responsabilitate**: \nAcest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa maternă ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de oameni. Nu ne asumăm responsabilitatea pentru neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:29:43+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "ro" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/ro/13-agent-memory/README.md b/translations/ro/13-agent-memory/README.md index 1715660bb..7674da822 100644 --- a/translations/ro/13-agent-memory/README.md +++ b/translations/ro/13-agent-memory/README.md @@ -1,54 +1,62 @@ -# Memorie pentru Agenți AI +# Memorie pentru Agenți AI [![Memorie Agenți](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.ro.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Când discutăm despre beneficiile unice ale creării agenților AI, două aspecte sunt în general abordate: abilitatea de a utiliza instrumente pentru a finaliza sarcini și capacitatea de a se îmbunătăți în timp. Memoria este fundamentul creării unui agent care se auto-îmbunătățește și care poate oferi experiențe mai bune utilizatorilor noștri. +Când discutăm despre beneficiile unice ale creării Agenților AI, două lucruri sunt în principal menționate: abilitatea de a utiliza instrumente pentru a finaliza sarcini și capacitatea de a se îmbunătăți în timp. Memoria stă la baza creării unui agent auto-îmbunătățitor care poate oferi experiențe mai bune utilizatorilor noștri. -În această lecție, vom analiza ce înseamnă memoria pentru agenții AI și cum o putem gestiona și utiliza în beneficiul aplicațiilor noastre. +În această lecție, vom analiza ce înseamnă memoria pentru Agenții AI și cum o putem gestiona și utiliza în beneficiul aplicațiilor noastre. ## Introducere Această lecție va acoperi: -• **Înțelegerea memoriei agenților AI**: Ce este memoria și de ce este esențială pentru agenți. +• **Înțelegerea memoriei Agenților AI**: Ce este memoria și de ce este esențială pentru agenți. • **Implementarea și stocarea memoriei**: Metode practice pentru adăugarea capacităților de memorie agenților AI, concentrându-ne pe memoria pe termen scurt și lung. -• **Crearea agenților AI care se auto-îmbunătățesc**: Cum memoria permite agenților să învețe din interacțiunile anterioare și să se îmbunătățească în timp. +• **Crearea Agenților AI auto-îmbunătățitori**: Cum permite memoria agenților să învețe din interacțiunile anterioare și să se îmbunătățească în timp. + +## Implementări disponibile + +Această lecție include două tutoriale complete sub formă de notebook-uri: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Implementează memoria folosind Mem0 și Azure AI Search cu cadrul Semantic Kernel. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Implementează memoria structurată folosind Cognee, construind automat un grafic de cunoștințe bazat pe embeddings, vizualizând graficul și realizând recuperări inteligente. ## Obiective de învățare -După finalizarea acestei lecții, vei ști cum să: +După finalizarea acestei lecții, veți ști cum să: -• **Diferențiezi între diferite tipuri de memorie ale agenților AI**, inclusiv memoria de lucru, pe termen scurt și lung, precum și forme specializate precum memoria de personalitate și memoria episodică. +• **Faceți diferența între diferite tipuri de memorie ale agenților AI**, inclusiv memoria de lucru, pe termen scurt și lung, precum și forme specializate precum memoria de personalitate și memoria episodică. -• **Implementezi și gestionezi memoria pe termen scurt și lung pentru agenții AI** folosind cadrul Semantic Kernel, utilizând instrumente precum Mem0 și memoria Whiteboard, și integrând cu Azure AI Search. +• **Implementați și gestionați memoria pe termen scurt și lung pentru agenții AI** folosind cadrul Semantic Kernel, utilizând instrumente precum Mem0, Cognee, memoria Whiteboard și integrarea cu Azure AI Search. -• **Înțelegi principiile din spatele agenților AI care se auto-îmbunătățesc** și cum sistemele robuste de gestionare a memoriei contribuie la învățarea și adaptarea continuă. +• **Înțelegeți principiile din spatele agenților AI auto-îmbunătățitori** și cum contribuie sistemele robuste de gestionare a memoriei la învățarea și adaptarea continuă. -## Înțelegerea memoriei agenților AI +## Înțelegerea memoriei Agenților AI -În esență, **memoria pentru agenții AI se referă la mecanismele care le permit să rețină și să recheme informații**. Aceste informații pot include detalii specifice despre o conversație, preferințele utilizatorului, acțiuni anterioare sau chiar modele învățate. +În esență, **memoria pentru agenții AI se referă la mecanismele care le permit să rețină și să recheme informații**. Aceste informații pot include detalii specifice despre o conversație, preferințele utilizatorului, acțiuni anterioare sau chiar tipare învățate. Fără memorie, aplicațiile AI sunt adesea fără stare, ceea ce înseamnă că fiecare interacțiune începe de la zero. Acest lucru duce la o experiență repetitivă și frustrantă pentru utilizator, în care agentul "uită" contextul sau preferințele anterioare. -### De ce este memoria importantă? +### De ce este importantă memoria? Inteligența unui agent este profund legată de abilitatea sa de a rechema și utiliza informațiile din trecut. Memoria permite agenților să fie: • **Reflexivi**: Să învețe din acțiunile și rezultatele anterioare. -• **Interactivi**: Să mențină contextul pe parcursul unei conversații. +• **Interactivi**: Să mențină contextul pe parcursul unei conversații continue. -• **Proactivi și reactivi**: Să anticipeze nevoile sau să răspundă adecvat pe baza datelor istorice. +• **Proactivi și Reactivi**: Să anticipeze nevoile sau să răspundă adecvat pe baza datelor istorice. • **Autonomi**: Să funcționeze mai independent, bazându-se pe cunoștințele stocate. @@ -58,17 +66,17 @@ Scopul implementării memoriei este de a face agenții mai **fiabili și capabil #### Memoria de lucru -Gândește-te la aceasta ca la o foaie de hârtie pe care agentul o folosește în timpul unei sarcini sau unui proces de gândire. Ea păstrează informațiile imediate necesare pentru a calcula pasul următor. +Gândiți-vă la aceasta ca la o foaie de hârtie pe care un agent o folosește în timpul unei singure sarcini sau proces de gândire. Aceasta reține informațiile imediate necesare pentru a calcula pasul următor. -Pentru agenții AI, memoria de lucru captează cele mai relevante informații dintr-o conversație, chiar dacă istoricul complet al chatului este lung sau trunchiat. Se concentrează pe extragerea elementelor cheie precum cerințe, propuneri, decizii și acțiuni. +Pentru agenții AI, memoria de lucru captează adesea cele mai relevante informații dintr-o conversație, chiar dacă istoricul complet al chat-ului este lung sau trunchiat. Se concentrează pe extragerea elementelor cheie precum cerințe, propuneri, decizii și acțiuni. **Exemplu de memorie de lucru** -În cazul unui agent de rezervare de călătorii, memoria de lucru ar putea capta cererea curentă a utilizatorului, cum ar fi "Vreau să rezerv o excursie la Paris". Această cerință specifică este păstrată în contextul imediat al agentului pentru a ghida interacțiunea curentă. +În cazul unui agent de rezervare a călătoriilor, memoria de lucru ar putea capta cererea curentă a utilizatorului, cum ar fi "Vreau să rezerv o călătorie la Paris". Această cerință specifică este păstrată în contextul imediat al agentului pentru a ghida interacțiunea curentă. #### Memoria pe termen scurt -Acest tip de memorie reține informații pe durata unei singure conversații sau sesiuni. Este contextul chatului curent, permițând agentului să se refere la turele anterioare din dialog. +Acest tip de memorie reține informațiile pe durata unei singure conversații sau sesiuni. Este contextul chat-ului curent, permițând agentului să facă referire la replicile anterioare din dialog. **Exemplu de memorie pe termen scurt** @@ -76,15 +84,15 @@ Dacă un utilizator întreabă, "Cât ar costa un zbor spre Paris?" și apoi con #### Memoria pe termen lung -Aceasta este informația care persistă pe parcursul mai multor conversații sau sesiuni. Permite agenților să-și amintească preferințele utilizatorului, interacțiunile istorice sau cunoștințele generale pe perioade extinse. Acest lucru este important pentru personalizare. +Aceasta este informația care persistă pe parcursul mai multor conversații sau sesiuni. Permite agenților să-și amintească preferințele utilizatorului, interacțiunile anterioare sau cunoștințele generale pe perioade extinse. Este importantă pentru personalizare. **Exemplu de memorie pe termen lung** -O memorie pe termen lung ar putea stoca faptul că "Ben adoră schiul și activitățile în aer liber, preferă cafeaua cu vedere la munte și dorește să evite pârtiile avansate de schi din cauza unei accidentări anterioare". Aceste informații, învățate din interacțiuni anterioare, influențează recomandările în sesiunile viitoare de planificare a călătoriilor, făcându-le extrem de personalizate. +O memorie pe termen lung ar putea stoca faptul că "Ben se bucură de schi și activități în aer liber, îi place cafeaua cu vedere la munte și dorește să evite pârtiile avansate de schi din cauza unei accidentări anterioare". Aceste informații, învățate din interacțiuni anterioare, influențează recomandările în sesiunile viitoare de planificare a călătoriilor, făcându-le extrem de personalizate. #### Memoria de personalitate -Acest tip de memorie specializată ajută un agent să dezvolte o "personalitate" sau un "rol" consistent. Permite agentului să-și amintească detalii despre sine sau rolul său intenționat, făcând interacțiunile mai fluide și concentrate. +Acest tip de memorie specializată ajută un agent să dezvolte o "personalitate" sau un "rol" consistent. Permite agentului să-și amintească detalii despre sine sau despre rolul său intenționat, făcând interacțiunile mai fluide și mai concentrate. **Exemplu de memorie de personalitate** @@ -92,11 +100,11 @@ Dacă agentul de călătorii este conceput să fie un "expert în planificarea s #### Memoria de flux/episodică -Această memorie stochează secvența de pași pe care un agent îi urmează în timpul unei sarcini complexe, inclusiv succesele și eșecurile. Este ca și cum ar "aminti" episoade sau experiențe anterioare pentru a învăța din ele. +Această memorie stochează secvența de pași pe care un agent îi face în timpul unei sarcini complexe, inclusiv succesele și eșecurile. Este ca și cum ar "ține minte" episoade specifice sau experiențe trecute pentru a învăța din ele. **Exemplu de memorie episodică** -Dacă agentul a încercat să rezerve un anumit zbor, dar a eșuat din cauza indisponibilității, memoria episodică ar putea înregistra acest eșec, permițând agentului să încerce zboruri alternative sau să informeze utilizatorul despre problemă într-un mod mai informat în încercările ulterioare. +Dacă agentul a încercat să rezerve un anumit zbor, dar a eșuat din cauza indisponibilității, memoria episodică ar putea înregistra acest eșec, permițând agentului să încerce zboruri alternative sau să informeze utilizatorul despre problemă într-un mod mai informat în timpul unei încercări ulterioare. #### Memoria de entitate @@ -104,57 +112,69 @@ Aceasta implică extragerea și reținerea entităților specifice (cum ar fi pe **Exemplu de memorie de entitate** -Dintr-o conversație despre o excursie anterioară, agentul ar putea extrage "Paris", "Turnul Eiffel" și "cină la restaurantul Le Chat Noir" ca entități. Într-o interacțiune viitoare, agentul ar putea rechema "Le Chat Noir" și oferi să facă o nouă rezervare acolo. +Dintr-o conversație despre o călătorie anterioară, agentul ar putea extrage "Paris", "Turnul Eiffel" și "cină la restaurantul Le Chat Noir" ca entități. Într-o interacțiune viitoare, agentul ar putea să-și amintească "Le Chat Noir" și să ofere să facă o nouă rezervare acolo. #### RAG Structurat (Generare Augmentată prin Recuperare) -Deși RAG este o tehnică mai largă, "RAG Structurat" este evidențiat ca o tehnologie de memorie puternică. Acesta extrage informații dense și structurate din diverse surse (conversații, e-mailuri, imagini) și le folosește pentru a îmbunătăți precizia, rechemarea și viteza răspunsurilor. Spre deosebire de RAG clasic, care se bazează doar pe similaritatea semantică, RAG Structurat lucrează cu structura inerentă a informațiilor. +Deși RAG este o tehnică mai largă, "RAG Structurat" este evidențiat ca o tehnologie de memorie puternică. Extrage informații dense și structurate din diverse surse (conversații, e-mailuri, imagini) și le folosește pentru a îmbunătăți precizia, rechemarea și viteza răspunsurilor. Spre deosebire de RAG-ul clasic, care se bazează doar pe similaritatea semantică, RAG Structurat lucrează cu structura inerentă a informațiilor. **Exemplu de RAG Structurat** -În loc să se limiteze la potrivirea cuvintelor cheie, RAG Structurat ar putea analiza detaliile unui zbor (destinație, dată, oră, companie aeriană) dintr-un e-mail și să le stocheze într-un mod structurat. Acest lucru permite interogări precise, cum ar fi "Ce zbor am rezervat spre Paris marți?" +În loc să se bazeze doar pe potrivirea cuvintelor cheie, RAG Structurat ar putea analiza detaliile unui zbor (destinație, dată, oră, companie aeriană) dintr-un e-mail și să le stocheze într-un mod structurat. Acest lucru permite interogări precise, cum ar fi "Ce zbor am rezervat spre Paris marți?" ## Implementarea și stocarea memoriei Implementarea memoriei pentru agenții AI implică un proces sistematic de **gestionare a memoriei**, care include generarea, stocarea, recuperarea, integrarea, actualizarea și chiar "uitarea" (sau ștergerea) informațiilor. Recuperarea este un aspect deosebit de crucial. -### Instrumente specializate de memorie +### Instrumente specializate pentru memorie + +#### Mem0 + +O modalitate de a stoca și gestiona memoria agentului este utilizarea unor instrumente specializate precum Mem0. Mem0 funcționează ca un strat de memorie persistentă, permițând agenților să recheme interacțiuni relevante, să stocheze preferințele utilizatorului și contextul factual și să învețe din succese și eșecuri în timp. Ideea este că agenții fără stare devin agenți cu stare. + +Funcționează printr-un **pipeline de memorie în două faze: extragere și actualizare**. Mai întâi, mesajele adăugate la firul unui agent sunt trimise la serviciul Mem0, care folosește un Model de Limbaj Mare (LLM) pentru a rezuma istoricul conversației și a extrage noi amintiri. Ulterior, o fază de actualizare condusă de LLM determină dacă să adauge, să modifice sau să șteargă aceste amintiri, stocându-le într-un depozit de date hibrid care poate include baze de date vectoriale, grafice și cheie-valoare. Acest sistem suportă, de asemenea, diverse tipuri de memorie și poate încorpora memoria grafică pentru gestionarea relațiilor dintre entități. + +#### Cognee + +O altă abordare puternică este utilizarea **Cognee**, o memorie semantică open-source pentru agenții AI care transformă datele structurate și nestructurate în grafice de cunoștințe interogabile, susținute de embeddings. Cognee oferă o **arhitectură cu dublu depozit** care combină căutarea prin similaritate vectorială cu relațiile grafice, permițând agenților să înțeleagă nu doar ce informații sunt similare, ci și cum se relaționează conceptele între ele. -O modalitate de a stoca și gestiona memoria agentului este utilizarea instrumentelor specializate precum Mem0. Mem0 funcționează ca un strat de memorie persistentă, permițând agenților să recheme interacțiuni relevante, să stocheze preferințele utilizatorului și contextul factual, și să învețe din succese și eșecuri în timp. Ideea este că agenții fără stare devin agenți cu stare. +Excellează în **recuperarea hibridă** care îmbină similaritatea vectorială, structura graficului și raționamentul LLM - de la căutarea brută a fragmentelor la răspunsuri conștiente de grafic. Sistemul menține o **memorie vie** care evoluează și crește, rămânând interogabilă ca un singur grafic conectat, susținând atât contextul sesiunii pe termen scurt, cât și memoria persistentă pe termen lung. -Acesta funcționează printr-un **pipeline de memorie în două faze: extragere și actualizare**. Mai întâi, mesajele adăugate la firul agentului sunt trimise la serviciul Mem0, care folosește un model de limbaj mare (LLM) pentru a rezuma istoricul conversației și a extrage noi amintiri. Ulterior, o fază de actualizare condusă de LLM determină dacă să adauge, să modifice sau să șteargă aceste amintiri, stocându-le într-un depozit de date hibrid care poate include baze de date vectoriale, grafice și cheie-valoare. Acest sistem susține, de asemenea, diverse tipuri de memorie și poate încorpora memoria grafică pentru gestionarea relațiilor dintre entități. +Tutorialul notebook Cognee ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) demonstrează construirea acestui strat de memorie unificat, cu exemple practice de ingestie a surselor de date diverse, vizualizarea graficului de cunoștințe și interogarea cu strategii de căutare diferite, adaptate nevoilor specifice ale agentului. ### Stocarea memoriei cu RAG -Dincolo de instrumentele specializate de memorie precum Mem0, poți utiliza servicii de căutare robuste precum **Azure AI Search ca backend pentru stocarea și recuperarea amintirilor**, în special pentru RAG structurat. +Dincolo de instrumentele specializate de memorie precum Mem0, puteți utiliza servicii robuste de căutare precum **Azure AI Search ca backend pentru stocarea și recuperarea amintirilor**, în special pentru RAG structurat. -Acest lucru îți permite să fundamentezi răspunsurile agentului cu propriile date, asigurând răspunsuri mai relevante și mai precise. Azure AI Search poate fi utilizat pentru a stoca amintiri specifice utilizatorului despre călătorii, cataloage de produse sau orice altă cunoaștere specifică domeniului. +Acest lucru vă permite să fundamentați răspunsurile agentului cu propriile date, asigurând răspunsuri mai relevante și mai precise. Azure AI Search poate fi utilizat pentru a stoca amintiri specifice utilizatorului despre călătorii, cataloage de produse sau orice altă cunoaștere specifică domeniului. -Azure AI Search susține capabilități precum **RAG Structurat**, care excelează în extragerea și recuperarea informațiilor dense și structurate din seturi mari de date, cum ar fi istoricul conversațiilor, e-mailuri sau chiar imagini. Acest lucru oferă "precizie și rechemare superumană" comparativ cu abordările tradiționale de fragmentare a textului și încorporare. +Azure AI Search suportă capabilități precum **RAG Structurat**, care excelează în extragerea și recuperarea informațiilor dense și structurate din seturi mari de date, cum ar fi istoricul conversațiilor, e-mailurile sau chiar imaginile. Acest lucru oferă "precizie și rechemare supraomenească" comparativ cu abordările tradiționale de împărțire a textului și încorporare. -## Crearea agenților AI care se auto-îmbunătățesc +## Crearea Agenților AI auto-îmbunătățitori -Un model comun pentru agenții care se auto-îmbunătățesc implică introducerea unui **"agent de cunoaștere"**. Acest agent separat observă conversația principală dintre utilizator și agentul primar. Rolul său este să: +Un model comun pentru agenții auto-îmbunătățitori implică introducerea unui **"agent de cunoaștere"**. Acest agent separat observă conversația principală dintre utilizator și agentul principal. Rolul său este să: -1. **Identifice informații valoroase**: Să determine dacă vreo parte a conversației merită salvată ca cunoaștere generală sau preferință specifică utilizatorului. +1. **Identifice informații valoroase**: Să determine dacă vreo parte a conversației merită salvată ca cunoaștere generală sau preferință specifică a utilizatorului. -2. **Extragă și rezumeze**: Să distileze învățătura sau preferința esențială din conversație. +2. **Extragă și rezumeze**: Să distileze esența învățării sau preferinței din conversație. -3. **Stocheze într-o bază de cunoștințe**: Să persisteze informația extrasă, adesea într-o bază de date vectorială, pentru a putea fi recuperată ulterior. +3. **Stocheze într-o bază de cunoștințe**: Să persisteze aceste informații extrase, adesea într-o bază de date vectorială, astfel încât să poată fi recuperate mai târziu. -4. **Augmenteze interogările viitoare**: Când utilizatorul inițiază o nouă interogare, agentul de cunoaștere recuperează informațiile relevante stocate și le adaugă la promptul utilizatorului, oferind context crucial agentului primar (similar cu RAG). +4. **Augmenteze interogările viitoare**: Când utilizatorul inițiază o nouă interogare, agentul de cunoaștere recuperează informațiile stocate relevante și le adaugă la promptul utilizatorului, oferind context crucial agentului principal (similar cu RAG). ### Optimizări pentru memorie -• **Gestionarea latenței**: Pentru a evita încetinirea interacțiunilor utilizatorului, poate fi utilizat inițial un model mai ieftin și mai rapid pentru a verifica rapid dacă informația este valoroasă pentru stocare sau recuperare, invocând procesul mai complex de extragere/recuperare doar atunci când este necesar. +• **Gestionarea latenței**: Pentru a evita încetinirea interacțiunilor utilizatorului, un model mai ieftin și mai rapid poate fi utilizat inițial pentru a verifica rapid dacă informațiile sunt valoroase pentru stocare sau recuperare, invocând doar procesul mai complex de extragere/recuperare atunci când este necesar. -• **Întreținerea bazei de cunoștințe**: Pentru o bază de cunoștințe în creștere, informațiile utilizate mai rar pot fi mutate în "stocare rece" pentru a gestiona costurile. +• **Întreținerea bazei de cunoștințe**: Pentru o bază de cunoștințe în creștere, informațiile mai puțin utilizate frecvent pot fi mutate în "stocare rece" pentru a gestiona costurile. -## Ai mai multe întrebări despre memoria agenților? +## Aveți mai multe întrebări despre memoria agenților? -Alătură-te [Discordului Azure AI Foundry](https://aka.ms/ai-agents/discord) pentru a te întâlni cu alți cursanți, a participa la ore de consultanță și a obține răspunsuri la întrebările tale despre agenții AI. +Alăturați-vă [Discordului Azure AI Foundry](https://aka.ms/ai-agents/discord) pentru a întâlni alți cursanți, a participa la ore de consultanță și a obține răspunsuri la întrebările despre Agenții AI. --- -**Declinarea responsabilității**: -Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să rețineți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa nativă ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm răspunderea pentru eventualele neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri. \ No newline at end of file + +**Declinare de responsabilitate**: +Acest document a fost tradus folosind serviciul de traducere AI [Co-op Translator](https://github.com/Azure/co-op-translator). Deși ne străduim să asigurăm acuratețea, vă rugăm să fiți conștienți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa maternă ar trebui considerat sursa autoritară. Pentru informații critice, se recomandă traducerea profesională realizată de oameni. Nu ne asumăm responsabilitatea pentru neînțelegeri sau interpretări greșite care pot apărea din utilizarea acestei traduceri. + \ No newline at end of file diff --git a/translations/ru/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/ru/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..5798a0904 --- /dev/null +++ b/translations/ru/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Создание AI-агентов с постоянной памятью с использованием Cognee\n", + "\n", + "Этот ноутбук демонстрирует, как создавать интеллектуальных AI-агентов с продвинутыми возможностями памяти, используя [**cognee**](https://www.cognee.ai/) — открытый инструмент для работы с памятью AI, который объединяет графы знаний, семантический поиск и управление сессиями для создания контекстно-осведомленных AI-систем.\n", + "\n", + "## 🎯 Цели обучения\n", + "\n", + "К концу этого урока вы научитесь:\n", + "- **Создавать графы знаний на основе эмбеддингов**: Преобразовывать неструктурированный текст в структурированные, доступные для запросов знания\n", + "- **Реализовывать память сессий**: Создавать многотуровые диалоги с автоматическим сохранением контекста\n", + "- **Сохранять диалоги**: При необходимости сохранять важные взаимодействия в долгосрочной памяти для последующего использования\n", + "- **Запрашивать с использованием естественного языка**: Получать доступ к историческому контексту и использовать его в новых диалогах\n", + "- **Визуализировать память**: Исследовать связи в графе знаний вашего агента\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Что вы создадите\n", + "\n", + "В этом руководстве мы создадим **Ассистента для кодирования** с постоянной памятью, который:\n", + "\n", + "### 1. **Создание базы знаний**\n", + " - Загружает информацию о профиле разработчика и его навыках\n", + " - Обрабатывает принципы программирования на Python и лучшие практики\n", + " - Сохраняет историю разговоров между разработчиками и AI-ассистентами\n", + "\n", + "### 2. **Учет контекста в разговорах**\n", + " - Сохраняет контекст при ответах на несколько вопросов в одной сессии\n", + " - Автоматически кэширует каждую пару вопрос/ответ для эффективного извлечения\n", + " - Предоставляет связные и контекстуальные ответы, основываясь на истории разговора\n", + "\n", + "### 3. **Долгосрочная память**\n", + " - Сохраняет важные разговоры в долгосрочную память\n", + " - Извлекает релевантные воспоминания из базы знаний и прошлых сессий для новых взаимодействий\n", + " - Создает растущую базу знаний, которая со временем становится лучше\n", + "\n", + "### 4. **Интеллектуальное извлечение памяти**\n", + " - Использует семантический поиск с учетом графов для нахождения релевантной информации во всей сохраненной базе знаний\n", + " - Фильтрует поиск по подгруппам данных (информация о разработчике vs. принципы)\n", + " - Объединяет несколько источников данных для предоставления комплексных ответов\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Предварительные требования и настройка\n", + "\n", + "### Системные требования\n", + "\n", + "Перед началом убедитесь, что у вас есть:\n", + "\n", + "1. **Среда Python**\n", + " - Python 3.9 или выше\n", + " - Виртуальная среда (рекомендуется)\n", + " \n", + "2. **Кэш Redis** (требуется для управления сессиями)\n", + " - Локальный Redis: `docker run -d -p 6379:6379 redis`\n", + " - Или используйте управляемый сервис Redis\n", + " \n", + "3. **Доступ к API LLM**\n", + " - Ключ API OpenAI или других провайдеров (см. [документацию](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Конфигурация базы данных**\n", + " - По умолчанию настройка не требуется. Cognee использует файловые базы данных (LanceDB и Kuzu)\n", + " - При желании вы можете настроить Azure AI Search как хранилище векторов (см. [документацию](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Конфигурация окружения\n", + "\n", + "Создайте файл `.env` в каталоге вашего проекта с следующими переменными:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Понимание архитектуры памяти Cognee\n", + "\n", + "### Как работает Cognee\n", + "\n", + "Cognee предоставляет сложную систему памяти, которая выходит за рамки простого хранения ключ-значение:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Основные компоненты:\n", + "\n", + "1. **Граф знаний**: Хранит сущности, отношения и семантические связи\n", + "2. **Векторные встраивания**: Обеспечивают семантический поиск по всей сохраненной информации\n", + "3. **Кэш сессии**: Сохраняет контекст разговора внутри и между сессиями\n", + "4. **NodeSets**: Организуют данные в логические категории для целенаправленного извлечения\n", + "\n", + "### Типы памяти в этом руководстве:\n", + "\n", + "- **Постоянная память**: Долгосрочное хранение в графе знаний\n", + "- **Память сессии**: Временный контекст разговора в кэше Redis\n", + "- **Семантическая память**: Поиск по сходству на основе векторов по всем данным\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Установка необходимых пакетов\n", + "\n", + "Установите Cognee с поддержкой Redis для управления сессиями:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Инициализация окружения и загрузка библиотек\n", + "\n", + "Убедитесь, что:\n", + "1. Redis запущен (например, через Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Переменные окружения установлены перед импортом модулей кэша\n", + "3. При необходимости перезапустите ядро и выполните ячейки по порядку\n", + "\n", + "Следующая ячейка выполнит:\n", + "1. Загрузку переменных окружения из `.env`\n", + "2. Настройку Cognee с вашими параметрами LLM\n", + "3. Включение кэширования для управления сессиями\n", + "4. Проверку правильного подключения всех компонентов\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Настройка каталогов хранения\n", + "\n", + "Cognee использует два отдельных каталога для своей работы:\n", + "- **Корень данных**: Хранит загруженные документы и обработанные данные\n", + "- **Системный корень**: Содержит базу данных графа знаний и системные метаданные\n", + "\n", + "Для этого урока мы создадим изолированные каталоги следующим образом:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Сброс состояния памяти\n", + "\n", + "Прежде чем мы начнем создавать нашу систему памяти, давайте убедимся, что мы начинаем с чистого листа.\n", + "\n", + "> 💡 **Совет**: Вы можете пропустить этот шаг, если хотите сохранить существующие данные памяти из предыдущих запусков, когда будете использовать этот ноутбук позже.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Часть 1: Создание базы знаний\n", + "\n", + "### Источники данных для нашего помощника разработчика\n", + "\n", + "Мы будем использовать три типа данных для создания всеобъемлющей базы знаний:\n", + "\n", + "1. **Профиль разработчика**: Личный опыт и технический бэкграунд\n", + "2. **Лучшие практики Python**: Дзен Python с практическими рекомендациями\n", + "3. **Исторические беседы**: Прошлые сессии вопросов и ответов между разработчиками и AI-ассистентами\n", + "\n", + "Эти разнообразные данные позволяют нашему агенту:\n", + "- Понимать технический контекст пользователя\n", + "- Применять лучшие практики в рекомендациях\n", + "- Учиться на предыдущих успешных взаимодействиях\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Преобразование данных в граф знаний\n", + "\n", + "Теперь мы преобразуем наш необработанный текст в структурированную память. Этот процесс:\n", + "\n", + "1. **Добавляет данные в NodeSets**: Организует информацию в логические категории\n", + " - `developer_data`: Профиль разработчика и разговоры\n", + " - `principles_data`: Лучшие практики и рекомендации по Python\n", + "\n", + "2. **Запускает Cognify Pipeline**: Извлекает сущности, отношения и создает эмбеддинги\n", + " - Определяет ключевые концепции\n", + " - Создает семантические связи между связанными данными\n", + " - Генерирует векторные эмбеддинги\n", + "\n", + "Это может занять некоторое время, пока LLM обрабатывает текст и строит структуру графа:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Визуализация графа знаний\n", + "\n", + "Давайте изучим структуру нашего графа знаний. Визуализация показывает:\n", + "- **Узлы**: Сущности, извлеченные из текста (концепции, технологии, люди)\n", + "- **Ребра**: Отношения и связи между сущностями\n", + "- **Кластеры**: Связанные концепции, сгруппированные по семантическому сходству\n", + "\n", + "Откройте сгенерированный HTML-файл в вашем браузере, чтобы интерактивно исследовать граф:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Обогащение памяти с помощью Memify\n", + "\n", + "Функция `memify()` анализирует граф знаний и генерирует интеллектуальные правила о данных. Этот процесс:\n", + "- Определяет шаблоны и лучшие практики\n", + "- Создает практические рекомендации на основе контента\n", + "- Устанавливает связи между различными областями знаний\n", + "\n", + "Эти правила помогают агенту принимать более обоснованные решения при ответах на вопросы. Захват второй визуализации позволяет сравнить, как граф становится более плотным после обогащения.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Часть 2: Интеллектуальное извлечение информации\n", + "\n", + "### Демонстрация 1: Интеграция знаний из разных документов\n", + "\n", + "Теперь, когда наш граф знаний создан, давайте проверим, как Cognee объединяет информацию из нескольких источников для ответа на сложные вопросы.\n", + "\n", + "Первый запрос демонстрирует:\n", + "- **Семантическое понимание**: Поиск релевантных концепций, даже если они явно не упомянуты\n", + "- **Перекрестные ссылки**: Сочетание профиля разработчика с принципами Python\n", + "- **Контекстуальное рассуждение**: Применение лучших практик к конкретным реализациям\n", + "\n", + "### Демонстрация 2: Фильтрованный поиск с NodeSets\n", + "\n", + "Второй запрос показывает, как нацелиться на определенные подмножества графа знаний:\n", + "- Использует параметр `node_name` для поиска только в пределах `principles_data`\n", + "- Предоставляет сфокусированные ответы из конкретной области знаний\n", + "- Полезно, когда требуется информация из определенной области\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Часть 3: Настройка управления сессиями\n", + "\n", + "### Включение памяти диалога\n", + "\n", + "Управление сессиями важно для сохранения контекста в ходе нескольких взаимодействий. Здесь мы:\n", + "\n", + "1. **Инициализируем пользовательский контекст**: Создаем или извлекаем профиль пользователя для отслеживания сессии\n", + "2. **Настраиваем механизм кэширования**: Подключаемся к Redis для хранения истории диалога\n", + "3. **Включаем переменные сессии**: Настраиваем переменные контекста, которые сохраняются между запросами\n", + "\n", + "> ⚠️ **Важно**: Для этого требуется запущенный Redis и `CACHING=true` в вашем окружении\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Вспомогательная функция: Просмотр истории сессии\n", + "\n", + "Эта утилита позволяет нам изучить историю разговоров, сохраненную в Redis. Она полезна для:\n", + "- Отладки управления сессиями\n", + "- Проверки, что разговоры сохраняются в кэше\n", + "- Понимания, какой контекст доступен агенту\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Сессия 1: Лаборатория поддержки Async — Первый вопрос\n", + "\n", + "Начните сессию `async-support-lab`, задав вопрос о подходящих для телеметрии паттернах asyncio для масштабного веб-скрейпера. Граф уже знаком с asyncio, aiohttp и практиками мониторинга, поэтому ответ должен отражать предыдущие обсуждения, адаптируясь к новому запросу.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Проверка памяти сессии 1 после первого обмена\n", + "\n", + "Выполнение команды `show_history(session_1)` сразу после первоначального вопроса подтверждает, что Cognee записал как запрос, так и ответ в Redis. Вы должны увидеть одну запись с рекомендацией по параллельности.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Сессия 1: Продолжение обсуждения моделей данных\n", + "\n", + "Далее мы задаем вопрос: «Когда следует выбирать dataclasses, а когда Pydantic?» с использованием того же идентификатора сессии. Cognee должен объединить принципы Python с предыдущими обсуждениями FastAPI, чтобы дать детализированный совет, демонстрируя, что контекст сохраняется в рамках именованной сессии.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Подтвердите, что история сессии 1 содержит оба хода\n", + "\n", + "Еще один вызов `show_history(session_1)` должен показать две записи вопросов и ответов. Это соответствует шагу \"воспроизведение памяти\" в лаборатории Mem0 и доказывает, что дополнительные ходы продолжают тот же самый транскрипт.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Сессия 2: Обсуждение дизайна — Новая сессия\n", + "\n", + "Чтобы показать изоляцию между потоками, мы запускаем `design-review-session` и запрашиваем рекомендации по ведению логов для анализа инцидентов. Хотя база знаний остается той же, новый идентификатор сессии позволяет хранить стенограммы отдельно.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Обзор сессии 2 История\n", + "\n", + "`show_history(session_2)` должен отображать только пару запрос/ответ для обзора дизайна. Сравните это с Сессией 1, чтобы подчеркнуть, как Cognee сохраняет независимые стенограммы, одновременно используя общий граф знаний.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Резюме\n", + "\n", + "Поздравляем! Вы только что добавили вашему помощнику по программированию настоящий слой долгосрочной памяти, работающий на основе Cognee.\n", + "\n", + "В этом руководстве вы взяли исходный контент разработчика (код, документацию, чаты) и преобразовали его в граф + векторную память, которую ваш агент может искать, анализировать и постоянно улучшать.\n", + "\n", + "Чему вы научились:\n", + "\n", + "1. **От текста к памяти ИИ**: Как Cognee обрабатывает неструктурированные данные и превращает их в интеллектуальную, доступную для поиска память, используя комбинированную архитектуру векторов и графа знаний.\n", + "\n", + "2. **Обогащение графа с помощью memify**: Как выйти за рамки базового создания графа и использовать memify для добавления производных фактов и более богатых связей поверх существующего графа.\n", + "\n", + "3. **Различные стратегии поиска**: Как выполнять запросы к памяти с использованием различных типов поиска (вопросы с учетом графа, завершение в стиле RAG, инсайты, исходные фрагменты, поиск кода и т.д.) в зависимости от потребностей вашего агента.\n", + "\n", + "4. **Визуальное исследование**: Как проверять и отлаживать то, что создал Cognee, с помощью визуализации графов и интерфейса Cognee, чтобы вы могли увидеть, как структурированы знания.\n", + "\n", + "5. **Память с учетом сеанса**: Как сочетать контекст каждого сеанса с постоянной семантической памятью, чтобы агенты могли запоминать между запусками, не допуская утечки информации между пользователями.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Основные моменты\n", + "1. Память как граф знаний, поддерживаемый эмбеддингами\n", + "\n", + " - **Структурированное понимание**: Cognee объединяет хранилище векторов и графовое хранилище, чтобы ваши данные были одновременно доступны для поиска по смыслу и связаны отношениями. По умолчанию Cognee использует файловые базы данных (LanceDB для векторов, Kuzu для графовой базы данных).\n", + "\n", + " - **Учёт отношений при поиске**: Ответы могут основываться не только на «похожем тексте», но и на том, как связаны сущности.\n", + "\n", + " - **Живая память**: Слой памяти развивается, растёт и остаётся доступным для запросов как единый связанный граф.\n", + "\n", + "2. Режимы поиска и рассуждения\n", + " - **Гибридный поиск**: поиск объединяет сходство векторов, структуру графа и рассуждения LLM, начиная от поиска по сырым фрагментам до ответов с учётом графа.\n", + "\n", + " - **Подбор режима под задачу**: Используйте режимы в стиле завершения, когда нужны ответы на естественном языке, и режимы фрагментов/резюме/графа, когда вашему агенту требуется сырой контекст или возможность самостоятельно рассуждать.\n", + "\n", + "3. Персонализированные агенты, учитывающие контекст сессии\n", + " - **Контекст сессии + долгосрочная память**: Cognee разделяет краткосрочный контекст «ветки» и долгосрочную память на уровне пользователя или организации.\n", + "\n", + "## Применение в реальном мире\n", + "\n", + "1. **Вертикальные AI-агенты**\n", + "\n", + " Используйте шаблон из этого блокнота для создания умных помощников, которые работают на основе Cognee как ядра для поиска и рассуждений:\n", + "\n", + "- **Помощники для разработчиков**: Помощь в код-ревью, анализе инцидентов и архитектурных решениях, которые охватывают код, API, проектную документацию и тикеты как единый граф памяти.\n", + "\n", + "- **Помощники для клиентов**: Агенты поддержки или успеха, которые используют продуктовую документацию, FAQ, заметки CRM и прошлые тикеты с учётом графа и цитируемыми ответами.\n", + "\n", + "- **Внутренние экспертные помощники**: Помощники по политике, юридическим вопросам или безопасности, которые рассуждают на основе взаимосвязанных правил, руководств и исторических решений, а не отдельных PDF.\n", + "\n", + " Cognee позиционируется как постоянная, точная память для AI-агентов, предоставляя живой граф знаний, который интегрируется с вашим агентом и заменяет случайные комбинации хранилищ векторов и пользовательского графового кода.\n", + "\n", + "2. **Объединение разрозненных данных в одну память**\n", + "\n", + " Тот же подход помогает создать единый слой памяти из разбросанных источников:\n", + "\n", + "- **От изолированных данных к единому графу**: Загружайте структурированные (например, базы данных) и неструктурированные данные (например, документы, чаты) в единый граф, поддерживаемый эмбеддингами, вместо отдельных индексов для каждой системы.\n", + "\n", + "- **Рассуждения с учётом источников и цитат**: Выполняйте многошаговые рассуждения по всем данным — «объединяйте» логи, метрики и документы через граф — и всё равно возвращайте обоснованные ответы с указанием источников.\n", + "\n", + "- **Центры знаний**: В таких областях, как банковское дело или образование, Cognee уже используется для объединения PDF, внутренних систем и данных приложений в единый граф знаний с векторами, чтобы агенты могли отвечать на вопросы с точным, цитируемым контекстом.\n", + "\n", + "## Следующие шаги\n", + "\n", + "Вы реализовали основной цикл памяти. Вот естественные расширения, которые вы можете попробовать самостоятельно (см. [документацию Cognee](https://docs.cognee.ai/) для подробностей):\n", + "\n", + "1. **Экспериментируйте с временной осведомлённостью**: Включите временную функцию Cognee, чтобы извлекать события и временные метки из текста.\n", + "\n", + "2. **Внедрите рассуждения, основанные на онтологии**: Определите онтологию OWL для вашей области. Используйте поддержку онтологии Cognee, чтобы извлечённые сущности и отношения были привязаны к этой схеме, улучшая качество графа и ответы, специфичные для вашей области.\n", + "\n", + "3. **Добавьте обратную связь**: Позвольте Cognee корректировать веса графовых связей на основе реальной обратной связи от пользователей, чтобы поиск улучшался со временем, а не оставался статичным.\n", + "\n", + "4. **Настройте персонализацию и поведение сессий**: Используйте идентификаторы пользователей, арендаторов и наборы данных, чтобы предоставить каждому человеку или команде их собственный вид на общий механизм памяти.\n", + "\n", + "5. **Масштабируйте для более сложных агентов**: Подключите Cognee к фреймворкам агентов, чтобы создавать системы с несколькими агентами, которые все используют общий слой памяти. *Microsoft Agent Framework x Cognee plugin скоро будет доступен.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Отказ от ответственности**: \nЭтот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования данного перевода.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:18:39+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "ru" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/ru/13-agent-memory/README.md b/translations/ru/13-agent-memory/README.md index 15047e40b..643f239a3 100644 --- a/translations/ru/13-agent-memory/README.md +++ b/translations/ru/13-agent-memory/README.md @@ -1,44 +1,52 @@ -# Память для AI-агентов +# Память для AI-агентов [![Память агента](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.ru.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Когда речь идет о преимуществах создания AI-агентов, обычно обсуждаются две ключевые вещи: способность использовать инструменты для выполнения задач и возможность улучшаться со временем. Память лежит в основе создания самообучающихся агентов, которые могут предоставлять более качественный опыт для пользователей. +Когда речь идет о преимуществах создания AI-агентов, обычно обсуждаются две основные вещи: способность использовать инструменты для выполнения задач и возможность улучшаться со временем. Память лежит в основе создания самообучающихся агентов, которые могут предоставлять лучший опыт для наших пользователей. В этом уроке мы рассмотрим, что такое память для AI-агентов, как ее можно управлять и использовать для улучшения наших приложений. ## Введение -В этом уроке мы изучим: +Этот урок охватывает: -• **Понимание памяти AI-агентов**: Что такое память и почему она важна для агентов. +• **Понимание памяти AI-агента**: Что такое память и почему она важна для агентов. -• **Реализация и хранение памяти**: Практические методы добавления возможностей памяти в AI-агентов, с акцентом на краткосрочную и долгосрочную память. +• **Реализация и хранение памяти**: Практические методы добавления возможностей памяти в ваши AI-агенты, с акцентом на краткосрочную и долгосрочную память. -• **Создание самообучающихся AI-агентов**: Как память позволяет агентам учиться на прошлых взаимодействиях и становиться лучше со временем. +• **Создание самообучающихся AI-агентов**: Как память позволяет агентам учиться на прошлых взаимодействиях и улучшаться со временем. + +## Доступные реализации + +Этот урок включает два подробных учебника в формате ноутбуков: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Реализует память с использованием Mem0 и Azure AI Search в рамках Semantic Kernel. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Реализует структурированную память с использованием Cognee, автоматически создавая граф знаний, поддерживаемый эмбеддингами, визуализируя граф и обеспечивая интеллектуальный поиск. ## Цели обучения После завершения урока вы сможете: -• **Различать различные типы памяти AI-агентов**, включая рабочую, краткосрочную и долгосрочную память, а также специализированные формы, такие как память персонажа и эпизодическая память. +• **Различать различные типы памяти AI-агента**, включая рабочую, краткосрочную и долгосрочную память, а также специализированные формы, такие как память персонажа и эпизодическая память. -• **Реализовывать и управлять краткосрочной и долгосрочной памятью для AI-агентов** с использованием фреймворка Semantic Kernel, инструментов, таких как Mem0 и Whiteboard memory, и интеграции с Azure AI Search. +• **Реализовывать и управлять краткосрочной и долгосрочной памятью для AI-агентов** с использованием Semantic Kernel, используя такие инструменты, как Mem0, Cognee, Whiteboard memory, и интеграцию с Azure AI Search. • **Понимать принципы работы самообучающихся AI-агентов** и как надежные системы управления памятью способствуют непрерывному обучению и адаптации. -## Понимание памяти AI-агентов +## Понимание памяти AI-агента -В основе своей **память AI-агентов — это механизмы, позволяющие им сохранять и вспоминать информацию**. Эта информация может включать детали разговора, предпочтения пользователя, прошлые действия или даже выученные шаблоны. +В своей основе **память AI-агента относится к механизмам, которые позволяют ему сохранять и вспоминать информацию**. Эта информация может включать конкретные детали разговора, предпочтения пользователя, прошлые действия или даже изученные шаблоны. -Без памяти AI-приложения часто остаются без состояния, то есть каждое взаимодействие начинается с нуля. Это приводит к повторяющемуся и неудовлетворительному пользовательскому опыту, когда агент "забывает" предыдущий контекст или предпочтения. +Без памяти AI-приложения часто являются бессостоящими, то есть каждое взаимодействие начинается с нуля. Это приводит к повторяющемуся и раздражающему пользовательскому опыту, когда агент "забывает" предыдущий контекст или предпочтения. ### Почему память важна? @@ -48,9 +56,9 @@ CO_OP_TRANSLATOR_METADATA: • **Интерактивными**: Сохранять контекст в ходе текущего разговора. -• **Проактивными и реактивными**: Предугадывать потребности или реагировать на основе исторических данных. +• **Проактивными и реактивными**: Предвидеть потребности или реагировать соответствующим образом на основе исторических данных. -• **Автономными**: Работать более независимо, используя накопленные знания. +• **Автономными**: Работать более независимо, опираясь на сохраненные знания. Цель внедрения памяти — сделать агентов более **надежными и способными**. @@ -58,13 +66,13 @@ CO_OP_TRANSLATOR_METADATA: #### Рабочая память -Представьте себе листок бумаги, который агент использует для выполнения текущей задачи или мыслительного процесса. Она хранит информацию, необходимую для выполнения следующего шага. +Представьте это как листок бумаги, который агент использует во время выполнения одной задачи или процесса мышления. Она хранит актуальную информацию, необходимую для выполнения следующего шага. -Для AI-агентов рабочая память часто фиксирует наиболее важную информацию из разговора, даже если полный журнал чата длинный или сокращен. Она сосредоточена на ключевых элементах, таких как требования, предложения, решения и действия. +Для AI-агентов рабочая память часто захватывает наиболее важную информацию из разговора, даже если полный чат длинный или сокращен. Она фокусируется на извлечении ключевых элементов, таких как требования, предложения, решения и действия. **Пример рабочей памяти** -В агенте по бронированию путешествий рабочая память может фиксировать текущий запрос пользователя, например: "Я хочу забронировать поездку в Париж". Это конкретное требование сохраняется в контексте агента для управления текущим взаимодействием. +В агенте бронирования путешествий рабочая память может захватывать текущий запрос пользователя, например: "Я хочу забронировать поездку в Париж". Это конкретное требование сохраняется в непосредственном контексте агента для управления текущим взаимодействием. #### Краткосрочная память @@ -72,7 +80,7 @@ CO_OP_TRANSLATOR_METADATA: **Пример краткосрочной памяти** -Если пользователь спрашивает: "Сколько будет стоить перелет в Париж?" и затем добавляет: "А как насчет проживания там?", краткосрочная память позволяет агенту понять, что "там" относится к "Парижу" в рамках одного разговора. +Если пользователь спрашивает: "Сколько будет стоить перелет в Париж?" и затем добавляет: "А как насчет проживания там?", краткосрочная память гарантирует, что агент понимает, что "там" относится к "Парижу" в рамках одного разговора. #### Долгосрочная память @@ -80,19 +88,18 @@ CO_OP_TRANSLATOR_METADATA: **Пример долгосрочной памяти** -Долгосрочная память может хранить информацию, например: "Бен любит кататься на лыжах и заниматься активным отдыхом, предпочитает кофе с видом на горы и избегает сложных лыжных трасс из-за прошлой травмы". Эта информация, полученная из предыдущих взаимодействий, влияет на рекомендации в будущих сеансах планирования путешествий, делая их максимально персонализированными. +Долгосрочная память может хранить, что "Бен любит кататься на лыжах и заниматься активным отдыхом, предпочитает кофе с видом на горы и хочет избегать сложных лыжных трасс из-за прошлой травмы". Эта информация, полученная из предыдущих взаимодействий, влияет на рекомендации в будущих сеансах планирования путешествий, делая их максимально персонализированными. #### Память персонажа -Этот специализированный тип памяти помогает агенту развивать последовательную "личность" или "персону". Он позволяет агенту запоминать детали о себе или своей роли, делая взаимодействия более естественными и целенаправленными. +Этот специализированный тип памяти помогает агенту развивать последовательную "личность" или "персонаж". Он позволяет агенту запоминать детали о себе или своей предполагаемой роли, делая взаимодействия более плавными и целенаправленными. **Пример памяти персонажа** - -Если агент по путешествиям предназначен быть "экспертом по планированию лыжных туров", память персонажа может укреплять эту роль, влияя на его ответы, чтобы они соответствовали тону и знаниям эксперта. +Если агент путешествий разработан как "эксперт по планированию лыжных поездок", память персонажа может укрепить эту роль, влияя на его ответы, чтобы они соответствовали тону и знаниям эксперта. #### Память рабочего процесса/эпизодическая память -Эта память сохраняет последовательность шагов, которые агент выполняет во время сложной задачи, включая успехи и неудачи. Это похоже на запоминание конкретных "эпизодов" или прошлых событий для обучения. +Эта память сохраняет последовательность шагов, которые агент выполняет во время сложной задачи, включая успехи и неудачи. Это похоже на запоминание конкретных "эпизодов" или прошлых событий для обучения на них. **Пример эпизодической памяти** @@ -100,7 +107,7 @@ CO_OP_TRANSLATOR_METADATA: #### Память сущностей -Этот тип памяти включает извлечение и запоминание конкретных сущностей (например, людей, мест или вещей) и событий из разговоров. Он позволяет агенту создавать структурированное понимание ключевых элементов обсуждения. +Она включает извлечение и запоминание конкретных сущностей (например, людей, мест или вещей) и событий из разговоров. Это позволяет агенту создавать структурированное понимание ключевых элементов, обсуждаемых в диалоге. **Пример памяти сущностей** @@ -108,11 +115,11 @@ CO_OP_TRANSLATOR_METADATA: #### Структурированный RAG (Retrieval Augmented Generation) -Хотя RAG — это более широкая техника, "структурированный RAG" выделяется как мощная технология памяти. Он извлекает плотную, структурированную информацию из различных источников (разговоров, писем, изображений) и использует ее для повышения точности, полноты и скорости ответов. В отличие от классического RAG, который опирается только на семантическое сходство, структурированный RAG работает с внутренней структурой информации. +Хотя RAG является более широкой техникой, "структурированный RAG" выделяется как мощная технология памяти. Он извлекает плотную, структурированную информацию из различных источников (разговоров, писем, изображений) и использует ее для повышения точности, полноты и скорости ответов. В отличие от классического RAG, который полагается только на семантическое сходство, структурированный RAG работает с внутренней структурой информации. **Пример структурированного RAG** -Вместо простого сопоставления ключевых слов структурированный RAG может анализировать детали рейса (пункт назначения, дата, время, авиакомпания) из письма и сохранять их в структурированном виде. Это позволяет задавать точные запросы, например: "Какой рейс я забронировал в Париж на вторник?" +Вместо простого сопоставления ключевых слов структурированный RAG может анализировать детали рейса (пункт назначения, дата, время, авиакомпания) из письма и сохранять их в структурированном виде. Это позволяет задавать точные запросы, такие как "Какой рейс я забронировал в Париж во вторник?" ## Реализация и хранение памяти @@ -120,41 +127,53 @@ CO_OP_TRANSLATOR_METADATA: ### Специализированные инструменты памяти -Один из способов хранения и управления памятью агента — использование специализированных инструментов, таких как Mem0. Mem0 работает как слой постоянной памяти, позволяя агентам вспоминать важные взаимодействия, сохранять предпочтения пользователей и фактический контекст, а также учиться на успехах и неудачах со временем. Идея заключается в том, чтобы сделать агентов с состоянием вместо агентов без состояния. +#### Mem0 + +Один из способов хранения и управления памятью агента — использование специализированных инструментов, таких как Mem0. Mem0 работает как слой постоянной памяти, позволяя агентам вспоминать релевантные взаимодействия, сохранять предпочтения пользователей и фактический контекст, а также учиться на успехах и неудачах со временем. Идея заключается в том, чтобы превратить бессостоящих агентов в состоянием. + +Он работает через **двухфазный конвейер памяти: извлечение и обновление**. Сначала сообщения, добавленные в поток агента, отправляются в сервис Mem0, который использует модель LLM для суммирования истории разговоров и извлечения новых воспоминаний. Затем этап обновления, управляемый LLM, определяет, следует ли добавить, изменить или удалить эти воспоминания, сохраняя их в гибридном хранилище данных, которое может включать векторные, графовые и ключ-значение базы данных. Эта система также поддерживает различные типы памяти и может включать графовую память для управления отношениями между сущностями. + +#### Cognee + +Еще один мощный подход — использование **Cognee**, открытого семантического хранилища памяти для AI-агентов, которое преобразует структурированные и неструктурированные данные в графы знаний, поддерживаемые эмбеддингами. Cognee предоставляет **архитектуру двойного хранилища**, объединяющую поиск по векторному сходству с графовыми отношениями, позволяя агентам понимать не только, какая информация схожа, но и как концепции связаны друг с другом. + +Он превосходит в **гибридном поиске**, который сочетает векторное сходство, графовую структуру и рассуждения LLM — от поиска необработанных фрагментов до ответов на вопросы с учетом графа. Система поддерживает **живую память**, которая развивается и растет, оставаясь доступной как единый связанный граф, поддерживая как краткосрочный контекст сеанса, так и долгосрочную постоянную память. -Он работает через **двухфазный процесс памяти: извлечение и обновление**. Сначала сообщения, добавленные в поток агента, отправляются в сервис Mem0, который использует модель LLM для суммирования истории разговора и извлечения новых воспоминаний. Затем этап обновления, управляемый LLM, определяет, следует ли добавить, изменить или удалить эти воспоминания, сохраняя их в гибридном хранилище данных, которое может включать векторные, графовые и ключ-значение базы данных. Эта система также поддерживает различные типы памяти и может включать графовую память для управления отношениями между сущностями. +Учебник Cognee ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) демонстрирует создание этого унифицированного слоя памяти, с практическими примерами поглощения разнообразных источников данных, визуализации графа знаний и выполнения запросов с различными стратегиями поиска, адаптированными к конкретным потребностям агента. ### Хранение памяти с помощью RAG -Помимо специализированных инструментов памяти, таких как Mem0, вы можете использовать мощные поисковые сервисы, такие как **Azure AI Search, как бэкенд для хранения и извлечения воспоминаний**, особенно для структурированного RAG. +Помимо специализированных инструментов памяти, таких как Mem0, вы можете использовать надежные поисковые сервисы, такие как **Azure AI Search, как бэкенд для хранения и извлечения воспоминаний**, особенно для структурированного RAG. -Это позволяет основывать ответы агента на ваших собственных данных, обеспечивая более релевантные и точные ответы. Azure AI Search можно использовать для хранения воспоминаний о путешествиях пользователей, каталогов продуктов или любых других знаний, специфичных для вашей области. +Это позволяет привязывать ответы вашего агента к вашим собственным данным, обеспечивая более релевантные и точные ответы. Azure AI Search можно использовать для хранения воспоминаний о путешествиях пользователей, каталогов продуктов или любых других знаний, специфичных для домена. -Azure AI Search поддерживает возможности, такие как **структурированный RAG**, который превосходно извлекает и извлекает плотную, структурированную информацию из больших наборов данных, таких как история разговоров, письма или даже изображения. Это обеспечивает "сверхчеловеческую точность и полноту" по сравнению с традиционными подходами к разбиению текста и встраиванию. +Azure AI Search поддерживает возможности, такие как **структурированный RAG**, который превосходит в извлечении и поиске плотной, структурированной информации из больших наборов данных, таких как история разговоров, письма или даже изображения. Это обеспечивает "сверхчеловеческую точность и полноту" по сравнению с традиционными подходами к разбиению текста и эмбеддингу. ## Создание самообучающихся AI-агентов -Распространенный подход к созданию самообучающихся агентов включает введение **"агента знаний"**. Этот отдельный агент наблюдает за основным разговором между пользователем и основным агентом. Его роль заключается в следующем: +Обычный шаблон для самообучающихся агентов включает введение **"агента знаний"**. Этот отдельный агент наблюдает за основным разговором между пользователем и основным агентом. Его роль заключается в: -1. **Выявление ценной информации**: Определение, стоит ли сохранить какую-либо часть разговора как общие знания или конкретное предпочтение пользователя. +1. **Определении ценной информации**: Выявлении, стоит ли какая-либо часть разговора сохранения как общих знаний или конкретного предпочтения пользователя. -2. **Извлечение и суммирование**: Выделение ключевых знаний или предпочтений из разговора. +2. **Извлечении и суммировании**: Выделении основной информации или предпочтения из разговора. -3. **Сохранение в базе знаний**: Сохранение извлеченной информации, часто в векторной базе данных, чтобы ее можно было извлечь позже. +3. **Сохранении в базе знаний**: Сохранении извлеченной информации, часто в векторной базе данных, чтобы ее можно было извлечь позже. -4. **Дополнение будущих запросов**: Когда пользователь инициирует новый запрос, агент знаний извлекает соответствующую сохраненную информацию и добавляет ее к запросу пользователя, предоставляя важный контекст основному агенту (аналогично RAG). +4. **Дополнении будущих запросов**: Когда пользователь инициирует новый запрос, агент знаний извлекает релевантную сохраненную информацию и добавляет ее к запросу пользователя, предоставляя важный контекст основному агенту (аналогично RAG). ### Оптимизация памяти -• **Управление задержкой**: Чтобы избежать замедления взаимодействий с пользователем, можно использовать более дешевую и быструю модель для первоначальной проверки, стоит ли сохранять или извлекать информацию, и только при необходимости запускать более сложный процесс извлечения/сохранения. +• **Управление задержкой**: Чтобы избежать замедления взаимодействий с пользователем, можно использовать более дешевую и быструю модель для первоначальной проверки, стоит ли информация сохранения или извлечения, вызывая более сложный процесс только при необходимости. -• **Поддержка базы знаний**: Для растущей базы знаний менее часто используемую информацию можно переместить в "холодное хранилище" для управления затратами. +• **Поддержание базы знаний**: Для растущей базы знаний менее часто используемая информация может быть перемещена в "холодное хранилище" для управления затратами. -## Остались вопросы о памяти агентов? +## Остались вопросы о памяти агента? -Присоединяйтесь к [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord), чтобы встретиться с другими учащимися, посетить офисные часы и получить ответы на свои вопросы о AI-агентах. +Присоединяйтесь к [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord), чтобы встретиться с другими учащимися, посетить часы консультаций и получить ответы на ваши вопросы о AI-агентах. --- + **Отказ от ответственности**: -Этот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода. \ No newline at end of file +Этот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования данного перевода. + \ No newline at end of file diff --git a/translations/sk/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/sk/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..9b47bd6b7 --- /dev/null +++ b/translations/sk/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Vytváranie AI agentov s trvalou pamäťou pomocou Cognee\n", + "\n", + "Tento notebook ukazuje, ako vytvoriť inteligentných AI agentov so sofistikovanými pamäťovými schopnosťami pomocou [**cognee**](https://www.cognee.ai/) - open source AI pamäte, ktorá kombinuje znalostné grafy, sémantické vyhľadávanie a správu relácií na vytváranie kontextovo uvedomelých AI systémov.\n", + "\n", + "## 🎯 Ciele učenia\n", + "\n", + "Na konci tohto tutoriálu budete rozumieť, ako:\n", + "- **Vytvárať znalostné grafy podporované embeddingami**: Transformovať nestruktúrovaný text na štruktúrované, dotazovateľné znalosti\n", + "- **Implementovať pamäť relácií**: Vytvárať viacotáčkové konverzácie s automatickým uchovávaním kontextu\n", + "- **Ukladať konverzácie**: Voliteľne ukladať dôležité interakcie do dlhodobej pamäte na budúce použitie\n", + "- **Dotazovať sa pomocou prirodzeného jazyka**: Pristupovať k historickému kontextu a využívať ho v nových konverzáciách\n", + "- **Vizualizovať pamäť**: Preskúmať vzťahy v znalostnom grafe vášho agenta\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Čo vytvoríte\n", + "\n", + "V tomto návode si vytvoríme **Asistenta pre programovanie** s trvalou pamäťou, ktorý:\n", + "\n", + "### 1. **Vytváranie znalostnej bázy**\n", + " - Získava informácie o profile a odbornosti vývojára\n", + " - Spracováva princípy a osvedčené postupy programovania v Pythone\n", + " - Ukladá historické konverzácie medzi vývojármi a AI asistentmi\n", + "\n", + "### 2. **Konverzácie s vedomím kontextu**\n", + " - Udržiava kontext naprieč viacerými otázkami v rámci jednej relácie\n", + " - Automaticky ukladá každú dvojicu otázka/odpoveď pre efektívne vyhľadávanie\n", + " - Poskytuje súvislé a kontextové odpovede na základe histórie konverzácie\n", + "\n", + "### 3. **Dlhodobá pamäť**\n", + " - Ukladá dôležité konverzácie do dlhodobej pamäte\n", + " - Získava relevantné spomienky zo znalostnej bázy a minulých relácií na obohatenie nových interakcií\n", + " - Buduje rastúcu znalostnú bázu, ktorá sa časom zlepšuje\n", + "\n", + "### 4. **Inteligentné vyhľadávanie v pamäti**\n", + " - Používa grafovo orientované sémantické vyhľadávanie na nájdenie relevantných informácií v celej uloženéj znalosti\n", + " - Filtruje vyhľadávania podľa podskupín údajov (informácie o vývojárovi vs. princípy)\n", + " - Kombinuje viacero zdrojov údajov na poskytovanie komplexných odpovedí\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Predpoklady a nastavenie\n", + "\n", + "### Požiadavky na systém\n", + "\n", + "Pred začiatkom sa uistite, že máte:\n", + "\n", + "1. **Prostredie Python**\n", + " - Python 3.9 alebo novší\n", + " - Virtuálne prostredie (odporúčané)\n", + " \n", + "2. **Redis Cache** (Povinné pre správu relácií)\n", + " - Lokálny Redis: `docker run -d -p 6379:6379 redis`\n", + " - Alebo použite spravovanú službu Redis\n", + " \n", + "3. **Prístup k LLM API**\n", + " - OpenAI API kľúč alebo iní poskytovatelia (pozrite [dokumentáciu](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Konfigurácia databázy**\n", + " - Predvolene nie je potrebná žiadna konfigurácia. Cognee používa databázy založené na súboroch (LanceDB a Kuzu)\n", + " - Voliteľne môžete nastaviť Azure AI Search ako vektorový úložný priestor (pozrite [dokumentáciu](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Konfigurácia prostredia\n", + "\n", + "Vytvorte súbor `.env` vo vašom projektovom adresári s nasledujúcimi premennými:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Pochopenie pamäťovej architektúry Cognee\n", + "\n", + "### Ako funguje Cognee\n", + "\n", + "Cognee poskytuje sofistikovaný pamäťový systém, ktorý presahuje jednoduché ukladanie kľúč-hodnota:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Kľúčové komponenty:\n", + "\n", + "1. **Knowledge Graph**: Ukladá entity, vzťahy a sémantické prepojenia\n", + "2. **Vector Embeddings**: Umožňuje sémantické vyhľadávanie vo všetkých uložených informáciách\n", + "3. **Session Cache**: Udržiava kontext konverzácie v rámci a medzi reláciami\n", + "4. **NodeSets**: Organizujú dáta do logických kategórií pre cielené vyhľadávanie\n", + "\n", + "### Typy pamäte v tomto tutoriáli:\n", + "\n", + "- **Persistent Memory**: Dlhodobé ukladanie v knowledge graph\n", + "- **Session Memory**: Dočasný kontext konverzácie v Redis cache\n", + "- **Semantic Memory**: Vyhľadávanie na základe podobnosti vektorov naprieč všetkými dátami\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Inštalácia potrebných balíkov\n", + "\n", + "Nainštalujte Cognee s podporou Redis pre správu relácií:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Inicializácia prostredia a načítanie knižníc\n", + "\n", + "Uistite sa, že:\n", + "1. Redis je spustený (napr. cez Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Premenné prostredia sú nastavené pred importovaním modulov cache\n", + "3. Ak je to potrebné, reštartujte jadro a spustite bunky v poradí\n", + "\n", + "Nasledujúca bunka:\n", + "1. Načíta premenné prostredia zo súboru `.env`\n", + "2. Nakonfiguruje Cognee s vašimi nastaveniami LLM\n", + "3. Povolenie cache pre správu relácií\n", + "4. Overí, či sú všetky komponenty správne pripojené\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Konfigurácia úložných adresárov\n", + "\n", + "Cognee používa dva samostatné adresáre pre svoje operácie:\n", + "- **Data Root**: Ukladá importované dokumenty a spracované dáta\n", + "- **System Root**: Obsahuje databázu znalostného grafu a systémové metadáta\n", + "\n", + "Pre tento návod vytvoríme izolované adresáre nasledovne:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Obnoviť stav pamäte\n", + "\n", + "Predtým, než začneme budovať náš pamäťový systém, uistime sa, že začíname od začiatku.\n", + "\n", + "> 💡 **Tip**: Tento krok môžete preskočiť, ak chcete zachovať existujúce spomienky z vašich predchádzajúcich spustení, keď budete tento notebook používať neskôr.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Časť 1: Budovanie znalostnej bázy\n", + "\n", + "### Zdroje dát pre nášho asistenta vývojára\n", + "\n", + "Na vytvorenie komplexnej znalostnej bázy použijeme tri typy dát:\n", + "\n", + "1. **Profil vývojára**: Osobná odbornosť a technické zázemie\n", + "2. **Najlepšie praktiky v Pythone**: Zen of Python s praktickými usmerneniami\n", + "3. **Historické konverzácie**: Minulé Q&A relácie medzi vývojármi a AI asistentmi\n", + "\n", + "Táto rôznorodá dátová základňa umožní nášmu agentovi:\n", + "- Pochopiť technický kontext používateľa\n", + "- Uplatňovať najlepšie praktiky v odporúčaniach\n", + "- Učiť sa z predchádzajúcich úspešných interakcií\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Spracovanie údajov do znalostného grafu\n", + "\n", + "Teraz premeníme náš surový text na štruktúrovanú pamäť. Tento proces:\n", + "\n", + "1. **Pridáva údaje do NodeSets**: Organizuje informácie do logických kategórií\n", + " - `developer_data`: Profil vývojára a konverzácie\n", + " - `principles_data`: Najlepšie postupy a usmernenia pre Python\n", + "\n", + "2. **Spúšťa Cognify Pipeline**: Extrahuje entity, vzťahy a vytvára embeddings\n", + " - Identifikuje kľúčové koncepty\n", + " - Vytvára semantické spojenia medzi súvisiacimi informáciami\n", + " - Generuje vektorové embeddings\n", + "\n", + "Tento proces môže chvíľu trvať, kým LLM spracuje text a vytvorí štruktúru grafu:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Vizualizácia znalostného grafu\n", + "\n", + "Preskúmajme štruktúru nášho znalostného grafu. Vizualizácia zobrazuje:\n", + "- **Uzly**: Entity extrahované z textu (koncepty, technológie, osoby)\n", + "- **Hrany**: Vzťahy a spojenia medzi entitami\n", + "- **Klastre**: Súvisiace koncepty zoskupené podľa sémantickej podobnosti\n", + "\n", + "Otvorte vygenerovaný HTML súbor vo svojom prehliadači, aby ste mohli interaktívne preskúmať graf:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Obohaťte pamäť s Memify\n", + "\n", + "Funkcia `memify()` analyzuje graf znalostí a generuje inteligentné pravidlá o údajoch. Tento proces:\n", + "- Identifikuje vzory a osvedčené postupy\n", + "- Vytvára praktické usmernenia na základe obsahu\n", + "- Ustanovuje vzťahy medzi rôznymi oblasťami znalostí\n", + "\n", + "Tieto pravidlá pomáhajú agentovi robiť informovanejšie rozhodnutia pri odpovedaní na otázky. Zachytenie druhej vizualizácie vám umožní porovnať, ako sa graf zahusťuje po obohatení.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Časť 2: Inteligentné vyhľadávanie v pamäti\n", + "\n", + "### Ukážka 1: Integrácia znalostí z viacerých dokumentov\n", + "\n", + "Teraz, keď je náš graf znalostí vytvorený, otestujeme, ako Cognee kombinuje informácie z viacerých zdrojov na zodpovedanie zložitých otázok.\n", + "\n", + "Prvá otázka demonštruje:\n", + "- **Sémantické porozumenie**: Vyhľadávanie relevantných konceptov, aj keď nie sú výslovne spomenuté\n", + "- **Krížové odkazy**: Kombinovanie profilu vývojára s princípmi Pythonu\n", + "- **Kontextové uvažovanie**: Uplatňovanie najlepších postupov na konkrétne implementácie\n", + "\n", + "### Ukážka 2: Filtrované vyhľadávanie pomocou NodeSets\n", + "\n", + "Druhá otázka ukazuje, ako cieliť na konkrétne podmnožiny grafu znalostí:\n", + "- Používa parameter `node_name` na vyhľadávanie iba v rámci `principles_data`\n", + "- Poskytuje zamerané odpovede z konkrétnej oblasti znalostí\n", + "- Užitočné, keď potrebujete informácie špecifické pre danú oblasť\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Časť 3: Nastavenie správy relácií\n", + "\n", + "### Aktivácia pamäte konverzácie\n", + "\n", + "Správa relácií je kľúčová pre udržanie kontextu počas viacerých interakcií. Tu urobíme:\n", + "\n", + "1. **Inicializácia používateľského kontextu**: Vytvorenie alebo načítanie používateľského profilu na sledovanie relácie\n", + "2. **Konfigurácia cache enginu**: Pripojenie k Redis na ukladanie histórie konverzácií\n", + "3. **Aktivácia premenných relácie**: Nastavenie kontextových premenných, ktoré pretrvávajú medzi dotazmi\n", + "\n", + "> ⚠️ **Dôležité**: Vyžaduje, aby Redis bežal a `CACHING=true` bolo nastavené vo vašom prostredí\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Pomocná funkcia: Zobrazenie histórie relácie\n", + "\n", + "Táto pomocná funkcia nám umožňuje prezerať históriu konverzácií uloženú v Redis. Je užitočná na:\n", + "- Ladenie správy relácií\n", + "- Overenie, že konverzácie sú ukladané do vyrovnávacej pamäte\n", + "- Pochopenie, aký kontext je dostupný pre agenta\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Relácia 1: Laboratórium podpory asynchrónneho spracovania — Prvá otázka\n", + "\n", + "Začnite reláciu `async-support-lab` otázkou na vzory asyncio vhodné pre telemetriu pre masívny web scraper. Graf už pozná asyncio, aiohttp a monitorovacie postupy, takže odpoveď by mala odrážať predchádzajúce rozhovory a zároveň prispôsobiť odpoveď novej otázke.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Skontrolujte pamäť relácie 1 po prvej výmene\n", + "\n", + "Spustením `show_history(session_1)` ihneď po úvodnej otázke sa potvrdí, že Cognee zapísal do Redisu aj výzvu, aj odpoveď. Mali by ste vidieť jeden záznam s pokynmi pre súbežnosť.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Relácia 1: Pokračovanie o dátových modeloch\n", + "\n", + "Ďalej sa pýtame: „Kedy by som mal zvoliť dataclasses namiesto Pydantic?“ s použitím rovnakého ID relácie. Cognee by mala spojiť princípy Pythonu spolu s predchádzajúcimi rozhovormi o FastAPI, aby poskytla jemné rady – ukazujúc, že kontext sa prenáša v rámci pomenovanej relácie.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Potvrďte, že história relácie 1 obsahuje oba kroky\n", + "\n", + "Ďalšie volanie `show_history(session_1)` by malo odhaliť dva záznamy otázok a odpovedí. To zodpovedá kroku \"prehrávania pamäte\" v laboratóriu Mem0 a dokazuje, že ďalšie kroky rozširujú ten istý prepis.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Relácia 2: Vlákno kontroly návrhu — Nová relácia\n", + "\n", + "Aby sme ukázali izoláciu medzi vláknami, spustíme `design-review-session` a požiadame o usmernenie pri zaznamenávaní incidentov. Aj keď je základná databáza znalostí rovnaká, nové ID relácie udržiava prepisy oddelené.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Prehľad relácie 2 História\n", + "\n", + "`show_history(session_2)` by mal zobraziť iba dvojicu výzva/odpoveď z dizajnovej recenzie. Porovnajte to s reláciou 1, aby ste zdôraznili, ako Cognee uchováva nezávislé prepisy a zároveň využíva zdieľaný graf znalostí.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Zhrnutie\n", + "\n", + "Gratulujeme! Práve ste svojmu kódovaciemu asistentovi pridali skutočnú dlhodobú pamäťovú vrstvu poháňanú Cognee.\n", + "\n", + "V tomto návode ste vzali surový obsah pre vývojárov (kód, dokumentáciu, rozhovory) a premenili ho na graf + vektorovú pamäť, ktorú váš agent dokáže vyhľadávať, analyzovať a neustále zlepšovať.\n", + "\n", + "Čo ste sa naučili\n", + "\n", + "1. **Od surového textu k AI pamäti**: Ako Cognee spracováva neštruktúrované dáta a premieňa ich na inteligentnú, vyhľadávateľnú pamäť pomocou kombinovanej architektúry vektorov a znalostného grafu.\n", + "\n", + "2. **Obohatenie grafu pomocou memify**: Ako ísť nad rámec základného vytvárania grafov a použiť memify na pridanie odvodených faktov a bohatších vzťahov do vášho existujúceho grafu.\n", + "\n", + "3. **Rôzne stratégie vyhľadávania**: Ako dotazovať pamäť pomocou rôznych typov vyhľadávania (otázky a odpovede s vedomím grafu, dopĺňanie v štýle RAG, prehľady, surové časti, vyhľadávanie kódu atď.) v závislosti od potrieb vášho agenta.\n", + "\n", + "4. **Vizualizácia a prieskum**: Ako kontrolovať a ladiť, čo Cognee vytvoril, pomocou vizualizácií grafov a Cognee UI, aby ste mohli skutočne vidieť, ako je štruktúrované poznanie.\n", + "\n", + "5. **Pamäť s vedomím relácie**: Ako kombinovať kontext konkrétnej relácie s trvalou sémantickou pamäťou, aby si agenti mohli pamätať medzi spusteniami bez úniku informácií medzi používateľmi.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Kľúčové body\n", + "1. Pamäť ako znalostný graf podporovaný embeddingami\n", + "\n", + " - **Štruktúrované porozumenie**: Cognee kombinuje úložisko vektorov a grafov, takže vaše dáta sú nielen vyhľadateľné podľa významu, ale aj prepojené vzťahmi. Cognee používa databázy založené na súboroch ako predvolené (LanceDB pre vektorové, Kuzu pre grafové databázy).\n", + "\n", + " - **Vyhľadávanie s ohľadom na vzťahy**: Odpovede môžu byť založené nielen na „podobnom texte“, ale aj na tom, ako sú entity prepojené.\n", + "\n", + " - **Živá pamäť**: Vrstva pamäte sa vyvíja, rastie a zostáva dotazovateľná ako jeden prepojený graf.\n", + "\n", + "2. Režimy vyhľadávania a uvažovania\n", + " - **Hybridné vyhľadávanie**: Vyhľadávanie kombinuje podobnosť vektorov, štruktúru grafu a uvažovanie LLM, od vyhľadávania surových častí až po odpovede na otázky s ohľadom na graf.\n", + "\n", + " - **Prispôsobenie režimu úlohe**: Používajte režimy v štýle dokončovania, keď chcete odpovede v prirodzenom jazyku, a režimy častí/zhrnutia/grafu, keď váš agent potrebuje surový kontext alebo chce riadiť vlastné uvažovanie.\n", + "\n", + "3. Personalizovaní agenti s vedomím relácie\n", + " - **Kontext relácie + dlhodobá pamäť**: Cognee uchováva krátkodobý kontext „vlákna“ oddelene od dlhodobej pamäte na úrovni používateľa alebo organizácie.\n", + "\n", + "## Reálne aplikácie\n", + "\n", + "1. **Vertikálni AI agenti**\n", + "\n", + " Použite vzor z tohto notebooku na vytvorenie doménovo inteligentných kopilotov, ktorí využívajú Cognee ako jadro pre vyhľadávanie a uvažovanie:\n", + "\n", + "- **Kopiloti pre vývojárov**: Asistenti na kontrolu kódu, analýzu incidentov a architektúru, ktorí prechádzajú kód, API, návrhové dokumenty a tikety ako jeden pamäťový graf.\n", + "\n", + "- **Kopiloti pre zákazníkov**: Podporní alebo úspešní agenti, ktorí čerpajú z produktovej dokumentácie, FAQ, poznámok CRM a minulých tiketov s vyhľadávaním s ohľadom na graf a citovanými odpoveďami.\n", + "\n", + "- **Interní expertní kopiloti**: Asistenti pre politiku, právo alebo bezpečnosť, ktorí uvažujú nad prepojenými pravidlami, smernicami a historickými rozhodnutiami namiesto izolovaných PDF.\n", + "\n", + " Cognee je výslovne navrhnutý ako trvalá, presná pamäť pre AI agentov, poskytujúca živý znalostný graf, ktorý sa integruje za vaším agentom a nahrádza ad-hoc kombinácie úložísk vektorov a vlastného grafového kódu.\n", + "\n", + "2. **Zjednotenie dátových sil do jednej pamäte**\n", + "\n", + " Rovnaký prístup vám tiež pomáha vytvoriť jednotnú pamäťovú vrstvu naprieč rozptýlenými zdrojmi:\n", + "\n", + "- **Zo sil do jedného grafu**: Načítajte štruktúrované (napr. databázy) a neštruktúrované dáta (napr. dokumenty, chaty) do jedného grafu podporovaného embeddingami, namiesto samostatných indexov pre každý systém.\n", + "\n", + "- **Medzi-zdrojové uvažovanie s citáciami**: Spustite viacstupňové uvažovanie nad všetkým—„spojte“ logy, metriky a dokumenty cez graf—a stále vracajte odpovede s overením pôvodu.\n", + "\n", + "- **Centrá znalostí**: Pre oblasti ako bankovníctvo alebo vzdelávanie sa Cognee už používa na zjednotenie PDF, interných systémov a aplikačných dát do jedného znalostného grafu s vektormi, aby agenti mohli odpovedať na otázky s presným, citovaným kontextom.\n", + "\n", + "## Ďalšie kroky\n", + "\n", + "Implementovali ste základný pamäťový cyklus. Tu sú prirodzené rozšírenia, ktoré si môžete vyskúšať sami (pozrite si [dokumentáciu Cognee](https://docs.cognee.ai/) pre podrobnosti):\n", + "\n", + "1. **Experimentujte s časovým povedomím**: Zapnite časové „cognify“, aby ste extrahovali udalosti a časové pečiatky z textu.\n", + "\n", + "2. **Zavedenie uvažovania riadeného ontológiou**: Definujte OWL ontológiu pre vašu oblasť. Použite podporu ontológie Cognee, aby extrahované entity a vzťahy boli ukotvené v tejto schéme, čím sa zlepší kvalita grafu a odpovede špecifické pre danú oblasť.\n", + "\n", + "3. **Pridajte spätnú väzbu**: Nechajte Cognee upravovať váhy hrán grafu na základe skutočnej spätnej väzby používateľov, aby sa vyhľadávanie časom zlepšovalo namiesto toho, aby zostalo statické.\n", + "\n", + "4. **Ladenie pre personalizáciu a správanie relácie**: Používajte ID používateľov, nájomcov a datasety, aby každý človek alebo tím mal svoj vlastný pohľad na zdieľaný pamäťový engine.\n", + "\n", + "5. **Rozšírenie na zložitejších agentov**: Pripojte Cognee k rámcom agentov na vytvorenie multi-agentových systémov, ktoré všetky zdieľajú rovnakú pamäťovú vrstvu. *Microsoft Agent Framework x Cognee plugin čoskoro dostupný.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Upozornenie**: \nTento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho rodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:27:55+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "sk" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/sk/13-agent-memory/README.md b/translations/sk/13-agent-memory/README.md index 838000614..0c9229a4a 100644 --- a/translations/sk/13-agent-memory/README.md +++ b/translations/sk/13-agent-memory/README.md @@ -1,48 +1,56 @@ -# Pamäť pre AI agentov +# Pamäť pre AI agentov [![Pamäť agenta](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.sk.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Pri diskusii o jedinečných výhodách vytvárania AI agentov sa najčastejšie spomínajú dve veci: schopnosť využívať nástroje na dokončenie úloh a schopnosť zlepšovať sa v priebehu času. Pamäť je základom pre vytvorenie samostatne sa zlepšujúceho agenta, ktorý dokáže poskytovať lepšie zážitky pre našich používateľov. +Pri diskusii o jedinečných výhodách vytvárania AI agentov sa najčastejšie spomínajú dve veci: schopnosť využívať nástroje na plnenie úloh a schopnosť zlepšovať sa v priebehu času. Pamäť je základom pre vytváranie samostatne sa zlepšujúcich agentov, ktorí dokážu poskytovať lepšie zážitky pre našich používateľov. -V tejto lekcii sa pozrieme na to, čo je pamäť pre AI agentov, ako ju môžeme spravovať a využívať na zlepšenie našich aplikácií. +V tejto lekcii sa pozrieme na to, čo je pamäť pre AI agentov, ako ju môžeme spravovať a využívať v prospech našich aplikácií. ## Úvod -Táto lekcia pokryje: +Táto lekcia pokrýva: -• **Porozumenie pamäti AI agenta**: Čo je pamäť a prečo je pre agentov nevyhnutná. +• **Pochopenie pamäte AI agenta**: Čo je pamäť a prečo je pre agentov nevyhnutná. -• **Implementácia a ukladanie pamäte**: Praktické metódy na pridanie pamäťových schopností do vašich AI agentov, so zameraním na krátkodobú a dlhodobú pamäť. +• **Implementácia a ukladanie pamäte**: Praktické metódy pridávania pamäťových schopností do vašich AI agentov, so zameraním na krátkodobú a dlhodobú pamäť. • **Vytváranie samostatne sa zlepšujúcich AI agentov**: Ako pamäť umožňuje agentom učiť sa z minulých interakcií a zlepšovať sa v priebehu času. +## Dostupné implementácie + +Táto lekcia obsahuje dva komplexné tutoriály v notebookoch: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Implementuje pamäť pomocou Mem0 a Azure AI Search s rámcom Semantic Kernel. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Implementuje štruktúrovanú pamäť pomocou Cognee, automaticky vytvára znalostný graf podporovaný embeddingmi, vizualizuje graf a umožňuje inteligentné vyhľadávanie. + ## Ciele učenia Po absolvovaní tejto lekcie budete vedieť: -• **Rozlíšiť rôzne typy pamäte AI agenta**, vrátane pracovnej, krátkodobej a dlhodobej pamäte, ako aj špecializovaných foriem, ako sú pamäť osobnosti a epizodická pamäť. +• **Rozlišovať medzi rôznymi typmi pamäte AI agenta**, vrátane pracovnej, krátkodobej a dlhodobej pamäte, ako aj špecializovaných foriem, ako sú pamäť osobnosti a epizodická pamäť. -• **Implementovať a spravovať krátkodobú a dlhodobú pamäť pre AI agentov** pomocou rámca Semantic Kernel, využívať nástroje ako Mem0 a Whiteboard memory a integrovať ich s Azure AI Search. +• **Implementovať a spravovať krátkodobú a dlhodobú pamäť pre AI agentov** pomocou rámca Semantic Kernel, využívajúc nástroje ako Mem0, Cognee, Whiteboard memory a integráciu s Azure AI Search. -• **Porozumieť princípom samostatne sa zlepšujúcich AI agentov** a tomu, ako robustné systémy správy pamäte prispievajú k neustálemu učeniu a adaptácii. +• **Pochopiť princípy samostatne sa zlepšujúcich AI agentov** a ako robustné systémy správy pamäte prispievajú k neustálemu učeniu a adaptácii. -## Porozumenie pamäti AI agenta +## Pochopenie pamäte AI agenta -V jadre **pamäť AI agenta odkazuje na mechanizmy, ktoré mu umožňujú uchovávať a vybavovať si informácie**. Tieto informácie môžu zahŕňať konkrétne detaily o konverzácii, preferencie používateľa, minulé akcie alebo dokonca naučené vzory. +V jadre **pamäť pre AI agentov označuje mechanizmy, ktoré im umožňujú uchovávať a vybavovať si informácie**. Tieto informácie môžu zahŕňať konkrétne detaily o konverzácii, preferencie používateľa, minulé akcie alebo dokonca naučené vzory. Bez pamäte sú AI aplikácie často bezstavové, čo znamená, že každá interakcia začína od nuly. To vedie k opakovanému a frustrujúcemu používateľskému zážitku, kde agent "zabúda" predchádzajúci kontext alebo preferencie. ### Prečo je pamäť dôležitá? -Inteligencia agenta je úzko spojená s jeho schopnosťou vybaviť si a využívať minulé informácie. Pamäť umožňuje agentom byť: +Inteligencia agenta je úzko spojená s jeho schopnosťou vybavovať si a využívať minulé informácie. Pamäť umožňuje agentom byť: • **Reflexívni**: Učiť sa z minulých akcií a výsledkov. @@ -58,13 +66,13 @@ Cieľom implementácie pamäte je urobiť agentov **spoľahlivejšími a schopne #### Pracovná pamäť -Predstavte si ju ako kúsok poznámkového papiera, ktorý agent používa počas jednej prebiehajúcej úlohy alebo myšlienkového procesu. Uchováva okamžité informácie potrebné na výpočet ďalšieho kroku. +Predstavte si ju ako kúsok poznámkového papiera, ktorý agent používa počas jednej úlohy alebo myšlienkového procesu. Uchováva okamžité informácie potrebné na výpočet ďalšieho kroku. -Pre AI agentov pracovná pamäť často zachytáva najrelevantnejšie informácie z konverzácie, aj keď je celá história chatu dlhá alebo skrátená. Zameriava sa na extrahovanie kľúčových prvkov, ako sú požiadavky, návrhy, rozhodnutia a akcie. +Pre AI agentov pracovná pamäť často zachytáva najrelevantnejšie informácie z konverzácie, aj keď je celá história chatu dlhá alebo skrátená. Zameriava sa na extrakciu kľúčových prvkov, ako sú požiadavky, návrhy, rozhodnutia a akcie. **Príklad pracovnej pamäte** -V prípade agenta na rezerváciu cestovania môže pracovná pamäť zachytiť aktuálnu požiadavku používateľa, napríklad "Chcem si rezervovať výlet do Paríža". Táto konkrétna požiadavka je držaná v bezprostrednom kontexte agenta na vedenie aktuálnej interakcie. +V prípade agenta na rezerváciu ciest by pracovná pamäť mohla zachytiť aktuálnu požiadavku používateľa, napríklad "Chcem si rezervovať výlet do Paríža". Táto konkrétna požiadavka je držaná v bezprostrednom kontexte agenta na vedenie aktuálnej interakcie. #### Krátkodobá pamäť @@ -72,83 +80,93 @@ Tento typ pamäte uchováva informácie počas jednej konverzácie alebo reláci **Príklad krátkodobej pamäte** -Ak sa používateľ opýta: "Koľko by stál let do Paríža?" a potom pokračuje: "A čo ubytovanie tam?", krátkodobá pamäť zabezpečí, že agent vie, že "tam" odkazuje na "Paríž" v rámci tej istej konverzácie. +Ak sa používateľ opýta: "Koľko by stál let do Paríža?" a potom pokračuje: "A čo ubytovanie tam?", krátkodobá pamäť zabezpečí, že agent vie, že "tam" sa vzťahuje na "Paríž" v rámci tej istej konverzácie. #### Dlhodobá pamäť -Toto sú informácie, ktoré pretrvávajú naprieč viacerými konverzáciami alebo reláciami. Umožňuje agentom pamätať si preferencie používateľa, historické interakcie alebo všeobecné znalosti počas dlhších období. To je dôležité pre personalizáciu. +Toto sú informácie, ktoré pretrvávajú naprieč viacerými konverzáciami alebo reláciami. Umožňuje agentom pamätať si preferencie používateľov, historické interakcie alebo všeobecné znalosti počas dlhších období. To je dôležité pre personalizáciu. **Príklad dlhodobej pamäte** -Dlhodobá pamäť môže uchovávať informácie ako "Ben má rád lyžovanie a outdoorové aktivity, obľubuje kávu s výhľadom na hory a chce sa vyhnúť pokročilým lyžiarskym svahom kvôli minulému zraneniu". Tieto informácie, naučené z predchádzajúcich interakcií, ovplyvňujú odporúčania v budúcich plánovacích reláciách, čím sú vysoko personalizované. +Dlhodobá pamäť by mohla uchovávať, že "Ben má rád lyžovanie a outdoorové aktivity, obľubuje kávu s výhľadom na hory a chce sa vyhnúť pokročilým lyžiarskym svahom kvôli minulému zraneniu". Tieto informácie, naučené z predchádzajúcich interakcií, ovplyvňujú odporúčania v budúcich plánovacích reláciách, čím sú vysoko personalizované. #### Pamäť osobnosti -Tento špecializovaný typ pamäte pomáha agentovi rozvíjať konzistentnú "osobnosť" alebo "personu". Umožňuje agentovi pamätať si detaily o sebe alebo svojej zamýšľanej úlohe, čím sú interakcie plynulejšie a zameranejšie. +Tento špecializovaný typ pamäte pomáha agentovi vyvinúť konzistentnú "osobnosť" alebo "personu". Umožňuje agentovi pamätať si detaily o sebe alebo o svojej zamýšľanej úlohe, čím sú interakcie plynulejšie a zameranejšie. **Príklad pamäte osobnosti** -Ak je cestovný agent navrhnutý ako "expert na plánovanie lyžovačiek", pamäť osobnosti môže posilniť túto úlohu, ovplyvňujúc jeho odpovede tak, aby zodpovedali tónu a znalostiam experta. +Ak je agent na plánovanie ciest navrhnutý ako "expert na lyžovanie", pamäť osobnosti by mohla posilniť túto úlohu, ovplyvňujúc jeho odpovede tak, aby zodpovedali tónu a znalostiam experta. -#### Pamäť pracovného toku/epizodická pamäť +#### Pamäť pracovného postupu/epizodická pamäť -Táto pamäť uchováva sekvenciu krokov, ktoré agent vykonáva počas komplexnej úlohy, vrátane úspechov a neúspechov. Je to ako pamätať si konkrétne "epizódy" alebo minulé skúsenosti na učenie sa z nich. +Táto pamäť uchováva sekvenciu krokov, ktoré agent vykonáva počas zložitej úlohy, vrátane úspechov a neúspechov. Je to ako pamätať si konkrétne "epizódy" alebo minulé skúsenosti, aby sa z nich dalo učiť. **Príklad epizodickej pamäte** -Ak sa agent pokúsil rezervovať konkrétny let, ale neúspešne kvôli nedostupnosti, epizodická pamäť môže zaznamenať tento neúspech, čo umožní agentovi skúsiť alternatívne lety alebo informovať používateľa o probléme informovanejším spôsobom pri ďalšom pokuse. +Ak sa agent pokúsil rezervovať konkrétny let, ale neúspešne kvôli nedostupnosti, epizodická pamäť by mohla zaznamenať tento neúspech, čo by agentovi umožnilo skúsiť alternatívne lety alebo informovať používateľa o probléme informovanejším spôsobom pri ďalšom pokuse. #### Pamäť entít -Táto pamäť zahŕňa extrahovanie a zapamätanie si konkrétnych entít (ako sú osoby, miesta alebo veci) a udalostí z konverzácií. Umožňuje agentovi vytvoriť štruktúrované pochopenie kľúčových prvkov, o ktorých sa diskutovalo. +Táto pamäť zahŕňa extrakciu a zapamätanie si konkrétnych entít (ako sú osoby, miesta alebo veci) a udalostí z konverzácií. Umožňuje agentovi vytvoriť štruktúrované pochopenie kľúčových prvkov, o ktorých sa diskutovalo. **Príklad pamäte entít** -Z konverzácie o minulom výlete môže agent extrahovať "Paríž", "Eiffelova veža" a "večera v reštaurácii Le Chat Noir" ako entity. Pri budúcej interakcii by si agent mohol spomenúť na "Le Chat Noir" a ponúknuť rezerváciu tam. +Z konverzácie o minulom výlete by agent mohol extrahovať "Paríž", "Eiffelova veža" a "večera v reštaurácii Le Chat Noir" ako entity. Pri budúcej interakcii by si agent mohol spomenúť na "Le Chat Noir" a ponúknuť rezerváciu tam. #### Štruktúrovaný RAG (Retrieval Augmented Generation) -Aj keď je RAG širšou technikou, "Štruktúrovaný RAG" je zdôraznený ako výkonná pamäťová technológia. Extrahuje husté, štruktúrované informácie z rôznych zdrojov (konverzácie, e-maily, obrázky) a používa ich na zlepšenie presnosti, vybavenia a rýchlosti odpovedí. Na rozdiel od klasického RAG, ktorý sa spolieha výlučne na sémantickú podobnosť, Štruktúrovaný RAG pracuje so vnútornou štruktúrou informácií. +Aj keď je RAG širšou technikou, "štruktúrovaný RAG" je zdôraznený ako výkonná pamäťová technológia. Extrahuje husté, štruktúrované informácie z rôznych zdrojov (konverzácie, e-maily, obrázky) a používa ich na zvýšenie presnosti, vybavenia a rýchlosti odpovedí. Na rozdiel od klasického RAG, ktorý sa spolieha výlučne na sémantickú podobnosť, štruktúrovaný RAG pracuje so samotnou štruktúrou informácií. **Príklad štruktúrovaného RAG** -Namiesto jednoduchého porovnávania kľúčových slov by Štruktúrovaný RAG mohol analyzovať detaily letu (destinácia, dátum, čas, letecká spoločnosť) z e-mailu a uložiť ich štruktúrovaným spôsobom. To umožňuje presné dotazy, ako napríklad "Aký let som si rezervoval do Paríža na utorok?" +Namiesto jednoduchého porovnávania kľúčových slov by štruktúrovaný RAG mohol analyzovať detaily letu (destinácia, dátum, čas, letecká spoločnosť) z e-mailu a uložiť ich štruktúrovaným spôsobom. To umožňuje presné dotazy, ako napríklad "Aký let som si rezervoval do Paríža na utorok?" ## Implementácia a ukladanie pamäte -Implementácia pamäte pre AI agentov zahŕňa systematický proces **správy pamäte**, ktorý zahŕňa generovanie, ukladanie, vyhľadávanie, integráciu, aktualizáciu a dokonca "zabúdanie" (alebo mazanie) informácií. Vyhľadávanie je obzvlášť dôležitý aspekt. +Implementácia pamäte pre AI agentov zahŕňa systematický proces **správy pamäte**, ktorý zahŕňa generovanie, ukladanie, vyhľadávanie, integráciu, aktualizáciu a dokonca aj "zabúdanie" (alebo mazanie) informácií. Vyhľadávanie je obzvlášť kľúčovým aspektom. + +### Špecializované nástroje na pamäť + +#### Mem0 + +Jedným zo spôsobov, ako ukladať a spravovať pamäť agenta, je použitie špecializovaných nástrojov, ako je Mem0. Mem0 funguje ako vrstva pretrvávajúcej pamäte, ktorá umožňuje agentom vybaviť si relevantné interakcie, ukladať preferencie používateľov a faktický kontext a učiť sa z úspechov a neúspechov v priebehu času. Myšlienka je, že bezstavoví agenti sa menia na stavových. + +Funguje prostredníctvom **dvojfázového pamäťového potrubia: extrakcia a aktualizácia**. Najprv sa správy pridané do vlákna agenta odosielajú do služby Mem0, ktorá používa veľký jazykový model (LLM) na zhrnutie histórie konverzácie a extrakciu nových spomienok. Následne fáza aktualizácie riadená LLM určuje, či tieto spomienky pridať, upraviť alebo vymazať, pričom ich ukladá do hybridného úložiska dát, ktoré môže zahŕňať vektorové, grafové a kľúčovo-hodnotové databázy. Tento systém tiež podporuje rôzne typy pamäte a môže zahŕňať grafovú pamäť na správu vzťahov medzi entitami. + +#### Cognee -### Špecializované nástroje pamäte +Ďalším výkonným prístupom je použitie **Cognee**, open-source sémantickej pamäte pre AI agentov, ktorá transformuje štruktúrované a neštruktúrované dáta na dotazovateľné znalostné grafy podporované embeddingmi. Cognee poskytuje **dvojité úložisko** kombinujúce vektorové vyhľadávanie podobnosti s grafovými vzťahmi, čo umožňuje agentom pochopiť nielen to, aké informácie sú podobné, ale aj ako sa koncepty navzájom vzťahujú. -Jedným zo spôsobov, ako ukladať a spravovať pamäť agenta, je použitie špecializovaných nástrojov, ako je Mem0. Mem0 funguje ako vrstva trvalej pamäte, ktorá umožňuje agentom vybaviť si relevantné interakcie, ukladať preferencie používateľa a faktický kontext a učiť sa z úspechov a neúspechov v priebehu času. Myšlienka je, že bezstavové agenti sa menia na stavové. +Vyniká v **hybridnom vyhľadávaní**, ktoré kombinuje vektorovú podobnosť, štruktúru grafu a LLM uvažovanie - od vyhľadávania surových častí až po odpovedanie na otázky s vedomím grafu. Systém udržiava **živú pamäť**, ktorá sa vyvíja a rastie, pričom zostáva dotazovateľná ako jeden prepojený graf, podporujúc krátkodobý kontext relácie aj dlhodobú pretrvávajúcu pamäť. -Funguje prostredníctvom **dvojfázového pamäťového procesu: extrakcia a aktualizácia**. Najprv sa správy pridané do vlákna agenta posielajú do služby Mem0, ktorá používa veľký jazykový model (LLM) na zhrnutie histórie konverzácie a extrakciu nových pamätí. Následne fáza aktualizácie riadená LLM určuje, či tieto pamäte pridať, upraviť alebo vymazať, pričom ich ukladá do hybridného dátového úložiska, ktoré môže zahŕňať vektorové, grafové a kľúčovo-hodnotové databázy. Tento systém tiež podporuje rôzne typy pamäte a môže zahŕňať grafovú pamäť na správu vzťahov medzi entitami. +Tutoriál v notebooku Cognee ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) demonštruje budovanie tejto unifikovanej pamäťovej vrstvy s praktickými príkladmi spracovania rôznych zdrojov dát, vizualizácie znalostného grafu a dotazovania s rôznymi stratégiami vyhľadávania prispôsobenými konkrétnym potrebám agenta. ### Ukladanie pamäte pomocou RAG -Okrem špecializovaných nástrojov pamäte, ako je Mem0, môžete využiť robustné vyhľadávacie služby, ako je **Azure AI Search ako backend na ukladanie a vyhľadávanie pamätí**, najmä pre štruktúrovaný RAG. +Okrem špecializovaných nástrojov na pamäť, ako je Mem0, môžete využiť robustné vyhľadávacie služby, ako je **Azure AI Search ako backend na ukladanie a vyhľadávanie spomienok**, najmä pre štruktúrovaný RAG. -To umožňuje zakotviť odpovede agenta vo vašich vlastných údajoch, čím sa zabezpečia relevantnejšie a presnejšie odpovede. Azure AI Search môže byť použitý na ukladanie používateľských cestovných pamätí, katalógov produktov alebo akýchkoľvek iných znalostí špecifických pre danú oblasť. +To umožňuje zakotviť odpovede vášho agenta vo vašich vlastných dátach, čím sa zabezpečia relevantnejšie a presnejšie odpovede. Azure AI Search môže byť použitý na ukladanie používateľských spomienok na cestovanie, katalógov produktov alebo akýchkoľvek iných znalostí špecifických pre danú oblasť. -Azure AI Search podporuje funkcie ako **Štruktúrovaný RAG**, ktorý vyniká pri extrakcii a vyhľadávaní hustých, štruktúrovaných informácií z veľkých datasetov, ako sú histórie konverzácií, e-maily alebo dokonca obrázky. To poskytuje "nadľudskú presnosť a vybavenie" v porovnaní s tradičnými prístupmi k textovému rozdeleniu a vkladaniu. +Azure AI Search podporuje funkcie ako **štruktúrovaný RAG**, ktorý vyniká v extrakcii a vyhľadávaní hustých, štruktúrovaných informácií z veľkých datasetov, ako sú histórie konverzácií, e-maily alebo dokonca obrázky. To poskytuje "nadľudskú presnosť a vybavenie" v porovnaní s tradičnými prístupmi k textovému rozdeľovaniu a embeddingom. ## Vytváranie samostatne sa zlepšujúcich AI agentov -Bežný vzor pre samostatne sa zlepšujúcich agentov zahŕňa zavedenie **"agenta znalostí"**. Tento samostatný agent pozoruje hlavnú konverzáciu medzi používateľom a primárnym agentom. Jeho úlohou je: +Bežný vzor pre samostatne sa zlepšujúcich agentov zahŕňa zavedenie **"znalostného agenta"**. Tento samostatný agent pozoruje hlavnú konverzáciu medzi používateľom a primárnym agentom. Jeho úlohou je: -1. **Identifikovať hodnotné informácie**: Určiť, či je niektorá časť konverzácie hodná uloženia ako všeobecné znalosti alebo konkrétna preferencia používateľa. +1. **Identifikovať hodnotné informácie**: Určiť, či je nejaká časť konverzácie hodná uloženia ako všeobecná znalosť alebo konkrétna preferencia používateľa. 2. **Extrahovať a zhrnúť**: Destilovať podstatné učenie alebo preferenciu z konverzácie. -3. **Uložiť do znalostnej databázy**: Uchovať tieto extrahované informácie, často vo vektorovej databáze, aby ich bolo možné neskôr vyhľadať. +3. **Uložiť do znalostnej bázy**: Uložiť tieto extrahované informácie, často do vektorovej databázy, aby ich bolo možné neskôr vyhľadať. -4. **Rozšíriť budúce dotazy**: Keď používateľ iniciuje nový dotaz, agent znalostí vyhľadá relevantné uložené informácie a pridá ich do používateľského promptu, čím poskytne dôležitý kontext primárnemu agentovi (podobne ako RAG). +4. **Doplniť budúce dotazy**: Keď používateľ iniciuje nový dotaz, znalostný agent vyhľadá relevantné uložené informácie a pridá ich k používateľovej výzve, čím poskytne kľúčový kontext primárnemu agentovi (podobne ako RAG). ### Optimalizácie pre pamäť -• **Správa latencie**: Aby sa zabránilo spomaleniu interakcií používateľa, môže sa najskôr použiť lacnejší a rýchlejší model na rýchle overenie, či je informácia hodná uloženia alebo vyhľadania, pričom komplexnejší proces extrakcie/vyhľadávania sa spustí iba v prípade potreby. +• **Správa latencie**: Aby sa predišlo spomaleniu interakcií používateľa, môže sa najprv použiť lacnejší a rýchlejší model na rýchle overenie, či je informácia hodná uloženia alebo vyhľadania, pričom zložitejší proces extrakcie/vyhľadávania sa spustí len v prípade potreby. -• **Údržba znalostnej databázy**: Pre rastúcu znalostnú databázu môžu byť menej často používané informácie presunuté do "studeného úložiska" na správu nákladov. +• **Údržba znalostnej bázy**: Pre rastúcu znalostnú bázu môžu byť menej často používané informácie presunuté do "studeného úložiska" na správu nákladov. ## Máte ďalšie otázky o pamäti agenta? @@ -156,5 +174,7 @@ Pripojte sa k [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord), kde --- -**Upozornenie**: -Tento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Hoci sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho rodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nenesieme zodpovednosť za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. \ No newline at end of file + +**Zrieknutie sa zodpovednosti**: +Tento dokument bol preložený pomocou služby AI prekladu [Co-op Translator](https://github.com/Azure/co-op-translator). Aj keď sa snažíme o presnosť, prosím, berte na vedomie, že automatizované preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho rodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre kritické informácie sa odporúča profesionálny ľudský preklad. Nie sme zodpovední za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu. + \ No newline at end of file diff --git a/translations/sl/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/sl/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..bea2e42c7 --- /dev/null +++ b/translations/sl/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Gradnja AI agentov s trajnim spominom z uporabo Cognee\n", + "\n", + "Ta zvezek prikazuje, kako zgraditi inteligentne AI agente z naprednimi zmogljivostmi spomina z uporabo [**cognee**](https://www.cognee.ai/) - odprtokodnega AI spomina, ki združuje grafične baze znanja, semantično iskanje in upravljanje sej za ustvarjanje kontekstno zavednih AI sistemov.\n", + "\n", + "## 🎯 Cilji učenja\n", + "\n", + "Do konca tega vodiča boste razumeli, kako:\n", + "- **Zgraditi grafične baze znanja podprte z vdelavami**: Pretvoriti nestrukturirano besedilo v strukturirano, poizvedljivo znanje\n", + "- **Implementirati spomin sej**: Ustvariti večkratne pogovore z avtomatskim ohranjanjem konteksta\n", + "- **Shranjevati pogovore**: Po potrebi shraniti pomembne interakcije v dolgoročni spomin za prihodnjo uporabo\n", + "- **Poizvedovati z uporabo naravnega jezika**: Dostopati do zgodovinskega konteksta in ga uporabiti v novih pogovorih\n", + "- **Vizualizirati spomin**: Raziskovati odnose v grafični bazi znanja vašega agenta\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Kaj boste ustvarili\n", + "\n", + "V tem vodiču bomo ustvarili **Pomočnika za programiranje** s trajnim spominom, ki:\n", + "\n", + "### 1. **Izgradnja baze znanja**\n", + " - Vključuje informacije o profilu in strokovnem znanju razvijalca\n", + " - Obdeluje principe in najboljše prakse programiranja v Pythonu\n", + " - Shranjuje zgodovinske pogovore med razvijalci in AI pomočniki\n", + "\n", + "### 2. **Pogovori z zavedanjem seje**\n", + " - Ohranja kontekst med več vprašanji v isti seji\n", + " - Samodejno shranjuje vsak par vprašanje/odgovor za učinkovito iskanje\n", + " - Ponuja skladne in kontekstualne odgovore na podlagi zgodovine pogovora\n", + "\n", + "### 3. **Dolgoročni spomin**\n", + " - Shranjuje pomembne pogovore v dolgoročni spomin\n", + " - Pridobiva ustrezne spomine iz baze znanja in preteklih sej za obveščanje novih interakcij\n", + " - Gradi rastočo bazo znanja, ki se sčasoma izboljšuje\n", + "\n", + "### 4. **Inteligentno pridobivanje spomina**\n", + " - Uporablja semantično iskanje, ki temelji na grafih, za iskanje ustreznih informacij v celotni shranjeni bazi znanja\n", + " - Filtrira iskanja po podskupinah podatkov (informacije o razvijalcu proti principom)\n", + " - Združuje več virov podatkov za zagotavljanje celovitih odgovorov\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Predpogoji in nastavitev\n", + "\n", + "### Sistemskie zahteve\n", + "\n", + "Pred začetkom se prepričajte, da imate:\n", + "\n", + "1. **Python okolje**\n", + " - Python 3.9 ali novejši\n", + " - Virtualno okolje (priporočeno)\n", + " \n", + "2. **Redis predpomnilnik** (zahtevan za upravljanje sej)\n", + " - Lokalni Redis: `docker run -d -p 6379:6379 redis`\n", + " - Ali uporabite upravljano storitev Redis\n", + " \n", + "3. **Dostop do LLM API**\n", + " - OpenAI API ključ ali drugi ponudniki (glejte [dokumentacijo](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Konfiguracija baze podatkov**\n", + " - Privzeto ni potrebna konfiguracija. Cognee uporablja baze podatkov na osnovi datotek (LanceDB in Kuzu)\n", + " - Po želji lahko nastavite Azure AI Search kot vektorsko shrambo (glejte [dokumentacijo](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Konfiguracija okolja\n", + "\n", + "Ustvarite datoteko `.env` v svojem projektni mapi z naslednjimi spremenljivkami:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Razumevanje arhitekture spomina Cognee\n", + "\n", + "### Kako deluje Cognee\n", + "\n", + "Cognee ponuja napreden sistem spomina, ki presega preprosto shranjevanje ključ-vrednost:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Ključne komponente:\n", + "\n", + "1. **Graf znanja**: Shranjuje entitete, odnose in semantične povezave\n", + "2. **Vektorske vdelave**: Omogočajo semantično iskanje po vseh shranjenih informacijah\n", + "3. **Predpomnilnik seje**: Ohranja kontekst pogovora znotraj in med sejami\n", + "4. **NodeSets**: Organizirajo podatke v logične kategorije za ciljno pridobivanje\n", + "\n", + "### Vrste spomina v tem vodiču:\n", + "\n", + "- **Trajni spomin**: Dolgoročno shranjevanje v grafu znanja\n", + "- **Sejni spomin**: Začasni kontekst pogovora v predpomnilniku Redis\n", + "- **Semantični spomin**: Iskanje podobnosti na osnovi vektorjev po vseh podatkih\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Namestitev potrebnih paketov\n", + "\n", + "Namestite Cognee z Redis podporo za upravljanje sej:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Inicializirajte okolje in naložite knjižnice\n", + "\n", + "Prepričajte se, da:\n", + "1. Redis deluje (npr. prek Dockerja: `docker run -d -p 6379:6379 redis`)\n", + "2. So okoljske spremenljivke nastavljene pred uvozom modulov za predpomnjenje\n", + "3. Po potrebi ponovno zaženite jedro in zaženite celice po vrsti\n", + "\n", + "Naslednja celica bo:\n", + "1. Naložila okoljske spremenljivke iz `.env`\n", + "2. Konfigurirala Cognee z vašimi nastavitvami LLM\n", + "3. Omogočila predpomnjenje za upravljanje sej\n", + "4. Preverila, ali so vsi komponenti pravilno povezani\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Konfiguracija shranjevalnih imenikov\n", + "\n", + "Cognee uporablja dva ločena imenika za svoje delovanje:\n", + "- **Koren podatkov**: Shrani uvožene dokumente in obdelane podatke\n", + "- **Koren sistema**: Vsebuje podatkovno bazo grafa znanja in sistemske metapodatke\n", + "\n", + "Za ta vodič bomo ustvarili ločene imenike, kot sledi:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Ponastavi stanje pomnilnika\n", + "\n", + "Preden začnemo graditi naš pomnilniški sistem, poskrbimo, da začnemo na novo.\n", + "\n", + "> 💡 **Namig**: Ta korak lahko preskočite, če želite ohraniti obstoječe spomine iz prejšnjih zagonov, ko boste ta zvezek uporabili kasneje.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 1. del: Gradnja baze znanja\n", + "\n", + "### Viri podatkov za našega asistenta za razvijalce\n", + "\n", + "Za ustvarjanje celovite baze znanja bomo uporabili tri vrste podatkov:\n", + "\n", + "1. **Profil razvijalca**: Osebna strokovna znanja in tehnično ozadje\n", + "2. **Najboljše prakse za Python**: Zen Pythona s praktičnimi smernicami\n", + "3. **Zgodovinski pogovori**: Pretekle Q&A seje med razvijalci in AI asistenti\n", + "\n", + "Ta raznolika podatkovna zbirka omogoča našemu agentu:\n", + "- Razumevanje tehničnega konteksta uporabnika\n", + "- Uporabo najboljših praks pri priporočilih\n", + "- Učenje iz prejšnjih uspešnih interakcij\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Pretvorba podatkov v graf znanja\n", + "\n", + "Zdaj bomo surovo besedilo pretvorili v strukturiran spomin. Ta proces:\n", + "\n", + "1. **Dodaja podatke v NodeSets**: Organiziranje informacij v logične kategorije\n", + " - `developer_data`: Profil razvijalca in pogovori\n", + " - `principles_data`: Najboljše prakse in smernice za Python\n", + "\n", + "2. **Izvaja Cognify Pipeline**: Izvleče entitete, odnose in ustvari vektorske predstavitve\n", + " - Prepozna ključne koncepte\n", + " - Ustvari semantične povezave med povezanimi informacijami\n", + " - Generira vektorske predstavitve\n", + "\n", + "To lahko traja nekaj trenutkov, saj LLM obdeluje besedilo in gradi strukturo grafa:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Vizualizirajte graf znanja\n", + "\n", + "Raziskujmo strukturo našega grafa znanja. Vizualizacija prikazuje:\n", + "- **Vozlišča**: Entitete, pridobljene iz besedila (koncepti, tehnologije, osebe)\n", + "- **Povezave**: Odnosi in povezave med entitetami\n", + "- **Grozdovje**: Povezani koncepti, združeni glede na semantično podobnost\n", + "\n", + "Odprite ustvarjeno HTML datoteko v svojem brskalniku za interaktivno raziskovanje grafa:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Obogatite spomin z Memify\n", + "\n", + "Funkcija `memify()` analizira graf znanja in ustvarja inteligentna pravila o podatkih. Ta proces:\n", + "- Prepoznava vzorce in najboljše prakse\n", + "- Ustvarja izvedljive smernice na podlagi vsebine\n", + "- Vzpostavlja povezave med različnimi področji znanja\n", + "\n", + "Ta pravila agentu pomagajo pri sprejemanju bolj informiranih odločitev pri odgovarjanju na vprašanja. Zajem druge vizualizacije vam omogoča primerjavo, kako se graf zgosti, ko je obogaten.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 2. del: Inteligentno iskanje informacij\n", + "\n", + "### Demonstracija 1: Integracija znanja med dokumenti\n", + "\n", + "Zdaj, ko je naš graf znanja zgrajen, preverimo, kako Cognee združuje informacije iz več virov za odgovore na kompleksna vprašanja.\n", + "\n", + "Prva poizvedba prikazuje:\n", + "- **Semantično razumevanje**: Iskanje relevantnih konceptov, tudi če niso izrecno omenjeni\n", + "- **Križno sklicevanje**: Združevanje profila razvijalca z načeli Python-a\n", + "- **Kontekstualno sklepanje**: Uporaba najboljših praks za specifične implementacije\n", + "\n", + "### Demonstracija 2: Filtrirano iskanje z NodeSets\n", + "\n", + "Druga poizvedba prikazuje, kako ciljati specifične podsklope grafa znanja:\n", + "- Uporablja parameter `node_name` za iskanje samo znotraj `principles_data`\n", + "- Ponuja osredotočene odgovore iz specifičnega področja znanja\n", + "- Koristno, kadar potrebujete informacije iz določenega področja\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 3. del: Nastavitev upravljanja sej\n", + "\n", + "### Omogočanje pomnjenja pogovorov\n", + "\n", + "Upravljanje sej je ključno za ohranjanje konteksta skozi več interakcij. Tukaj bomo:\n", + "\n", + "1. **Inicializirali uporabniški kontekst**: Ustvarili ali pridobili uporabniški profil za sledenje sej\n", + "2. **Konfigurirali predpomnilniški mehanizem**: Povezali se z Redis za shranjevanje zgodovine pogovorov\n", + "3. **Omogočili spremenljivke seje**: Nastavili kontekstne spremenljivke, ki se ohranijo med poizvedbami\n", + "\n", + "> ⚠️ **Pomembno**: To zahteva, da Redis deluje in da je `CACHING=true` nastavljeno v vašem okolju\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Pomožna funkcija: Ogled zgodovine seje\n", + "\n", + "Ta pripomoček nam omogoča pregled zgodovine pogovorov, shranjenih v Redis. Uporaben je za:\n", + "- Odpravljanje napak pri upravljanju sej\n", + "- Preverjanje, ali se pogovori shranjujejo v predpomnilnik\n", + "- Razumevanje, kateri kontekst je na voljo agentu\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Seja 1: Laboratorij za podporo asinhronosti — Prvo vprašanje\n", + "\n", + "Začnite sejo `async-support-lab` z vprašanjem o vzorcih asyncio, ki so prijazni do telemetrije, za obsežen spletni strgalnik. Graf že pozna asyncio, aiohttp in prakse spremljanja, zato naj odgovor odraža prejšnje pogovore, hkrati pa prilagodi odgovor na novo vprašanje.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Pregled pomnilnika seje 1 po prvem pogovoru\n", + "\n", + "Zagon `show_history(session_1)` takoj po začetnem vprašanju potrjuje, da je Cognee shranil tako poziv kot odgovor v Redis. Videti bi morali en vnos z navodili za sočasnost.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Seja 1: Nadaljevanje o podatkovnih modelih\n", + "\n", + "Naslednje vprašanje je: \"Kdaj naj izberem dataclasses namesto Pydantic?\" z uporabo istega ID-ja seje. Cognee naj združi Python načela in prejšnje pogovore o FastAPI, da poda podrobne nasvete—s čimer pokaže, da se kontekst prenese znotraj poimenovane seje.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Potrdite, da zgodovina seje 1 vsebuje oba obrata\n", + "\n", + "Še en klic `show_history(session_1)` bi moral razkriti dva vnosa vprašanj in odgovorov. To ustreza koraku \"ponovnega predvajanja spomina\" v laboratoriju Mem0 in dokazuje, da dodatni obrati podaljšajo isti prepis.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Seja 2: Nit pregleda oblikovanja — Nova seja\n", + "\n", + "Za prikaz izolacije med nitmi zaženemo `design-review-session` in prosimo za smernice beleženja za preglede incidentov. Čeprav je osnovna baza znanja enaka, nova ID seje ohranja prepise ločene.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Pregled seje 2 zgodovina\n", + "\n", + "`show_history(session_2)` naj bi prikazal samo par poziv/odgovor za pregled zasnove. Primerjajte ga s sejo 1, da poudarite, kako Cognee ohranja neodvisne prepise, medtem ko ponovno uporablja skupni graf znanja.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Povzetek\n", + "\n", + "Čestitke! Pravkar ste svojemu programerskemu asistentu dodali pravo dolgoročno plast spomina, ki jo poganja Cognee.\n", + "\n", + "V tem vodiču ste vzeli surove vsebine za razvijalce (kodo, dokumentacijo, pogovore) in jih spremenili v graf + vektorski spomin, ki ga vaš agent lahko išče, uporablja za razmišljanje in nenehno izboljšuje.\n", + "\n", + "Kaj ste se naučili:\n", + "\n", + "1. **Od surovega besedila do AI spomina**: Kako Cognee obdeluje nestrukturirane podatke in jih spremeni v inteligenten, iskalni spomin z uporabo kombinirane arhitekture vektorjev + grafa znanja.\n", + "\n", + "2. **Obogatitev grafa z memify**: Kako preseči osnovno ustvarjanje grafa in uporabiti memify za dodajanje izpeljanih dejstev ter bogatejših povezav na obstoječi graf.\n", + "\n", + "3. **Različne strategije iskanja**: Kako poizvedovati v spominu z različnimi vrstami iskanja (Q&A, ki upošteva graf, dopolnjevanje v slogu RAG, vpogledi, surovi odlomki, iskanje kode itd.), odvisno od potreb vašega agenta.\n", + "\n", + "4. **Vizualno raziskovanje**: Kako pregledati in odpravljati napake v tem, kar je Cognee ustvaril, z uporabo vizualizacij grafa in Cognee UI, da dejansko vidite, kako je znanje strukturirano.\n", + "\n", + "5. **Spomin, ki upošteva seje**: Kako združiti kontekst posamezne seje s trajnim semantičnim spominom, da si agenti lahko zapomnijo med izvajanji, ne da bi pri tem prišlo do uhajanja informacij med uporabniki.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Ključne točke\n", + "1. Spomin kot graf znanja, podprt z vektorji\n", + "\n", + " - **Strukturirano razumevanje**: Cognee združuje shrambo vektorjev in grafov, tako da so vaši podatki iskalni po pomenu in povezani z odnosi. Cognee privzeto uporablja baze podatkov na osnovi datotek (LanceDB za vektorje, Kuzu za grafovno bazo podatkov).\n", + "\n", + " - **Pridobivanje zavedanja o odnosih**: Odgovori temeljijo ne samo na \"podobnem besedilu\", temveč tudi na tem, kako so entitete povezane.\n", + "\n", + " - **Živ spomin**: Plast spomina se razvija, raste in ostaja poizvedljiva kot en povezan graf.\n", + "\n", + "2. Načini iskanja in sklepanja\n", + " - **Hibridno pridobivanje**: Iskanje združuje podobnost vektorjev, strukturo grafa in sklepanje LLM, od iskanja surovih delov do vprašanj, ki upoštevajo graf.\n", + "\n", + " - **Prilagodite način nalogi**: Uporabite načine v slogu dopolnjevanja, ko želite odgovore v naravnem jeziku, in načine za dele/besedila/grafe, ko vaš agent potrebuje surov kontekst ali želi samostojno sklepati.\n", + "\n", + "3. Personalizirani agenti, zavedni seje\n", + " - **Kontekst seje + dolgoročni spomin**: Cognee ločuje kratkoročni kontekst \"niti\" od dolgoročnega spomina na ravni uporabnika ali organizacije.\n", + "\n", + "## Praktične uporabe\n", + "\n", + "1. **Vertikalni AI agenti**\n", + "\n", + " Uporabite vzorec iz tega zvezka za pogon domensko pametnih kopilotov, ki temeljijo na Cognee kot njihovem jedru za pridobivanje in sklepanje:\n", + "\n", + "- **Kopiloti za razvijalce**: Pregled kode, analiza incidentov in pomoč pri arhitekturi, ki pregleduje kodo, API-je, oblikovalske dokumente in vstopnice kot enoten graf spomina.\n", + "\n", + "- **Kopiloti za stranke**: Agenti za podporo ali uspeh, ki črpajo iz produktne dokumentacije, pogostih vprašanj, CRM zapiskov in preteklih vstopnic z grafovno zavednim pridobivanjem in citiranimi odgovori.\n", + "\n", + "- **Notranji strokovni kopiloti**: Pomočniki za politiko, pravne zadeve ali varnost, ki sklepajo na podlagi medsebojno povezanih pravil, smernic in zgodovinskih odločitev namesto izoliranih PDF-jev.\n", + "\n", + " Cognee je izrecno postavljen kot trajen, natančen spomin za AI agente, ki zagotavlja živ graf znanja, ki se poveže za vašim agentom in nadomesti ad-hoc kombinacije shramb vektorjev in prilagojene grafovne kode.\n", + "\n", + "2. **Združevanje podatkovnih silosov v en spomin**\n", + "\n", + " Isti pristop vam pomaga zgraditi enotno plast spomina čez razpršene vire:\n", + "\n", + "- **Od silosov do enega grafa**: Uvozite strukturirane (npr. baze podatkov) in nestrukturirane podatke (npr. dokumente, klepete) v en sam graf, podprt z vektorji, namesto ločenih indeksov za vsak sistem.\n", + "\n", + "- **Sklepanje čez vire s citati**: Izvajajte večstopenjsko sklepanje čez vse—\"združite\" dnevnike, metrike in dokumente prek grafa—ter še vedno vrnite utemeljene odgovore s poreklom.\n", + "\n", + "- **Središča znanja**: Za domene, kot so bančništvo ali izobraževanje, se Cognee že uporablja za združevanje PDF-jev, notranjih sistemov in podatkov aplikacij v en graf znanja z vektorji, tako da agenti lahko odgovarjajo na vprašanja s točnim, citiranim kontekstom.\n", + "\n", + "## Naslednji koraki\n", + "\n", + "Izvedli ste osnovno zanko spomina. Tukaj so naravne razširitve, ki jih lahko preizkusite sami (glejte [dokumentacijo Cognee](https://docs.cognee.ai/) za podrobnosti):\n", + "\n", + "1. **Eksperimentirajte s časovno zavednostjo**: Vključite časovno funkcijo za izvleček dogodkov in časovnih žigov iz besedila.\n", + "\n", + "2. **Uvedite sklepanje, ki temelji na ontologiji**: Določite OWL ontologijo za svojo domeno. Uporabite podporo za ontologijo v Cognee, da so izvlečene entitete in odnosi utemeljeni v tej shemi, kar izboljša kakovost grafa in domensko specifične odgovore.\n", + "\n", + "3. **Dodajte povratno zanko**: Dovolite Cognee, da prilagodi uteži robov grafa na podlagi povratnih informacij uporabnikov, tako da se pridobivanje sčasoma izboljša in ne ostane statično.\n", + "\n", + "4. **Prilagodite za personalizacijo in vedenje seje**: Uporabite ID-je uporabnikov, najemnike in nabore podatkov, da vsakemu posamezniku ali ekipi omogočite lasten pogled na skupni spominski mehanizem.\n", + "\n", + "5. **Razširite na bolj zapletene agente**: Povežite Cognee z ogrodji agentov za gradnjo večagentnih sistemov, ki vsi delijo isto plast spomina. *Microsoft Agent Framework x Cognee vtičnik prihaja kmalu.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Omejitev odgovornosti**: \nTa dokument je bil preveden z uporabo storitve za prevajanje AI [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku naj se šteje za avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitne nesporazume ali napačne razlage, ki izhajajo iz uporabe tega prevoda.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:38:36+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "sl" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/sl/13-agent-memory/README.md b/translations/sl/13-agent-memory/README.md index b6e6ff21d..297abc317 100644 --- a/translations/sl/13-agent-memory/README.md +++ b/translations/sl/13-agent-memory/README.md @@ -1,8 +1,8 @@ **Omejitev odgovornosti**: -Ta dokument je bil preveden z uporabo storitve AI za prevajanje [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitna nesporazumevanja ali napačne razlage, ki izhajajo iz uporabe tega prevoda. \ No newline at end of file +Ta dokument je bil preveden z uporabo storitve AI prevajanja [Co-op Translator](https://github.com/Azure/co-op-translator). Čeprav si prizadevamo za natančnost, vas prosimo, da upoštevate, da lahko avtomatizirani prevodi vsebujejo napake ali netočnosti. Izvirni dokument v njegovem maternem jeziku je treba obravnavati kot avtoritativni vir. Za ključne informacije priporočamo profesionalni človeški prevod. Ne prevzemamo odgovornosti za morebitne nesporazume ali napačne razlage, ki izhajajo iz uporabe tega prevoda. + \ No newline at end of file diff --git a/translations/sr/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/sr/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..eaa9ae9db --- /dev/null +++ b/translations/sr/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Изградња AI агената са перзистентном меморијом користећи Cognee\n", + "\n", + "Овај нотебук демонстрира како изградити интелигентне AI агенте са напредним способностима меморије користећи [**cognee**](https://www.cognee.ai/) - отворени извор AI меморије који комбинује графове знања, семантичко претраживање и управљање сесијама за креирање AI система свесних контекста.\n", + "\n", + "## 🎯 Циљеви учења\n", + "\n", + "На крају овог туторијала, разумећете како да:\n", + "- **Изградите графове знања подржане ембедингима**: Претворите неструктурирани текст у структурисано, упитно знање\n", + "- **Имплементирате меморију сесије**: Креирајте разговоре са више корака уз аутоматско задржавање контекста\n", + "- **Перзистирате разговоре**: Опционо сачувајте важне интеракције у дугорочној меморији за будућу употребу\n", + "- **Постављате упите користећи природни језик**: Приступите и искористите историјски контекст у новим разговорима\n", + "- **Визуализујете меморију**: Истражите односе у графу знања вашег агента\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Шта ћете направити\n", + "\n", + "У овом туторијалу, креираћемо **Асистента за кодирање** са перзистентном меморијом који:\n", + "\n", + "### 1. **Конструкција базе знања**\n", + " - Уноси информације о профилу и експертизи програмера\n", + " - Обрађује принципе и најбоље праксе програмирања у Python-у\n", + " - Чува историјске разговоре између програмера и AI асистената\n", + "\n", + "### 2. **Разговори свесни сесије**\n", + " - Одржава контекст кроз више питања у истој сесији\n", + " - Аутоматски кешира сваки пар питање/одговор ради ефикасног преузимања\n", + " - Пружа кохерентне, контекстуалне одговоре засноване на историји разговора\n", + "\n", + "### 3. **Дугорочна меморија**\n", + " - Перзистира важне разговоре у дугорочну меморију\n", + " - Преузима релевантна сећања из базе знања и претходних сесија како би информисао нове интеракције\n", + " - Гради растућу базу знања која се временом побољшава\n", + "\n", + "### 4. **Интелигентно преузимање меморије**\n", + " - Користи семантичко претраживање засновано на графовима за проналажење релевантних информација у целокупној похрањеној бази знања\n", + " - Филтрира претраге по подгрупама података (информације о програмеру vs. принципи)\n", + " - Комбинује више извора података ради пружања свеобухватних одговора\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Предуслови и подешавање\n", + "\n", + "### Системски захтеви\n", + "\n", + "Пре него што почнете, уверите се да имате:\n", + "\n", + "1. **Python окружење**\n", + " - Python 3.9 или новији\n", + " - Виртуелно окружење (препоручено)\n", + " \n", + "2. **Redis кеш** (Потребно за управљање сесијама)\n", + " - Локални Redis: `docker run -d -p 6379:6379 redis`\n", + " - Или користите управљану Redis услугу\n", + " \n", + "3. **Приступ LLM API-ју**\n", + " - OpenAI API кључ или други провајдери (погледајте [документацију](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Конфигурација базе података**\n", + " - Подразумевано није потребна конфигурација. Cognee користи базе података засноване на датотекама (LanceDB и Kuzu)\n", + " - Опционално, можете подесити Azure AI Search као складиште вектора (погледајте [документацију](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Конфигурација окружења\n", + "\n", + "Направите `.env` датотеку у вашем пројектном директоријуму са следећим променљивим:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Разумевање архитектуре меморије Cognee\n", + "\n", + "### Како Cognee функционише\n", + "\n", + "Cognee пружа софистициран систем меморије који превазилази једноставно складиштење кључ-вредност:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Кључне компоненте:\n", + "\n", + "1. **Граф знања**: Чува ентитете, односе и семантичке везе\n", + "2. **Векторски уграђаји**: Омогућавају семантичку претрагу кроз све сачуване информације\n", + "3. **Кеш сесије**: Одржава контекст разговора унутар и између сесија\n", + "4. **NodeSets**: Организују податке у логичке категорије за циљано преузимање\n", + "\n", + "### Типови меморије у овом туторијалу:\n", + "\n", + "- **Перзистентна меморија**: Дугорочно складиштење у графу знања\n", + "- **Сесијска меморија**: Привремени контекст разговора у Redis кешу\n", + "- **Семантичка меморија**: Претраживање сличности засновано на векторима кроз све податке\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Инсталирајте потребне пакете\n", + "\n", + "Инсталирајте Cognee са Redis подршком за управљање сесијама:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Иницијализуј окружење и учитај библиотеке\n", + "\n", + "Уверите се:\n", + "1. Да Redis ради (нпр. преко Docker-а: `docker run -d -p 6379:6379 redis`)\n", + "2. Да су променљиве окружења постављене пре него што се увезу модули кеша\n", + "3. Ако је потребно, поново покрените језгро и извршите ћелије редом\n", + "\n", + "Следећа ћелија ће:\n", + "1. Учитати променљиве окружења из `.env`\n", + "2. Конфигурисати Cognee са вашим LLM подешавањима\n", + "3. Омогућити кеширање за управљање сесијама\n", + "4. Потврдити да су сви компоненти правилно повезани\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Конфигуришите директоријуме за складиштење\n", + "\n", + "Cognee користи два одвојена директоријума за своје операције:\n", + "- **Корен података**: Чува унете документе и обрађене податке\n", + "- **Системски корен**: Садржи базу података графа знања и системске метаподатке\n", + "\n", + "Креираћемо изоловане директоријуме за овај туторијал на следећи начин:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Ресетовање стања меморије\n", + "\n", + "Пре него што почнемо са изградњом нашег система меморије, хајде да се уверимо да почињемо од почетка.\n", + "\n", + "> 💡 **Савет**: Можете прескочити овај корак ако желите да сачувате постојећа сећања из претходних покретања када касније користите ову свеску.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Део 1: Изградња базе знања\n", + "\n", + "### Извори података за нашег асистента за програмере\n", + "\n", + "Унећемо три врсте података како бисмо креирали свеобухватну базу знања:\n", + "\n", + "1. **Профил програмера**: Лично искуство и техничка позадина\n", + "2. **Најбоље праксе за Python**: Зен Python-а са практичним смерницама\n", + "3. **Историјски разговори**: Претходне сесије питања и одговора између програмера и AI асистената\n", + "\n", + "Ови разноврсни подаци омогућавају нашем агенту да:\n", + "- Разуме технички контекст корисника\n", + "- Примени најбоље праксе у препорукама\n", + "- Учи из претходних успешних интеракција\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Претварање података у граф знања\n", + "\n", + "Сада ћемо претворити наш необрађени текст у структурирану меморију. Овај процес:\n", + "\n", + "1. **Додаје податке у NodeSets**: Организује информације у логичке категорије\n", + " - `developer_data`: Профил програмера и разговори\n", + " - `principles_data`: Најбоље праксе и смернице за Python\n", + "\n", + "2. **Покреће Cognify Pipeline**: Извлачи ентитете, односе и креира уграђивања\n", + " - Идентификује кључне концепте\n", + " - Ствара семантичке везе између повезаних информација\n", + " - Генерише векторска уграђивања\n", + "\n", + "Ово може потрајати неколико тренутака док LLM обрађује текст и гради структуру графа:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Визуализација графа знања\n", + "\n", + "Хајде да истражимо структуру нашег графа знања. Визуализација приказује:\n", + "- **Чворове**: Ентитети извучени из текста (концепти, технологије, људи)\n", + "- **Ивице**: Односи и везе између ентитета\n", + "- **Кластере**: Повезани концепти груписани по семантичкој сличности\n", + "\n", + "Отворите генерисани HTML фајл у вашем претраживачу да бисте интерактивно истражили граф:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Обогатите меморију са Memify\n", + "\n", + "Функција `memify()` анализира граф знања и генерише интелигентна правила о подацима. Овај процес:\n", + "- Идентификује обрасце и најбоље праксе\n", + "- Креира применљиве смернице на основу садржаја\n", + "- Успоставља односе између различитих области знања\n", + "\n", + "Ова правила помажу агенту да доноси боље информисане одлуке приликом одговарања на питања. Захватање друге визуализације помаже вам да упоредите како се граф густи након обогаћивања.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Део 2: Интелигентно преузимање меморије\n", + "\n", + "### Демонстрација 1: Интеграција знања из више докумената\n", + "\n", + "Сада када је наш граф знања изграђен, тестираћемо како Cognee комбинује информације из више извора да би одговорио на сложена питања.\n", + "\n", + "Први упит демонстрира:\n", + "- **Семантичко разумевање**: Проналажење релевантних концепата чак и када нису експлицитно поменути\n", + "- **Укрштање информација**: Комбиновање профила програмера са принципима Python-а\n", + "- **Контекстуално резоновање**: Примена најбољих пракси на специфичне имплементације\n", + "\n", + "### Демонстрација 2: Филтрирана претрага са NodeSets\n", + "\n", + "Други упит показује како циљати одређене подсетове графа знања:\n", + "- Користи параметар `node_name` за претрагу само унутар `principles_data`\n", + "- Пружа фокусиране одговоре из специфичне области знања\n", + "- Корисно када вам је потребна информација из одређене домене\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Део 3: Подешавање управљања сесијом\n", + "\n", + "### Омогућавање меморије разговора\n", + "\n", + "Управљање сесијом је кључно за одржавање контекста током више интеракција. Овде ћемо:\n", + "\n", + "1. **Иницијализовати кориснички контекст**: Направити или преузети кориснички профил за праћење сесије\n", + "2. **Конфигурисати механизам кеша**: Повезати се са Redis-ом за чување историје разговора\n", + "3. **Омогућити променљиве сесије**: Поставити контекстуалне променљиве које се задржавају током упита\n", + "\n", + "> ⚠️ **Важно**: Ово захтева да Redis ради и `CACHING=true` у вашем окружењу\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Помоћна функција: Преглед историје сесије\n", + "\n", + "Ова помоћна функција нам омогућава да прегледамо историју разговора сачувану у Redis-у. Корисна је за:\n", + "- Отклањање грешака у управљању сесијама\n", + "- Проверу да ли се разговори кеширају\n", + "- Разумевање контекста који је доступан агенту\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Сесија 1: Лабораторија за асинхрону подршку — Прво питање\n", + "\n", + "Започните сесију `async-support-lab` постављањем питања о телеметријски прилагођеним asyncio обрасцима за масивни веб скрепер. Граф већ познаје asyncio, aiohttp и праксе мониторинга, тако да одговор треба да одражава претходне разговоре док прилагођава одговор новом упиту.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Преглед меморије сесије 1 након прве размене\n", + "\n", + "Покретањем `show_history(session_1)` одмах након почетног питања потврђује се да је Cognee уписао и упит и одговор у Redis. Требало би да видите један унос са смерницама за истовременост.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Сесија 1: Прати праћење модела података\n", + "\n", + "Следеће питање је: \"Када треба да изаберем dataclasses уместо Pydantic?\" користећи исти ID сесије. Cognee би требало да повеже Python принципе са претходним разговорима о FastAPI-ју како би пружио детаљан савет—показујући да се контекст преноси у оквиру именоване сесије.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Потврдите да историја сесије 1 садржи оба корака\n", + "\n", + "Још један позив `show_history(session_1)` треба да прикаже два уноса питања и одговора. Ово одговара кораку \"репродукције меморије\" у лабораторији Mem0 и доказује да додатни кораци проширују исти транскрипт.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Сесија 2: Нит за преглед дизајна — Нова сесија\n", + "\n", + "Да бисмо показали изолацију између нити, покрећемо `design-review-session` и тражимо упутства за евидентирање прегледа инцидената. Иако је основна база знања иста, нови идентификатор сесије одржава транскрипте одвојеним.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Преглед Сесије 2 Историја\n", + "\n", + "`show_history(session_2)` треба да приказује само пар питања и одговора из прегледа дизајна. Упоредите то са Сесијом 1 како бисте истакли како Cognee одржава независне транскрипте док истовремено користи заједнички граф знања.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Резиме\n", + "\n", + "Честитамо! Управо сте свом асистенту за кодирање дали прави слој дугорочне меморије који покреће Cognee.\n", + "\n", + "У овом туторијалу сте узели сирови садржај за програмере (код, документацију, разговоре) и претворили га у граф + векторску меморију коју ваш агент може претраживати, анализирати и континуирано унапређивати.\n", + "\n", + "Шта сте научили:\n", + "\n", + "1. **Од сировог текста до AI меморије**: Како Cognee обрађује неструктуриране податке и претвара их у интелигентну, претраживу меморију користећи комбиновану архитектуру вектора + графа знања.\n", + "\n", + "2. **Обогаћивање графа помоћу memify**: Како прећи основно креирање графа и користити memify за додавање изведених чињеница и богатијих односа на постојећи граф.\n", + "\n", + "3. **Вишеструке стратегије претраге**: Како претраживати меморију користећи различите типове претраге (Q&A свесно графа, RAG-стил комплетирање, увиди, сирови делови, претрага кода, итд.) у зависности од потреба вашег агента.\n", + "\n", + "4. **Визуелна експлорација**: Како прегледати и отклонити грешке у ономе што је Cognee изградио користећи визуализације графа и Cognee UI, тако да можете заиста видети како је знање структурирано.\n", + "\n", + "5. **Меморија свесна сесије**: Како комбиновати контекст по сесији са трајном семантичком меморијом тако да агенти могу памтити кроз више покретања без цурења информација између корисника.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Кључне тачке\n", + "1. Меморија као граф знања подржана уграђивањима\n", + "\n", + " - **Структурисано разумевање**: Cognee комбинује складиште вектора и складиште графова, тако да су ваши подаци претраживи по значењу и повезани односима. Cognee подразумевано користи базе података засноване на датотекама (LanceDB за векторе, Kuzu за граф базе података).\n", + "\n", + " - **Претраживање свесно односа**: Одговори могу бити засновани не само на „сличном тексту“, већ и на томе како су ентитети повезани.\n", + "\n", + " - **Жива меморија**: Слој меморије се развија, расте и остаје претражив као један повезан граф.\n", + "\n", + "2. Модови претраге и резоновања\n", + " - **Хибридно претраживање**: Претрага комбинује сличност вектора, структуру графа и резоновање LLM-а, од основног проналажења делова текста до одговарања на питања свесних графа.\n", + "\n", + " - **Прилагодите мод задатку**: Користите модове у стилу комплетирања када желите одговоре на природном језику, а модове за делове/резиме/граф када вашем агенту треба сирови контекст или да води сопствено резоновање.\n", + "\n", + "3. Персонализовани агенти свесни сесије\n", + " - **Контекст сесије + дугорочна меморија**: Cognee одваја краткорочни контекст „теме“ од дугорочне меморије на нивоу корисника или организације.\n", + "\n", + "## Примена у стварном свету\n", + "\n", + "1. **Вертикални AI агенти**\n", + "\n", + " Користите образац из овог нотебука за покретање доменски паметних копилота који се ослањају на Cognee као језгро за претраживање и резоновање:\n", + "\n", + "- **Копилоти за програмере**: Асистенти за преглед кода, анализу инцидената и архитектуру који прелазе кроз код, API-је, дизајнерске документе и тикете као један граф меморије.\n", + "\n", + "- **Копилоти за кориснике**: Агенти за подршку или успех који извлаче информације из документације о производу, FAQ-ова, CRM белешки и претходних тикета уз претраживање свесно графа и одговоре са навођењем извора.\n", + "\n", + "- **Интерни експертски копилоти**: Асистенти за политику, правна питања или безбедност који резонују преко међусобно повезаних правила, смерница и историјских одлука уместо изолованих PDF-ова.\n", + "\n", + " Cognee је експлицитно позициониран као трајна, прецизна меморија за AI агенте, пружајући живи граф знања који се уклапа иза вашег агента и замењује ад-хок комбинације складишта вектора и прилагођеног граф кода.\n", + "\n", + "2. **Уједињавање податковних силоса у једну меморију**\n", + "\n", + " Исти приступ вам такође помаже да изградите уједињени слој меморије преко разбацаних извора:\n", + "\n", + "- **Од силоса до једног графа**: Унесите структуиране (нпр. базе података) и неструктуиране податке (нпр. документе, четове) у један граф подржан уграђивањима, уместо одвојених индекса за сваки систем.\n", + "\n", + "- **Резоновање преко извора са навођењем извора**: Спроведите вишестепено резоновање преко свега—„спојите“ логове, метрике и документе преко графа—и ипак вратите одговоре са доказима и пореклом.\n", + "\n", + "- **Чворишта знања**: За домене као што су банкарство или образовање, Cognee се већ користи за уједињавање PDF-ова, интерних система и података апликација у један граф знања са векторима, тако да агенти могу одговарати на питања са прецизним, наведеним контекстом.\n", + "\n", + "## Следећи кораци\n", + "\n", + "Имплементирали сте основну петљу меморије. Ево природних проширења која можете испробати сами (погледајте [Cognee документацију](https://docs.cognee.ai/) за детаље):\n", + "\n", + "1. **Експериментишите са временском свешћу**: Укључите временску когнификацију да извучете догађаје и временске ознаке из текста.\n", + "\n", + "2. **Уведите резоновање вођено онтологијом**: Дефинишите OWL онтологију за ваш домен. Користите Cognee-ову подршку за онтологије како би извучени ентитети и односи били засновани на тој шеми, побољшавајући квалитет графа и одговоре специфичне за домен.\n", + "\n", + "3. **Додајте петљу повратних информација**: Дозволите Cognee-у да прилагођава тежине ивица графа на основу стварних повратних информација корисника, тако да се претраживање временом побољшава уместо да остаје статично.\n", + "\n", + "4. **Прилагодите за персонализацију и понашање сесије**: Користите ID-ове корисника, закупце и скупове података да свакој особи или тиму дате сопствени поглед на заједнички мотор меморије.\n", + "\n", + "5. **Проширите на сложеније агенте**: Повежите Cognee са оквирима за агенте како бисте изградили системе са више агената који сви деле исти слој меморије. *Microsoft Agent Framework x Cognee додатак долази ускоро.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Одрицање од одговорности**: \nОвај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:34:24+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "sr" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/sr/13-agent-memory/README.md b/translations/sr/13-agent-memory/README.md index b9d2f8c2d..86882ef03 100644 --- a/translations/sr/13-agent-memory/README.md +++ b/translations/sr/13-agent-memory/README.md @@ -1,28 +1,36 @@ -# Меморија за AI агенте +# Меморија за AI агенте [![Меморија агента](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.sr.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Када говоримо о јединственим предностима креирања AI агената, две ствари се најчешће истичу: способност позивања алата за обављање задатака и способност побољшања током времена. Меморија је основа за креирање агента који се сам побољшава и који може пружити боље искуство нашим корисницима. +Када говоримо о јединственим предностима креирања AI агената, углавном се дискутује о две ствари: могућност позивања алата за обављање задатака и способност побољшања током времена. Меморија је основа за креирање агента који се сам побољшава и који може пружити боље искуство нашим корисницима. -У овом лекцији, погледаћемо шта је меморија за AI агенте, како је можемо управљати и користити за добробит наших апликација. +У овом лекцији, погледаћемо шта је меморија за AI агенте и како можемо управљати њом и користити је за добробит наших апликација. ## Увод -Ова лекција обухвата: +Ова лекција ће обухватити: • **Разумевање меморије AI агента**: Шта је меморија и зашто је она суштинска за агенте. -• **Имплементација и складиштење меморије**: Практични начини додавања способности меморије вашим AI агентима, са фокусом на краткорочну и дугорочну меморију. +• **Имплементација и складиштење меморије**: Практичне методе за додавање способности меморије вашим AI агентима, са фокусом на краткорочну и дугорочну меморију. -• **Креирање агената који се сами побољшавају**: Како меморија омогућава агентима да уче из претходних интеракција и побољшавају се током времена. +• **Прављење AI агената који се сами побољшавају**: Како меморија омогућава агентима да уче из претходних интеракција и побољшавају се током времена. + +## Доступне имплементације + +Ова лекција укључује два свеобухватна туторијала у облику нотебоок-а: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Имплементира меморију користећи Mem0 и Azure AI Search са Semantic Kernel оквиром + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Имплементира структурисану меморију користећи Cognee, аутоматски градећи граф знања подржан ембедингом, визуализујући граф и интелигентно претражујући ## Циљеви учења @@ -30,15 +38,15 @@ CO_OP_TRANSLATOR_METADATA: • **Разликујете различите типове меморије AI агента**, укључујући радну, краткорочну и дугорочну меморију, као и специјализоване форме попут меморије личности и епизодне меморије. -• **Имплементирате и управљате краткорочном и дугорочном меморијом за AI агенте** користећи Semantic Kernel оквир, уз коришћење алата као што су Mem0 и Whiteboard меморија, и интеграцију са Azure AI Search. +• **Имплементирате и управљате краткорочном и дугорочном меморијом за AI агенте** користећи Semantic Kernel оквир, уз коришћење алата као што су Mem0, Cognee, Whiteboard меморија и интеграцију са Azure AI Search. -• **Разумете принципе иза агената који се сами побољшавају** и како робусни системи управљања меморијом доприносе континуираном учењу и адаптацији. +• **Разумете принципе иза AI агената који се сами побољшавају** и како робусни системи управљања меморијом доприносе континуираном учењу и адаптацији. ## Разумевање меморије AI агента У својој суштини, **меморија за AI агенте односи се на механизме који им омогућавају да задрже и призову информације**. Ове информације могу бити специфични детаљи о разговору, корисничке преференције, претходне акције или чак научени обрасци. -Без меморије, AI апликације су често без стања, што значи да свака интеракција почиње од нуле. Ово доводи до понављајућег и фрустрирајућег корисничког искуства где агент "заборавља" претходни контекст или преференције. +Без меморије, AI апликације су често без стања, што значи да свака интеракција почиње од нуле. Ово доводи до поновљеног и фрустрирајућег корисничког искуства где агент "заборавља" претходни контекст или преференције. ### Зашто је меморија важна? @@ -50,9 +58,9 @@ CO_OP_TRANSLATOR_METADATA: • **Проактивни и реактивни**: Предвиђање потреба или одговарање на основу историјских података. -• **Аутономни**: Рад са више независности користећи сачувано знање. +• **Аутономни**: Рад више независно ослањајући се на сачувано знање. -Циљ имплементације меморије је да агенти постану **поузданији и способнији**. +Циљ имплементације меморије је да агенти постану више **поуздани и способни**. ### Типови меморије @@ -68,11 +76,11 @@ CO_OP_TRANSLATOR_METADATA: #### Краткорочна меморија -Овај тип меморије задржава информације током трајања једног разговора или сесије. То је контекст текућег чета, који омогућава агенту да се врати на претходне кораке у дијалогу. +Овај тип меморије задржава информације током трајања једног разговора или сесије. То је контекст текућег чета, омогућавајући агенту да се позове на претходне кораке у дијалогу. **Пример краткорочне меморије** -Ако корисник пита: "Колико би коштао лет за Париз?" а затим настави са "Шта је са смештајем тамо?", краткорочна меморија осигурава да агент зна да се "тамо" односи на "Париз" у оквиру истог разговора. +Ако корисник пита, "Колико би коштао лет за Париз?" а затим настави са "Шта је са смештајем тамо?", краткорочна меморија осигурава да агент зна да "тамо" се односи на "Париз" у истом разговору. #### Дугорочна меморија @@ -84,11 +92,10 @@ CO_OP_TRANSLATOR_METADATA: #### Меморија личности -Овај специјализовани тип меморије помаже агенту да развије конзистентну "личност" или "персону". Омогућава агенту да памти детаље о себи или својој намењеној улози, чинећи интеракције течнијим и фокусиранијим. +Овај специјализовани тип меморије помаже агенту да развије доследну "личност" или "персону". Омогућава агенту да памти детаље о себи или својој намењеној улози, чинећи интеракције течнијим и фокусиранијим. **Пример меморије личности** - -Ако је агент за путовања дизајниран да буде "стручњак за планирање скијања", меморија личности може да ојача ову улогу, утичући на његове одговоре да буду у складу са тоном и знањем стручњака. +Ако је агент за путовања дизајниран да буде "стручњак за планирање скијања", меморија личности може да ојача ову улогу, утичући на његове одговоре да се ускладе са тоном и знањем стручњака. #### Радна/епизодна меморија @@ -96,7 +103,7 @@ CO_OP_TRANSLATOR_METADATA: **Пример епизодне меморије** -Ако је агент покушао да резервише одређени лет, али је то пропало због недоступности, епизодна меморија може да забележи овај неуспех, омогућавајући агенту да проба алтернативне летове или да обавести корисника о проблему на информисанији начин током следећег покушаја. +Ако је агент покушао да резервише одређени лет, али није успео због недоступности, епизодна меморија може да забележи овај неуспех, омогућавајући агенту да проба алтернативне летове или да обавести корисника о проблему на информисанији начин током следећег покушаја. #### Меморија ентитета @@ -108,11 +115,11 @@ CO_OP_TRANSLATOR_METADATA: #### Структурисани RAG (Retrieval Augmented Generation) -Док је RAG шира техника, "структурисани RAG" се истиче као моћна технологија меморије. Он издваја густе, структурисане информације из различитих извора (разговори, имејлови, слике) и користи их за побољшање прецизности, присећања и брзине у одговорима. За разлику од класичног RAG-а који се ослања искључиво на семантичку сличност, структурисани RAG ради са унутрашњом структуром информација. +Док је RAG шира техника, "Структурисани RAG" се истиче као моћна технологија меморије. Он издваја густе, структурисане информације из различитих извора (разговора, имејлова, слика) и користи их за побољшање прецизности, присећања и брзине у одговорима. За разлику од класичног RAG-а који се ослања искључиво на семантичку сличност, Структурисани RAG ради са унутрашњом структуром информација. **Пример структурисаног RAG-а** -Уместо да само упоређује кључне речи, структурисани RAG може да анализира детаље лета (одредиште, датум, време, авио-компанија) из имејла и складишти их на структурисан начин. Ово омогућава прецизна питања као што је "Који лет сам резервисао за Париз у уторак?" +Уместо да само упоређује кључне речи, Структурисани RAG може да анализира детаље лета (одредиште, датум, време, авио-компанија) из имејла и складишти их на структурисан начин. Ово омогућава прецизна питања као што је "Који лет сам резервисао за Париз у уторак?" ## Имплементација и складиштење меморије @@ -120,41 +127,53 @@ CO_OP_TRANSLATOR_METADATA: ### Специјализовани алати за меморију +#### Mem0 + Један од начина за складиштење и управљање меморијом агента је коришћење специјализованих алата као што је Mem0. Mem0 функционише као слој перзистентне меморије, омогућавајући агентима да се присете релевантних интеракција, складиште корисничке преференције и фактички контекст, и уче из успеха и неуспеха током времена. Идеја је да се агенти без стања претворе у агенте са стањем. -Он функционише кроз **двофазни процес меморијског цевовода: екстракција и ажурирање**. Прво, поруке додате у нит агента шаљу се Mem0 сервису, који користи Large Language Model (LLM) за сумирање историје разговора и издвајање нових меморија. Након тога, фаза ажурирања вођена LLM-ом одређује да ли да дода, измени или избрише те меморије, складиштећи их у хибридној бази података која може укључивати векторске, графичке и key-value базе података. Овај систем такође подржава различите типове меморије и може укључити графичку меморију за управљање односима између ентитета. +Он функционише кроз **двофазни процес меморије: екстракција и ажурирање**. Прво, поруке додате у нит агента се шаљу Mem0 сервису, који користи Large Language Model (LLM) за сумирање историје разговора и издвајање нових меморија. Након тога, фаза ажурирања вођена LLM-ом одређује да ли да дода, измени или избрише те меморије, складиштећи их у хибридној бази података која може укључивати векторске, графичке и key-value базе података. Овај систем такође подржава различите типове меморије и може укључити графичку меморију за управљање односима између ентитета. + +#### Cognee + +Још један моћан приступ је коришћење **Cognee**, отвореног кода за семантичку меморију AI агената који трансформише структурисане и неструктурисане податке у графове знања који се могу претраживати, подржане ембедингом. Cognee пружа **архитектуру двоструког складишта** која комбинује претрагу по векторској сличности са графичким односима, омогућавајући агентима да разумеју не само које информације су сличне, већ и како се концепти међусобно односе. + +Он се истиче у **хибридном преузимању** које комбинује векторску сличност, графичку структуру и LLM резоновање - од претраге сирових делова до одговарања на питања свесних графа. Систем одржава **живу меморију** која се развија и расте док остаје претражива као један повезан граф, подржавајући и краткорочни контекст сесије и дугорочну перзистентну меморију. + +Туторијал Cognee нотебоок-а ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) демонстрира изградњу овог јединственог слоја меморије, са практичним примерима уноса различитих извора података, визуализације графа знања и претраживања са различитим стратегијама претраге прилагођеним специфичним потребама агента. -### Складиштење меморије са RAG-ом +### Складиштење меморије са RAG Поред специјализованих алата за меморију као што је Mem0, можете искористити робусне услуге претраге као што је **Azure AI Search као позадину за складиштење и преузимање меморија**, посебно за структурисани RAG. Ово вам омогућава да заснујете одговоре вашег агента на сопственим подацима, осигуравајући релевантније и прецизније одговоре. Azure AI Search може се користити за складиштење корисничких меморија о путовањима, каталога производа или било ког другог доменског знања. -Azure AI Search подржава могућности као што је **структурисани RAG**, који се истиче у издвајању и преузимању густих, структурисаних информација из великих скупова података као што су историје разговора, имејлови или чак слике. Ово пружа "суперхуманску прецизност и присећање" у поређењу са традиционалним приступима текстуалног сегментирања и уграђивања. +Azure AI Search подржава могућности као што је **структурисани RAG**, који се истиче у издвајању и преузимању густих, структурисаних информација из великих скупова података као што су историје разговора, имејлови или чак слике. Ово пружа "суперхуману прецизност и присећање" у поређењу са традиционалним приступима текстуалног сегментирања и ембединга. -## Креирање агената који се сами побољшавају +## Прављење AI агената који се сами побољшавају Уобичајени образац за агенте који се сами побољшавају укључује увођење **"агента знања"**. Овај посебан агент посматра главни разговор између корисника и примарног агента. Његова улога је да: -1. **Идентификује вредне информације**: Одреди да ли је неки део разговора вредан чувања као опште знање или специфична корисничка преференција. +1. **Идентификује вредне информације**: Одреди да ли је било који део разговора вредан чувања као опште знање или специфична корисничка преференција. 2. **Издвоји и сумира**: Дестилује суштинско учење или преференцију из разговора. 3. **Складишти у базу знања**: Перзистира издвојене информације, често у векторској бази података, како би се касније могле преузети. -4. **Допуни будуће упите**: Када корисник покрене нови упит, агент знања преузима релевантне сачуване информације и додаје их корисничком упиту, пружајући кључни контекст примарном агенту (слично RAG-у). +4. **Допуни будуће упите**: Када корисник иницира нови упит, агент знања преузима релевантне сачуване информације и додаје их корисничком упиту, пружајући кључни контекст примарном агенту (слично RAG-у). ### Оптимизације за меморију -• **Управљање кашњењем**: Да би се избегло успоравање интеракција са корисником, јефтинији, бржи модел може се користити у почетку за брзу проверу да ли је информација вредна чувања или преузимања, а сложенији процес екстракције/преузимања се активира само када је неопходно. +• **Управљање кашњењем**: Да би се избегло успоравање интеракција са корисником, јефтинији, бржи модел може се користити у почетку за брзо проверавање да ли је информација вредна чувања или преузимања, а сложенији процес екстракције/преузимања се позива само када је неопходно. • **Одржавање базе знања**: За растућу базу знања, ређе коришћене информације могу се преместити у "хладно складиштење" ради управљања трошковима. ## Имате још питања о меморији агента? -Придружите се [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) да се повежете са другим ученицима, присуствујете консултацијама и добијете одговоре на ваша питања о AI агентима. +Придружите се [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) да се повежете са другим ученицима, присуствујете радним часов --- + **Одрицање од одговорности**: -Овај документ је преведен помоћу услуге за превођење уз помоћ вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људског преводиоца. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода. \ No newline at end of file +Овај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати меродавним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. + \ No newline at end of file diff --git a/translations/sv/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/sv/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..ff76ef999 --- /dev/null +++ b/translations/sv/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Bygga AI-agenter med bestående minne med Cognee\n", + "\n", + "Den här notebooken visar hur man bygger intelligenta AI-agenter med avancerade minnesfunktioner med hjälp av [**cognee**](https://www.cognee.ai/) - ett öppet AI-minne som kombinerar kunskapsgrafer, semantisk sökning och sessionshantering för att skapa kontextmedvetna AI-system.\n", + "\n", + "## 🎯 Lärandemål\n", + "\n", + "I slutet av denna handledning kommer du att förstå hur man:\n", + "- **Bygger kunskapsgrafer baserade på embeddings**: Omvandlar ostrukturerad text till strukturerad, sökbar kunskap\n", + "- **Implementerar sessionsminne**: Skapar flervändiga konversationer med automatisk kontextbevarande\n", + "- **Sparar konversationer**: Valfritt lagrar viktiga interaktioner i långtidsminne för framtida referens\n", + "- **Frågar med naturligt språk**: Åtkomst till och utnyttjande av historisk kontext i nya konversationer\n", + "- **Visualiserar minne**: Utforskar relationerna i agentens kunskapsgraf\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Vad du kommer att bygga\n", + "\n", + "I den här handledningen kommer vi att skapa en **Kodningsassistent** med ihållande minne som:\n", + "\n", + "### 1. **Kunskapsbasuppbyggnad**\n", + " - Tar in information om utvecklarprofiler och expertis\n", + " - Bearbetar principer och bästa praxis för Python-programmering\n", + " - Lagrar historiska konversationer mellan utvecklare och AI-assistenter\n", + "\n", + "### 2. **Sessionsmedvetna konversationer**\n", + " - Bibehåller kontext över flera frågor i samma session\n", + " - Cachar automatiskt varje fråga/svar-par för effektiv hämtning\n", + " - Ger sammanhängande och kontextuella svar baserade på konversationshistorik\n", + "\n", + "### 3. **Långtidsminne**\n", + " - Sparar viktiga konversationer i ett långtidsminne\n", + " - Hämtar relevanta minnen från kunskapsbasen och tidigare sessioner för att informera nya interaktioner\n", + " - Bygger en växande kunskapsbas som förbättras över tid\n", + "\n", + "### 4. **Intelligent minneshämtning**\n", + " - Använder grafmedveten semantisk sökning för att hitta relevant information i all lagrad kunskap\n", + " - Filtrerar sökningar efter datasubgrupper (utvecklarinformation vs. principer)\n", + " - Kombinerar flera datakällor för att ge omfattande svar\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Förutsättningar & Installation\n", + "\n", + "### Systemkrav\n", + "\n", + "Innan du börjar, se till att du har:\n", + "\n", + "1. **Python-miljö**\n", + " - Python 3.9 eller högre\n", + " - Virtuell miljö (rekommenderas)\n", + " \n", + "2. **Redis Cache** (Krävs för sessionshantering)\n", + " - Lokal Redis: `docker run -d -p 6379:6379 redis`\n", + " - Eller använd en hanterad Redis-tjänst\n", + " \n", + "3. **LLM API-åtkomst**\n", + " - OpenAI API-nyckel eller andra leverantörer (se [dokumentation](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Databaskonfiguration**\n", + " - Ingen konfiguration krävs som standard. Cognee använder filbaserade databaser (LanceDB och Kuzu)\n", + " - Alternativt kan du konfigurera Azure AI Search som en vektorlagring (se [dokumentation](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Miljökonfiguration\n", + "\n", + "Skapa en `.env`-fil i din projektkatalog med följande variabler:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Förstå Cognees minnesarkitektur\n", + "\n", + "### Hur Cognee fungerar\n", + "\n", + "Cognee erbjuder ett avancerat minnessystem som går bortom enkel nyckel-värde-lagring:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Viktiga komponenter:\n", + "\n", + "1. **Kunskapsgraf**: Lagrar enheter, relationer och semantiska kopplingar\n", + "2. **Vektorinbäddningar**: Möjliggör semantisk sökning över all lagrad information\n", + "3. **Sessionscache**: Bibehåller samtalskontext inom och mellan sessioner\n", + "4. **NodeSets**: Organiserar data i logiska kategorier för riktad hämtning\n", + "\n", + "### Minnestyper i denna handledning:\n", + "\n", + "- **Persistent Memory**: Långtidslagring i kunskapsgrafen\n", + "- **Session Memory**: Tillfällig samtalskontext i Redis-cache\n", + "- **Semantic Memory**: Vektorbaserad likhetssökning över all data\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Installera nödvändiga paket\n", + "\n", + "Installera Cognee med Redis-stöd för sessionshantering:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Initiera miljö och ladda bibliotek\n", + "\n", + "Se till att:\n", + "1. Redis körs (t.ex. via Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Miljövariabler är inställda innan cachemoduler importeras\n", + "3. Om det behövs, starta om kärnan och kör cellerna i ordning\n", + "\n", + "Följande cell kommer att:\n", + "1. Ladda miljövariabler från `.env`\n", + "2. Konfigurera Cognee med dina LLM-inställningar\n", + "3. Aktivera caching för sessionshantering\n", + "4. Kontrollera att alla komponenter är korrekt anslutna\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Konfigurera lagringskataloger\n", + "\n", + "Cognee använder två separata kataloger för sina operationer:\n", + "- **Data Root**: Lagrar importerade dokument och bearbetad data\n", + "- **System Root**: Innehåller kunskapsgrafdatabasen och systemmetadata\n", + "\n", + "Vi kommer att skapa separata kataloger för denna handledning enligt följande:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Återställ minnestillstånd\n", + "\n", + "Innan vi börjar bygga vårt minnssystem, låt oss se till att vi börjar från början.\n", + "\n", + "> 💡 **Tips**: Du kan hoppa över detta steg om du vill behålla befintliga minnen från dina tidigare körningar när du använder denna notebook senare.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Del 1: Bygga kunskapsbasen\n", + "\n", + "### Datakällor för vår utvecklarassistent\n", + "\n", + "Vi kommer att använda tre typer av data för att skapa en omfattande kunskapsbas:\n", + "\n", + "1. **Utvecklarprofil**: Personlig expertis och teknisk bakgrund\n", + "2. **Python bästa praxis**: The Zen of Python med praktiska riktlinjer\n", + "3. **Historiska konversationer**: Tidigare frågor och svar mellan utvecklare och AI-assistenter\n", + "\n", + "Denna mångsidiga data gör det möjligt för vår agent att:\n", + "- Förstå användarens tekniska sammanhang\n", + "- Tillämpa bästa praxis i rekommendationer\n", + "- Lära sig från tidigare framgångsrika interaktioner\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Bearbeta data till kunskapsgraf\n", + "\n", + "Nu ska vi omvandla vår råtext till ett strukturerat minne. Denna process:\n", + "\n", + "1. **Lägger till data i NodeSets**: Organiserar information i logiska kategorier\n", + " - `developer_data`: Utvecklarprofil och konversationer\n", + " - `principles_data`: Bästa praxis och riktlinjer för Python\n", + "\n", + "2. **Kör Cognify Pipeline**: Extraherar entiteter, relationer och skapar embeddings\n", + " - Identifierar nyckelkoncept\n", + " - Skapar semantiska kopplingar mellan relaterad information\n", + " - Genererar vektorembeddings\n", + "\n", + "Detta kan ta några ögonblick medan LLM bearbetar texten och bygger grafstrukturen:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Visualisera kunskapsgrafen\n", + "\n", + "Låt oss utforska strukturen av vår kunskapsgraf. Visualiseringen visar:\n", + "- **Noder**: Enheter som extraherats från texten (koncept, teknologier, personer)\n", + "- **Kanter**: Relationer och kopplingar mellan enheter\n", + "- **Kluster**: Relaterade koncept grupperade efter semantisk likhet\n", + "\n", + "Öppna den genererade HTML-filen i din webbläsare för att interaktivt utforska grafen:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Berika minnet med Memify\n", + "\n", + "Funktionen `memify()` analyserar kunskapsgrafen och genererar intelligenta regler om datan. Denna process:\n", + "- Identifierar mönster och bästa praxis\n", + "- Skapar handlingsbara riktlinjer baserade på innehållet\n", + "- Etablerar relationer mellan olika kunskapsområden\n", + "\n", + "Dessa regler hjälper agenten att fatta mer informerade beslut när den svarar på frågor. Att fånga en andra visualisering hjälper dig att jämföra hur grafen blir tätare när den berikas.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Del 2: Intelligent informationshämtning\n", + "\n", + "### Demonstration 1: Kunskapsintegration över dokument\n", + "\n", + "Nu när vår kunskapsgraf är byggd, låt oss testa hur Cognee kombinerar information från flera källor för att besvara komplexa frågor.\n", + "\n", + "Den första frågan demonstrerar:\n", + "- **Semantisk förståelse**: Hitta relevanta koncept även när de inte uttryckligen nämns\n", + "- **Korsreferenser**: Kombinera utvecklarprofil med Python-principer\n", + "- **Kontextuell resonemang**: Tillämpa bästa praxis på specifika implementationer\n", + "\n", + "### Demonstration 2: Filtrerad sökning med NodeSets\n", + "\n", + "Den andra frågan visar hur man riktar in sig på specifika delmängder av kunskapsgrafen:\n", + "- Använder `node_name`-parametern för att söka endast inom `principles_data`\n", + "- Ger fokuserade svar från ett specifikt kunskapsområde\n", + "- Användbart när du behöver information från ett specifikt område\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Del 3: Inställning av sessionshantering\n", + "\n", + "### Aktivera konversationsminne\n", + "\n", + "Sessionshantering är avgörande för att behålla kontexten över flera interaktioner. Här kommer vi att:\n", + "\n", + "1. **Initiera användarkontext**: Skapa eller hämta en användarprofil för att spåra sessioner\n", + "2. **Konfigurera cachemotor**: Anslut till Redis för att lagra konversationshistorik\n", + "3. **Aktivera sessionsvariabler**: Ställ in kontextvariabler som kvarstår mellan frågor\n", + "\n", + "> ⚠️ **Viktigt**: Detta kräver att Redis körs och att `CACHING=true` är inställt i din miljö\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Hjälpfunktion: Visa sessionshistorik\n", + "\n", + "Den här hjälpfunktionen gör det möjligt för oss att granska konversationshistoriken som lagras i Redis. Den är användbar för:\n", + "- Felsökning av sessionshantering\n", + "- Verifiera att konversationer cachas\n", + "- Förstå vilken kontext som är tillgänglig för agenten\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Session 1: Async Support Lab — Första Frågan\n", + "\n", + "Start `async-support-lab`-sessionen genom att fråga efter telemetrivänliga asyncio-mönster för en massiv webbscraper. Grafen känner redan till asyncio, aiohttp och övervakningspraxis, så svaret bör spegla tidigare samtal samtidigt som det anpassas till den nya frågan.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Inspektera minnet för Session 1 efter det första utbytet\n", + "\n", + "Att köra `show_history(session_1)` direkt efter den inledande frågan bekräftar att Cognee skrev både prompten och svaret till Redis. Du bör se en post med vägledning för samtidighet.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Session 1: Uppföljning på Datamodeller\n", + "\n", + "Nästa fråga är: \"När ska jag välja dataclasses istället för Pydantic?\" med samma sessions-ID. Cognee bör sammanfoga Python-principerna med tidigare FastAPI-diskussioner för att ge nyanserade råd—och visa att kontexten följer med inom en namngiven session.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Bekräfta att historiken för session 1 innehåller båda turerna\n", + "\n", + "Ett ytterligare anrop av `show_history(session_1)` bör visa två frågor och svar. Detta stämmer överens med Mem0-labbets steg för \"minnesuppspelning\" och bevisar att ytterligare turer läggs till i samma transkript.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Session 2: Designgranskningstråd — Ny session\n", + "\n", + "För att visa isolering mellan trådar startar vi `design-review-session` och ber om loggningsvägledning för incidentgranskningar. Även om den underliggande kunskapsbasen är densamma, håller det nya sessions-ID:t transkriptionerna separata.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Granska Session 2 Historia\n", + "\n", + "`show_history(session_2)` ska endast lista designgranskningens prompt/svar-par. Jämför detta med Session 1 för att belysa hur Cognee håller separata transkript samtidigt som den återanvänder den gemensamma kunskapsgrafen.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Sammanfattning\n", + "\n", + "Grattis! Du har precis gett din kodassistent ett verkligt långtidsminneslager drivet av Cognee.\n", + "\n", + "I den här handledningen tog du rått utvecklarinnehåll (kod, dokumentation, chattar) och omvandlade det till ett graf- och vektorminne som din agent kan söka i, resonera kring och kontinuerligt förbättra.\n", + "\n", + "Vad du har lärt dig\n", + "\n", + "1. **Från råtext till AI-minne**: Hur Cognee tar in ostrukturerad data och omvandlar den till ett intelligent, sökbart minne med hjälp av en kombinerad vektor- och kunskapsgrafarkitektur.\n", + "\n", + "2. **Grafberikning med memify**: Hur du kan gå bortom grundläggande grafskapande och använda memify för att lägga till härledda fakta och rikare relationer ovanpå din befintliga graf.\n", + "\n", + "3. **Flera sökstrategier**: Hur du kan söka i minnet med olika söktyper (grafmedveten Q&A, RAG-stil komplettering, insikter, råa textbitar, kodsökning, etc.) beroende på vad din agent behöver.\n", + "\n", + "4. **Visuell utforskning**: Hur du kan inspektera och felsöka det som Cognee har byggt med hjälp av grafvisualiseringar och Cognee UI, så att du faktiskt kan se hur kunskapen är strukturerad.\n", + "\n", + "5. **Sessionsmedvetet minne**: Hur du kombinerar kontext per session med ett bestående semantiskt minne så att agenter kan komma ihåg mellan körningar utan att läcka information mellan användare.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Viktiga insikter\n", + "1. Minne som en kunskapsgraf stödd av inbäddningar\n", + "\n", + " - **Strukturerad förståelse**: Cognee kombinerar en vektorlagring och en graflagring så att din data både är sökbar efter betydelse och kopplad genom relationer. Cognee använder filbaserade databaser som standard (LanceDB för vektor-, Kuzu för graflagring).\n", + "\n", + " - **Relationsmedveten hämtning**: Svar kan baseras inte bara på \"liknande text\" utan också på hur entiteter är relaterade.\n", + "\n", + " - **Levande minne**: Minneslagret utvecklas, växer och förblir sökbart som en sammanhängande graf.\n", + "\n", + "2. Sök- och resonemangslägen\n", + " - **Hybridhämtning**: Sökningen kombinerar vektorsimilaritet, grafstruktur och LLM-resonemang, från rå chunk-uppslag till grafmedveten frågesvar.\n", + "\n", + " - **Anpassa läget till uppgiften**: Använd lägen för textkomplettering när du vill ha naturliga språksvar, och chunk-/sammanfattnings-/graflägen när din agent behöver rå kontext eller för att driva sitt eget resonemang.\n", + "\n", + "3. Personliga, sessionsmedvetna agenter\n", + " - **Sessionskontext + långtidsminne**: Cognee håller kortsiktig \"tråd\"-kontext separat från långlivat, användar- eller organisationsnivåminne.\n", + "\n", + "## Verkliga tillämpningar\n", + "\n", + "1. **Vertikala AI-agenter**\n", + "\n", + " Använd mönstret från denna notebook för att driva domänsmarta copiloter som bygger på Cognee som sin kärna för hämtning och resonemang:\n", + "\n", + "- **Utvecklarcopiloter**: Kodgranskning, incidentanalys och arkitekturassistenter som navigerar genom kod, API:er, design-dokument och ärenden som en enda minnesgraf.\n", + "\n", + "- **Kundfokuserade copiloter**: Support- eller framgångsagenter som hämtar från produktdokumentation, vanliga frågor, CRM-anteckningar och tidigare ärenden med grafmedveten hämtning och citerade svar.\n", + "\n", + "- **Interna expertcopiloter**: Policy-, juridik- eller säkerhetsassistenter som resonerar över sammanhängande regler, riktlinjer och historiska beslut istället för isolerade PDF-filer.\n", + "\n", + " Cognee är uttryckligen positionerat som ett bestående, exakt minne för AI-agenter, och tillhandahåller en levande kunskapsgraf som integreras bakom din agent och ersätter ad-hoc-kombinationer av vektorlager och anpassad grafkod.\n", + "\n", + "2. **Sammanföra datasilos till ett minne**\n", + "\n", + " Samma tillvägagångssätt hjälper dig också att bygga ett enhetligt minneslager över spridda källor:\n", + "\n", + "- **Från silos till en graf**: Importera strukturerad (t.ex. databaser) och ostrukturerad data (t.ex. dokument, chattar) till en enda graf stödd av inbäddningar, istället för separata index för varje system.\n", + "\n", + "- **Källöverskridande resonemang med citat**: Kör flerstegsresonemang över allt—\"koppla samman\" loggar, mätvärden och dokument via grafen—och returnera ändå grundade svar med proveniens.\n", + "\n", + "- **Kunskapshubbar**: För områden som bank eller utbildning används Cognee redan för att förena PDF-filer, interna system och appdata till en kunskapsgraf med vektorer så att agenter kan besvara frågor med exakt, citerad kontext.\n", + "\n", + "## Nästa steg\n", + "\n", + "Du har implementerat den grundläggande minnesloopen. Här är naturliga utvidgningar du kan prova själv (se [Cognee-dokumentation](https://docs.cognee.ai/) för detaljer):\n", + "\n", + "1. **Experimentera med tidsmedvetenhet**: Aktivera temporal cognify för att extrahera händelser och tidsstämplar från text.\n", + "\n", + "2. **Introducera ontologidrivet resonemang**: Definiera en OWL-ontologi för ditt område. Använd Cognees ontologistöd så att extraherade entiteter och relationer är förankrade i det schemat, vilket förbättrar grafkvaliteten och domänspecifika svar.\n", + "\n", + "3. **Lägg till en feedback-loop**: Låt Cognee justera grafkantvikter baserat på verklig användarfeedback, så att hämtningen förbättras över tid istället för att förbli statisk.\n", + "\n", + "4. **Optimera för personalisering och sessionsbeteende**: Använd användar-ID:n, hyresgäster och dataset för att ge varje person eller team sin egen vy över den delade minnesmotorn.\n", + "\n", + "5. **Skala upp till mer komplexa agenter**: Anslut Cognee till agentramverk för att bygga multi-agent-system som alla delar samma minneslager. *Microsoft Agent Framework x Cognee-plugin kommer snart.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Ansvarsfriskrivning**: \nDetta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:59:54+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "sv" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/sv/13-agent-memory/README.md b/translations/sv/13-agent-memory/README.md index 395f4cf9a..0a37d59e1 100644 --- a/translations/sv/13-agent-memory/README.md +++ b/translations/sv/13-agent-memory/README.md @@ -1,42 +1,50 @@ -# Minneshantering för AI-agenter +# Minne för AI-agenter [![Agentminne](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.sv.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -När man diskuterar de unika fördelarna med att skapa AI-agenter, nämns främst två saker: förmågan att använda verktyg för att utföra uppgifter och förmågan att förbättras över tid. Minne är grunden för att skapa självförbättrande agenter som kan ge bättre upplevelser för våra användare. +När man diskuterar de unika fördelarna med att skapa AI-agenter, nämns ofta två saker: förmågan att använda verktyg för att slutföra uppgifter och förmågan att förbättras över tid. Minne är grunden för att skapa självförbättrande agenter som kan ge bättre upplevelser för våra användare. -I denna lektion kommer vi att titta på vad minne innebär för AI-agenter och hur vi kan hantera och använda det för att förbättra våra applikationer. +I denna lektion kommer vi att titta på vad minne är för AI-agenter och hur vi kan hantera och använda det för att gynna våra applikationer. ## Introduktion Denna lektion kommer att täcka: -• **Förstå AI-agenters minne**: Vad minne är och varför det är viktigt för agenter. +• **Förstå AI-agentminne**: Vad minne är och varför det är viktigt för agenter. -• **Implementera och lagra minne**: Praktiska metoder för att lägga till minnesfunktioner i dina AI-agenter, med fokus på kortsiktigt och långsiktigt minne. +• **Implementera och lagra minne**: Praktiska metoder för att lägga till minnesfunktioner till dina AI-agenter, med fokus på kort- och långtidsminne. -• **Göra AI-agenter självförbättrande**: Hur minne gör det möjligt för agenter att lära sig från tidigare interaktioner och förbättras över tid. +• **Göra AI-agenter självförbättrande**: Hur minne gör det möjligt för agenter att lära sig av tidigare interaktioner och förbättras över tid. + +## Tillgängliga implementeringar + +Denna lektion inkluderar två omfattande handledningar i notebook-format: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Implementerar minne med Mem0 och Azure AI Search med Semantic Kernel-ramverket. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Implementerar strukturerat minne med Cognee, som automatiskt bygger en kunskapsgraf baserad på inbäddningar, visualiserar grafen och möjliggör intelligent hämtning. ## Lärandemål -Efter att ha genomfört denna lektion kommer du att kunna: +Efter att ha slutfört denna lektion kommer du att kunna: -• **Skilja mellan olika typer av AI-agenters minne**, inklusive arbetsminne, kortsiktigt och långsiktigt minne, samt specialiserade former som personaminne och episodiskt minne. +• **Skilja mellan olika typer av AI-agentminne**, inklusive arbetsminne, korttidsminne och långtidsminne, samt specialiserade former som personaminne och episodiskt minne. -• **Implementera och hantera kortsiktigt och långsiktigt minne för AI-agenter** med hjälp av Semantic Kernel-ramverket, verktyg som Mem0 och Whiteboard-minne, samt integrering med Azure AI Search. +• **Implementera och hantera kort- och långtidsminne för AI-agenter** med hjälp av Semantic Kernel-ramverket, och använda verktyg som Mem0, Cognee, Whiteboard-minne samt integrera med Azure AI Search. • **Förstå principerna bakom självförbättrande AI-agenter** och hur robusta minneshanteringssystem bidrar till kontinuerligt lärande och anpassning. -## Förstå AI-agenters minne +## Förstå AI-agentminne -I grunden innebär **minne för AI-agenter mekanismer som gör det möjligt för dem att behålla och återkalla information**. Denna information kan vara specifika detaljer om en konversation, användarpreferenser, tidigare handlingar eller till och med inlärda mönster. +I grunden handlar **minne för AI-agenter om mekanismer som gör det möjligt för dem att behålla och återkalla information**. Denna information kan vara specifika detaljer om en konversation, användarpreferenser, tidigare handlingar eller till och med inlärda mönster. Utan minne är AI-applikationer ofta tillståndslösa, vilket innebär att varje interaktion börjar från början. Detta leder till en repetitiv och frustrerande användarupplevelse där agenten "glömmer" tidigare sammanhang eller preferenser. @@ -44,13 +52,13 @@ Utan minne är AI-applikationer ofta tillståndslösa, vilket innebär att varje En agents intelligens är starkt kopplad till dess förmåga att återkalla och använda tidigare information. Minne gör det möjligt för agenter att vara: -• **Reflekterande**: Lära sig från tidigare handlingar och resultat. +• **Reflekterande**: Lära sig av tidigare handlingar och resultat. • **Interaktiva**: Bibehålla sammanhang under en pågående konversation. -• **Proaktiva och reaktiva**: Förutse behov eller svara lämpligt baserat på historiska data. +• **Proaktiva och reaktiva**: Förutse behov eller reagera lämpligt baserat på historiska data. -• **Autonoma**: Arbeta mer självständigt genom att dra nytta av lagrad kunskap. +• **Självständiga**: Arbeta mer självständigt genom att dra nytta av lagrad kunskap. Målet med att implementera minne är att göra agenter mer **pålitliga och kapabla**. @@ -58,37 +66,37 @@ Målet med att implementera minne är att göra agenter mer **pålitliga och kap #### Arbetsminne -Tänk på detta som en bit kladdpapper som en agent använder under en enda, pågående uppgift eller tankeprocess. Det håller omedelbar information som behövs för att beräkna nästa steg. +Tänk på detta som ett anteckningsblock som en agent använder under en enda, pågående uppgift eller tankeprocess. Det håller omedelbar information som behövs för att beräkna nästa steg. -För AI-agenter fångar arbetsminnet ofta den mest relevanta informationen från en konversation, även om hela chattens historik är lång eller förkortad. Det fokuserar på att extrahera nyckelelement som krav, förslag, beslut och handlingar. +För AI-agenter fångar arbetsminnet ofta den mest relevanta informationen från en konversation, även om hela chattens historik är lång eller förkortad. Det fokuserar på att extrahera nyckelelement som krav, förslag, beslut och åtgärder. **Exempel på arbetsminne** -I en resebokningsagent kan arbetsminnet fånga användarens aktuella begäran, såsom "Jag vill boka en resa till Paris". Detta specifika krav hålls i agentens omedelbara sammanhang för att styra den aktuella interaktionen. +I en resebokningsagent kan arbetsminnet fånga användarens aktuella begäran, som "Jag vill boka en resa till Paris". Detta specifika krav hålls i agentens omedelbara sammanhang för att styra den aktuella interaktionen. -#### Kortsiktigt minne +#### Korttidsminne -Denna typ av minne behåller information under en enda konversation eller session. Det är sammanhanget för den aktuella chatten, vilket gör det möjligt för agenten att referera tillbaka till tidigare turer i dialogen. +Denna typ av minne behåller information under en enda konversation eller session. Det är sammanhanget för den aktuella chatten, vilket gör det möjligt för agenten att referera till tidigare turer i dialogen. -**Exempel på kortsiktigt minne** +**Exempel på korttidsminne** -Om en användare frågar, "Hur mycket kostar en flygresa till Paris?" och sedan följer upp med "Hur är det med boende där?", säkerställer kortsiktigt minne att agenten vet att "där" syftar på "Paris" inom samma konversation. +Om en användare frågar, "Hur mycket kostar en flygresa till Paris?" och sedan följer upp med "Vad sägs om boende där?", säkerställer korttidsminnet att agenten vet att "där" syftar på "Paris" inom samma konversation. -#### Långsiktigt minne +#### Långtidsminne Detta är information som kvarstår över flera konversationer eller sessioner. Det gör det möjligt för agenter att komma ihåg användarpreferenser, historiska interaktioner eller allmän kunskap över längre perioder. Detta är viktigt för personalisering. -**Exempel på långsiktigt minne** +**Exempel på långtidsminne** -Ett långsiktigt minne kan lagra att "Ben gillar skidåkning och utomhusaktiviteter, föredrar kaffe med bergsutsikt och vill undvika avancerade skidbackar på grund av en tidigare skada". Denna information, inlärd från tidigare interaktioner, påverkar rekommendationer i framtida reseplaneringssessioner och gör dem mycket personliga. +Ett långtidsminne kan lagra att "Ben gillar skidåkning och utomhusaktiviteter, föredrar kaffe med bergsutsikt och vill undvika avancerade skidbackar på grund av en tidigare skada". Denna information, inlärd från tidigare interaktioner, påverkar rekommendationer i framtida reseplaneringssessioner och gör dem mycket personliga. #### Personaminne -Denna specialiserade typ av minne hjälper en agent att utveckla en konsekvent "personlighet" eller "persona". Det gör det möjligt för agenten att komma ihåg detaljer om sig själv eller sin avsedda roll, vilket gör interaktioner mer smidiga och fokuserade. +Denna specialiserade minnestyp hjälper en agent att utveckla en konsekvent "personlighet" eller "persona". Det gör det möjligt för agenten att komma ihåg detaljer om sig själv eller sin avsedda roll, vilket gör interaktioner mer flytande och fokuserade. **Exempel på personaminne** -Om reseagenten är designad för att vara en "expert på skidplanering", kan personaminne förstärka denna roll och påverka dess svar så att de överensstämmer med en experts ton och kunskap. +Om reseagenten är designad att vara en "expert på skidplanering", kan personaminne förstärka denna roll och påverka dess svar så att de överensstämmer med en experts ton och kunskap. #### Arbetsflöde/Episodiskt minne @@ -96,19 +104,19 @@ Detta minne lagrar sekvensen av steg en agent tar under en komplex uppgift, inkl **Exempel på episodiskt minne** -Om agenten försökte boka ett specifikt flyg men det misslyckades på grund av otillgänglighet, kan episodiskt minne registrera detta misslyckande, vilket gör det möjligt för agenten att försöka alternativa flyg eller informera användaren om problemet på ett mer informerat sätt vid ett senare försök. +Om agenten försökte boka ett specifikt flyg men det misslyckades på grund av otillgänglighet, kan episodiskt minne registrera detta misslyckande, vilket gör det möjligt för agenten att försöka med alternativa flyg eller informera användaren om problemet på ett mer informerat sätt vid ett senare försök. #### Entitetsminne -Detta innebär att extrahera och komma ihåg specifika entiteter (som personer, platser eller saker) och händelser från konversationer. Det gör det möjligt för agenten att bygga en strukturerad förståelse av nyckelelement som diskuteras. +Detta handlar om att extrahera och komma ihåg specifika entiteter (som personer, platser eller saker) och händelser från konversationer. Det gör det möjligt för agenten att bygga en strukturerad förståelse av nyckelelement som diskuterats. **Exempel på entitetsminne** -Från en konversation om en tidigare resa kan agenten extrahera "Paris", "Eiffeltornet" och "middag på Le Chat Noir-restaurang" som entiteter. Vid en framtida interaktion kan agenten komma ihåg "Le Chat Noir" och erbjuda att göra en ny reservation där. +Från en konversation om en tidigare resa kan agenten extrahera "Paris", "Eiffeltornet" och "middag på Le Chat Noir-restaurangen" som entiteter. Vid en framtida interaktion kan agenten minnas "Le Chat Noir" och erbjuda att boka en ny reservation där. #### Strukturerad RAG (Retrieval Augmented Generation) -Även om RAG är en bredare teknik, lyfts "Strukturerad RAG" fram som en kraftfull minnesteknologi. Den extraherar tät, strukturerad information från olika källor (konversationer, e-post, bilder) och använder den för att förbättra precision, återkallning och hastighet i svar. Till skillnad från klassisk RAG som enbart förlitar sig på semantisk likhet, arbetar Strukturerad RAG med informationens inneboende struktur. +Även om RAG är en bredare teknik, lyfts "Strukturerad RAG" fram som en kraftfull minnesteknik. Den extraherar tät, strukturerad information från olika källor (konversationer, e-post, bilder) och använder den för att förbättra precision, återkallning och hastighet i svar. Till skillnad från klassisk RAG som enbart förlitar sig på semantisk likhet, arbetar Strukturerad RAG med informationens inneboende struktur. **Exempel på Strukturerad RAG** @@ -116,21 +124,31 @@ Istället för att bara matcha nyckelord kan Strukturerad RAG analysera flyguppg ## Implementera och lagra minne -Att implementera minne för AI-agenter innebär en systematisk process av **minneshantering**, som inkluderar att generera, lagra, hämta, integrera, uppdatera och till och med "glömma" (eller radera) information. Hämtning är en särskilt viktig aspekt. +Att implementera minne för AI-agenter innebär en systematisk process av **minneshantering**, som inkluderar att generera, lagra, hämta, integrera, uppdatera och till och med "glömma" (eller radera) information. Hämtning är en särskilt avgörande aspekt. ### Specialiserade minnesverktyg -Ett sätt att lagra och hantera agentminne är att använda specialiserade verktyg som Mem0. Mem0 fungerar som ett beständigt minneslager, vilket gör det möjligt för agenter att återkalla relevanta interaktioner, lagra användarpreferenser och faktuell kontext, samt lära sig av framgångar och misslyckanden över tid. Idén här är att tillståndslösa agenter blir tillståndsfulla. +#### Mem0 + +Ett sätt att lagra och hantera agentminne är att använda specialiserade verktyg som Mem0. Mem0 fungerar som ett beständigt minneslager, vilket gör det möjligt för agenter att återkalla relevanta interaktioner, lagra användarpreferenser och faktuell kontext samt lära sig av framgångar och misslyckanden över tid. Idén här är att tillståndslösa agenter blir tillståndsfulla. + +Det fungerar genom en **tvåfasig minnespipeline: extraktion och uppdatering**. Först skickas meddelanden som läggs till en agents tråd till Mem0-tjänsten, som använder en Large Language Model (LLM) för att sammanfatta konversationshistorik och extrahera nya minnen. Därefter avgör en LLM-driven uppdateringsfas om dessa minnen ska läggas till, modifieras eller raderas, och lagrar dem i en hybrid datalagring som kan inkludera vektor-, graf- och nyckel-värde-databaser. Detta system stöder också olika minnestyper och kan inkludera grafminne för att hantera relationer mellan entiteter. + +#### Cognee + +Ett annat kraftfullt tillvägagångssätt är att använda **Cognee**, ett open-source semantiskt minne för AI-agenter som omvandlar strukturerad och ostrukturerad data till sökbara kunskapsgrafer baserade på inbäddningar. Cognee erbjuder en **dubbel-lagringsarkitektur** som kombinerar vektorsökning med grafrelationer, vilket gör det möjligt för agenter att förstå inte bara vilken information som är liknande, utan också hur koncept relaterar till varandra. + +Det utmärker sig i **hybridhämtning** som blandar vektorsökning, grafstruktur och LLM-resonemang - från rå chunk-uppslag till grafmedveten frågehantering. Systemet upprätthåller **levande minne** som utvecklas och växer samtidigt som det förblir sökbart som en sammanhängande graf, vilket stöder både kortsiktigt sessionssammanhang och långsiktigt beständigt minne. -Det fungerar genom en **tvåfasig minnespipeline: extraktion och uppdatering**. Först skickas meddelanden som läggs till en agents tråd till Mem0-tjänsten, som använder en Large Language Model (LLM) för att sammanfatta konversationshistorik och extrahera nya minnen. Därefter avgör en LLM-driven uppdateringsfas om dessa minnen ska läggas till, modifieras eller raderas, och lagrar dem i en hybrid datalagring som kan inkludera vektor-, graf- och nyckelvärdesdatabaser. Detta system stöder också olika minnestyper och kan integrera grafminne för att hantera relationer mellan entiteter. +Handledningen i Cognee-notebooken ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) visar hur man bygger detta enhetliga minneslager, med praktiska exempel på att mata in olika datakällor, visualisera kunskapsgrafen och göra frågor med olika sökstrategier anpassade till specifika agentbehov. ### Lagra minne med RAG Utöver specialiserade minnesverktyg som Mem0 kan du använda robusta söktjänster som **Azure AI Search som backend för att lagra och hämta minnen**, särskilt för strukturerad RAG. -Detta gör det möjligt att grunda agentens svar med din egen data, vilket säkerställer mer relevanta och korrekta svar. Azure AI Search kan användas för att lagra användarspecifika reseminnen, produktkataloger eller annan domänspecifik kunskap. +Detta gör det möjligt att grunda agentens svar på din egen data, vilket säkerställer mer relevanta och korrekta svar. Azure AI Search kan användas för att lagra användarspecifika reseminnen, produktkataloger eller annan domänspecifik kunskap. -Azure AI Search stöder funktioner som **Strukturerad RAG**, som utmärker sig vid att extrahera och hämta tät, strukturerad information från stora dataset som konversationshistorik, e-post eller till och med bilder. Detta ger "övermänsklig precision och återkallning" jämfört med traditionella textchunking- och inbäddningsmetoder. +Azure AI Search stöder funktioner som **Strukturerad RAG**, som utmärker sig i att extrahera och hämta tät, strukturerad information från stora dataset som konversationshistorik, e-post eller till och med bilder. Detta ger "övermänsklig precision och återkallning" jämfört med traditionella textchunking- och inbäddningsmetoder. ## Göra AI-agenter självförbättrande @@ -146,7 +164,7 @@ Ett vanligt mönster för självförbättrande agenter innebär att introducera ### Optimeringar för minne -• **Latenshantering**: För att undvika att sakta ner användarinteraktioner kan en billigare, snabbare modell användas initialt för att snabbt kontrollera om information är värd att lagra eller hämta, och endast använda den mer komplexa extraktions-/hämtprocessen vid behov. +• **Latenshantering**: För att undvika att sakta ner användarinteraktioner kan en billigare, snabbare modell användas initialt för att snabbt kontrollera om information är värd att lagra eller hämta, och endast aktivera den mer komplexa extraktions-/hämtprocessen vid behov. • **Underhåll av kunskapsbas**: För en växande kunskapsbas kan mindre frekvent använd information flyttas till "kall lagring" för att hantera kostnader. @@ -156,5 +174,7 @@ Gå med i [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) för att --- + **Ansvarsfriskrivning**: -Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. \ No newline at end of file +Detta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess ursprungliga språk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning. + \ No newline at end of file diff --git a/translations/sw/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/sw/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..cacb33183 --- /dev/null +++ b/translations/sw/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Kujenga Mawakala wa AI wenye Kumbukumbu Endelevu kwa kutumia Cognee\n", + "\n", + "Notibuku hii inaonyesha jinsi ya kujenga mawakala wa AI wenye akili na uwezo wa kumbukumbu wa hali ya juu kwa kutumia [**cognee**](https://www.cognee.ai/) - kumbukumbu ya AI ya chanzo huria inayochanganya grafu za maarifa, utafutaji wa maana, na usimamizi wa vikao ili kuunda mifumo ya AI inayotambua muktadha.\n", + "\n", + "## 🎯 Malengo ya Kujifunza\n", + "\n", + "Ifikapo mwisho wa mafunzo haya, utaelewa jinsi ya:\n", + "- **Kujenga Grafu za Maarifa Zinazoungwa na Embeddings**: Kubadilisha maandishi yasiyo na muundo kuwa maarifa yaliyopangiliwa na yanayoweza kuulizwa\n", + "- **Kutumia Kumbukumbu ya Kikao**: Kuunda mazungumzo ya mizunguko mingi yenye uhifadhi wa muktadha wa kiotomatiki\n", + "- **Kuhifadhi Mazungumzo**: Kwa hiari, kuhifadhi mwingiliano muhimu katika kumbukumbu ya muda mrefu kwa marejeleo ya baadaye\n", + "- **Kuuliza kwa Kutumia Lugha Asilia**: Kupata na kutumia muktadha wa kihistoria katika mazungumzo mapya\n", + "- **Kuonyesha Kumbukumbu**: Kuchunguza mahusiano katika grafu ya maarifa ya wakala wako\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Kile Utakachojenga\n", + "\n", + "Katika mafunzo haya, tutatengeneza **Msaidizi wa Uandishi wa Nambari** mwenye kumbukumbu endelevu ambaye:\n", + "\n", + "### 1. **Ujenzi wa Hifadhidata ya Maarifa**\n", + " - Huchukua taarifa za wasifu wa msanidi programu na utaalamu wake\n", + " - Hushughulikia kanuni na mbinu bora za programu ya Python\n", + " - Huhifadhi mazungumzo ya kihistoria kati ya wasanidi programu na wasaidizi wa AI\n", + "\n", + "### 2. **Mazungumzo Yenye Ufahamu wa Kikao**\n", + " - Hudumisha muktadha katika maswali mengi ndani ya kikao kimoja\n", + " - Hujiwekea kiotomatiki kila jozi ya swali/jibu kwa urejeshaji wa haraka\n", + " - Hutoa majibu yenye muktadha na yanayolingana kulingana na historia ya mazungumzo\n", + "\n", + "### 3. **Kumbukumbu ya Muda Mrefu**\n", + " - Huhifadhi mazungumzo muhimu katika kumbukumbu ya muda mrefu\n", + " - Hurejesha kumbukumbu husika kutoka kwenye hifadhidata ya maarifa na vikao vya awali ili kuarifu mwingiliano mpya\n", + " - Huunda hifadhidata ya maarifa inayokua na kuboreka kwa muda\n", + "\n", + "### 4. **Urejeshaji wa Kumbukumbu wa Akili**\n", + " - Hutumia utafutaji wa semantiki unaojua grafu ili kupata taarifa husika katika maarifa yote yaliyohifadhiwa\n", + " - Huchuja utafutaji kwa vikundi vidogo vya data (taarifa za msanidi programu dhidi ya kanuni)\n", + " - Huchanganya vyanzo mbalimbali vya data ili kutoa majibu ya kina\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Mahitaji & Usanidi\n", + "\n", + "### Mahitaji ya Mfumo\n", + "\n", + "Kabla ya kuanza, hakikisha unayo:\n", + "\n", + "1. **Mazingira ya Python**\n", + " - Python 3.9 au ya juu zaidi\n", + " - Mazingira ya virtual (inapendekezwa)\n", + " \n", + "2. **Hifadhi ya Redis** (Inahitajika kwa Usimamizi wa Vikao)\n", + " - Redis ya ndani: `docker run -d -p 6379:6379 redis`\n", + " - Au tumia huduma ya Redis inayosimamiwa\n", + " \n", + "3. **Ufikiaji wa API ya LLM**\n", + " - Funguo ya API ya OpenAI au watoa huduma wengine (angalia [hati](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Usanidi wa Hifadhidata**\n", + " - Hakuna usanidi unaohitajika kwa chaguo-msingi. Cognee hutumia hifadhidata zinazotegemea faili (LanceDB na Kuzu)\n", + " - Kwa hiari, unaweza kusanidi Azure AI Search kama duka la vector (angalia [hati](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Usanidi wa Mazingira\n", + "\n", + "Tengeneza faili `.env` kwenye saraka ya mradi wako na vigezo vifuatavyo:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Kuelewa Muundo wa Kumbukumbu ya Cognee\n", + "\n", + "### Jinsi Cognee Inavyofanya Kazi\n", + "\n", + "Cognee inatoa mfumo wa kumbukumbu wa hali ya juu unaozidi uhifadhi rahisi wa funguo na thamani:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Vipengele Muhimu:\n", + "\n", + "1. **Grafu ya Maarifa**: Huhifadhi vyombo, mahusiano, na miunganisho ya kisemantiki\n", + "2. **Vector Embeddings**: Huwezesha utafutaji wa kisemantiki katika taarifa zote zilizohifadhiwa\n", + "3. **Cache ya Kikao**: Hudumisha muktadha wa mazungumzo ndani na kati ya vikao\n", + "4. **NodeSets**: Huandaa data katika makundi ya kimantiki kwa upatikanaji ulioelekezwa\n", + "\n", + "### Aina za Kumbukumbu Katika Mafunzo Haya:\n", + "\n", + "- **Kumbukumbu ya Kudumu**: Uhifadhi wa muda mrefu katika grafu ya maarifa\n", + "- **Kumbukumbu ya Kikao**: Muktadha wa muda wa mazungumzo katika cache ya Redis\n", + "- **Kumbukumbu ya Kisemantiki**: Utafutaji wa mfanano wa msingi wa vector katika data yote\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Sakinisha Vifurushi Vinavyohitajika\n", + "\n", + "Sakinisha Cognee pamoja na msaada wa Redis kwa usimamizi wa vikao:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Anzisha Mazingira na Pakia Maktaba\n", + "\n", + "Hakikisha:\n", + "1. Redis inafanya kazi (mfano, kupitia Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Vigezo vya mazingira vimewekwa kabla ya kuingiza moduli za cache\n", + "3. Ikiwa inahitajika, anzisha upya kernel na endesha seli kwa mpangilio\n", + "\n", + "Seli ifuatayo itafanya:\n", + "1. Kupakia vigezo vya mazingira kutoka `.env`\n", + "2. Kusawazisha Cognee na mipangilio yako ya LLM\n", + "3. Kuwezesha kuhifadhi cache kwa usimamizi wa kikao\n", + "4. Kuhakikisha vipengele vyote vimeunganishwa ipasavyo\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Sanidi Saraka za Hifadhi\n", + "\n", + "Cognee hutumia saraka mbili tofauti kwa shughuli zake:\n", + "- **Data Root**: Huhifadhi nyaraka zilizoingizwa na data iliyochakatwa\n", + "- **System Root**: Inajumuisha hifadhidata ya grafu ya maarifa na metadata ya mfumo\n", + "\n", + "Tutaunda saraka zilizotengwa kwa mafunzo haya kama ifuatavyo:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Weka Upya Hali ya Kumbukumbu\n", + "\n", + "Kabla ya kuanza kujenga mfumo wetu wa kumbukumbu, hebu tuhakikishe tunaanza upya.\n", + "\n", + "> 💡 **Kidokezo**: Unaweza kuruka hatua hii ikiwa unataka kuhifadhi kumbukumbu zilizopo kutoka kwa majaribio yako ya awali unapoitumia daftari hili baadaye.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Sehemu ya 1: Kujenga Msingi wa Maarifa\n", + "\n", + "### Vyanzo vya Data kwa Msaidizi wa Wataalamu wa Maendeleo\n", + "\n", + "Tutakusanya aina tatu za data ili kuunda msingi wa maarifa wa kina:\n", + "\n", + "1. **Profaili ya Mtaalamu wa Maendeleo**: Utaalamu wa kibinafsi na historia ya kiufundi \n", + "2. **Mbinu Bora za Python**: Zen ya Python pamoja na miongozo ya vitendo \n", + "3. **Mazungumzo ya Kihistoria**: Maswali na majibu ya awali kati ya wataalamu wa maendeleo na wasaidizi wa AI \n", + "\n", + "Data hii tofauti inamruhusu wakala wetu: \n", + "- Kuelewa muktadha wa kiufundi wa mtumiaji \n", + "- Kutumia mbinu bora katika mapendekezo \n", + "- Kujifunza kutoka kwa mwingiliano wa awali uliofanikiwa \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Badilisha Data Kuwa Grafu ya Maarifa\n", + "\n", + "Sasa tutabadilisha maandishi yetu ghafi kuwa kumbukumbu iliyopangiliwa. Mchakato huu:\n", + "\n", + "1. **Huongeza data kwenye NodeSets**: Hupanga taarifa katika makundi ya kimantiki\n", + " - `developer_data`: Profaili za waendelezaji na mazungumzo yao\n", + " - `principles_data`: Miongozo na mbinu bora za Python\n", + "\n", + "2. **Inaendesha Mchakato wa Cognify**: Hutoa vyombo, mahusiano, na huunda embeddings\n", + " - Inatambua dhana kuu\n", + " - Inaunda uhusiano wa kimantiki kati ya taarifa zinazohusiana\n", + " - Inazalisha vector embeddings\n", + "\n", + "Hii inaweza kuchukua muda kidogo wakati LLM inachakata maandishi na kujenga muundo wa grafu:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Angalia Mchoro wa Maarifa\n", + "\n", + "Hebu tuchunguze muundo wa mchoro wetu wa maarifa. Mchoro unaonyesha:\n", + "- **Nodes**: Vitu vilivyotolewa kutoka kwenye maandishi (dhana, teknolojia, watu)\n", + "- **Edges**: Mahusiano na miunganisho kati ya vitu\n", + "- **Clusters**: Dhana zinazohusiana zimepangwa kwa kufanana kwa maana\n", + "\n", + "Fungua faili la HTML lililotengenezwa kwenye kivinjari chako ili kuchunguza mchoro huo kwa njia ya mwingiliano:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Kuimarisha Kumbukumbu kwa Memify\n", + "\n", + "Kazi ya `memify()` inachambua grafu ya maarifa na kutengeneza sheria za akili kuhusu data. Mchakato huu:\n", + "- Hutambua mifumo na mbinu bora\n", + "- Hutengeneza miongozo inayoweza kutekelezwa kulingana na maudhui\n", + "- Huanzisha uhusiano kati ya maeneo tofauti ya maarifa\n", + "\n", + "Sheria hizi husaidia wakala kufanya maamuzi ya busara zaidi wakati wa kujibu maswali. Kuchukua taswira ya pili hukusaidia kulinganisha jinsi grafu inavyokuwa na wingi zaidi mara baada ya kuimarishwa.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Sehemu ya 2: Urejeshaji wa Kumbukumbu Mahiri\n", + "\n", + "### Maonyesho 1: Ujumuishaji wa Maarifa kutoka Nyaraka Tofauti\n", + "\n", + "Sasa kwa kuwa grafu yetu ya maarifa imejengwa, hebu tujaribu jinsi Cognee inavyounganisha taarifa kutoka vyanzo mbalimbali kujibu maswali changamano.\n", + "\n", + "Swali la kwanza linaonyesha:\n", + "- **Uelewa wa kisemantiki**: Kupata dhana zinazohusiana hata kama hazikutajwa moja kwa moja\n", + "- **Marejeleo ya msalaba**: Kuchanganya wasifu wa msanidi programu na kanuni za Python\n", + "- **Ufikiri wa muktadha**: Kutumia mbinu bora kwa utekelezaji maalum\n", + "\n", + "### Maonyesho 2: Utafutaji Uliochujwa kwa NodeSets\n", + "\n", + "Swali la pili linaonyesha jinsi ya kulenga sehemu maalum za grafu ya maarifa:\n", + "- Linatumia kipengele cha `node_name` kutafuta ndani ya `principles_data` pekee\n", + "- Linatoa majibu yaliyolengwa kutoka kwa uwanja maalum wa maarifa\n", + "- Ni muhimu unapohitaji taarifa za uwanja maalum\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Sehemu ya 3: Usanidi wa Usimamizi wa Kikao\n", + "\n", + "### Kuwezesha Kumbukumbu ya Mazungumzo\n", + "\n", + "Usimamizi wa kikao ni muhimu kwa kudumisha muktadha katika mwingiliano mingi. Hapa tutafanya:\n", + "\n", + "1. **Kuanza Muktadha wa Mtumiaji**: Unda au pata wasifu wa mtumiaji kwa ajili ya kufuatilia kikao\n", + "2. **Sanidi Injini ya Akiba**: Unganisha na Redis kwa kuhifadhi historia ya mazungumzo\n", + "3. **Wezesha Vigezo vya Kikao**: Sanidi vigezo vya muktadha vinavyodumu kati ya maswali\n", + "\n", + "> ⚠️ **Muhimu**: Hii inahitaji Redis iwe inafanya kazi na `CACHING=true` katika mazingira yako\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Kazi ya Msaidizi: Tazama Historia ya Kikao\n", + "\n", + "Kazi hii ya zana inatuwezesha kuchunguza historia ya mazungumzo iliyohifadhiwa kwenye Redis. Ni muhimu kwa:\n", + "- Kutatua matatizo ya usimamizi wa kikao\n", + "- Kuhakikisha kwamba mazungumzo yanahifadhiwa\n", + "- Kuelewa muktadha gani unapatikana kwa wakala\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Kikao cha 1: Maabara ya Usaidizi wa Async — Swali la Kwanza\n", + "\n", + "Anzisha kikao cha `async-support-lab` kwa kuuliza kuhusu mifumo ya asyncio inayofaa kwa telemetry kwa ajili ya programu kubwa ya kuchakata wavuti. Grafu tayari inajua kuhusu asyncio, aiohttp, na mbinu za ufuatiliaji, kwa hivyo jibu linapaswa kufanana na mazungumzo ya awali huku likibadilishwa kulingana na swali jipya.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Kagua Kumbukumbu ya Kikao cha 1 Baada ya Kubadilishana kwa Mara ya Kwanza\n", + "\n", + "Kuendesha `show_history(session_1)` mara tu baada ya swali la awali kunathibitisha kwamba Cognee aliandika maelezo ya awali na jibu kwenye Redis. Unapaswa kuona ingizo moja lenye mwongozo wa ushirikiano.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Kikao cha 1: Ufuatiliaji wa Miundo ya Data\n", + "\n", + "Sasa tunauliza, \"Ni lini napaswa kuchagua dataclasses badala ya Pydantic?\" tukitumia kitambulisho cha kikao hicho hicho. Cognee inapaswa kuunganisha kanuni za Python pamoja na mazungumzo ya awali ya FastAPI ili kutoa ushauri wa kina—ikionyesha kwamba muktadha unahifadhiwa ndani ya kikao kilichopewa jina.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Thibitisha Historia ya Kikao 1 Ina Zamu Zote Mbili\n", + "\n", + "Wito mwingine wa `show_history(session_1)` unapaswa kuonyesha maingizo mawili ya Maswali na Majibu. Hii inalingana na hatua ya \"kurejesha kumbukumbu\" ya maabara ya Mem0 na inathibitisha kwamba zamu za ziada zinaongeza maandishi yale yale.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Kipindi cha 2: Mjadala wa Mapitio ya Ubunifu — Kipindi Kipya\n", + "\n", + "Ili kuonyesha kutengwa kati ya mijadala, tunaanzisha `design-review-session` na kuomba mwongozo wa kurekodi kwa ajili ya mapitio ya matukio. Ingawa msingi wa maarifa ni ule ule, kitambulisho kipya cha kipindi kinahakikisha mazungumzo yanabaki tofauti.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Kikao cha Mapitio 2 Historia\n", + "\n", + "`show_history(session_2)` inapaswa kuonyesha tu jozi ya maelekezo/majibu ya mapitio ya muundo. Linganisha na Kikao cha 1 ili kuonyesha jinsi Cognee inavyohifadhi maandishi huru huku ikitumia tena grafu ya maarifa ya pamoja.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Muhtasari\n", + "\n", + "Hongera! Umeipa msaidizi wako wa programu safu ya kumbukumbu ya muda mrefu inayotumia Cognee.\n", + "\n", + "Katika mafunzo haya, umechukua maudhui ghafi ya msanidi programu (kodi, nyaraka, mazungumzo) na kuyageuza kuwa grafu + kumbukumbu ya vekta ambayo wakala wako anaweza kuitafuta, kuichambua, na kuiboresha kila mara.\n", + "\n", + "Ulichopata Kujifunza\n", + "\n", + "1. **Kutoka maandishi ghafi hadi kumbukumbu ya AI**: Jinsi Cognee inavyopokea data isiyo na muundo na kuibadilisha kuwa kumbukumbu yenye akili, inayoweza kutafutwa kwa kutumia usanifu wa vekta + grafu ya maarifa.\n", + "\n", + "2. **Kuimarisha grafu kwa memify**: Jinsi ya kwenda zaidi ya uundaji wa grafu ya msingi na kutumia memify kuongeza ukweli uliochanganuliwa na mahusiano tajiri zaidi juu ya grafu yako iliyopo.\n", + "\n", + "3. **Mikakati mbalimbali ya utafutaji**: Jinsi ya kuuliza kumbukumbu kwa aina tofauti za utafutaji (maswali na majibu yanayojua grafu, kukamilisha mtindo wa RAG, maarifa, vipande ghafi, utafutaji wa kodi, n.k.) kulingana na mahitaji ya wakala wako.\n", + "\n", + "4. **Uchunguzi wa kuona**: Jinsi ya kukagua na kurekebisha kile Cognee ilichojenga kwa kutumia taswira za grafu na UI ya Cognee, ili uweze kuona jinsi maarifa yanavyopangwa.\n", + "\n", + "5. **Kumbukumbu inayojua kikao**: Jinsi ya kuchanganya muktadha wa kila kikao na kumbukumbu ya semantiki ya kudumu ili mawakala waweze kukumbuka kati ya vipindi bila kuvuja taarifa kati ya watumiaji.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Mambo Muhimu ya Kuzingatia\n", + "1. Kumbukumbu kama Grafu ya Maarifa inayotegemea Embeddings\n", + "\n", + " - **Uelewa uliopangiliwa**: Cognee inachanganya hifadhi ya vekta na hifadhi ya grafu ili data yako iweze kutafutwa kwa maana na kuunganishwa kwa mahusiano. Cognee hutumia hifadhidata za faili kwa chaguo-msingi (LanceDB kwa vekta, Kuzu kwa hifadhidata ya grafu).\n", + "\n", + " - **Urejeshaji unaojua mahusiano**: Majibu yanaweza kuzingatia sio tu \"maandishi yanayofanana,\" bali pia jinsi vyombo vinavyohusiana.\n", + "\n", + " - **Kumbukumbu hai**: Safu ya kumbukumbu inabadilika, inakua, na inabaki kuwa ya kuulizwa kama grafu moja iliyounganishwa.\n", + "\n", + "2. Njia za Utafutaji na Utoaji Sababu\n", + " - **Urejeshaji mseto**: Utafutaji unachanganya mfanano wa vekta, muundo wa grafu, na utoaji sababu wa LLM, kutoka kutafuta vipande vya msingi hadi kujibu maswali kwa kuzingatia grafu.\n", + "\n", + " - **Linganishia hali na kazi**: Tumia hali za mtindo wa kukamilisha unapotaka majibu ya lugha asilia, na hali za vipande/muhtasari/grafu wakati wakala wako anahitaji muktadha wa msingi au kuendesha utoaji wake wa sababu.\n", + "\n", + "3. Mawakala Waliobinafsishwa, Wanaojua Muktadha wa Kikao\n", + " - **Muktadha wa kikao + kumbukumbu ya muda mrefu**: Cognee hutenganisha muktadha wa muda mfupi wa \"thread\" na kumbukumbu ya muda mrefu ya mtumiaji au shirika.\n", + "\n", + "## Matumizi ya Kwenye Ulimwengu Halisi\n", + "\n", + "1. **Mawakala wa AI Wima**\n", + "\n", + " Tumia muundo kutoka kwenye daftari hili kuendesha wasaidizi wa akili wa kikoa wanaotegemea Cognee kama msingi wa urejeshaji na utoaji sababu:\n", + "\n", + "- **Wasaidizi wa waendelezaji**: Mapitio ya msimbo, uchambuzi wa matukio, na wasaidizi wa usanifu wanaovinjari msimbo, API, nyaraka za muundo, na tiketi kama grafu moja ya kumbukumbu.\n", + "\n", + "- **Wasaidizi wa wateja**: Mawakala wa msaada au mafanikio wanaovuta kutoka nyaraka za bidhaa, Maswali Yanayoulizwa Mara kwa Mara, maelezo ya CRM, na tiketi za zamani kwa urejeshaji unaojua grafu na majibu yaliyonukuliwa.\n", + "\n", + "- **Wasaidizi wa wataalamu wa ndani**: Wasaidizi wa sera, sheria, au usalama wanaotoa sababu juu ya sheria, miongozo, na maamuzi ya kihistoria yaliyounganishwa badala ya PDF zilizotengwa.\n", + "\n", + " Cognee imewekwa wazi kama kumbukumbu ya kudumu, sahihi kwa mawakala wa AI, ikitoa grafu ya maarifa hai inayochukua nafasi nyuma ya wakala wako na kubadilisha mchanganyiko wa hifadhi za vekta na msimbo wa grafu maalum.\n", + "\n", + "2. **Kuunganisha Silos za Data kuwa Kumbukumbu Moja**\n", + "\n", + " Mbinu hiyo hiyo pia inakusaidia kujenga safu ya kumbukumbu iliyounganishwa kwenye vyanzo vilivyotawanyika:\n", + "\n", + "- **Kutoka silos hadi grafu moja**: Ingiza data iliyopangiliwa (mfano, hifadhidata) na data isiyo na muundo (mfano, nyaraka, mazungumzo) kwenye grafu moja inayoungwa mkono na embeddings, badala ya faharasa tofauti kwa kila mfumo.\n", + "\n", + "- **Utoaji sababu wa vyanzo mbalimbali na nukuu**: Fanya utoaji sababu wa hatua nyingi juu ya kila kitu—\"unganisha\" magogo, vipimo, na nyaraka kupitia grafu—na bado urudishe majibu yaliyo na msingi na chanzo.\n", + "\n", + "- **Vituo vya maarifa**: Kwa maeneo kama benki au elimu, Cognee tayari inatumika kuunganisha PDF, mifumo ya ndani, na data ya programu kuwa grafu moja ya maarifa yenye vekta ili mawakala waweze kujibu maswali kwa muktadha sahihi, uliotajwa.\n", + "\n", + "## Hatua Zifuatazo\n", + "\n", + "Umeanzisha mzunguko wa msingi wa kumbukumbu. Hapa kuna upanuzi wa asili unaweza kujaribu mwenyewe (angalia [nyaraka za Cognee](https://docs.cognee.ai/) kwa maelezo zaidi):\n", + "\n", + "1. **Jaribu ufahamu wa muda**: Washa \"temporal cognify\" ili kutoa matukio na mihuri ya muda kutoka kwenye maandishi.\n", + "\n", + "2. **Tumia utoaji sababu unaoendeshwa na ontolojia**: Fafanua ontolojia ya OWL kwa kikoa chako. Tumia msaada wa ontolojia wa Cognee ili vyombo na mahusiano yaliyotolewa viwe na msingi katika mpangilio huo, kuboresha ubora wa grafu na majibu maalum ya kikoa.\n", + "\n", + "3. **Ongeza mzunguko wa maoni**: Ruhusu Cognee kurekebisha uzito wa kingo za grafu kutoka maoni halisi ya watumiaji, ili urejeshaji uboreke kwa muda badala ya kubaki tuli.\n", + "\n", + "4. **Rekebisha kwa ubinafsishaji na tabia ya kikao**: Tumia vitambulisho vya watumiaji, wapangaji, na seti za data ili kumpa kila mtu au timu mtazamo wao wenyewe juu ya injini ya kumbukumbu iliyoshirikiwa.\n", + "\n", + "5. **Panua hadi kwa mawakala ngumu zaidi**: Unganisha Cognee kwenye mifumo ya mawakala ili kujenga mifumo ya mawakala wengi ambayo yote yanashiriki safu moja ya kumbukumbu. *Microsoft Agent Framework x Cognee plugin inakuja hivi karibuni.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Kanusho**: \nHati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:21:04+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "sw" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/sw/13-agent-memory/README.md b/translations/sw/13-agent-memory/README.md index f49745ed4..fcdf5d71c 100644 --- a/translations/sw/13-agent-memory/README.md +++ b/translations/sw/13-agent-memory/README.md @@ -1,8 +1,8 @@ **Kanusho**: -Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kuhakikisha usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya awali inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii. \ No newline at end of file +Hati hii imetafsiriwa kwa kutumia huduma ya tafsiri ya AI [Co-op Translator](https://github.com/Azure/co-op-translator). Ingawa tunajitahidi kwa usahihi, tafadhali fahamu kuwa tafsiri za kiotomatiki zinaweza kuwa na makosa au kutokuwa sahihi. Hati ya asili katika lugha yake ya kiasili inapaswa kuzingatiwa kama chanzo cha mamlaka. Kwa taarifa muhimu, tafsiri ya kitaalamu ya binadamu inapendekezwa. Hatutawajibika kwa kutoelewana au tafsiri zisizo sahihi zinazotokana na matumizi ya tafsiri hii. + \ No newline at end of file diff --git a/translations/ta/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/ta/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..65c5e13e3 --- /dev/null +++ b/translations/ta/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Cognee பயன்படுத்தி நிலையான நினைவகத்துடன் AI முகவர்களை உருவாக்குதல்\n", + "\n", + "இந்த நோட்புக் [**cognee**](https://www.cognee.ai/) - ஒரு திறந்த மூல AI நினைவகம், இது அறிவு வரைபடங்கள், அர்த்தமுள்ள தேடல் மற்றும் அமர்வு மேலாண்மையை இணைத்து சூழ்நிலை உணர்ந்த AI அமைப்புகளை உருவாக்குகிறது - பயன்படுத்தி மேம்பட்ட நினைவக திறன்களுடன் நுண்ணறிவு AI முகவர்களை உருவாக்குவது எப்படி என்பதை விளக்குகிறது.\n", + "\n", + "## 🎯 கற்றல் நோக்கங்கள்\n", + "\n", + "இந்த பாடத்திட்டத்தின் முடிவில், நீங்கள் கீழ்கண்டவற்றை புரிந்துகொள்வீர்கள்:\n", + "- **உருவாக்கப்பட்ட அறிவு வரைபடங்கள்**: அமைப்பற்ற உரையை அமைப்பான, கேள்வி கேட்கக்கூடிய அறிவாக மாற்றுதல்\n", + "- **அமர்வு நினைவகத்தை செயல்படுத்துதல்**: தன்னியக்க சூழ்நிலை தக்கவைத்துக்கொள்ளும் பல முறை உரையாடல்களை உருவாக்குதல்\n", + "- **உரையாடல்களை நிலைப்படுத்துதல்**: முக்கியமான தொடர்புகளை நீண்டகால நினைவகத்தில் சேமித்து எதிர்காலத்தில் பயன்படுத்துதல்\n", + "- **இயல்பான மொழி மூலம் கேள்வி கேட்குதல்**: புதிய உரையாடல்களில் வரலாற்று சூழ்நிலையை அணுகி பயன்படுத்துதல்\n", + "- **நினைவகத்தை காட்சிப்படுத்துதல்**: உங்கள் முகவரின் அறிவு வரைபடத்தில் உள்ள உறவுகளை ஆராய்தல்\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ நீங்கள் உருவாக்கப் போகும்து\n", + "\n", + "இந்த பாடத்தில், **Coding Assistant** ஒன்றை நிரந்தர நினைவுடன் உருவாக்கப் போகிறோம், இது:\n", + "\n", + "### 1. **அறிவுக் களத்தை உருவாக்குதல்**\n", + " - டெவலப்பர் சுயவிவர மற்றும் திறமைகள் பற்றிய தகவல்களை சேர்க்கிறது\n", + " - Python நிரலாக்கக் கொள்கைகள் மற்றும் சிறந்த நடைமுறைகளை செயலாக்குகிறது\n", + " - டெவலப்பர்கள் மற்றும் AI உதவியாளர்களுக்கிடையேயான வரலாற்று உரையாடல்களை சேமிக்கிறது\n", + "\n", + "### 2. **அமர்வு-அறிந்த உரையாடல்கள்**\n", + " - ஒரே அமர்வில் பல கேள்விகளுக்கு இடையே சூழலை பராமரிக்கிறது\n", + " - ஒவ்வொரு கேள்வி/பதில் ஜோடியையும் தானாகவே சேமித்து, வேகமான தேடலுக்காக கையாண்டு விடுகிறது\n", + " - உரையாடல் வரலாற்றின் அடிப்படையில் தெளிவான, சூழலுக்கு ஏற்ப பதில்களை வழங்குகிறது\n", + "\n", + "### 3. **நீண்டகால நினைவகம்**\n", + " - முக்கியமான உரையாடல்களை நீண்டகால நினைவகத்தில் சேமிக்கிறது\n", + " - புதிய தொடர்புகளுக்கு தகவல் வழங்க, அறிவுக் களத்திலிருந்து மற்றும் கடந்த அமர்வுகளிலிருந்து தொடர்புடைய நினைவுகளை மீட்டெடுக்கிறது\n", + " - காலத்திற்கேற்ப மேம்படும் ஒரு வளர்ந்துவரும் அறிவுக் களத்தை உருவாக்குகிறது\n", + "\n", + "### 4. **புத்திசாலி நினைவக மீட்பு**\n", + " - அனைத்து சேமிக்கப்பட்ட அறிவுகளிலும் தொடர்புடைய தகவல்களை கண்டுபிடிக்க, graph-aware semantic search பயன்படுத்துகிறது\n", + " - தேடல்களை தரவுக் குழுக்களால் (டெவலப்பர் தகவல் vs. கொள்கைகள்) வடிகட்டுகிறது\n", + " - பல தரவூட்டங்களை இணைத்து விரிவான பதில்களை வழங்குகிறது\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 முன்னேற்பாடுகள் மற்றும் அமைப்பு\n", + "\n", + "### கணினி தேவைகள்\n", + "\n", + "தொடங்குவதற்கு முன், உங்களிடம் பின்வரும் உள்ளதா என்பதை உறுதிப்படுத்துங்கள்:\n", + "\n", + "1. **Python சூழல்**\n", + " - Python 3.9 அல்லது அதற்கு மேல்\n", + " - மெய்நிகர் சூழல் (பரிந்துரைக்கப்படுகிறது)\n", + " \n", + "2. **Redis Cache** (அமர்வு மேலாண்மைக்கு தேவை)\n", + " - உள்ளூர் Redis: `docker run -d -p 6379:6379 redis`\n", + " - அல்லது நிர்வகிக்கப்பட்ட Redis சேவையைப் பயன்படுத்தவும்\n", + " \n", + "3. **LLM API அணுகல்**\n", + " - OpenAI API விசை அல்லது பிற வழங்குநர்கள் (இங்கே பார்க்கவும் [documentation](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **தரவுத்தள அமைப்பு**\n", + " - இயல்பாக எந்த அமைப்பும் தேவையில்லை. Cognee கோப்பு அடிப்படையிலான தரவுத்தளங்களை (LanceDB மற்றும் Kuzu) பயன்படுத்துகிறது\n", + " - விருப்பமாக, Azure AI Search ஐ ஒரு வெக்டர் சேமிப்பாக அமைக்கலாம் (இங்கே பார்க்கவும் [documentation](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### சூழல் அமைப்பு\n", + "\n", + "உங்கள் திட்ட அடைவில் `.env` கோப்பை பின்வரும் மாறிகளுடன் உருவாக்கவும்:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Cognee நினைவக கட்டமைப்பை புரிந்துகொள்வது\n", + "\n", + "### Cognee எப்படி செயல்படுகிறது\n", + "\n", + "Cognee ஒரு மேம்பட்ட நினைவக அமைப்பை வழங்குகிறது, இது எளிய முக்கிய-மதிப்பு சேமிப்பை விட அதிகமாக செயல்படுகிறது:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### முக்கிய கூறுகள்:\n", + "\n", + "1. **அறிவியல் வரைபடம்**: பொருட்கள், உறவுகள் மற்றும் அர்த்தமான இணைப்புகளை சேமிக்கிறது\n", + "2. **வெக்டர் எம்பெடிங்க்ஸ்**: சேமிக்கப்பட்ட அனைத்து தகவல்களிலும் அர்த்தமான தேடலை சாத்தியமாக்குகிறது\n", + "3. **அமர்வு கேஷ்**: உரையாடல் சூழலை அமர்வுகளுக்குள் மற்றும் வெளியே பராமரிக்கிறது\n", + "4. **NodeSets**: தரவுகளை இலக்குக்கான தேடலுக்காக தார்மீக வகைகளில் ஒழுங்குபடுத்துகிறது\n", + "\n", + "### இந்த பாடத்தில் உள்ள நினைவக வகைகள்:\n", + "\n", + "- **நிலையான நினைவகம்**: அறிவியல் வரைபடத்தில் நீண்டகால சேமிப்பு\n", + "- **அமர்வு நினைவகம்**: Redis கேஷில் தற்காலிக உரையாடல் சூழல்\n", + "- **அர்த்தமான நினைவகம்**: அனைத்து தரவுகளிலும் வெக்டர் அடிப்படையிலான ஒற்றுமை தேடல்\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 தேவையான தொகுப்புகளை நிறுவவும்\n", + "\n", + "Redis ஆதரவு கொண்ட Cognee-ஐ அமர்வு மேலாண்மைக்காக நிறுவவும்:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 சூழலை ஆரம்பித்து நூலகங்களை ஏற்றவும்\n", + "\n", + "பின்வரும் விஷயங்களை உறுதிப்படுத்தவும்:\n", + "1. Redis இயங்கிக் கொண்டிருக்க வேண்டும் (உதாரணமாக, Docker மூலம்: `docker run -d -p 6379:6379 redis`)\n", + "2. சூழல் மாறிகள் cache மாட்யூல்களை இறக்குமதி செய்வதற்கு முன் அமைக்கப்பட்டிருக்க வேண்டும்\n", + "3. தேவைப்பட்டால், kernel ஐ மீண்டும் தொடங்கி, செல் களை வரிசைப்படி இயக்கவும்\n", + "\n", + "கீழே உள்ள செல் செய்யும் செயல்பாடுகள்:\n", + "1. `.env` இலிருந்து சூழல் மாறிகளை ஏற்றும்\n", + "2. உங்கள் LLM அமைப்புகளுடன் Cognee ஐ கட்டமைக்கும்\n", + "3. அமர்வு மேலாண்மைக்காக caching ஐ இயலுமைப்படுத்தும்\n", + "4. அனைத்து கூறுகளும் சரியாக இணைக்கப்பட்டுள்ளதா என்பதை சரிபார்க்கும்\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 சேமிப்பு அடைவுகளை அமைக்கவும்\n", + "\n", + "Cognee அதன் செயல்பாடுகளுக்கு இரண்டு தனித்தனி அடைவுகளை பயன்படுத்துகிறது:\n", + "- **Data Root**: உள்ளீடு செய்யப்பட்ட ஆவணங்கள் மற்றும் செயல்படுத்தப்பட்ட தரவுகளை சேமிக்கிறது\n", + "- **System Root**: அறிவு வரைபட தரவுத்தொகுப்பும், அமைப்பு மெட்டாடேட்டாவும் அடங்கும்\n", + "\n", + "இந்த பயிற்சிக்காக தனித்தனி அடைவுகளை பின்வருமாறு உருவாக்குவோம்:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 நினைவக நிலையை மீட்டமைக்கவும்\n", + "\n", + "நாம் நமது நினைவக அமைப்பை உருவாக்கத் தொடங்குவதற்கு முன், புதியதாக தொடங்குவதை உறுதிப்படுத்திக் கொள்ளலாம்.\n", + "\n", + "> 💡 **குறிப்பு**: இந்த படியை தவிர்க்கலாம், நீங்கள் இந்த நோட்புக்கை பின்னர் பயன்படுத்தும் போது முந்தைய இயக்கங்களிலிருந்து உள்ள நினைவுகளை பாதுகாக்க விரும்பினால்.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 பகுதி 1: அறிவு அடிப்படையை உருவாக்குதல்\n", + "\n", + "### எங்கள் டெவலப்பர் உதவியாளருக்கான தரவூற்றுகள்\n", + "\n", + "ஒரு முழுமையான அறிவு அடிப்படையை உருவாக்க, மூன்று வகையான தரவுகளை நாங்கள் சேர்க்கிறோம்:\n", + "\n", + "1. **டெவலப்பர் சுயவிவரம்**: தனிப்பட்ட நிபுணத்துவம் மற்றும் தொழில்நுட்ப பின்னணி\n", + "2. **Python சிறந்த நடைமுறைகள்**: Python-இன் தத்துவம் மற்றும் நடைமுறை வழிகாட்டுதல்கள்\n", + "3. **வரலாற்று உரையாடல்கள்**: டெவலப்பர்களுக்கும் AI உதவியாளர்களுக்கும் இடையிலான முந்தைய கேள்வி-பதில் அமர்வுகள்\n", + "\n", + "இந்த மாறுபட்ட தரவுகள் எங்கள் உதவியாளருக்கு கீழ்கண்டவைகளை செய்ய உதவுகின்றன:\n", + "- பயனரின் தொழில்நுட்ப சூழலை புரிந்துகொள்வது\n", + "- பரிந்துரைகளில் சிறந்த நடைமுறைகளைப் பயன்படுத்துவது\n", + "- முந்தைய வெற்றிகரமான தொடர்புகளிலிருந்து கற்றுக்கொள்வது\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 தரவுகளை அறிவு வரைபடமாக மாற்றுதல்\n", + "\n", + "இப்போது நமது மூல உரையை ஒரு கட்டமைக்கப்பட்ட நினைவாக மாற்றுவோம். இந்த செயல்முறை:\n", + "\n", + "1. **தரவை NodeSets-க்கு சேர்க்கிறது**: தகவல்களை தர்க்கரீதியான பிரிவுகளாக ஒழுங்குபடுத்துகிறது\n", + " - `developer_data`: டெவலப்பர் சுயவிவரங்கள் மற்றும் உரையாடல்கள்\n", + " - `principles_data`: Python சிறந்த நடைமுறைகள் மற்றும் வழிகாட்டுதல்கள்\n", + "\n", + "2. **Cognify Pipeline-ஐ இயக்குகிறது**: அமைப்புகளை, உறவுகளை பிரித்தெடுத்து, embeddings உருவாக்குகிறது\n", + " - முக்கிய கருத்துக்களை அடையாளம் காண்கிறது\n", + " - தொடர்புடைய தகவல்களுக்கு இடையே அர்த்தமுள்ள இணைப்புகளை உருவாக்குகிறது\n", + " - வெக்டர் embeddings உருவாக்குகிறது\n", + "\n", + "LLM உரையை செயலாக்கி, வரைபட அமைப்பை உருவாக்கும் போது இது சில நிமிடங்கள் ஆகலாம்:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 அறிவு வரைபடத்தை காட்சிப்படுத்துங்கள்\n", + "\n", + "நாம் உருவாக்கிய அறிவு வரைபடத்தின் அமைப்பை ஆராய்வோம். காட்சிப்படுத்தல் காட்டுகிறது:\n", + "- **கணுக்கள்**: உரையிலிருந்து எடுக்கப்பட்ட பொருட்கள் (கருத்துகள், தொழில்நுட்பங்கள், நபர்கள்)\n", + "- **இருகோணங்கள்**: பொருட்களுக்கிடையிலான உறவுகள் மற்றும் இணைப்புகள்\n", + "- **குழுக்கள்**: அர்த்த சார்ந்த ஒற்றுமையால் குழுவாக்கப்பட்ட தொடர்புடைய கருத்துகள்\n", + "\n", + "உங்கள் உலாவியில் உருவாக்கப்பட்ட HTML கோப்பை திறந்து வரைபடத்தை தொடர்புடைய முறையில் ஆராயுங்கள்:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 நினைவுகளை மேம்படுத்த Memify\n", + "\n", + "`memify()` செயல்பாடு அறிவு வரைபடத்தை பகுப்பாய்வு செய்து, தரவின் மீது புத்திசாலியான விதிகளை உருவாக்குகிறது. இந்த செயல்முறை:\n", + "- முறைமைகள் மற்றும் சிறந்த நடைமுறைகளை அடையாளம் காண்கிறது\n", + "- உள்ளடக்கத்தின் அடிப்படையில் செயல்படக்கூடிய வழிகாட்டுதல்களை உருவாக்குகிறது\n", + "- பல்வேறு அறிவு பகுதிகளுக்கு இடையிலான தொடர்புகளை நிறுவுகிறது\n", + "\n", + "இந்த விதிகள், கேள்விகளுக்கு பதிலளிக்கும் போது முகவருக்கு மேலும் தகவலான முடிவுகளை எடுக்க உதவுகின்றன. இரண்டாவது காட்சியமைப்பை பிடிப்பது, செறிவூட்டப்பட்ட பிறகு வரைபடம் எவ்வாறு அடர்த்தியாக மாறுகிறது என்பதை ஒப்பிட உதவுகிறது.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 பகுதி 2: புத்திசாலி நினைவக மீட்பு\n", + "\n", + "### விளக்கம் 1: பல ஆவணங்களின் அறிவு ஒருங்கிணைப்பு\n", + "\n", + "இப்போது நமது அறிவு வரைபடம் உருவாக்கப்பட்டுவிட்டது, Cognee பல்வேறு ஆதாரங்களிலிருந்து தகவல்களை இணைத்து சிக்கலான கேள்விகளுக்கு எப்படி பதிலளிக்கிறது என்பதை பரிசோதிப்போம்.\n", + "\n", + "முதல் கேள்வி இதை விளக்குகிறது:\n", + "- **அர்த்தமுள்ள புரிதல்**: நேரடியாக குறிப்பிடப்படாதாலும் தொடர்புடைய கருத்துகளை கண்டுபிடித்தல்\n", + "- **குறிப்பிட்ட தகவல்களை இணைத்தல்**: டெவலப்பர் சுயவிவரத்தையும் Python கொள்கைகளையும் இணைத்தல்\n", + "- **சூழல் காரணம்**: சிறந்த நடைமுறைகளை குறிப்பிட்ட செயல்பாடுகளுக்கு பயன்படுத்துதல்\n", + "\n", + "### விளக்கம் 2: NodeSets உடன் வடிகட்டப்பட்ட தேடல்\n", + "\n", + "இரண்டாவது கேள்வி அறிவு வரைபடத்தின் குறிப்பிட்ட பகுதிகளை இலக்கு வைப்பதை காட்டுகிறது:\n", + "- `node_name` அளவுருவை பயன்படுத்தி `principles_data`-இல் மட்டும் தேடுகிறது\n", + "- குறிப்பிட்ட அறிவு துறையிலிருந்து மையப்படுத்தப்பட்ட பதில்களை வழங்குகிறது\n", + "- குறிப்பிட்ட துறையிலான தகவல்களை தேவைப்படும் போது பயனுள்ளதாக இருக்கும்\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 பகுதி 3: அமர்வு மேலாண்மை அமைப்பு\n", + "\n", + "### உரையாடல் நினைவகத்தை செயல்படுத்துதல்\n", + "\n", + "அமர்வு மேலாண்மை பல தொடர்புகளுக்கு இடையில் சூழ்நிலையை பராமரிக்க மிகவும் முக்கியம். இங்கு நாம் செய்யப்போகிறோம்:\n", + "\n", + "1. **பயனர் சூழ்நிலையை ஆரம்பிக்கவும்**: அமர்வு கண்காணிப்புக்காக ஒரு பயனர் சுயவிவரத்தை உருவாக்கவும் அல்லது மீட்டெடுக்கவும் \n", + "2. **கேஷ் இயந்திரத்தை அமைக்கவும்**: உரையாடல் வரலாற்றை சேமிக்க Redis-இன் இணைக்கவும் \n", + "3. **அமர்வு மாறிகளை செயல்படுத்தவும்**: கேள்விகளுக்கு இடையே நிலைத்திருக்கும் சூழ்நிலை மாறிகளை அமைக்கவும் \n", + "\n", + "> ⚠️ **முக்கியம்**: இதற்கு Redis இயங்க வேண்டும் மற்றும் உங்கள் சூழலில் `CACHING=true` ஆக இருக்க வேண்டும்\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ உதவி செயல்பாடு: அமர்வு வரலாற்றை பார்க்க\n", + "\n", + "Redis-ல் சேமிக்கப்பட்ட உரையாடல் வரலாற்றை பார்ப்பதற்கு இந்த உதவித் செயல்பாடு உதவுகிறது. இது பயனுள்ளதாக இருக்கும்:\n", + "- அமர்வு மேலாண்மையை பிழைத்திருத்த\n", + "- உரையாடல்கள் சேமிக்கப்பட்டுள்ளதா என்பதை சரிபார்க்க\n", + "- முகவருக்கு கிடைக்கும் சூழலை புரிந்துகொள்ள\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## அமர்வு 1: அசிங்க் ஆதரவு ஆய்வகம் — முதல் கேள்வி\n", + "\n", + "`async-support-lab` அமர்வை தொடங்க, பெரிய அளவிலான வலைத் தேடலுக்கான டெலிமெட்ரி-நட்பு asyncio முறைகளை கேளுங்கள். கிராஃப் ஏற்கனவே asyncio, aiohttp, மற்றும் கண்காணிப்பு நடைமுறைகள் பற்றி அறிந்துள்ளது, எனவே பதில் முந்தைய உரையாடல்களை பிரதிபலிக்க வேண்டும், அதே நேரத்தில் புதிய கேள்விக்கு பதிலளிக்க தனிப்பயனாக்கவும்.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## முதல் பரிமாற்றத்திற்குப் பிறகு Session 1 நினைவகத்தை ஆய்வு செய்யவும்\n", + "\n", + "ஆரம்பக் கேள்விக்குப் பிறகு `show_history(session_1)` ஐ இயக்குவது, Cognee ப்ராம்ப்டையும் முடிவையும் Redis-ல் எழுதியதை உறுதிப்படுத்துகிறது. நீங்கள் ஒரே ஒரு பதிவை, ஒருங்கிணைப்பு வழிகாட்டியுடன் காணலாம்.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## அமர்வு 1: தரவுக் மாதிரிகள் குறித்து தொடர்ச்சி\n", + "\n", + "அடுத்ததாக நாம் கேட்கிறோம், \"நான் எப்போது dataclasses ஐ தேர்வு செய்ய வேண்டும், எப்போது Pydantic ஐ தேர்வு செய்ய வேண்டும்?\" அதே அமர்வு ஐடியைப் பயன்படுத்தி. Cognee Python நெறிமுறைகளையும் முந்தைய FastAPI உரையாடல்களையும் இணைத்து நுணுக்கமான ஆலோசனையை வழங்க வேண்டும்—ஒரு பெயரிடப்பட்ட அமர்வின் உள்ளடக்கம் தொடர்ச்சியாக இருக்கும் என்பதை காட்டுவதற்காக.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## அமர்வு 1 வரலாறு இரு முறை உள்ளதா என்பதை உறுதிப்படுத்தவும்\n", + "\n", + "மற்றொரு `show_history(session_1)` அழைப்பு இரண்டு கேள்வி-பதில் பதிவுகளை காட்ட வேண்டும். இது Mem0 ஆய்வகத்தின் \"மெமரி ரிப்ளே\" படியை ஒத்ததாகும் மற்றும் கூடுதல் முறை அதே உரையாடலை நீட்டிக்கிறது என்பதை நிரூபிக்கிறது.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## அமர்வு 2: வடிவமைப்பு மதிப்பீட்டு திரி — புதிய அமர்வு\n", + "\n", + "திரிகளுக்கு இடையிலான தனிமையை காட்ட, `design-review-session` ஐ தொடங்கி, சம்பவ மதிப்பீடுகளுக்கான பதிவு வழிகாட்டுதலை கேட்கிறோம். அடிப்படை அறிவுக் களஞ்சியம் ஒரே மாதிரியாக இருந்தாலும், புதிய அமர்வு ஐடி உரையாடல்களை தனித்தனியாக வைத்திருக்கிறது.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## மதிப்பீட்டு அமர்வு 2 வரலாறு\n", + "\n", + "`show_history(session_2)` வடிவமைப்பு-மதிப்பீட்டு கேள்வி/பதில் ஜோடியை மட்டுமே பட்டியலிட வேண்டும். Session 1 உடன் இதை ஒப்பிட்டு, Cognee எப்படி தனித்துவமான உரையாடல் பதிவுகளை வைத்திருக்கிறது, ஆனால் பகிரப்பட்ட அறிவு வரைபடத்தை மீண்டும் பயன்படுத்துகிறது என்பதை விளக்குங்கள்.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## சுருக்கம்\n", + "\n", + "வாழ்த்துக்கள்! நீங்கள் உங்கள் குறியீட்டு உதவியாளருக்கு Cognee மூலம் இயக்கப்படும் ஒரு உண்மையான நீண்டகால நினைவக அடுக்கு கொடுத்துவிட்டீர்கள்.\n", + "\n", + "இந்த பயிற்சியில், நீங்கள் மூல டெவலப்பர் உள்ளடக்கத்தை (குறியீடு, ஆவணங்கள், உரையாடல்கள்) எடுத்துக் கொண்டு, உங்கள் முகவர் தேட, காரணம் கூற, மற்றும் தொடர்ந்து மேம்படுத்தக்கூடிய ஒரு கிராஃப் + வெக்டர் நினைவகமாக மாற்றியுள்ளீர்கள்.\n", + "\n", + "நீங்கள் கற்றுக்கொண்டவை\n", + "\n", + "1. **மூல உரையிலிருந்து AI நினைவகம் வரை**: Cognee எவ்வாறு அமைப்பற்ற தரவுகளை உட்கொண்டு, வெக்டர் + அறிவு கிராஃப் கட்டமைப்பை பயன்படுத்தி புத்திசாலியான, தேடக்கூடிய நினைவகமாக மாற்றுகிறது என்பதை.\n", + "\n", + "2. **memify மூலம் கிராஃப் மேம்பாடு**: அடிப்படை கிராஃப் உருவாக்கத்தை தாண்டி, memify ஐ பயன்படுத்தி உங்கள் தற்போதைய கிராஃப்பின் மேல் பெறப்பட்ட உண்மைகள் மற்றும் செறிவான உறவுகளைச் சேர்ப்பது எப்படி என்பதை.\n", + "\n", + "3. **பல தேடல் உத்திகள்**: உங்கள் முகவருக்கு தேவையானவைகளின் அடிப்படையில் (கிராஃப்-அறிந்த Q&A, RAG-பாணி நிறைவு, உள்ளடக்கங்கள், மூல துண்டுகள், குறியீடு தேடல், போன்றவை) நினைவகத்தை வினவுவதற்கான பல்வேறு தேடல் வகைகளை.\n", + "\n", + "4. **காட்சி ஆராய்ச்சி**: Cognee உருவாக்கியதை கிராஃப் காட்சிப்படுத்தல்களையும் Cognee UI-யையும் பயன்படுத்தி ஆய்வு செய்து பிழைதிருத்துவது எப்படி என்பதை, இதனால் அறிவு எவ்வாறு அமைக்கப்பட்டுள்ளது என்பதை நீங்கள் உணர முடியும்.\n", + "\n", + "5. **அமர்வு-அறிந்த நினைவகம்**: ஒவ்வொரு அமர்வின் சூழ்நிலையை நிலையான அர்த்தமுள்ள நினைவகத்துடன் இணைத்து, முகவர்கள் பயனர்களுக்கு இடையே தகவல் கசியாமல் பல இயக்கங்களில் நினைவில் வைத்துக்கொள்ள முடியும் என்பதை.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## முக்கிய குறிப்புகள்\n", + "1. எம்பெடிங்க்ஸ் மூலம் ஆதரிக்கப்படும் அறிவு வரைபடமாக நினைவகம்\n", + "\n", + " - **கட்டமைக்கப்பட்ட புரிதல்**: Cognee ஒரு வெக்டர் ஸ்டோர் மற்றும் ஒரு வரைபட ஸ்டோரைக் கூட்டுவதன் மூலம் உங்கள் தரவுகள் அர்த்தத்தால் தேடக்கூடியதாகவும் உறவுகளால் இணைக்கப்பட்டதாகவும் இருக்கும். Cognee இயல்பாக கோப்பு அடிப்படையிலான தரவுத்தொகுப்புகளைப் பயன்படுத்துகிறது (வெக்டர் ஸ்டோருக்கு LanceDB, வரைபட தரவுத்தொகுப்புக்கு Kuzu).\n", + "\n", + " - **உறவுகளை உணரும் மீட்பு**: பதில்கள் \"ஒத்த உரை\" மட்டுமல்லாமல், அமைப்புகள் எப்படி தொடர்புடையவை என்பதிலும் அடிப்படையாக இருக்கலாம்.\n", + "\n", + " - **உயிருடன் இருக்கும் நினைவகம்**: நினைவக அடுக்கு வளர்ந்து, விரிவடைந்து, ஒரே இணைக்கப்பட்ட வரைபடமாக தேடக்கூடியதாக இருக்கும்.\n", + "\n", + "2. தேடல் மற்றும் காரணமறிதல் முறைகள்\n", + " - **கலப்பு மீட்பு**: தேடல் வெக்டர் ஒற்றுமை, வரைபட அமைப்பு மற்றும் LLM காரணமறிதலை ஒருங்கிணைக்கிறது, மூல துண்டு தேடலிலிருந்து வரைபடத்தை உணரும் கேள்வி பதிலளிக்க வரை.\n", + "\n", + " - **வேலையைப் பொருத்த முறை**: இயற்கை மொழி பதில்களை விரும்பும் போது completion-ஸ்டைல் முறைகளைப் பயன்படுத்தவும், உங்கள் முகவர் மூல சூழலை அல்லது தனது சொந்த காரணமறிதலை இயக்க Chunk/summary/graph முறைகளைப் பயன்படுத்தவும்.\n", + "\n", + "3. தனிப்பயனாக்கப்பட்ட, அமர்வு-அறிந்த முகவர்கள்\n", + " - **அமர்வு சூழல் + நீண்டகால நினைவகம்**: Cognee குறுகியகால \"தொடர்\" சூழலை நீண்டகால, பயனர் அல்லது அமைப்பு நிலை நினைவகத்திலிருந்து தனியாக வைத்திருக்கிறது.\n", + "\n", + "## நிஜ உலக பயன்பாடுகள்\n", + "\n", + "1. **செங்குத்து AI முகவர்கள்**\n", + "\n", + " இந்த நோட்புக் முறைமையைப் பயன்படுத்தி Cognee-ஐ Retrieval மற்றும் Reasoning மையமாகக் கொண்ட டொமைன்-ஸ்மார்ட் கோபைலட்டுகளை இயக்கவும்:\n", + "\n", + "- **டெவலப்பர் கோபைலட்டுகள்**: குறியீடு மதிப்பாய்வு, சம்பவ பகுப்பாய்வு மற்றும் கட்டமைப்பு உதவியாளர்கள், குறியீடு, APIகள், வடிவமைப்பு ஆவணங்கள் மற்றும் டிக்கெட்டுகளை ஒரே நினைவுக் வரைபடமாகச் சுற்றி ஆராய்கின்றனர்.\n", + "\n", + "- **வாடிக்கையாளர் எதிர்கொள்ளும் கோபைலட்டுகள்**: தயாரிப்பு ஆவணங்கள், FAQகள், CRM குறிப்புகள் மற்றும் முந்தைய டிக்கெட்டுகளிலிருந்து வரைபடத்தை உணரும் மீட்பு மற்றும் மேற்கோள் பதில்களுடன் ஆதரவு அல்லது வெற்றியாளர்கள்.\n", + "\n", + "- **உள்ளக நிபுணர் கோபைலட்டுகள்**: தனித்தனியாக உள்ள PDFகளுக்கு பதிலாக, இணைக்கப்பட்ட விதிகள், வழிகாட்டுதல்கள் மற்றும் வரலாற்று முடிவுகளை ஆராயும் கொள்கை, சட்டம் அல்லது பாதுகாப்பு உதவியாளர்கள்.\n", + "\n", + " Cognee AI முகவர்களுக்கு நிலையான, துல்லியமான நினைவகமாக வெளிப்படையாக அமைக்கப்பட்டுள்ளது, உங்கள் முகவருக்கு பின்னால் ஒரு உயிருள்ள அறிவு வரைபடத்தை வழங்குகிறது மற்றும் வெக்டர் ஸ்டோர்களின் மற்றும் தனிப்பயன் வரைபட குறியீடுகளின் சீரற்ற சேர்க்கைகளை மாற்றுகிறது.\n", + "\n", + "2. **தரவு சைலோக்களை ஒரே நினைவகமாக ஒன்றிணைத்தல்**\n", + "\n", + " இதே அணுகுமுறை பரவலாக உள்ள மூலங்களுக்கிடையே ஒரே நினைவக அடுக்கை உருவாக்க உதவுகிறது:\n", + "\n", + "- **சைலோக்களிலிருந்து ஒரே வரைபடமாக**: கட்டமைக்கப்பட்ட (எ.கா., தரவுத்தொகுப்புகள்) மற்றும் கட்டமைக்காத தரவுகளை (எ.கா., ஆவணங்கள், உரையாடல்கள்) வெக்டர் ஆதரவு கொண்ட ஒரே வரைபடமாக உள்ளீடு செய்யவும், ஒவ்வொரு அமைப்பிற்கும் தனித்தனியான குறியீடுகளை விட.\n", + "\n", + "- **மேற்கோள்களுடன் குறுக்கு-மூல காரணமறிதல்**: அனைத்திலும் பல படி காரணமறிதலை இயக்கவும்—\"கணல்களை,\" அளவுகோல்களை மற்றும் ஆவணங்களை வரைபடத்தின் மூலம் \"இணைக்கவும்\"—மேலும் ஆதாரத்துடன் கூடிய பதில்களை திருப்பவும்.\n", + "\n", + "- **அறிவுக் மையங்கள்**: வங்கிகள் அல்லது கல்வி போன்ற துறைகளுக்கு, Cognee ஏற்கனவே PDFகள், உள்ளக அமைப்புகள் மற்றும் பயன்பாட்டு தரவுகளை ஒரே அறிவு வரைபடமாக ஒன்றிணைக்க பயன்படுத்தப்படுகிறது, இதனால் முகவர்கள் துல்லியமான, மேற்கோள் சூழலுடன் கேள்விகளுக்கு பதிலளிக்க முடியும்.\n", + "\n", + "## அடுத்த படிகள்\n", + "\n", + "நீங்கள் முக்கிய நினைவக சுற்றத்தை செயல்படுத்தியுள்ளீர்கள். இங்கே நீங்கள் உங்கள் சொந்தமாக முயற்சிக்கக்கூடிய இயல்பான விரிவாக்கங்கள் உள்ளன (விவரங்களுக்கு [Cognee ஆவணங்களை](https://docs.cognee.ai/) பார்க்கவும்):\n", + "\n", + "1. **கால உணர்வுடன் பரிசோதிக்கவும்**: உரையிலிருந்து நிகழ்வுகள் மற்றும் காலக்கோடுகளை எடுக்க கால cognify ஐ இயக்கவும்.\n", + "\n", + "2. **ஒன்டாலஜி-ஓரியண்டட் காரணமறிதலை அறிமுகப்படுத்தவும்**: உங்கள் துறைக்கான OWL ஒன்டாலஜியை வரையறுக்கவும். Cognee-இன் ஒன்டாலஜி ஆதரவைப் பயன்படுத்தி எடுக்கப்பட்ட அமைப்புகள் மற்றும் உறவுகள் அந்த திட்டத்தில் அடிப்படையாக இருக்கும், இது வரைபட தரத்தையும் துறைக்கு ஏற்ற பதில்களையும் மேம்படுத்தும்.\n", + "\n", + "3. **ஒரு கருத்து மடலத்தைச் சேர்க்கவும்**: உண்மையான பயனர் கருத்துக்களிலிருந்து Cognee வரைபட விளிம்பு எடைகளை சரிசெய்ய அனுமதிக்கவும், இதனால் மீட்பு நிலையாக இருக்காமல் நேரத்துடன் மேம்படுகிறது.\n", + "\n", + "4. **தனிப்பயனாக்கல் மற்றும் அமர்வு நடத்தைக்கு அமைக்கவும்**: பயனர் ஐடிக்கள், டெனன்ட்கள் மற்றும் தரவுத்தொகுப்புகளைப் பயன்படுத்தி ஒவ்வொரு நபருக்கும் அல்லது குழுவுக்கும் பகிரப்பட்ட நினைவக இயந்திரத்தின் மீது தங்களுக்கே உரிய பார்வையை வழங்கவும்.\n", + "\n", + "5. **மேலும் சிக்கலான முகவர்களுக்கு அளவீடு செய்யவும்**: பல முகவர் அமைப்புகளை உருவாக்க Cognee ஐ முகவர் கட்டமைப்புகளில் இணைக்கவும், அவை அனைத்தும் ஒரே நினைவக அடுக்கை பகிர்கின்றன. *Microsoft Agent Framework x Cognee plugin விரைவில் வருகிறது.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**குறிப்பு**: \nஇந்த ஆவணம் AI மொழிபெயர்ப்பு சேவை [Co-op Translator](https://github.com/Azure/co-op-translator) பயன்படுத்தி மொழிபெயர்க்கப்பட்டுள்ளது. நாங்கள் துல்லியத்திற்காக முயற்சிக்கிறோம், ஆனால் தானியக்க மொழிபெயர்ப்புகளில் பிழைகள் அல்லது தவறுகள் இருக்கக்கூடும் என்பதை கவனத்தில் கொள்ளவும். அதன் தாய்மொழியில் உள்ள மூல ஆவணம் அதிகாரப்பூர்வ ஆதாரமாக கருதப்பட வேண்டும். முக்கியமான தகவல்களுக்கு, தொழில்முறை மனித மொழிபெயர்ப்பு பரிந்துரைக்கப்படுகிறது. இந்த மொழிபெயர்ப்பைப் பயன்படுத்துவதால் ஏற்படும் எந்த தவறான புரிதல்கள் அல்லது தவறான விளக்கங்களுக்கு நாங்கள் பொறுப்பல்ல.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:50:09+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "ta" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/ta/13-agent-memory/README.md b/translations/ta/13-agent-memory/README.md index d050e01aa..b974db9e0 100644 --- a/translations/ta/13-agent-memory/README.md +++ b/translations/ta/13-agent-memory/README.md @@ -1,160 +1,152 @@ -# AI முகவர்களுக்கான நினைவகம் -[![முகவர் நினைவகம்](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.ta.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) +# AI முகவர்களின் நினைவகம் +[![Agent Memory](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.ta.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -AI முகவர்களை உருவாக்குவதன் தனித்துவமான நன்மைகள் குறித்து பேசும்போது, இரண்டு விஷயங்கள் முக்கியமாக பேசப்படுகின்றன: பணிகளை முடிக்க கருவிகளை அழைக்கும் திறன் மற்றும் காலப்போக்கில் மேம்படுவதற்கான திறன். நினைவகம் என்பது நமது பயனர்களுக்கு சிறந்த அனுபவங்களை உருவாக்கும் தன்னம்பிக்கை முகவர்களை உருவாக்குவதற்கான அடிப்படை அம்சமாகும். +AI முகவர்களை உருவாக்குவதன் தனித்துவமான நன்மைகள் குறித்து பேசும்போது, இரண்டு முக்கிய அம்சங்கள் பேசப்படுகின்றன: கருவிகளை அழைத்து பணிகளை முடிக்கவும், காலப்போக்கில் மேம்படவும். நினைவகம் என்பது தன்னம்பிக்கையுடன் மேம்படும் முகவர்களை உருவாக்குவதற்கான அடித்தளமாகும், இது எங்கள் பயனர்களுக்கு சிறந்த அனுபவங்களை உருவாக்க உதவுகிறது. -இந்த பாடத்தில், AI முகவர்களுக்கு நினைவகம் என்றால் என்ன, அதை எவ்வாறு நிர்வகிக்கலாம் மற்றும் எவ்வாறு நமது பயன்பாடுகளுக்காக அதைப் பயன்படுத்தலாம் என்பதைப் பார்ப்போம். +இந்த பாடத்தில், AI முகவர்களுக்கு நினைவகம் என்ன, அதை எவ்வாறு நிர்வகிக்கலாம் மற்றும் எங்கள் பயன்பாடுகளுக்கு பயன்படுமாறு பயன்படுத்தலாம் என்பதைப் பார்ப்போம். ## அறிமுகம் -இந்த பாடத்தில் நீங்கள் கற்றுக்கொள்ளப்போகிறீர்கள்: +இந்த பாடத்தில் கற்றுக்கொள்ளப்படுவது: -• **AI முகவர் நினைவகத்தைப் புரிந்துகொள்வது**: நினைவகம் என்றால் என்ன, அது முகவர்களுக்கு ஏன் அவசியம். +• **AI முகவர்களின் நினைவகத்தைப் புரிந்துகொள்வது**: நினைவகம் என்ன, ஏன் அது முகவர்களுக்கு அவசியம். -• **நினைவகத்தை செயல்படுத்துதல் மற்றும் சேமித்தல்**: குறுகிய கால மற்றும் நீண்ட கால நினைவகத்தை மையமாகக் கொண்டு உங்கள் AI முகவர்களுக்கு நினைவக திறன்களைச் சேர்க்கும் நடைமுறை முறைகள். +• **நினைவகத்தை செயல்படுத்துதல் மற்றும் சேமித்தல்**: AI முகவர்களுக்கு நினைவக திறன்களைச் சேர்க்கும் நடைமுறை முறைகள், குறுகிய கால மற்றும் நீண்ட கால நினைவகத்தை மையமாகக் கொண்டு. -• **AI முகவர்களை தன்னம்பிக்கையுடன் மேம்படுத்துதல்**: கடந்த தொடர்புகளிலிருந்து கற்றுக்கொண்டு காலப்போக்கில் மேம்பட நினைவகம் எவ்வாறு உதவுகிறது. +• **AI முகவர்களை தன்னம்பிக்கையுடன் மேம்படுத்துதல்**: கடந்த தொடர்புகளிலிருந்து கற்றுக்கொள்வதற்கும், காலப்போக்கில் மேம்படுவதற்கும் நினைவகம் எப்படி உதவுகிறது. -## கற்றல் நோக்கங்கள் +## கிடைக்கக்கூடிய செயல்பாடுகள் -இந்த பாடத்தை முடித்த பிறகு, நீங்கள் அறிந்துகொள்வீர்கள்: +இந்த பாடத்தில் இரண்டு விரிவான நோட்புக் டுடோரியல்கள் உள்ளன: -• **AI முகவர் நினைவகத்தின் பல்வேறு வகைகளை வேறுபடுத்துதல்**, வேலை நினைவகம், குறுகிய கால நினைவகம், நீண்ட கால நினைவகம் மற்றும் தனிப்பட்ட வடிவங்கள் போன்றவை. +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Mem0 மற்றும் Azure AI Search-ஐ Semantic Kernel framework மூலம் நினைவகத்தை செயல்படுத்துகிறது. -• **AI முகவர்களுக்கு குறுகிய கால மற்றும் நீண்ட கால நினைவகத்தை செயல்படுத்துதல் மற்றும் நிர்வகித்தல்** Semantic Kernel கட்டமைப்பைப் பயன்படுத்தி, Mem0 மற்றும் Whiteboard நினைவகம் போன்ற கருவிகளைப் பயன்படுத்தி, Azure AI Search உடன் ஒருங்கிணைத்து. +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Cognee மூலம் அமைப்பான நினைவகத்தை செயல்படுத்துகிறது, இது எம்பெடிங்குகளால் ஆதரிக்கப்படும் அறிவு வரைபடத்தை தானாக உருவாக்கி, அதை காட்சிப்படுத்தி, புத்திசாலியான தேடலை வழங்குகிறது. -• **தன்னம்பிக்கையுடன் மேம்படும் AI முகவர்களின் அடிப்படைக் கொள்கைகளைப் புரிந்துகொள்வது** மற்றும் தொடர்ச்சியான கற்றல் மற்றும் தழுவலுக்கு வலுவான நினைவக மேலாண்மை அமைப்புகள் எவ்வாறு பங்களிக்கின்றன. +## கற்றல் இலக்குகள் -## AI முகவர் நினைவகத்தைப் புரிந்துகொள்வது +இந்த பாடத்தை முடித்த பிறகு, நீங்கள்: -அதன் மையத்தில், **AI முகவர்களுக்கான நினைவகம் என்பது தகவல்களை நினைவில் வைத்துக்கொள்வதற்கும் மீண்டும் நினைவூட்டுவதற்கும் அவற்றை அனுமதிக்கும் முறைமைகள்** ஆகும். இந்த தகவல் உரையாடல், பயனர் விருப்பங்கள், கடந்த செயல்கள் அல்லது கற்றுக்கொண்ட மாதிரிகள் பற்றிய குறிப்புகள் போன்றவை இருக்கலாம். +• **AI முகவர்களின் பல்வேறு வகையான நினைவகங்களை வேறுபடுத்த முடியும்**, வேலை, குறுகிய கால, நீண்ட கால நினைவகம் மற்றும் தனிப்பட்ட நினைவகங்கள் போன்ற சிறப்பு வடிவங்களை உள்ளடக்கியது. -நினைவகம் இல்லாமல், AI பயன்பாடுகள் பெரும்பாலும் நிலையற்றதாக இருக்கும், அதாவது ஒவ்வொரு தொடர்பும் புதிதாக தொடங்கும். இது முகவர் முந்தைய சூழல் அல்லது விருப்பங்களை "மறந்துவிடும்" ஒரு மீண்டும் மீண்டும் வரும் மற்றும் சிரமமான பயனர் அனுபவத்தை ஏற்படுத்துகிறது. +• **AI முகவர்களுக்கு குறுகிய கால மற்றும் நீண்ட கால நினைவகத்தை செயல்படுத்தவும் நிர்வகிக்கவும்** Semantic Kernel framework-ஐ பயன்படுத்தி, Mem0, Cognee, Whiteboard memory போன்ற கருவிகளைப் பயன்படுத்தி, Azure AI Search உடன் ஒருங்கிணைத்து. + +• **தன்னம்பிக்கையுடன் மேம்படும் AI முகவர்களின் அடிப்படை கொள்கைகளைப் புரிந்துகொள்ளவும்** மற்றும் வலுவான நினைவக மேலாண்மை அமைப்புகள் தொடர்ச்சியான கற்றல் மற்றும் தழுவலுக்கு எப்படி பங்களிக்கின்றன என்பதை அறியலாம். + +## AI முகவர்களின் நினைவகத்தைப் புரிந்துகொள்வது + +அதன் மையத்தில், **AI முகவர்களுக்கு நினைவகம் என்பது தகவலை நினைவில் வைத்துக்கொள்வதற்கும் மீண்டும் நினைவூட்டுவதற்கும் உதவும் முறைகளை குறிக்கிறது**. இந்த தகவல் உரையாடல் பற்றிய குறிப்புகள், பயனர் விருப்பங்கள், கடந்த செயல்கள் அல்லது கற்றுக்கொண்ட முறைமைகள் போன்றவை இருக்கலாம். + +நினைவகம் இல்லாமல், AI பயன்பாடுகள் பெரும்பாலும் நிலையற்றதாக இருக்கும், அதாவது ஒவ்வொரு தொடர்பும் புதிதாக தொடங்கும். இது முகவர் முந்தைய சூழல் அல்லது விருப்பங்களை "மறந்து" மீண்டும் மீண்டும் தொடங்கும், பயனர்களுக்கு சிரமமான அனுபவத்தை உருவாக்கும். ### நினைவகம் ஏன் முக்கியம்? -ஒரு முகவரின் நுண்ணறிவு அதன் முந்தைய தகவல்களை நினைவூட்டும் மற்றும் பயன்படுத்தும் திறனுடன் ஆழமாக இணைக்கப்பட்டுள்ளது. நினைவகம் முகவர்களை பின்வரும் வகைகளில் மாற்றுகிறது: +ஒரு முகவரின் புத்திசாலித்தனம் அதன் கடந்த தகவல்களை நினைவூட்டுவதற்கும் பயன்படுத்துவதற்கும் உள்ள திறனுடன் ஆழமாக இணைக்கப்பட்டுள்ளது. நினைவகம் முகவர்களை: -• **தன்னிலைப் பிரதிபலிப்பு**: முந்தைய செயல்கள் மற்றும் முடிவுகளிலிருந்து கற்றுக்கொள்வது. +• **பரிந்துரை செய்யும்**: கடந்த செயல்கள் மற்றும் முடிவுகளிலிருந்து கற்றுக்கொள்வது. -• **உரையாடல் தொடர்ச்சி**: தொடர்ச்சியான உரையாடலின் போது சூழ்நிலையை பராமரித்தல். +• **உரையாடல் நடத்தும்**: தொடர்ச்சியான உரையாடலின் சூழலை பராமரிக்கிறது. -• **முன்கூட்டியே செயல்படுதல் மற்றும் எதிர்வினை**: வரலாற்று தரவின் அடிப்படையில் தேவைகளை முன்னறிவிப்பது அல்லது சரியாக பதிலளிப்பது. +• **முன்கூட்டிய மற்றும் எதிர்வினை செயல்**: கடந்த தரவின் அடிப்படையில் தேவைகளை முன்னறிவிக்க அல்லது சரியான பதில்களை வழங்க. -• **தன்னம்பிக்கை**: சேமிக்கப்பட்ட அறிவைப் பயன்படுத்தி சுயாதீனமாக செயல்படுதல். +• **தன்னாட்சி**: சேமிக்கப்பட்ட அறிவைப் பயன்படுத்தி சுயமாக செயல்படுதல். நினைவகத்தை செயல்படுத்துவதன் நோக்கம் முகவர்களை **நம்பகமான மற்றும் திறமையானதாக** மாற்றுவதாகும். -### நினைவகத்தின் வகைகள் +### நினைவக வகைகள் #### வேலை நினைவகம் -இதை ஒரு முகவர் ஒரு ஒற்றை, தொடர்ச்சியான பணியோ அல்லது சிந்தனை செயல்முறையோ செய்யும் போது பயன்படுத்தும் ஒரு தற்காலிக காகிதம் என்று நினைக்கலாம். இது அடுத்த படியை கணக்கிட உடனடியாக தேவையான தகவல்களை வைத்திருக்கும். +இதை ஒரு முகவர் ஒரு குறிப்பிட்ட பணியை அல்லது சிந்தனை செயல்முறையை மேற்கொள்ளும் போது பயன்படுத்தும் "குறுகிய குறிப்புப் பேப்பர்" என்று நினைக்கலாம். இது அடுத்த படியை கணக்கிட தேவையான உடனடி தகவலை வைத்திருக்கிறது. -AI முகவர்களுக்கு, வேலை நினைவகம் பெரும்பாலும் ஒரு உரையாடலின் மிக முக்கியமான தகவல்களைப் பிடிக்கிறது, முழு உரையாடல் வரலாறு நீண்டதாக இருந்தாலும் அல்லது குறைக்கப்பட்டிருந்தாலும். இது தேவைகள், பரிந்துரைகள், முடிவுகள் மற்றும் செயல்கள் போன்ற முக்கிய கூறுகளை எடுத்துக்காட்டுகிறது. +AI முகவர்களுக்கு, வேலை நினைவகம் பெரும்பாலும் ஒரு உரையாடலின் மிக முக்கியமான தகவல்களைப் பிடிக்கிறது, முழு உரையாடல் வரலாறு நீண்டதாக இருந்தாலும் அல்லது குறைக்கப்பட்டாலும். இது தேவைகள், முன்மொழிவுகள், முடிவுகள் மற்றும் செயல்கள் போன்ற முக்கிய அம்சங்களை எடுத்துக்காட்டுகிறது. **வேலை நினைவக உதாரணம்** -ஒரு பயண முன்பதிவு முகவரில், வேலை நினைவகம் பயனரின் தற்போதைய கோரிக்கையைப் பிடிக்கலாம், உதாரணமாக "நான் பாரிசுக்கு ஒரு பயணத்தை முன்பதிவு செய்ய விரும்புகிறேன்". இந்த குறிப்பிட்ட தேவையை முகவர் உடனடி சூழ்நிலையில் வைத்துக்கொண்டு தற்போதைய தொடர்பை வழிநடத்துகிறது. +ஒரு பயண முன்பதிவு முகவரில், வேலை நினைவகம் பயனரின் தற்போதைய கோரிக்கையைப் பிடிக்கலாம், உதாரணமாக "நான் பாரிசுக்கு ஒரு பயணத்தை முன்பதிவு செய்ய விரும்புகிறேன்". இந்த குறிப்பிட்ட தேவையை முகவரின் உடனடி சூழலில் வைத்துக்கொண்டு தற்போதைய தொடர்பை வழிநடத்துகிறது. #### குறுகிய கால நினைவகம் -இந்த நினைவகம் ஒரு ஒற்றை உரையாடல் அல்லது அமர்வின் காலத்திற்கு தகவல்களை வைத்திருக்கும். இது தற்போதைய உரையாடலின் சூழ்நிலையாகும், இது உரையாடலின் முந்தைய திருப்பங்களை முகவர் மீண்டும் குறிப்பிட அனுமதிக்கிறது. +இந்த வகை நினைவகம் ஒரு உரையாடல் அல்லது அமர்வின் காலத்திற்கு தகவலை வைத்திருக்கிறது. இது தற்போதைய உரையாடலின் சூழல், உரையாடலின் முந்தைய திருப்புகளை மீண்டும் குறிப்பிடுவதற்கு முகவருக்கு உதவுகிறது. **குறுகிய கால நினைவக உதாரணம்** -ஒரு பயனர், "பாரிசுக்கு ஒரு விமானம் எவ்வளவு செலவாகும்?" என்று கேட்கிறார், பின்னர் "அங்கு தங்குமிடம் பற்றி என்ன?" என்று தொடர்கிறார் என்றால், குறுகிய கால நினைவகம் "அங்கு" என்பது "பாரிஸ்" என்பதை உறுதிப்படுத்துகிறது. +ஒரு பயனர் "பாரிசுக்கு ஒரு விமானத்தின் செலவு எவ்வளவு?" என்று கேட்க, பின்னர் "அங்கு தங்குமிடம் பற்றி என்ன?" என்று தொடர்ந்தால், குறுகிய கால நினைவகம் "அங்கு" என்பது "பாரிஸ்" என்பதை உறுதிப்படுத்துகிறது. #### நீண்ட கால நினைவகம் -இது பல உரையாடல்கள் அல்லது அமர்வுகளுக்கு மேல் நிலைத்திருக்கும் தகவலாகும். இது பயனர் விருப்பங்கள், வரலாற்று தொடர்புகள் அல்லது நீண்டகாலத்தில் பொதுவான அறிவை நினைவில் வைத்திருக்கும். இது தனிப்பயனாக்கலுக்கு முக்கியமானது. +இது பல உரையாடல்கள் அல்லது அமர்வுகளுக்கு மேலாக நிலைத்திருக்கும் தகவலாகும். இது பயனர் விருப்பங்கள், வரலாற்று தொடர்புகள் அல்லது பொதுவான அறிவை நீண்ட காலத்திற்கு நினைவில் வைத்திருக்க உதவுகிறது. இது தனிப்பயனாக்கத்திற்கு முக்கியமானது. **நீண்ட கால நினைவக உதாரணம்** -ஒரு நீண்டகால நினைவகம் "பென் ஸ்கீயிங் மற்றும் வெளிப்புற செயல்பாடுகளை விரும்புகிறார், மலைக்காட்சி கொண்ட காபி விரும்புகிறார், மற்றும் முந்தைய காயம் காரணமாக மேம்பட்ட ஸ்கீ சாய்வுகளை தவிர்க்க விரும்புகிறார்" என்பதை சேமிக்கலாம். முந்தைய தொடர்புகளிலிருந்து கற்றுக்கொண்ட இந்த தகவல் எதிர்கால பயண திட்டமிடும் அமர்வுகளில் பரிந்துரைகளை மிகவும் தனிப்பயனாக்க உதவுகிறது. +நீண்ட கால நினைவகம் "பென் ஸ்கீயிங் மற்றும் வெளிப்புற செயல்பாடுகளை விரும்புகிறார், மலைக்காட்சியுடன் காபி விரும்புகிறார், மற்றும் கடந்த காயம் காரணமாக மேம்பட்ட ஸ்கீ சாய்வுகளை தவிர்க்க விரும்புகிறார்" என்பதை சேமிக்கலாம். இது முந்தைய தொடர்புகளிலிருந்து கற்றுக்கொண்ட தகவலாக, எதிர்கால பயண திட்டமிடும் அமர்வுகளில் பரிந்துரைகளை மிகவும் தனிப்பயனாக்கமாக மாற்றுகிறது. #### தனிப்பட்ட நினைவகம் -இந்த சிறப்பு நினைவக வகை ஒரு முகவருக்கு ஒரே மாதிரியான "பயனர் தன்மை" அல்லது "தனிப்பட்ட தன்மை" உருவாக்க உதவுகிறது. இது முகவருக்கு தன்னுடைய விவரங்கள் அல்லது நோக்கம் பற்றிய தகவல்களை நினைவில் வைத்துக்கொள்ள அனுமதிக்கிறது, இதனால் தொடர்புகள் மேலும் சீரான மற்றும் கவனமாக இருக்கும். +இந்த சிறப்பு நினைவக வகை ஒரு முகவருக்கு ஒரு "தனித்துவமான தன்மை" அல்லது "தனிப்பட்ட தன்மை" உருவாக்க உதவுகிறது. இது முகவருக்கு அதன் விவரங்களை அல்லது அதன் நோக்கமுள்ள பாத்திரத்தை நினைவில் வைத்திருக்க உதவுகிறது, உரையாடல்களை மேலும் சீராகவும் மையமாகவும் மாற்றுகிறது. **தனிப்பட்ட நினைவக உதாரணம்** -ஒரு பயண முகவர் "சிறந்த ஸ்கீ திட்டமிடுபவர்" ஆக வடிவமைக்கப்பட்டிருந்தால், தனிப்பட்ட நினைவகம் இந்த வேட்கையை வலுப்படுத்தலாம், அதன் பதில்களை ஒரு நிபுணரின் குரலும் அறிவும் பொருந்தும் வகையில் பாதிக்கிறது. +ஒரு பயண முகவர் "சிறந்த ஸ்கீ திட்டமிடும் நிபுணர்" ஆக வடிவமைக்கப்பட்டால், தனிப்பட்ட நினைவகம் இந்த பாத்திரத்தை உறுதிப்படுத்தலாம், அதன் பதில்களை ஒரு நிபுணரின் குரல் மற்றும் அறிவுடன் இணங்கச் செய்ய உதவுகிறது. -#### வேலைநிலை/எபிசோடிக் நினைவகம் +#### வேலை/நிகழ்வு நினைவகம் -இந்த நினைவகம் ஒரு சிக்கலான பணியின் போது ஒரு முகவர் எடுத்த படிகளின் வரிசையை, வெற்றிகள் மற்றும் தோல்விகளைச் சேமிக்கிறது. இது குறிப்பிட்ட "எபிசோடுகள்" அல்லது முந்தைய அனுபவங்களை நினைவில் வைத்துக்கொண்டு அவற்றிலிருந்து கற்றுக்கொள்வதைப் போன்றது. +இந்த நினைவகம் ஒரு முகவர் ஒரு சிக்கலான பணியை மேற்கொள்ளும் போது எடுத்துக்கொள்ளும் படிகளின் வரிசையை, வெற்றிகள் மற்றும் தோல்விகளைச் சேமிக்கிறது. இது கடந்த "நிகழ்வுகள்" அல்லது அனுபவங்களை நினைவில் வைத்துக்கொண்டு அவற்றிலிருந்து கற்றுக்கொள்வது போன்றது. -**எபிசோடிக் நினைவக உதாரணம்** +**நிகழ்வு நினைவக உதாரணம்** -முகவர் ஒரு குறிப்பிட்ட விமானத்தை முன்பதிவு செய்ய முயற்சித்தால், ஆனால் அது கிடைக்காததால் தோல்வியடைந்தால், எபிசோடிக் நினைவகம் இந்த தோல்வியை பதிவு செய்யலாம், இது முகவருக்கு மாற்று விமானங்களை முயற்சிக்க அல்லது அடுத்த முறை பயனருக்கு இந்த பிரச்சினையைப் பற்றி தகவல் அளிக்க அனுமதிக்கிறது. +முகவர் ஒரு குறிப்பிட்ட விமானத்தை முன்பதிவு செய்ய முயன்றால், ஆனால் அது கிடைக்காததால் தோல்வியடைந்தால், நிகழ்வு நினைவகம் இந்த தோல்வியை பதிவு செய்யலாம், இது முகவருக்கு மாற்று விமானங்களை முயற்சிக்க அல்லது பயனருக்கு தகவல் வழங்க உதவுகிறது. #### பொருள் நினைவகம் -இது உரையாடல்களில் இருந்து குறிப்பிட்ட பொருட்கள் (மக்கள், இடங்கள் அல்லது பொருட்கள்) மற்றும் நிகழ்வுகளைப் பிடித்து நினைவில் வைத்துக்கொள்வதைக் குறிக்கிறது. இது விவாதிக்கப்பட்ட முக்கிய கூறுகளின் கட்டமைக்கப்பட்ட புரிதலை உருவாக்க முகவருக்கு உதவுகிறது. +இது உரையாடல்களில் இருந்து குறிப்பிட்ட பொருட்கள் (மனிதர்கள், இடங்கள் அல்லது பொருட்கள்) மற்றும் நிகழ்வுகளை எடுத்து நினைவில் வைத்துக்கொள்வதைக் குறிக்கிறது. இது உரையாடப்பட்ட முக்கிய அம்சங்களை அமைப்பான முறையில் புரிந்துகொள்ள முகவருக்கு உதவுகிறது. **பொருள் நினைவக உதாரணம்** -ஒரு முந்தைய பயணத்தைப் பற்றிய உரையாடலிலிருந்து, முகவர் "பாரிஸ்," "ஐஃபல் டவர்," மற்றும் "லே சாட் நோயர் உணவகத்தில் இரவு உணவு" போன்றவற்றை பொருட்களாகப் பிடிக்கலாம். எதிர்கால தொடர்பில், முகவர் "லே சாட் நோயர்" என்பதை நினைவூட்டிக் கொண்டு அங்கு புதிய முன்பதிவைச் செய்ய பரிந்துரை செய்யலாம். +கடந்த பயணத்தைப் பற்றிய உரையாடலிலிருந்து, முகவர் "பாரிஸ்," "ஐஃபெல் டவர்," மற்றும் "Le Chat Noir உணவகத்தில் இரவு உணவு" போன்ற பொருட்களை எடுக்கலாம். எதிர்கால தொடர்பில், முகவர் "Le Chat Noir" ஐ நினைவூட்ட முடியும் மற்றும் அங்கு புதிய முன்பதிவை செய்ய பரிந்துரைக்கலாம். -#### கட்டமைக்கப்பட்ட RAG (Retrieval Augmented Generation) +#### அமைப்பான RAG (Retrieval Augmented Generation) -RAG என்பது ஒரு பரந்த தொழில்நுட்பமாக இருந்தாலும், "கட்டமைக்கப்பட்ட RAG" ஒரு சக்திவாய்ந்த நினைவக தொழில்நுட்பமாக குறிப்பிடப்பட்டுள்ளது. இது பல்வேறு ஆதாரங்களிலிருந்து (உரையாடல்கள், மின்னஞ்சல்கள், படங்கள்) அடர்த்தியான, கட்டமைக்கப்பட்ட தகவல்களை எடுத்து, பதில்களில் துல்லியத்தையும் மீளப்பெறுதலையும் வேகத்தையும் மேம்படுத்துகிறது. செமாண்டிக் ஒத்திசைவை மட்டுமே நம்பும் பாரம்பரிய RAG-க்கு மாறாக, கட்டமைக்கப்பட்ட RAG தகவலின் உட்கட்டமைப்புடன் வேலை செய்கிறது. +RAG என்பது ஒரு பரந்த தொழில்நுட்பமாக இருந்தாலும், "அமைப்பான RAG" ஒரு சக்திவாய்ந்த நினைவக தொழில்நுட்பமாக குறிப்பிடப்படுகிறது. இது பல்வேறு மூலங்களிலிருந்து (உரையாடல்கள், மின்னஞ்சல்கள், படங்கள்) அடர்த்தியான, அமைப்பான தகவல்களை எடுத்து, பதில்களில் துல்லியத்தை, நினைவூட்டலை மற்றும் வேகத்தை மேம்படுத்த உதவுகிறது. பாரம்பரிய RAG semantic similarity-ஐ மட்டுமே நம்புவதற்கு மாறாக, Structured RAG தகவலின் உள்ளமைப்புடன் வேலை செய்கிறது. -**கட்டமைக்கப்பட்ட RAG உதாரணம்** +**அமைப்பான RAG உதாரணம்** -விசேஷமாக சொற்களை பொருத்துவதற்குப் பதிலாக, கட்டமைக்கப்பட்ட RAG ஒரு மின்னஞ்சலிலிருந்து விமான விவரங்களை (இலக்கு, தேதி, நேரம், விமான நிறுவனம்) பகுப்பாய்வு செய்து அவற்றை ஒரு கட்டமைக்கப்பட்ட முறையில் சேமிக்க முடியும். இது "செவ்வாய்க்கிழமை பாரிசுக்கு நான் எந்த விமானத்தை முன்பதிவு செய்தேன்?" போன்ற துல்லியமான கேள்விகளுக்கு பதிலளிக்க அனுமதிக்கிறது. +விசைப்பதிவுகளைப் பொருத்துவதற்கு மாறாக, Structured RAG ஒரு மின்னஞ்சலிலிருந்து விமான விவரங்களை (இடம், தேதி, நேரம், விமான நிறுவனம்) பகுப்பாய்வு செய்து அமைப்பான முறையில் சேமிக்கலாம். இது "நான் செவ்வாய்க்கிழமை பாரிஸ் செல்ல எந்த விமானத்தை முன்பதிவு செய்தேன்?" போன்ற துல்லியமான கேள்விகளை அனுமதிக்கிறது. ## நினைவகத்தை செயல்படுத்துதல் மற்றும் சேமித்தல் -AI முகவர்களுக்கு நினைவகத்தை செயல்படுத்துவது **நினைவக மேலாண்மை** என்ற அமைப்புசார்ந்த செயல்முறையை உள்ளடக்கியது, இதில் தகவல்களை உருவாக்குதல், சேமித்தல், மீட்டெடுத்தல், ஒருங்கிணைத்தல், புதுப்பித்தல் மற்றும் "மறந்துவிடுதல்" (அல்லது நீக்குதல்) ஆகியவை அடங்கும். குறிப்பாக, மீட்டெடுத்தல் மிகவும் முக்கியமான அம்சமாகும். +AI முகவர்களுக்கு நினைவகத்தை செயல்படுத்துவது **நினைவக மேலாண்மை** என்ற முறையான செயல்முறையை உள்ளடக்கியது, இது தகவலை உருவாக்குதல், சேமித்தல், மீட்டெடுப்பது, ஒருங்கிணைத்தல், புதுப்பித்தல் மற்றும் "மறக்குதல்" (அல்லது நீக்குதல்) ஆகியவற்றை உள்ளடக்கியது. குறிப்பாக, மீட்டெடுப்பு முக்கியமான அம்சமாகும். ### சிறப்பு நினைவக கருவிகள் -முகவர் நினைவகத்தை சேமிக்கவும் நிர்வகிக்கவும் ஒரு வழி Mem0 போன்ற சிறப்பு கருவிகளைப் பயன்படுத்துவது. Mem0 ஒரு நிலையான நினைவக அடுக்கு ஆக செயல்படுகிறது, இது முகவர்களுக்கு தொடர்புடைய தொடர்புகளை நினைவூட்ட, பயனர் விருப்பங்கள் மற்றும் உண்மையான சூழ்நிலையை சேமிக்க மற்றும் வெற்றிகள் மற்றும் தோல்விகளிலிருந்து கற்றுக்கொள்ள அனுமதிக்கிறது. இங்கே உள்ள கருத்து என்னவென்றால், நிலையற்ற முகவர்கள் நிலையானவர்களாக மாறுகிறார்கள். +#### Mem0 -இது ஒரு **இரண்டு கட்ட நினைவக குழாய்: சுருக்கம் மற்றும் புதுப்பிப்பு** மூலம் செயல்படுகிறது. முதலில், ஒரு முகவரின் திரையில் சேர்க்கப்பட்ட செய்திகள் Mem0 சேவைக்கு அனுப்பப்படுகின்றன, இது ஒரு பெரிய மொழி மாதிரியை (LLM) பயன்படுத்தி உரையாடல் வரலாற்றை சுருக்கி புதிய நினைவகங்களை எடுக்கிறது. பின்னர், ஒரு LLM இயக்கப்படும் புதுப்பிப்பு கட்டம் இந்த நினைவகங்களைச் சேர்க்க, மாற்ற அல்லது நீக்க முடிவு செய்கிறது, அவற்றை வெக்டர், கிராஃப் மற்றும் முக்கிய மதிப்பு தரவுத்தொகுப்புகள் போன்ற ஒரு கலப்பு தரவுத்தொகுப்பில் சேமிக்கிறது. இந்த அமைப்பு பல்வேறு நினைவக வகைகளை ஆதரிக்கிறது மற்றும் பொருட்களின் இடையே உறவுகளை நிர்வகிக்க கிராஃப் நினைவகத்தை உள்ளடக்க முடியும். +முகவர்களின் நினைவகத்தை சேமிக்கவும் நிர்வகிக்கவும் Mem0 போன்ற சிறப்பு கருவிகளைப் பயன்படுத்தலாம். Mem0 ஒரு நிலையான நினைவக அடுக்கு ஆக செயல்படுகிறது, இது முகவர்களுக்கு தொடர்புகளை நினைவூட்ட, பயனர் விருப்பங்கள் மற்றும் உண்மையான சூழலை சேமிக்கவும், காலப்போக்கில் வெற்றிகள் மற்றும் தோல்விகளிலிருந்து கற்றுக்கொள்ளவும் உதவுகிறது. இங்கு கருத்து, நிலையற்ற முகவர்கள் நிலையானவர்களாக மாறுகின்றனர். -### RAG மூலம் நினைவகத்தை சேமித்தல் +#### Cognee -Mem0 போன்ற சிறப்பு நினைவக கருவிகளைத் தவிர, **Azure AI Search போன்ற வலுவான தேடல் சேவைகளை நினைவகங்களை சேமிக்கவும் மீட்டெடுக்கவும்** பின்புலமாகப் பயன்படுத்தலாம், குறிப்பாக கட்டமைக்கப்பட்ட RAG க்காக. +மற்றொரு சக்திவாய்ந்த அணுகுமுறை **Cognee** ஐப் பயன்படுத்துவது, இது AI முகவர்களுக்கு திறந்த மூல semantic memory ஆக செயல்படுகிறது, அமைப்பான மற்றும் அமைப்பற்ற தரவுகளை எம்பெடிங்குகளால் ஆதரிக்கப்படும் கேள்விக்குரிய அறிவு வரைபடங்களாக மாற்றுகிறது. Cognee **இரட்டை-சேமிப்பு கட்டமைப்பை** வழங்குகிறது, இது வெக்டர் ஒத்திசைவு தேடலுடன் வரைபட உறவுகளை இணைக்கிறது, தகவல் ஒத்திசைவு மட்டுமல்லாமல், கருத்துகள் எப்படி தொடர்புடையவை என்பதை முகவர்களுக்கு புரிந்துகொள்ள உதவுகிறது. -இது உங்கள் முகவரின் பதில்களை உங்கள் சொந்த தரவுடன் நிலைநிறுத்த அனுமதிக்கிறது, மேலும் தொடர்புடைய மற்றும் துல்லியமான பதில்களை உறுதிசெய்கிறது. Azure AI Search பயனர்-சிறப்பு பயண நினைவகங்கள், தயாரிப்பு பட்டியல்கள் அல்லது பிற துறைக்கு-சிறப்பு அறிவு போன்றவற்றை சேமிக்க பயன்படுத்தப்படலாம். +### RAG மூலம் நினைவகத்தை சேமித்தல் -Azure AI Search **கட்டமைக்கப்பட்ட RAG** போன்ற திறன்களை ஆதரிக்கிறது, இது உரையாடல் வரலாறுகள், மின்னஞ்சல்கள் அல்லது படங்கள் போன்ற பெரிய தரவுத்தொகுப்புகளிலிருந்து அடர்த்தியான, கட்டமைக்கப்பட்ட தகவல்களை எடுக்கவும் மீட்டெடுக்கவும் சிறந்தது. இது பாரம்பரிய உரை துண்டாக்கல் மற்றும் எம்பெட்டிங் அணுகுமுறைகளுடன் ஒப்பிடும்போது "மிகுந்த துல்லியத்தையும் மீளப்பெறுதலையும்" வழங்குகிறது. +Mem0 போன்ற சிறப்பு நினைவக கருவிகளைத் தவிர, **Azure AI Search** போன்ற வலுவான தேடல் சேவைகளை நினைவகங்களை சேமிக்கவும் மீட்டெடுக்கவும் பின்புலமாக பயன்படுத்தலாம், குறிப்பாக அமைப்பான RAG க்காக. ## AI முகவர்களை தன்னம்பிக்கையுடன் மேம்படுத்துதல் -தன்னம்பிக்கையுடன் மேம்படும் முகவர்களுக்கு பொதுவான முறை **"அறிவு முகவர்"** ஒன்றை அறிமுகப்படுத்துவதை உள்ளடக்கியது. இந்த தனி முகவர் பயனர் மற்றும் முதன்மை முகவருக்கு இடையிலான முக்கிய உரையாடலை கவனிக்கிறது. இதன் பங்கு: - -1. **முக்கியமான தகவல்களை அடையாளம் காண்க**: உரையாடலின் எந்த பகுதியும் பொதுவான அறிவாக அல்லது குறிப்பிட்ட பயனர் விருப்பமாக சேமிக்கப்பட வேண்டுமா என்பதை தீர்மானிக்கவும். - -2. **தகவலை எடுத்து சுருக்கவும்**: உரையாடலிலிருந்து முக்கியமான கற்றலோ அல்லது விருப்பத்தையோ சுருக்கவும். - -3. **அறிவு தரவுத்தொகுப்பில் சேமிக்கவும்**: இந்த எடுக்கப்பட்ட தகவல்களை நிலைத்துவமாக சேமிக்கவும், பெரும்பாலும் ஒரு வெக்டர் தரவுத்தொகுப்பில், பின்னர் அதை மீட்டெடுக்க முடியும். - -4. **எதிர்கால கேள்விகளை மேம்படுத்தவும்**: பயனர் புதிய கேள்வியைத் தொடங்கும்போது, அறிவு முகவர் தொடர்புடைய சேமிக்கப்பட்ட தகவல்களை மீட்டெடுத்து, பயனரின் உத்தேசத்திற்கு அதைச் சேர்க்கிறது, இது முதன்மை முகவருக்கு முக்கியமான சூழ்நிலையை வழங்குகிறது (RAG போன்றது). - -### நினைவகத்திற்கான மேம்பாடுகள் - -• **தாமத மேலாண்மை**: பயனர் தொடர்புகளை மெதுவாக செய்யாமல் இருக்க, தகவல் மதிப்புமிக்கதா என்பதைச் சரிபார்க்க முதலில் மலிவான, வேகமான மாதிரியைப் பயன்படுத்தலாம், தேவைப்படும் போது மட்டுமே சிக்கலான சுருக்கம்/மீட்டெடுப்பு செயல்முறையை அழைக்கலாம். - -• **அறிவு தரவுத்தொகுப்பு பராமரிப்பு**: ஒரு வளர்ந்துவரும் அறிவு தரவுத்தொகுப்பிற்காக, குறைவாக பயன்படுத்தப்படும் தகவல்களை "குளிர் சேமிப்பு"க்கு மாற்றலாம், செலவுகளை நிர்வகிக்க. - -## முகவர் நினைவகம் குறித்த மேலும் கேள்விகள் உள்ளதா? - -மற்ற கற்றலாளர்களை சந்திக்கவும், அலுவலக நேரங்களில் பங்கேற்கவும் மற்றும் உங்கள் AI முகவர் தொடர்பான கேள்விகளுக்கு பதிலளிக்கவும் [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) க்கு சேரவும். +தன்னம்பிக்கையுடன் மேம்படும் முகவர்களுக்கு ஒரு **"அறிவு முகவர்"** அறிமுகப்படுத்துவது பொதுவான முறை. --- -**குறிப்பு**: -இந்த ஆவணம் [Co-op Translator](https://github.com/Azure/co-op-translator) என்ற AI மொழிபெயர்ப்பு சேவையைப் பயன்படுத்தி மொழிபெயர்க்கப்பட்டுள்ளது. நாங்கள் துல்லியத்திற்காக முயற்சிக்கின்றோம், ஆனால் தானியங்கி மொழிபெயர்ப்புகளில் பிழைகள் அல்லது தவறான தகவல்கள் இருக்கக்கூடும் என்பதை தயவுசெய்து கவனத்தில் கொள்ளுங்கள். அதன் தாய்மொழியில் உள்ள மூல ஆவணம் அதிகாரப்பூர்வ ஆதாரமாக கருதப்பட வேண்டும். முக்கியமான தகவல்களுக்கு, தொழில்முறை மனித மொழிபெயர்ப்பு பரிந்துரைக்கப்படுகிறது. இந்த மொழிபெயர்ப்பைப் பயன்படுத்துவதால் ஏற்படும் எந்த தவறான புரிதல்கள் அல்லது தவறான விளக்கங்களுக்கு நாங்கள் பொறுப்பல்ல. \ No newline at end of file + +**புறக்குறிப்பு**: +இந்த ஆவணம் AI மொழிபெயர்ப்பு சேவை [Co-op Translator](https://github.com/Azure/co-op-translator) பயன்படுத்தி மொழிபெயர்க்கப்பட்டுள்ளது. நாங்கள் துல்லியத்திற்காக முயற்சிக்கின்றோம், ஆனால் தானியங்கி மொழிபெயர்ப்புகளில் பிழைகள் அல்லது தவறுகள் இருக்கக்கூடும் என்பதை கவனத்தில் கொள்ளவும். அதன் தாய்மொழியில் உள்ள மூல ஆவணம் அதிகாரப்பூர்வ ஆதாரமாக கருதப்பட வேண்டும். முக்கியமான தகவல்களுக்கு, தொழில்முறை மனித மொழிபெயர்ப்பு பரிந்துரைக்கப்படுகிறது. இந்த மொழிபெயர்ப்பைப் பயன்படுத்துவதால் ஏற்படும் எந்த தவறான புரிதல்கள் அல்லது தவறான விளக்கங்களுக்கு நாங்கள் பொறுப்பல்ல. + \ No newline at end of file diff --git a/translations/te/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/te/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..1da198579 --- /dev/null +++ b/translations/te/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Cognee ఉపయోగించి శాశ్వత మెమరీతో AI ఏజెంట్లను నిర్మించడం\n", + "\n", + "ఈ నోట్‌బుక్ [**cognee**](https://www.cognee.ai/) ఉపయోగించి అధునాతన మెమరీ సామర్థ్యాలతో తెలివైన AI ఏజెంట్లను ఎలా నిర్మించాలో చూపిస్తుంది - ఇది ఓపెన్ సోర్స్ AI మెమరీ, జ్ఞాన గ్రాఫ్‌లు, సెమాంటిక్ సెర్చ్, మరియు సెషన్ మేనేజ్‌మెంట్‌ను కలిపి కాంటెక్స్ట్-అవేర్ AI సిస్టమ్‌లను సృష్టిస్తుంది.\n", + "\n", + "## 🎯 నేర్చుకునే లక్ష్యాలు\n", + "\n", + "ఈ ట్యుటోరియల్ ముగిసే నాటికి, మీరు ఈ విషయాలను అర్థం చేసుకుంటారు:\n", + "- **ఎంబెడింగ్‌లతో మద్దతు ఉన్న జ్ఞాన గ్రాఫ్‌లను నిర్మించడం**: నిర్మాణరహిత టెక్స్ట్‌ను నిర్మిత, ప్రశ్నించగలిగే జ్ఞానంగా మార్చడం\n", + "- **సెషన్ మెమరీని అమలు చేయడం**: ఆటోమేటిక్ కాంటెక్స్ట్ నిలుపుదలతో బహు-మలుపుల సంభాషణలను సృష్టించడం\n", + "- **సంభాషణలను నిల్వ చేయడం**: భవిష్యత్తులో సూచన కోసం ముఖ్యమైన పరస్పర చర్యలను దీర్ఘకాలిక మెమరీలో నిల్వ చేయడం\n", + "- **నేచురల్ లాంగ్వేజ్ ఉపయోగించి ప్రశ్నించడం**: కొత్త సంభాషణల్లో చారిత్రక కాంటెక్స్ట్‌ను యాక్సెస్ చేసి ఉపయోగించడం\n", + "- **మెమరీని విజువలైజ్ చేయడం**: మీ ఏజెంట్ జ్ఞాన గ్రాఫ్‌లో సంబంధాలను అన్వేషించడం\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ మీరు నిర్మించబోయేది ఏమిటి\n", + "\n", + "ఈ ట్యుటోరియల్‌లో, మేము **కోడింగ్ అసిస్టెంట్** ను స్థిరమైన మెమరీతో తయారు చేస్తాము, ఇది:\n", + "\n", + "### 1. **నాలెడ్జ్ బేస్ నిర్మాణం**\n", + " - డెవలపర్ ప్రొఫైల్ మరియు నైపుణ్య సమాచారం పొందుతుంది\n", + " - పైథాన్ ప్రోగ్రామింగ్ సూత్రాలు మరియు ఉత్తమ పద్ధతులను ప్రాసెస్ చేస్తుంది\n", + " - డెవలపర్లు మరియు AI అసిస్టెంట్ల మధ్య చారిత్రక సంభాషణలను నిల్వ చేస్తుంది\n", + "\n", + "### 2. **సెషన్-అవేర్ సంభాషణలు**\n", + " - అదే సెషన్‌లో అనేక ప్రశ్నల మధ్య సందర్భాన్ని నిర్వహిస్తుంది\n", + " - ప్రతి ప్రశ్న/జవాబు జంటను సమర్థవంతమైన రిట్రీవల్ కోసం ఆటోమేటిక్‌గా క్యాష్ చేస్తుంది\n", + " - సంభాషణ చరిత్ర ఆధారంగా సుస్పష్టమైన, సందర్భానుసారమైన జవాబులను అందిస్తుంది\n", + "\n", + "### 3. **దీర్ఘకాలిక మెమరీ**\n", + " - ముఖ్యమైన సంభాషణలను దీర్ఘకాలిక మెమరీలో నిల్వ చేస్తుంది\n", + " - నాలెడ్జ్ బేస్ మరియు గత సెషన్ల నుండి సంబంధిత మెమరీలను రిట్రీవ్ చేసి కొత్త పరస్పర చర్యలకు సమాచారం అందిస్తుంది\n", + " - కాలక్రమేణా మెరుగుపడే పెరుగుతున్న నాలెడ్జ్ బేస్‌ను నిర్మిస్తుంది\n", + "\n", + "### 4. **బుద్ధిమంతమైన మెమరీ రిట్రీవల్**\n", + " - నిల్వ చేయబడిన మొత్తం నాలెడ్జ్‌లో సంబంధిత సమాచారాన్ని కనుగొనడానికి గ్రాఫ్-అవేర్ సెమాంటిక్ సెర్చ్‌ను ఉపయోగిస్తుంది\n", + " - డేటా ఉపగుంపుల ద్వారా సెర్చ్‌లను ఫిల్టర్ చేస్తుంది (డెవలపర్ సమాచారం vs. సూత్రాలు)\n", + " - సమగ్ర జవాబులను అందించడానికి అనేక డేటా మూలాలను కలిపి ఉపయోగిస్తుంది\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 ముందస్తు అవసరాలు & సెటప్\n", + "\n", + "### సిస్టమ్ అవసరాలు\n", + "\n", + "ప్రారంభించడానికి ముందు, మీ వద్ద ఈ క్రింది వాటి ఉనికిని నిర్ధారించుకోండి:\n", + "\n", + "1. **Python వాతావరణం**\n", + " - Python 3.9 లేదా అంతకంటే పై వెర్షన్\n", + " - వర్చువల్ ఎన్విరాన్‌మెంట్ (సిఫార్సు చేయబడింది)\n", + "\n", + "2. **Redis Cache** (సెషన్ నిర్వహణ కోసం అవసరం)\n", + " - లోకల్ Redis: `docker run -d -p 6379:6379 redis`\n", + " - లేదా మేనేజ్‌డ్ Redis సర్వీస్ ఉపయోగించండి\n", + "\n", + "3. **LLM API యాక్సెస్**\n", + " - OpenAI API కీ లేదా ఇతర ప్రొవైడర్లు (ఇక్కడ [డాక్యుమెంటేషన్](https://docs.cognee.ai/setup-configuration/llm-providers) చూడండి)\n", + "\n", + "4. **డేటాబేస్ కాన్ఫిగరేషన్**\n", + " - డిఫాల్ట్‌గా ఎటువంటి కాన్ఫిగరేషన్ అవసరం లేదు. Cognee ఫైల్-బేస్డ్ డేటాబేస్‌లు (LanceDB మరియు Kuzu) ఉపయోగిస్తుంది.\n", + " - ఐచ్ఛికంగా, మీరు Azure AI Search ను వెక్టర్ స్టోర్‌గా సెటప్ చేయవచ్చు (ఇక్కడ [డాక్యుమెంటేషన్](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch) చూడండి)\n", + "\n", + "### వాతావరణం కాన్ఫిగరేషన్\n", + "\n", + "మీ ప్రాజెక్ట్ డైరెక్టరీలో `.env` ఫైల్‌ను క్రియేట్ చేసి, ఈ క్రింది వేరియబుల్స్‌ను జోడించండి:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Cognee యొక్క మెమరీ ఆర్కిటెక్చర్‌ను అర్థం చేసుకోవడం\n", + "\n", + "### Cognee ఎలా పనిచేస్తుంది\n", + "\n", + "Cognee సాధారణ కీ-విలువ నిల్వకు మించి ఉన్న ఒక క్లిష్టమైన మెమరీ వ్యవస్థను అందిస్తుంది:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### ముఖ్యమైన భాగాలు:\n", + "\n", + "1. **నాలెడ్జ్ గ్రాఫ్**: ఎంటిటీలను, సంబంధాలను, మరియు సెమాంటిక్ కనెక్షన్లను నిల్వ చేస్తుంది \n", + "2. **వెక్టార్ ఎంబెడింగ్స్**: నిల్వ చేయబడిన సమాచారం అంతటా సెమాంటిక్ సెర్చ్‌ను సాధ్యమవుతుంది \n", + "3. **సెషన్ క్యాష్**: సెషన్లలో మరియు సెషన్ల మధ్య సంభాషణ కంటెక్స్ట్‌ను నిర్వహిస్తుంది \n", + "4. **నోడ్‌సెట్స్**: లక్ష్యిత రిట్రీవల్ కోసం డేటాను తార్కిక వర్గాలుగా నిర్వహిస్తుంది \n", + "\n", + "### ఈ ట్యుటోరియల్‌లో మెమరీ రకాలు:\n", + "\n", + "- **పర్సిస్టెంట్ మెమరీ**: నాలెడ్జ్ గ్రాఫ్‌లో దీర్ఘకాల నిల్వ \n", + "- **సెషన్ మెమరీ**: Redis క్యాష్‌లో తాత్కాలిక సంభాషణ కంటెక్స్ట్ \n", + "- **సెమాంటిక్ మెమరీ**: అన్ని డేటా అంతటా వెక్టర్ ఆధారిత సారూప్యత సెర్చ్ \n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 అవసరమైన ప్యాకేజీలను ఇన్‌స్టాల్ చేయండి\n", + "\n", + "సెషన్ నిర్వహణ కోసం Redis మద్దతుతో Cognee ను ఇన్‌స్టాల్ చేయండి:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 పరిసరాలను ప్రారంభించి లైబ్రరీలను లోడ్ చేయండి\n", + "\n", + "దయచేసి నిర్ధారించండి:\n", + "1. Redis నడుస్తోంది (ఉదా., Docker ద్వారా: `docker run -d -p 6379:6379 redis`)\n", + "2. Cache మాడ్యూల్స్‌ను ఇంపోర్ట్ చేయడానికి ముందు పరిసర వేరియబుల్స్ సెట్ చేయబడ్డాయి\n", + "3. అవసరమైతే, కర్నల్‌ను రీస్టార్ట్ చేసి, సెల్స్‌ను క్రమంగా నడపండి\n", + "\n", + "క్రింది సెల్:\n", + "1. `.env` నుండి పరిసర వేరియబుల్స్‌ను లోడ్ చేస్తుంది\n", + "2. మీ LLM సెట్టింగులతో Cognee ను కాన్ఫిగర్ చేస్తుంది\n", + "3. సెషన్ మేనేజ్‌మెంట్ కోసం క్యాషింగ్‌ను ఎనేబుల్ చేస్తుంది\n", + "4. అన్ని భాగాలు సరిగా కనెక్ట్ అయ్యాయా అని ధృవీకరిస్తుంది\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 నిల్వ డైరెక్టరీలను కాన్ఫిగర్ చేయండి\n", + "\n", + "Cognee తన ఆపరేషన్ల కోసం రెండు వేర్వేరు డైరెక్టరీలను ఉపయోగిస్తుంది:\n", + "- **డేటా రూట్**: ఇంజెస్ట్ చేసిన డాక్యుమెంట్లు మరియు ప్రాసెస్ చేసిన డేటాను నిల్వ చేస్తుంది\n", + "- **సిస్టమ్ రూట్**: నాలెడ్జ్ గ్రాఫ్ డేటాబేస్ మరియు సిస్టమ్ మెటాడేటాను కలిగి ఉంటుంది\n", + "\n", + "ఈ ట్యుటోరియల్ కోసం, మేము క్రింది విధంగా వేరు డైరెక్టరీలను సృష్టిస్తాము:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 మెమరీ స్థితిని రీసెట్ చేయండి\n", + "\n", + "మన మెమరీ వ్యవస్థను నిర్మించడం ప్రారంభించే ముందు, మనం కొత్తగా ప్రారంభిస్తున్నామని నిర్ధారించుకుందాం.\n", + "\n", + "> 💡 **సూచన**: మీరు ఈ నోట్‌బుక్‌ను తర్వాత ఉపయోగించినప్పుడు మీ గత రన్ల నుండి ఉన్న మెమరీలను నిలుపుకోవాలనుకుంటే, ఈ దశను దాటవచ్చు.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 భాగం 1: జ్ఞాన ఆధారం నిర్మించడం\n", + "\n", + "### మా డెవలపర్ అసిస్టెంట్ కోసం డేటా వనరులు\n", + "\n", + "మేము సమగ్రమైన జ్ఞాన ఆధారం సృష్టించడానికి మూడు రకాల డేటాను పొందుతాము:\n", + "\n", + "1. **డెవలపర్ ప్రొఫైల్**: వ్యక్తిగత నైపుణ్యం మరియు సాంకేతిక నేపథ్యం \n", + "2. **Python ఉత్తమ పద్ధతులు**: Python యొక్క జెన్ మరియు ప్రాక్టికల్ మార్గదర్శకాలు \n", + "3. **చారిత్రక సంభాషణలు**: డెవలపర్లు మరియు AI అసిస్టెంట్ల మధ్య గత Q&A సెషన్లు \n", + "\n", + "ఈ విభిన్నమైన డేటా మా ఏజెంట్‌కు ఈ క్రింది సామర్థ్యాలను అందిస్తుంది: \n", + "- వినియోగదారుడి సాంకేతిక సందర్భాన్ని అర్థం చేసుకోవడం \n", + "- సిఫారసుల్లో ఉత్తమ పద్ధతులను వర్తింపజేయడం \n", + "- గత విజయవంతమైన పరస్పర చర్యల నుండి నేర్చుకోవడం \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 డేటాను నాలెడ్జ్ గ్రాఫ్‌గా ప్రాసెస్ చేయడం\n", + "\n", + "ఇప్పుడు మనం ముడి పాఠ్యాన్ని ఒక నిర్మితమైన మెమరీగా మార్చుతాము. ఈ ప్రక్రియ:\n", + "\n", + "1. **డేటాను NodeSetsకి జోడిస్తుంది**: సమాచారాన్ని తార్కిక వర్గాలుగా క్రమబద్ధం చేస్తుంది \n", + " - `developer_data`: డెవలపర్ ప్రొఫైల్ మరియు సంభాషణలు \n", + " - `principles_data`: Python ఉత్తమ పద్ధతులు మరియు మార్గదర్శకాలు \n", + "\n", + "2. **Cognify Pipeline నడుపుతుంది**: ఎంటిటీలను, సంబంధాలను వెలికితీసి, ఎంబెడ్డింగ్స్‌ను సృష్టిస్తుంది \n", + " - ముఖ్యమైన భావనలను గుర్తిస్తుంది \n", + " - సంబంధిత సమాచారానికి సెమాంటిక్ కనెక్షన్లను సృష్టిస్తుంది \n", + " - వెక్టర్ ఎంబెడ్డింగ్స్‌ను ఉత్పత్తి చేస్తుంది \n", + "\n", + "ఇది కొంత సమయం పడవచ్చు, ఎందుకంటే LLM పాఠ్యాన్ని ప్రాసెస్ చేసి గ్రాఫ్ నిర్మాణాన్ని నిర్మిస్తుంది:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 జ్ఞాన గ్రాఫ్‌ను విజువలైజ్ చేయండి\n", + "\n", + "మన జ్ఞాన గ్రాఫ్ నిర్మాణాన్ని పరిశీలిద్దాం. ఈ విజువలైజేషన్ చూపిస్తుంది:\n", + "- **నోడ్స్**: టెక్స్ట్ నుండి తీసుకున్న ఎంటిటీలను (కాన్సెప్ట్స్, టెక్నాలజీస్, వ్యక్తులు)\n", + "- **ఎడ్జెస్**: ఎంటిటీల మధ్య సంబంధాలు మరియు కనెక్షన్లు\n", + "- **క్లస్టర్స్**: సెమాంటిక్ సారూప్యత ఆధారంగా గ్రూప్ చేయబడిన సంబంధిత కాన్సెప్ట్స్\n", + "\n", + "గ్రాఫ్‌ను ఇంటరాక్టివ్‌గా అన్వేషించడానికి మీ బ్రౌజర్‌లో రూపొందించిన HTML ఫైల్‌ను ఓపెన్ చేయండి:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 మెమరీని మెరుగుపరచడం Memify తో\n", + "\n", + "`memify()` ఫంక్షన్ జ్ఞాన గ్రాఫ్‌ను విశ్లేషించి, డేటా గురించి తెలివైన నియమాలను రూపొందిస్తుంది. ఈ ప్రక్రియ:\n", + "- నమూనాలు మరియు ఉత్తమ పద్ధతులను గుర్తిస్తుంది\n", + "- కంటెంట్ ఆధారంగా అమలు చేయగల మార్గదర్శకాలను సృష్టిస్తుంది\n", + "- వివిధ జ్ఞాన ప్రాంతాల మధ్య సంబంధాలను స్థాపిస్తుంది\n", + "\n", + "ఈ నియమాలు ఏజెంట్‌కు ప్రశ్నలకు సమాధానం ఇవ్వడంలో మరింత సమాచారం కలిగిన నిర్ణయాలు తీసుకోవడంలో సహాయపడతాయి. రెండవ విజువలైజేషన్‌ను క్యాప్చర్ చేయడం ద్వారా, గ్రాఫ్ మెరుగుపరచిన తర్వాత అది ఎలా సాంద్రీకృతమవుతుందో మీరు సరిపోల్చవచ్చు.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 భాగం 2: తెలివైన మెమరీ రిట్రీవల్\n", + "\n", + "### ప్రదర్శన 1: క్రాస్-డాక్యుమెంట్ నాలెడ్జ్ ఇంటిగ్రేషన్\n", + "\n", + "మన నాలెడ్జ్ గ్రాఫ్ నిర్మించబడిన తర్వాత, Cognee అనేక మూలాల నుండి సమాచారాన్ని కలిపి క్లిష్టమైన ప్రశ్నలకు ఎలా సమాధానం ఇస్తుందో పరీక్షిద్దాం.\n", + "\n", + "మొదటి ప్రశ్న ఇది చూపిస్తుంది:\n", + "- **సెమాంటిక్ అర్థం**: స్పష్టంగా ప్రస్తావించనప్పుడు కూడా సంబంధిత భావాలను కనుగొనడం\n", + "- **క్రాస్-రెఫరెన్సింగ్**: డెవలపర్ ప్రొఫైల్‌ను Python సూత్రాలతో కలపడం\n", + "- **కాంటెక్స్టువల్ రీజనింగ్**: ఉత్తమ పద్ధతులను నిర్దిష్ట అమలులకు వర్తింపజేయడం\n", + "\n", + "### ప్రదర్శన 2: నోడ్‌సెట్‌లతో ఫిల్టర్ చేసిన సెర్చ్\n", + "\n", + "రెండవ ప్రశ్న నాలెడ్జ్ గ్రాఫ్‌లోని నిర్దిష్ట ఉపసమితులను లక్ష్యంగా చేసుకోవడం ఎలా అనేది చూపిస్తుంది:\n", + "- `node_name` పారామీటర్‌ను ఉపయోగించి `principles_data`లో మాత్రమే శోధిస్తుంది\n", + "- నిర్దిష్ట నాలెడ్జ్ డొమైన్ నుండి కేంద్రీకృత సమాధానాలను అందిస్తుంది\n", + "- మీరు డొమైన్-స్పెసిఫిక్ సమాచారం అవసరమైనప్పుడు ఉపయోగపడుతుంది\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 భాగం 3: సెషన్ నిర్వహణ సెటప్\n", + "\n", + "### సంభాషణ మెమరీ ప్రారంభించడం\n", + "\n", + "సెషన్ నిర్వహణ అనేది బహుళ పరస్పర చర్యలలో సందర్భాన్ని నిర్వహించడానికి కీలకం. ఇక్కడ మేము చేస్తాము:\n", + "\n", + "1. **వినియోగదారు సందర్భాన్ని ప్రారంభించండి**: సెషన్ ట్రాకింగ్ కోసం వినియోగదారు ప్రొఫైల్‌ను సృష్టించండి లేదా పొందండి \n", + "2. **క్యాష్ ఇంజిన్‌ను కాన్ఫిగర్ చేయండి**: సంభాషణ చరిత్రను నిల్వ చేయడానికి Redis కు కనెక్ట్ అవ్వండి \n", + "3. **సెషన్ వేరియబుల్స్‌ను ప్రారంభించండి**: ప్రశ్నల మధ్య కొనసాగే సందర్భ వేరియబుల్స్‌ను సెటప్ చేయండి \n", + "\n", + "> ⚠️ **ముఖ్యమైనది**: దీని కోసం Redis నడుస్తుండాలి మరియు మీ పరిసరాల్లో `CACHING=true` ఉండాలి\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ సహాయక ఫంక్షన్: సెషన్ చరిత్రను చూడండి\n", + "\n", + "ఈ యుటిలిటీ ఫంక్షన్ Redis లో నిల్వచేసిన సంభాషణ చరిత్రను పరిశీలించడానికి అనుమతిస్తుంది. ఇది ఉపయోగకరంగా ఉంటుంది:\n", + "- సెషన్ నిర్వహణను డీబగ్ చేయడానికి\n", + "- సంభాషణలు క్యాష్ చేయబడుతున్నాయా అని ధృవీకరించడానికి\n", + "- ఏ సందర్భం ఏజెంట్‌కు అందుబాటులో ఉందో అర్థం చేసుకోవడానికి\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## సెషన్ 1: అసింక్ సపోర్ట్ ల్యాబ్ — మొదటి ప్రశ్న\n", + "\n", + "`async-support-lab` సెషన్‌ను ప్రారంభించండి, పెద్ద వెబ్ స్క్రాపర్ కోసం టెలిమెట్రీ-ఫ్రెండ్లీ asyncio ప్యాటర్న్స్ గురించి అడగండి. గ్రాఫ్ ఇప్పటికే asyncio, aiohttp, మరియు మానిటరింగ్ ప్రాక్టీసుల గురించి తెలుసు, కాబట్టి సమాధానం గత సంభాషణలను ప్రతిబింబిస్తూ, కొత్త ప్రశ్నకు అనుగుణంగా ఉండాలి.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## సెషన్ 1 మెమరీని మొదటి మార్పిడి తర్వాత పరిశీలించండి\n", + "\n", + "ప్రారంభ ప్రశ్న తర్వాత వెంటనే `show_history(session_1)` నడపడం ద్వారా, Cognee ప్రాంప్ట్ మరియు పూర్తి భాగాన్ని Redis లో రాశిందని నిర్ధారించవచ్చు. మీరు ఒక ఎంట్రీని కాంకరెన్సీ గైడెన్స్‌తో చూడగలుగుతారు.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## సెషన్ 1: డేటా మోడల్స్ పై ఫాలో-అప్\n", + "\n", + "తరువాత మేము అడుగుతాము, \"డేటాక్లాసెస్ మరియు Pydantic మధ్య ఎప్పుడు ఎంచుకోవాలి?\" అదే సెషన్ ID ఉపయోగించి. Cognee Python సూత్రాలు మరియు గత FastAPI సంభాషణలను కలిపి, సున్నితమైన సలహాలను అందించాలి—ఒక పేరుతో ఉన్న సెషన్‌లో సందర్భం కొనసాగుతుందని చూపిస్తూ.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## సెషన్ 1 చరిత్రలో రెండు టర్న్‌లు ఉన్నాయో లేదో నిర్ధారించండి\n", + "\n", + "మరొక `show_history(session_1)` కాల్ రెండు ప్రశ్నలు మరియు సమాధానాలు ఉన్న ఎంట్రీలను చూపిస్తుంది. ఇది Mem0 ల్యాబ్ యొక్క \"మెమరీ రీప్లే\" దశకు సరిపోతుంది మరియు అదనపు టర్న్‌లు అదే ట్రాన్స్క్రిప్ట్‌ను కొనసాగిస్తాయని నిరూపిస్తుంది.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## సెషన్ 2: డిజైన్ రివ్యూ థ్రెడ్ — కొత్త సెషన్\n", + "\n", + "థ్రెడ్‌ల మధ్య వేరుపును చూపించడానికి, మేము `design-review-session` ను ప్రారంభించి, సంఘటన రివ్యూల కోసం లాగింగ్ మార్గదర్శకతను అడుగుతాము. మౌలిక జ్ఞాన ఆధారం ఒకటే అయినప్పటికీ, కొత్త సెషన్ ఐడీ ట్రాన్స్క్రిప్ట్‌లను వేరుగా ఉంచుతుంది.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## సమీక్ష సెషన్ 2 చరిత్ర\n", + "\n", + "`show_history(session_2)` డిజైన్-రివ్యూ ప్రాంప్ట్/రెస్పాన్స్ జంటను మాత్రమే చూపించాలి. సెషన్ 1తో దీన్ని పోల్చి చూడండి, Cognee ఎలా స్వతంత్ర ట్రాన్స్క్రిప్ట్‌లను నిర్వహిస్తుందో, అలాగే పంచుకున్న జ్ఞాన గ్రాఫ్‌ను పునర్వినియోగం చేస్తుందో వివరించండి.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## సారాంశం\n", + "\n", + "అభినందనలు! మీరు మీ కోడింగ్ అసిస్టెంట్‌కు Cognee ద్వారా శక్తివంతమైన దీర్ఘకాలిక మెమరీ లేయర్‌ను అందించారు.\n", + "\n", + "ఈ ట్యుటోరియల్‌లో మీరు ముడి డెవలపర్ కంటెంట్ (కోడ్, డాక్స్, చాట్స్) తీసుకుని దాన్ని గ్రాఫ్ + వెక్టర్ మెమరీగా మార్చి, మీ ఏజెంట్ అన్వేషించగలిగే, ఆలోచించగలిగే మరియు నిరంతరం మెరుగుపరుచుకోగలిగేలా చేశారు.\n", + "\n", + "మీరు నేర్చుకున్నది:\n", + "\n", + "1. **ముడి టెక్స్ట్ నుండి AI మెమరీ వరకు**: Cognee ఎలా అసంఘటిత డేటాను గ్రహించి, వెక్టర్ + నాలెడ్జ్ గ్రాఫ్ ఆర్కిటెక్చర్ ఉపయోగించి తెలివైన, శోధన చేయగలిగే మెమరీగా మార్చుతుందో.\n", + "\n", + "2. **మెమిఫైతో గ్రాఫ్ ఎన్‌రిచ్‌మెంట్**: ప్రాథమిక గ్రాఫ్ సృష్టి దాటించి, మీ ఉన్న గ్రాఫ్‌పై ఉత్పన్నమైన వాస్తవాలు మరియు సమృద్ధమైన సంబంధాలను జోడించడానికి మెమిఫైని ఎలా ఉపయోగించాలో.\n", + "\n", + "3. **బహుళ శోధన వ్యూహాలు**: మీ ఏజెంట్ అవసరాలకు అనుగుణంగా వివిధ శోధన రకాల (గ్రాఫ్-అవేర్ Q&A, RAG-శైలి కంప్లీషన్, ఇన్‌సైట్స్, ముడి చంక్స్, కోడ్ శోధన మొదలైనవి)తో మెమరీని ఎలా ప్రశ్నించాలో.\n", + "\n", + "4. **దృశ్య అన్వేషణ**: Cognee నిర్మించిన దాన్ని గ్రాఫ్ విజువలైజేషన్లు మరియు Cognee UI ఉపయోగించి ఎలా తనిఖీ చేయాలో మరియు డీబగ్ చేయాలో, తద్వారా మీరు జ్ఞానం ఎలా నిర్మించబడిందో చూడగలుగుతారు.\n", + "\n", + "5. **సెషన్-అవేర్ మెమరీ**: ఏజెంట్లు రన్‌ల మధ్య వినియోగదారుల మధ్య సమాచారం లీక్ చేయకుండా గుర్తుంచుకోగలిగేలా, ప్రతి సెషన్ కంటెక్స్ట్‌ను స్థిరమైన సెమాంటిక్ మెమరీతో ఎలా కలపాలో.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## ముఖ్యమైన అంశాలు\n", + "1. ఎంబెడింగ్స్ ఆధారంగా ఉన్న జ్ఞాన గ్రాఫ్‌గా మెమరీ\n", + "\n", + " - **నిర్వచిత అవగాహన**: Cognee ఒక వెక్టర్ స్టోర్ మరియు గ్రాఫ్ స్టోర్‌ను కలిపి మీ డేటాను అర్థం ద్వారా శోధించగలిగేలా మరియు సంబంధాల ద్వారా అనుసంధానించగలిగేలా చేస్తుంది. Cognee డిఫాల్ట్‌గా ఫైల్-ఆధారిత డేటాబేస్‌లను ఉపయోగిస్తుంది (వెక్టర్ కోసం LanceDB, గ్రాఫ్ డేటాబేస్ కోసం Kuzu).\n", + "\n", + " - **సంబంధాలపై ఆధారపడిన రిట్రీవల్**: సమాధానాలు కేవలం \"సమానమైన టెక్స్ట్\"లోనే కాకుండా, ఎంటిటీల మధ్య ఉన్న సంబంధాల ఆధారంగా కూడా ఉంటాయి.\n", + "\n", + " - **జీవిత మెమరీ**: మెమరీ లేయర్ అభివృద్ధి చెందుతుంది, పెరుగుతుంది, మరియు ఒక అనుసంధానిత గ్రాఫ్‌గా ప్రశ్నించదగినదిగా ఉంటుంది.\n", + "\n", + "2. శోధన & తర్క విధానాలు\n", + " - **హైబ్రిడ్ రిట్రీవల్**: వెక్టర్ సిమిలారిటీ, గ్రాఫ్ నిర్మాణం, మరియు LLM తర్కాన్ని కలిపి శోధన, రా చంక్ లుకప్ నుండి గ్రాఫ్-అవేర్ ప్రశ్నల సమాధానాల వరకు.\n", + "\n", + " - **పని ప్రకారం విధానాన్ని అనుసరించండి**: సహజ భాషా సమాధానాల కోసం completion-style విధానాలను ఉపయోగించండి, మరియు మీ ఏజెంట్‌కు రా కాంటెక్స్ట్ లేదా స్వతంత్ర తర్కం అవసరమైతే చంక్/సారాంశ/గ్రాఫ్ విధానాలను ఉపయోగించండి.\n", + "\n", + "3. వ్యక్తిగతీకరించిన, సెషన్-అవేర్ ఏజెంట్లు\n", + " - **సెషన్ కాంటెక్స్ట్ + దీర్ఘకాలిక మెమరీ**: Cognee తాత్కాలిక \"థ్రెడ్\" కాంటెక్స్ట్‌ను దీర్ఘకాలిక, యూజర్- లేదా ఆర్గ్-లెవల్ మెమరీ నుండి వేరుగా ఉంచుతుంది.\n", + "\n", + "## వాస్తవ ప్రపంచ అనువర్తనాలు\n", + "\n", + "1. **వర్టికల్ AI ఏజెంట్లు**\n", + "\n", + " ఈ నోట్‌బుక్‌లోని నమూనాను ఉపయోగించి Cognee యొక్క రిట్రీవల్ మరియు తర్క కోర్‌పై ఆధారపడే డొమైన్-స్మార్ట్ కోపైలట్లను శక్తివంతం చేయండి:\n", + "\n", + "- **డెవలపర్ కోపైలట్లు**: కోడ్ రివ్యూ, ఇన్సిడెంట్ విశ్లేషణ, మరియు ఆర్కిటెక్చర్ అసిస్టెంట్లు, కోడ్, APIలు, డిజైన్ డాక్స్, మరియు టికెట్లను ఒకే మెమరీ గ్రాఫ్‌గా అన్వేషించగలవు.\n", + "\n", + "- **కస్టమర్-ఫేసింగ్ కోపైలట్లు**: ప్రొడక్ట్ డాక్స్, FAQs, CRM నోట్స్, మరియు గత టికెట్ల నుండి గ్రాఫ్-అవేర్ రిట్రీవల్ మరియు సైటెడ్ సమాధానాలను పొందగల సపోర్ట్ లేదా సక్సెస్ ఏజెంట్లు.\n", + "\n", + "- **ఇంటర్నల్ ఎక్స్‌పర్ట్ కోపైలట్లు**: పాలసీ, లీగల్, లేదా సెక్యూరిటీ అసిస్టెంట్లు, వేరుగా ఉన్న PDFs కాకుండా అనుసంధానిత నియమాలు, మార్గదర్శకాలు, మరియు చారిత్రక నిర్ణయాలపై తర్కం చేస్తాయి.\n", + "\n", + " Cognee ప్రత్యేకంగా AI ఏజెంట్ల కోసం శాశ్వత, ఖచ్చితమైన మెమరీగా ఉంచబడింది, ఇది మీ ఏజెంట్ వెనుక ఒక జీవన జ్ఞాన గ్రాఫ్‌ను అందిస్తుంది మరియు వెక్టర్ స్టోర్‌ల మరియు కస్టమ్ గ్రాఫ్ కోడ్‌ల యాదృచ్ఛిక కలయికలను భర్తీ చేస్తుంది.\n", + "\n", + "2. **ఒకే మెమరీగా డేటా సైలోలను ఏకీకృతం చేయడం**\n", + "\n", + " ఇదే విధానం విస్తృతంగా ఉన్న వనరులపై ఒక ఏకీకృత మెమరీ లేయర్‌ను నిర్మించడంలో కూడా సహాయపడుతుంది:\n", + "\n", + "- **సైలోల నుండి ఒకే గ్రాఫ్‌కు**: నిర్మిత (ఉదా: డేటాబేస్‌లు) మరియు నిర్మాణరహిత డేటాను (ఉదా: డాక్స్, చాట్స్) వేర్వేరు సిస్టమ్‌ల కోసం వేర్వేరు సూచికలుగా కాకుండా, ఎంబెడింగ్స్‌తో మద్దతు ఉన్న ఒకే గ్రాఫ్‌లో ఇంజెస్ట్ చేయండి.\n", + "\n", + "- **సైటేషన్లతో క్రాస్-సోర్స్ తర్కం**: ప్రతిదానిపై బహుళ-దశల తర్కం అమలు చేయండి—గ్రాఫ్ ద్వారా \"జాయిన్\" లాగ్స్, మెట్రిక్స్, మరియు డాక్స్—మరియు ప్రావెనెన్స్‌తో స్థిరమైన సమాధానాలను తిరిగి ఇవ్వండి.\n", + "\n", + "- **జ్ఞాన కేంద్రాలు**: బ్యాంకింగ్ లేదా విద్య వంటి డొమైన్‌ల కోసం, Cognee ఇప్పటికే PDFs, అంతర్గత సిస్టమ్‌లు, మరియు యాప్ డేటాను ఒక జ్ఞాన గ్రాఫ్‌గా ఏకీకృతం చేయడానికి ఉపయోగించబడుతుంది, తద్వారా ఏజెంట్లు ఖచ్చితమైన, సైటెడ్ కాంటెక్స్ట్‌తో ప్రశ్నలకు సమాధానం ఇవ్వగలవు.\n", + "\n", + "## తదుపరి దశలు\n", + "\n", + "మీరు కోర్ మెమరీ లూప్‌ను అమలు చేశారు. మీరే ప్రయత్నించగల సహజ విస్తరణలు ఇక్కడ ఉన్నాయి ([Cognee డాక్యుమెంటేషన్](https://docs.cognee.ai/) కోసం చూడండి):\n", + "\n", + "1. **కాలజ్ఞానం ప్రయోగించండి**: టెక్స్ట్ నుండి ఈవెంట్లు మరియు టైమ్‌స్టాంప్‌లను వెలికితీయడానికి కాలజ్ఞానం ఆన్ చేయండి.\n", + "\n", + "2. **ఆంటాలజీ-ఆధారిత తర్కాన్ని పరిచయం చేయండి**: మీ డొమైన్ కోసం ఒక OWL ఆంటాలజీని నిర్వచించండి. Cognee యొక్క ఆంటాలజీ మద్దతును ఉపయోగించి వెలికితీసిన ఎంటిటీలు మరియు సంబంధాలు ఆ స్కీమాలో స్థిరపడేలా చేయండి, గ్రాఫ్ నాణ్యత మరియు డొమైన్-స్పెసిఫిక్ సమాధానాలను మెరుగుపరచండి.\n", + "\n", + "3. **ఫీడ్‌బ్యాక్ లూప్‌ను జోడించండి**: నిజమైన యూజర్ ఫీడ్‌బ్యాక్ నుండి Cognee గ్రాఫ్ ఎడ్జ్ వెయిట్లను సర్దుబాటు చేయనివ్వండి, తద్వారా రిట్రీవల్ స్థిరంగా ఉండకుండా సమయం గడిచేకొద్దీ మెరుగుపడుతుంది.\n", + "\n", + "4. **వ్యక్తిగతీకరణ & సెషన్ ప్రవర్తన కోసం ట్యూన్ చేయండి**: యూజర్ IDలు, టెనెంట్లు, మరియు డేటాసెట్‌లను ఉపయోగించి ప్రతి వ్యక్తి లేదా టీమ్‌కు షేర్డ్ మెమరీ ఇంజిన్‌పై వారి స్వంత వీక్షణను ఇవ్వండి.\n", + "\n", + "5. **మరింత క్లిష్టమైన ఏజెంట్లకు విస్తరించండి**: Cogneeని ఏజెంట్ ఫ్రేమ్‌వర్క్‌లలో ప్లగ్ చేయండి, తద్వారా అన్ని ఏజెంట్లు ఒకే మెమరీ లేయర్‌ను పంచుకునే బహుళ-ఏజెంట్ సిస్టమ్‌లను నిర్మించండి. *Microsoft Agent Framework x Cognee ప్లగిన్ త్వరలో రాబోతోంది.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**అస్వీకరణ**: \nఈ పత్రం AI అనువాద సేవ [Co-op Translator](https://github.com/Azure/co-op-translator) ఉపయోగించి అనువదించబడింది. మేము ఖచ్చితత్వానికి ప్రయత్నిస్తున్నప్పటికీ, ఆటోమేటెడ్ అనువాదాలలో తప్పులు లేదా అసమగ్రతలు ఉండవచ్చు. దయచేసి, దాని స్వస్థల భాషలో ఉన్న అసలు పత్రాన్ని అధికారం కలిగిన మూలంగా పరిగణించండి. ముఖ్యమైన సమాచారం కోసం, ప్రొఫెషనల్ మానవ అనువాదాన్ని సిఫారసు చేస్తాము. ఈ అనువాదాన్ని ఉపయోగించడం వల్ల కలిగే ఏవైనా అపార్థాలు లేదా తప్పుదారులు కోసం మేము బాధ్యత వహించము.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:57:15+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "te" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/te/13-agent-memory/README.md b/translations/te/13-agent-memory/README.md index a3aee48f5..73c4c264a 100644 --- a/translations/te/13-agent-memory/README.md +++ b/translations/te/13-agent-memory/README.md @@ -1,8 +1,8 @@ -**అస్వీకరణ**: -ఈ పత్రం AI అనువాద సేవ [Co-op Translator](https://github.com/Azure/co-op-translator) ఉపయోగించి అనువదించబడింది. మేము ఖచ్చితత్వానికి ప్రయత్నిస్తున్నప్పటికీ, ఆటోమేటెడ్ అనువాదాలు తప్పులు లేదా అసమగ్రతలను కలిగి ఉండవచ్చు. దాని స్వదేశ భాషలో ఉన్న అసలు పత్రాన్ని అధికారం కలిగిన మూలంగా పరిగణించాలి. కీలకమైన సమాచారం కోసం, ప్రొఫెషనల్ మానవ అనువాదాన్ని సిఫారసు చేస్తాము. ఈ అనువాదం ఉపయోగం వల్ల కలిగే ఏవైనా అపార్థాలు లేదా తప్పుదారులు కోసం మేము బాధ్యత వహించము. +**విమర్శ**: +ఈ పత్రాన్ని AI అనువాద సేవ [Co-op Translator](https://github.com/Azure/co-op-translator) ఉపయోగించి అనువదించారు. మేము ఖచ్చితత్వానికి ప్రయత్నిస్తున్నప్పటికీ, ఆటోమేటెడ్ అనువాదాలలో తప్పులు లేదా అసమానతలు ఉండవచ్చు. దయచేసి, మూల పత్రాన్ని దాని స్వదేశీ భాషలో అధికారం కలిగిన మూలంగా పరిగణించండి. కీలకమైన సమాచారం కోసం, ప్రొఫెషనల్ మానవ అనువాదాన్ని సిఫారసు చేస్తాము. ఈ అనువాదాన్ని ఉపయోగించడం వల్ల కలిగే ఏవైనా అపార్థాలు లేదా తప్పుదారులు కోసం మేము బాధ్యత వహించము. \ No newline at end of file diff --git a/translations/th/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/th/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..c2703bcd8 --- /dev/null +++ b/translations/th/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# สร้าง AI Agents ที่มีหน่วยความจำถาวรด้วย Cognee\n", + "\n", + "โน้ตบุ๊กนี้แสดงวิธีการสร้าง AI agents ที่ชาญฉลาดพร้อมความสามารถด้านหน่วยความจำที่ซับซ้อน โดยใช้ [**cognee**](https://www.cognee.ai/) - หน่วยความจำ AI แบบโอเพ่นซอร์สที่รวมกราฟความรู้ การค้นหาเชิงความหมาย และการจัดการเซสชัน เพื่อสร้างระบบ AI ที่เข้าใจบริบท\n", + "\n", + "## 🎯 วัตถุประสงค์การเรียนรู้\n", + "\n", + "เมื่อจบการเรียนรู้ในบทเรียนนี้ คุณจะเข้าใจวิธี:\n", + "- **สร้างกราฟความรู้ที่สนับสนุนด้วย Embeddings**: เปลี่ยนข้อความที่ไม่มีโครงสร้างให้เป็นความรู้ที่มีโครงสร้างและสามารถสืบค้นได้\n", + "- **ใช้งานหน่วยความจำเซสชัน**: สร้างบทสนทนาแบบหลายรอบที่สามารถเก็บบริบทได้โดยอัตโนมัติ\n", + "- **เก็บบทสนทนา**: บันทึกการโต้ตอบที่สำคัญในหน่วยความจำระยะยาวเพื่อใช้อ้างอิงในอนาคต\n", + "- **สืบค้นด้วยภาษาธรรมชาติ**: เข้าถึงและใช้บริบทในอดีตในบทสนทนาใหม่\n", + "- **แสดงภาพหน่วยความจำ**: สำรวจความสัมพันธ์ในกราฟความรู้ของเอเจนต์ของคุณ\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ สิ่งที่คุณจะสร้าง\n", + "\n", + "ในบทเรียนนี้ เราจะสร้าง **ผู้ช่วยเขียนโค้ด** ที่มีความสามารถในการจดจำข้อมูลอย่างต่อเนื่อง ซึ่งจะมีคุณสมบัติดังนี้:\n", + "\n", + "### 1. **การสร้างฐานความรู้**\n", + " - รับข้อมูลโปรไฟล์และความเชี่ยวชาญของนักพัฒนา\n", + " - ประมวลผลหลักการและแนวปฏิบัติที่ดีที่สุดในการเขียนโปรแกรม Python\n", + " - เก็บบันทึกการสนทนาระหว่างนักพัฒนาและผู้ช่วย AI\n", + "\n", + "### 2. **การสนทนาที่คำนึงถึงบริบท**\n", + " - รักษาบริบทของการสนทนาในคำถามหลายข้อในเซสชันเดียวกัน\n", + " - บันทึกคำถาม/คำตอบแต่ละคู่โดยอัตโนมัติเพื่อการเรียกใช้ที่มีประสิทธิภาพ\n", + " - ให้คำตอบที่สอดคล้องและมีบริบทตามประวัติการสนทนา\n", + "\n", + "### 3. **หน่วยความจำระยะยาว**\n", + " - เก็บบันทึกการสนทนาที่สำคัญไว้ในหน่วยความจำระยะยาว\n", + " - ดึงข้อมูลที่เกี่ยวข้องจากฐานความรู้และเซสชันที่ผ่านมาเพื่อใช้ในการโต้ตอบใหม่\n", + " - สร้างฐานความรู้ที่เติบโตและพัฒนาขึ้นเรื่อย ๆ\n", + "\n", + "### 4. **การดึงข้อมูลจากหน่วยความจำอย่างชาญฉลาด**\n", + " - ใช้การค้นหาเชิงความหมายที่คำนึงถึงกราฟเพื่อค้นหาข้อมูลที่เกี่ยวข้องจากความรู้ทั้งหมดที่เก็บไว้\n", + " - กรองการค้นหาตามกลุ่มข้อมูลย่อย (ข้อมูลนักพัฒนากับหลักการ)\n", + " - ผสมผสานแหล่งข้อมูลหลายแหล่งเพื่อให้คำตอบที่ครอบคลุม\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 ข้อกำหนดเบื้องต้นและการตั้งค่า\n", + "\n", + "### ความต้องการของระบบ\n", + "\n", + "ก่อนเริ่มต้น ตรวจสอบให้แน่ใจว่าคุณมี:\n", + "\n", + "1. **สภาพแวดล้อม Python**\n", + " - Python 3.9 หรือสูงกว่า\n", + " - สภาพแวดล้อมเสมือน (แนะนำ)\n", + "\n", + "2. **Redis Cache** (จำเป็นสำหรับการจัดการเซสชัน)\n", + " - Redis ในเครื่อง: `docker run -d -p 6379:6379 redis`\n", + " - หรือใช้บริการ Redis ที่มีการจัดการ\n", + "\n", + "3. **การเข้าถึง LLM API**\n", + " - คีย์ API ของ OpenAI หรือผู้ให้บริการอื่น ๆ (ดู [เอกสาร](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **การตั้งค่าฐานข้อมูล**\n", + " - ไม่จำเป็นต้องตั้งค่าโดยค่าเริ่มต้น Cognee ใช้ฐานข้อมูลแบบไฟล์ (LanceDB และ Kuzu)\n", + " - หากต้องการ คุณสามารถตั้งค่า Azure AI Search เป็น vector store (ดู [เอกสาร](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### การตั้งค่าสภาพแวดล้อม\n", + "\n", + "สร้างไฟล์ `.env` ในไดเรกทอรีโปรเจกต์ของคุณพร้อมตัวแปรดังต่อไปนี้:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ ทำความเข้าใจกับสถาปัตยกรรมหน่วยความจำของ Cognee\n", + "\n", + "### วิธีการทำงานของ Cognee\n", + "\n", + "Cognee มีระบบหน่วยความจำที่ซับซ้อนซึ่งก้าวข้ามการจัดเก็บแบบ key-value แบบง่าย:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### องค์ประกอบสำคัญ:\n", + "\n", + "1. **Knowledge Graph**: เก็บข้อมูลเกี่ยวกับเอนทิตี ความสัมพันธ์ และการเชื่อมโยงเชิงความหมาย\n", + "2. **Vector Embeddings**: ช่วยให้สามารถค้นหาเชิงความหมายในข้อมูลที่จัดเก็บทั้งหมด\n", + "3. **Session Cache**: รักษาบริบทของการสนทนาในและระหว่างเซสชัน\n", + "4. **NodeSets**: จัดระเบียบข้อมูลเป็นหมวดหมู่ที่มีเหตุผลเพื่อการดึงข้อมูลที่ตรงเป้าหมาย\n", + "\n", + "### ประเภทของหน่วยความจำในบทเรียนนี้:\n", + "\n", + "- **Persistent Memory**: การจัดเก็บระยะยาวใน knowledge graph\n", + "- **Session Memory**: บริบทการสนทนาชั่วคราวใน Redis cache\n", + "- **Semantic Memory**: การค้นหาความคล้ายคลึงเชิงเวกเตอร์ในข้อมูลทั้งหมด\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 ติดตั้งแพ็กเกจที่จำเป็น\n", + "\n", + "ติดตั้ง Cognee พร้อมการรองรับ Redis สำหรับการจัดการเซสชัน:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 เริ่มต้นสภาพแวดล้อมและโหลดไลบรารี\n", + "\n", + "ตรวจสอบให้แน่ใจว่า:\n", + "1. Redis กำลังทำงานอยู่ (เช่น ผ่าน Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. ตัวแปรสภาพแวดล้อมถูกตั้งค่าก่อนที่จะนำเข้าโมดูลแคช\n", + "3. หากจำเป็น ให้รีสตาร์ทเคอร์เนลและรันเซลล์ตามลำดับ\n", + "\n", + "เซลล์ต่อไปนี้จะ:\n", + "1. โหลดตัวแปรสภาพแวดล้อมจาก `.env`\n", + "2. กำหนดค่า Cognee ด้วยการตั้งค่า LLM ของคุณ\n", + "3. เปิดใช้งานการแคชสำหรับการจัดการเซสชัน\n", + "4. ตรวจสอบให้แน่ใจว่าทุกองค์ประกอบเชื่อมต่อกันอย่างถูกต้อง\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 กำหนดค่าที่เก็บข้อมูล\n", + "\n", + "Cognee ใช้ไดเรกทอรีสองแห่งแยกกันสำหรับการทำงาน:\n", + "- **Data Root**: เก็บเอกสารที่นำเข้าและข้อมูลที่ประมวลผล\n", + "- **System Root**: มีฐานข้อมูลกราฟความรู้และข้อมูลเมตาของระบบ\n", + "\n", + "เราจะสร้างไดเรกทอรีแยกต่างหากสำหรับบทเรียนนี้ดังนี้:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 รีเซ็ตสถานะหน่วยความจำ\n", + "\n", + "ก่อนที่เราจะเริ่มสร้างระบบหน่วยความจำของเรา มาทำให้แน่ใจว่าเราเริ่มต้นใหม่ทั้งหมด\n", + "\n", + "> 💡 **เคล็ดลับ**: คุณสามารถข้ามขั้นตอนนี้ได้หากคุณต้องการเก็บหน่วยความจำที่มีอยู่จากการใช้งานก่อนหน้านี้เมื่อคุณใช้โน้ตบุ๊กนี้ในภายหลัง\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 ส่วนที่ 1: การสร้างฐานความรู้\n", + "\n", + "### แหล่งข้อมูลสำหรับผู้ช่วยนักพัฒนา\n", + "\n", + "เราจะรวบรวมข้อมูลสามประเภทเพื่อสร้างฐานความรู้ที่ครอบคลุม:\n", + "\n", + "1. **โปรไฟล์นักพัฒนา**: ความเชี่ยวชาญส่วนตัวและพื้นฐานทางเทคนิค\n", + "2. **แนวทางปฏิบัติที่ดีที่สุดใน Python**: หลักการของ Python พร้อมคำแนะนำที่ใช้งานได้จริง\n", + "3. **บทสนทนาในอดีต**: คำถามและคำตอบระหว่างนักพัฒนาและผู้ช่วย AI ในอดีต\n", + "\n", + "ข้อมูลที่หลากหลายนี้ช่วยให้ตัวแทนของเราสามารถ:\n", + "- เข้าใจบริบททางเทคนิคของผู้ใช้\n", + "- ใช้แนวทางปฏิบัติที่ดีที่สุดในการให้คำแนะนำ\n", + "- เรียนรู้จากการโต้ตอบที่ประสบความสำเร็จในอดีต\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 แปลงข้อมูลเป็นกราฟความรู้\n", + "\n", + "ตอนนี้เราจะเปลี่ยนข้อความดิบให้เป็นหน่วยความจำที่มีโครงสร้าง ขั้นตอนนี้:\n", + "\n", + "1. **เพิ่มข้อมูลลงใน NodeSets**: จัดระเบียบข้อมูลให้เป็นหมวดหมู่ที่มีเหตุผล\n", + " - `developer_data`: โปรไฟล์นักพัฒนาและการสนทนา\n", + " - `principles_data`: แนวทางปฏิบัติที่ดีที่สุดและคำแนะนำเกี่ยวกับ Python\n", + "\n", + "2. **เรียกใช้ Cognify Pipeline**: สกัดเอนทิตี ความสัมพันธ์ และสร้าง embeddings\n", + " - ระบุแนวคิดสำคัญ\n", + " - สร้างการเชื่อมโยงเชิงความหมายระหว่างข้อมูลที่เกี่ยวข้อง\n", + " - สร้างเวกเตอร์ embeddings\n", + "\n", + "ขั้นตอนนี้อาจใช้เวลาสักครู่ในขณะที่ LLM ประมวลผลข้อความและสร้างโครงสร้างกราฟ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 แสดงภาพกราฟความรู้\n", + "\n", + "มาสำรวจโครงสร้างของกราฟความรู้ของเรากัน การแสดงภาพจะแสดงให้เห็น:\n", + "- **Nodes**: เอนทิตีที่ดึงมาจากข้อความ (แนวคิด, เทคโนโลยี, บุคคล)\n", + "- **Edges**: ความสัมพันธ์และการเชื่อมโยงระหว่างเอนทิตี\n", + "- **Clusters**: แนวคิดที่เกี่ยวข้องซึ่งถูกจัดกลุ่มตามความคล้ายคลึงทางความหมาย\n", + "\n", + "เปิดไฟล์ HTML ที่สร้างขึ้นในเบราว์เซอร์ของคุณเพื่อสำรวจกราฟแบบโต้ตอบ:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 เพิ่มความจำด้วย Memify\n", + "\n", + "ฟังก์ชัน `memify()` วิเคราะห์กราฟความรู้และสร้างกฎอัจฉริยะเกี่ยวกับข้อมูล กระบวนการนี้:\n", + "- ระบุรูปแบบและแนวทางปฏิบัติที่ดีที่สุด\n", + "- สร้างแนวทางที่นำไปใช้ได้จริงจากเนื้อหา\n", + "- สร้างความสัมพันธ์ระหว่างพื้นที่ความรู้ต่าง ๆ\n", + "\n", + "กฎเหล่านี้ช่วยให้ตัวแทนตัดสินใจได้อย่างมีข้อมูลมากขึ้นเมื่อตอบคำถาม การจับภาพการแสดงผลครั้งที่สองช่วยให้คุณเปรียบเทียบว่ากราฟมีความหนาแน่นขึ้นอย่างไรเมื่อได้รับการเพิ่มข้อมูล\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 ส่วนที่ 2: การดึงข้อมูลจากความจำอย่างชาญฉลาด\n", + "\n", + "### การสาธิตที่ 1: การรวมความรู้ข้ามเอกสาร\n", + "\n", + "ตอนนี้ที่เราได้สร้างกราฟความรู้เสร็จแล้ว มาลองทดสอบว่า Cognee สามารถรวมข้อมูลจากหลายแหล่งเพื่อให้คำตอบกับคำถามที่ซับซ้อนได้อย่างไร\n", + "\n", + "คำถามแรกแสดงให้เห็นถึง:\n", + "- **ความเข้าใจเชิงความหมาย**: การค้นหาคอนเซ็ปต์ที่เกี่ยวข้องแม้จะไม่ได้กล่าวถึงโดยตรง\n", + "- **การอ้างอิงข้าม**: การรวมโปรไฟล์นักพัฒนากับหลักการของ Python\n", + "- **การใช้เหตุผลตามบริบท**: การนำแนวปฏิบัติที่ดีที่สุดไปใช้กับการดำเนินการเฉพาะ\n", + "\n", + "### การสาธิตที่ 2: การค้นหาแบบกรองด้วย NodeSets\n", + "\n", + "คำถามที่สองแสดงให้เห็นถึงวิธีการกำหนดเป้าหมายไปยังชุดย่อยเฉพาะของกราฟความรู้:\n", + "- ใช้พารามิเตอร์ `node_name` เพื่อค้นหาเฉพาะใน `principles_data`\n", + "- ให้คำตอบที่เน้นเฉพาะจากโดเมนความรู้ที่กำหนด\n", + "- มีประโยชน์เมื่อคุณต้องการข้อมูลเฉพาะในโดเมน\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 ส่วนที่ 3: การตั้งค่าการจัดการเซสชัน\n", + "\n", + "### การเปิดใช้งานหน่วยความจำการสนทนา\n", + "\n", + "การจัดการเซสชันมีความสำคัญสำหรับการรักษาบริบทระหว่างการโต้ตอบหลายครั้ง ในส่วนนี้เราจะ:\n", + "\n", + "1. **เริ่มต้นบริบทผู้ใช้**: สร้างหรือดึงข้อมูลโปรไฟล์ผู้ใช้สำหรับการติดตามเซสชัน\n", + "2. **กำหนดค่าเครื่องมือแคช**: เชื่อมต่อกับ Redis เพื่อจัดเก็บประวัติการสนทนา\n", + "3. **เปิดใช้งานตัวแปรเซสชัน**: ตั้งค่าตัวแปรบริบทที่คงอยู่ระหว่างการสอบถาม\n", + "\n", + "> ⚠️ **สำคัญ**: สิ่งนี้ต้องการให้ Redis ทำงานอยู่และ `CACHING=true` ในสภาพแวดล้อมของคุณ\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ ฟังก์ชันช่วยเหลือ: ดูประวัติการสนทนา\n", + "\n", + "ฟังก์ชันนี้ช่วยให้เราสามารถตรวจสอบประวัติการสนทนาที่ถูกเก็บไว้ใน Redis ได้ มีประโยชน์สำหรับ:\n", + "- การแก้ไขปัญหาการจัดการเซสชัน\n", + "- การตรวจสอบว่าการสนทนาได้รับการแคชไว้หรือไม่\n", + "- การทำความเข้าใจว่ามีบริบทอะไรบ้างที่พร้อมใช้งานสำหรับตัวแทน\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## เซสชัน 1: ห้องปฏิบัติการสนับสนุน Async — คำถามแรก\n", + "\n", + "เริ่มต้นเซสชัน `async-support-lab` โดยการถามถึงรูปแบบ asyncio ที่เหมาะสมกับการเก็บข้อมูลเว็บขนาดใหญ่ที่เป็นมิตรกับการตรวจสอบข้อมูล (telemetry-friendly) กราฟได้มีความรู้เกี่ยวกับ asyncio, aiohttp และแนวปฏิบัติในการตรวจสอบข้อมูลอยู่แล้ว ดังนั้นคำตอบควรสะท้อนถึงการสนทนาก่อนหน้านี้ในขณะที่ปรับให้เหมาะสมกับคำถามใหม่นี้\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## ตรวจสอบหน่วยความจำของ Session 1 หลังจากการแลกเปลี่ยนครั้งแรก\n", + "\n", + "การรัน `show_history(session_1)` ทันทีหลังจากคำถามแรกจะยืนยันว่า Cognee ได้บันทึกทั้งคำถามและคำตอบลงใน Redis คุณควรเห็นหนึ่งรายการที่มีคำแนะนำเกี่ยวกับการทำงานพร้อมกัน.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## เซสชันที่ 1: ติดตามผลเกี่ยวกับโมเดลข้อมูล\n", + "\n", + "ต่อไปเราจะถามว่า \"ควรเลือกใช้ dataclasses หรือ Pydantic เมื่อไหร่?\" โดยใช้ session id เดียวกัน Cognee ควรเชื่อมโยงหลักการของ Python เข้ากับการสนทนาเกี่ยวกับ FastAPI ก่อนหน้านี้เพื่อให้คำแนะนำที่ละเอียดอ่อน—แสดงให้เห็นว่าบริบทสามารถต่อเนื่องได้ภายในเซสชันที่มีชื่อเดียวกัน\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## ยืนยันประวัติของ Session 1 มีทั้งสองรอบ\n", + "\n", + "การเรียก `show_history(session_1)` อีกครั้งควรแสดงรายการคำถามและคำตอบสองรายการ ซึ่งตรงกับขั้นตอน \"การเล่นซ้ำความจำ\" ของ Mem0 lab และพิสูจน์ว่ารอบเพิ่มเติมจะขยายบทสนทนาเดิมต่อไป\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## เซสชัน 2: การตรวจสอบการออกแบบ — เซสชันใหม่\n", + "\n", + "เพื่อแสดงการแยกกันระหว่างเธรด เราเริ่มต้น `design-review-session` และขอคำแนะนำเกี่ยวกับการบันทึกสำหรับการตรวจสอบเหตุการณ์ แม้ว่าฐานความรู้พื้นฐานจะเหมือนกัน แต่ session id ใหม่จะช่วยแยกบันทึกการสนทนาออกจากกัน\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## ทบทวนเซสชัน 2 ประวัติศาสตร์\n", + "\n", + "`show_history(session_2)` ควรแสดงเฉพาะคู่คำถาม/คำตอบในการตรวจสอบการออกแบบเท่านั้น เปรียบเทียบกับเซสชัน 1 เพื่อเน้นว่า Cognee เก็บบันทึกการสนทนาแยกกันอย่างอิสระในขณะที่ยังคงใช้กราฟความรู้ร่วมกัน\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## สรุป\n", + "\n", + "ยินดีด้วย! คุณเพิ่งเพิ่มชั้นความจำระยะยาวให้กับผู้ช่วยเขียนโค้ดของคุณด้วย Cognee\n", + "\n", + "ในบทเรียนนี้ คุณได้นำเนื้อหาสำหรับนักพัฒนาที่เป็นข้อมูลดิบ (โค้ด, เอกสาร, การสนทนา) และเปลี่ยนมันให้กลายเป็นกราฟ + ความจำแบบเวกเตอร์ที่ตัวแทนของคุณสามารถค้นหา ใช้เหตุผล และปรับปรุงได้อย่างต่อเนื่อง\n", + "\n", + "สิ่งที่คุณได้เรียนรู้\n", + "\n", + "1. **จากข้อความดิบสู่ความจำ AI**: วิธีที่ Cognee รับข้อมูลที่ไม่มีโครงสร้างและเปลี่ยนมันให้เป็นความจำที่ชาญฉลาดและค้นหาได้ โดยใช้สถาปัตยกรรมที่รวมเวกเตอร์ + กราฟความรู้\n", + "\n", + "2. **การเพิ่มคุณค่ากราฟด้วย memify**: วิธีการไปไกลกว่าการสร้างกราฟพื้นฐาน และใช้ memify เพื่อเพิ่มข้อเท็จจริงที่ได้มารวมถึงความสัมพันธ์ที่ลึกซึ้งยิ่งขึ้นบนกราฟที่มีอยู่ของคุณ\n", + "\n", + "3. **กลยุทธ์การค้นหาหลายรูปแบบ**: วิธีการค้นหาความจำด้วยประเภทการค้นหาที่แตกต่างกัน (ถามตอบที่รับรู้กราฟ, การเติมเต็มแบบ RAG, ข้อมูลเชิงลึก, ข้อมูลดิบ, การค้นหาโค้ด ฯลฯ) ตามความต้องการของตัวแทนของคุณ\n", + "\n", + "4. **การสำรวจแบบภาพ**: วิธีการตรวจสอบและแก้ไขสิ่งที่ Cognee สร้างขึ้นโดยใช้การแสดงผลกราฟและ UI ของ Cognee เพื่อให้คุณสามารถเห็นโครงสร้างของความรู้ได้จริง\n", + "\n", + "5. **ความจำที่รับรู้บริบทของเซสชัน**: วิธีการรวมบริบทของแต่ละเซสชันเข้ากับความจำเชิงความหมายที่คงอยู่ เพื่อให้ตัวแทนสามารถจดจำข้ามการใช้งานได้โดยไม่รั่วไหลข้อมูลระหว่างผู้ใช้\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## ประเด็นสำคัญ\n", + "1. หน่วยความจำในรูปแบบ Knowledge Graph ที่สนับสนุนด้วย Embeddings\n", + "\n", + " - **ความเข้าใจที่มีโครงสร้าง**: Cognee ผสมผสานระหว่าง vector store และ graph store ทำให้ข้อมูลของคุณสามารถค้นหาได้ทั้งจากความหมายและความสัมพันธ์ Cognee ใช้ฐานข้อมูลแบบไฟล์เป็นค่าเริ่มต้น (LanceDB สำหรับ vector และ Kuzu สำหรับ graph database)\n", + "\n", + " - **การดึงข้อมูลที่คำนึงถึงความสัมพันธ์**: คำตอบไม่ได้อิงแค่ “ข้อความที่คล้ายกัน” แต่ยังรวมถึงความสัมพันธ์ระหว่างเอนทิตีด้วย\n", + "\n", + " - **หน่วยความจำที่มีชีวิต**: ชั้นหน่วยความจำพัฒนา เติบโต และสามารถค้นหาได้ในรูปแบบกราฟที่เชื่อมโยงกัน\n", + "\n", + "2. โหมดการค้นหาและการให้เหตุผล\n", + " - **การดึงข้อมูลแบบไฮบริด**: การค้นหาผสมผสานความคล้ายคลึงของเวกเตอร์ โครงสร้างกราฟ และการให้เหตุผลของ LLM ตั้งแต่การค้นหาข้อมูลดิบไปจนถึงการตอบคำถามที่คำนึงถึงกราฟ\n", + "\n", + " - **ปรับโหมดให้เหมาะกับงาน**: ใช้โหมดแบบ completion-style เมื่อคุณต้องการคำตอบในภาษาธรรมชาติ และใช้โหมด chunk/summary/graph เมื่อเอเจนต์ของคุณต้องการบริบทดิบหรือเพื่อขับเคลื่อนการให้เหตุผลของตัวเอง\n", + "\n", + "3. เอเจนต์ที่ปรับแต่งได้และรับรู้บริบทของเซสชัน\n", + " - **บริบทของเซสชัน + หน่วยความจำระยะยาว**: Cognee แยกบริบท “เธรด” ระยะสั้นออกจากหน่วยความจำระยะยาวที่ระดับผู้ใช้หรือองค์กร\n", + "\n", + "## การใช้งานในโลกจริง\n", + "\n", + "1. **เอเจนต์ AI เฉพาะด้าน**\n", + "\n", + " ใช้รูปแบบจากโน้ตบุ๊กนี้เพื่อสร้างโคไพลอตที่ชาญฉลาดในโดเมนซึ่งทำงานบน Cognee เป็นแกนกลางสำหรับการดึงข้อมูลและการให้เหตุผล:\n", + "\n", + "- **โคไพลอตสำหรับนักพัฒนา**: ช่วยตรวจสอบโค้ด วิเคราะห์เหตุการณ์ และเป็นผู้ช่วยด้านสถาปัตยกรรมที่สามารถเข้าถึงโค้ด API เอกสารการออกแบบ และตั๋วงานในรูปแบบกราฟหน่วยความจำเดียว\n", + "\n", + "- **โคไพลอตสำหรับลูกค้า**: เอเจนต์สนับสนุนหรือความสำเร็จที่ดึงข้อมูลจากเอกสารผลิตภัณฑ์ คำถามที่พบบ่อย บันทึก CRM และตั๋วงานที่ผ่านมา พร้อมการดึงข้อมูลที่คำนึงถึงกราฟและคำตอบที่มีการอ้างอิง\n", + "\n", + "- **โคไพลอตผู้เชี่ยวชาญภายในองค์กร**: ผู้ช่วยด้านนโยบาย กฎหมาย หรือความปลอดภัยที่ให้เหตุผลจากกฎ แนวทาง และการตัดสินใจในอดีตที่เชื่อมโยงกัน แทนที่จะเป็น PDF แยกกัน\n", + "\n", + " Cognee ถูกออกแบบมาให้เป็นหน่วยความจำที่แม่นยำและถาวรสำหรับเอเจนต์ AI โดยให้กราฟความรู้ที่มีชีวิตซึ่งสามารถแทนที่การรวม vector store และโค้ดกราฟแบบกำหนดเองที่ไม่เป็นระบบ\n", + "\n", + "2. **รวมข้อมูลที่กระจัดกระจายให้เป็นหน่วยความจำเดียว**\n", + "\n", + " วิธีการเดียวกันนี้ยังช่วยให้คุณสร้างชั้นหน่วยความจำที่รวมศูนย์จากแหล่งข้อมูลที่กระจัดกระจาย:\n", + "\n", + "- **จากข้อมูลที่แยกส่วนสู่กราฟเดียว**: นำเข้าข้อมูลที่มีโครงสร้าง (เช่น ฐานข้อมูล) และข้อมูลที่ไม่มีโครงสร้าง (เช่น เอกสาร แชท) ลงในกราฟเดียวที่สนับสนุนด้วย embeddings แทนที่จะสร้างดัชนีแยกสำหรับแต่ละระบบ\n", + "\n", + "- **การให้เหตุผลข้ามแหล่งข้อมูลพร้อมการอ้างอิง**: ดำเนินการให้เหตุผลหลายขั้นตอนผ่านทุกอย่าง—“เชื่อม” บันทึก เมตริก และเอกสารผ่านกราฟ—และยังคงให้คำตอบที่มีแหล่งที่มา\n", + "\n", + "- **ศูนย์กลางความรู้**: สำหรับโดเมนอย่างการธนาคารหรือการศึกษา Cognee ถูกใช้เพื่อรวม PDF ระบบภายใน และข้อมูลแอปพลิเคชันให้เป็นกราฟความรู้เดียวที่มีเวกเตอร์ เพื่อให้เอเจนต์สามารถตอบคำถามด้วยบริบทที่แม่นยำและมีการอ้างอิง\n", + "\n", + "## ขั้นตอนถัดไป\n", + "\n", + "คุณได้สร้างวงจรหน่วยความจำหลักแล้ว ต่อไปนี้คือการขยายเพิ่มเติมที่คุณสามารถลองทำได้ด้วยตัวเอง (ดูรายละเอียดเพิ่มเติมได้ที่ [เอกสาร Cognee](https://docs.cognee.ai/)):\n", + "\n", + "1. **ทดลองกับการรับรู้เชิงเวลา**: เปิดใช้งาน temporal cognify เพื่อดึงเหตุการณ์และการประทับเวลาออกจากข้อความ\n", + "\n", + "2. **เพิ่มการให้เหตุผลที่ขับเคลื่อนด้วยออนโทโลยี**: กำหนด OWL ontology สำหรับโดเมนของคุณ ใช้การสนับสนุนออนโทโลยีของ Cognee เพื่อให้เอนทิตีและความสัมพันธ์ที่ดึงออกมาสอดคล้องกับสคีมา ซึ่งช่วยปรับปรุงคุณภาพกราฟและคำตอบเฉพาะโดเมน\n", + "\n", + "3. **เพิ่มวงจรป้อนกลับ**: ให้ Cognee ปรับน้ำหนักขอบกราฟจากความคิดเห็นของผู้ใช้จริง เพื่อให้การดึงข้อมูลดีขึ้นเรื่อย ๆ แทนที่จะคงที่\n", + "\n", + "4. **ปรับแต่งสำหรับการใช้งานส่วนบุคคลและพฤติกรรมเซสชัน**: ใช้ user IDs, tenants และ datasets เพื่อให้แต่ละบุคคลหรือทีมมีมุมมองของตัวเองในเครื่องยนต์หน่วยความจำที่ใช้ร่วมกัน\n", + "\n", + "5. **ขยายไปยังเอเจนต์ที่ซับซ้อนมากขึ้น**: เชื่อมต่อ Cognee เข้ากับเฟรมเวิร์กเอเจนต์เพื่อสร้างระบบเอเจนต์หลายตัวที่ใช้ชั้นหน่วยความจำเดียวกัน *Microsoft Agent Framework x Cognee plugin กำลังจะมาเร็ว ๆ นี้*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**ข้อจำกัดความรับผิดชอบ**: \nเอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:58:16+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "th" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/th/13-agent-memory/README.md b/translations/th/13-agent-memory/README.md index 86f370106..7d8fba6c9 100644 --- a/translations/th/13-agent-memory/README.md +++ b/translations/th/13-agent-memory/README.md @@ -1,8 +1,8 @@ **ข้อจำกัดความรับผิดชอบ**: -เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาต้นทางควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ แนะนำให้ใช้บริการแปลภาษามนุษย์ที่เป็นมืออาชีพ เราจะไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดพลาดที่เกิดจากการใช้การแปลนี้ \ No newline at end of file +เอกสารนี้ได้รับการแปลโดยใช้บริการแปลภาษา AI [Co-op Translator](https://github.com/Azure/co-op-translator) แม้ว่าเราจะพยายามให้การแปลมีความถูกต้อง แต่โปรดทราบว่าการแปลโดยอัตโนมัติอาจมีข้อผิดพลาดหรือความไม่ถูกต้อง เอกสารต้นฉบับในภาษาดั้งเดิมควรถือเป็นแหล่งข้อมูลที่เชื่อถือได้ สำหรับข้อมูลที่สำคัญ ขอแนะนำให้ใช้บริการแปลภาษามืออาชีพ เราไม่รับผิดชอบต่อความเข้าใจผิดหรือการตีความผิดที่เกิดจากการใช้การแปลนี้ + \ No newline at end of file diff --git a/translations/tl/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/tl/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..f8ae09064 --- /dev/null +++ b/translations/tl/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Pagbuo ng AI Agents na may Persistent Memory gamit ang Cognee\n", + "\n", + "Ang notebook na ito ay nagpapakita kung paano bumuo ng matatalinong AI agents na may advanced na kakayahan sa memorya gamit ang [**cognee**](https://www.cognee.ai/) - isang open source na AI memory na pinagsasama ang knowledge graphs, semantic search, at session management upang makalikha ng mga context-aware na AI systems.\n", + "\n", + "## 🎯 Mga Layunin sa Pag-aaral\n", + "\n", + "Sa pagtatapos ng tutorial na ito, mauunawaan mo kung paano:\n", + "- **Bumuo ng Knowledge Graphs na May Embeddings**: I-transform ang hindi organisadong teksto sa structured, queryable na kaalaman\n", + "- **Magpatupad ng Session Memory**: Lumikha ng multi-turn na mga pag-uusap na may awtomatikong pag-iingat ng konteksto\n", + "- **Mag-imbak ng Mga Pag-uusap**: Opsyonal na itago ang mahahalagang interaksyon sa pangmatagalang memorya para sa hinaharap na paggamit\n", + "- **Mag-query Gamit ang Natural na Wika**: I-access at gamitin ang historical na konteksto sa mga bagong pag-uusap\n", + "- **I-visualize ang Memorya**: Tuklasin ang mga relasyon sa knowledge graph ng iyong agent\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Ano ang Iyong Itatayo\n", + "\n", + "Sa tutorial na ito, gagawa tayo ng isang **Coding Assistant** na may kakayahang magtago ng memorya na:\n", + "\n", + "### 1. **Pagbuo ng Knowledge Base**\n", + " - Kumukuha ng impormasyon tungkol sa profile at kakayahan ng developer\n", + " - Nagpoproseso ng mga prinsipyo at pinakamahusay na kasanayan sa Python programming\n", + " - Nagtatabi ng mga nakaraang pag-uusap sa pagitan ng mga developer at AI assistants\n", + "\n", + "### 2. **Session-Aware na Mga Pag-uusap**\n", + " - Pinapanatili ang konteksto sa maraming tanong sa parehong session\n", + " - Awtomatikong iniimbak ang bawat pares ng tanong/sagot para sa mas mabilis na retrieval\n", + " - Nagbibigay ng malinaw at may kontekstong sagot batay sa kasaysayan ng pag-uusap\n", + "\n", + "### 3. **Pangmatagalang Memorya**\n", + " - Nagtatabi ng mahahalagang pag-uusap sa pangmatagalang memorya\n", + " - Kinukuha ang mga kaugnay na alaala mula sa knowledge base at mga nakaraang session upang magbigay ng impormasyon sa mga bagong interaksyon\n", + " - Lumilikha ng lumalaking knowledge base na patuloy na bumubuti sa paglipas ng panahon\n", + "\n", + "### 4. **Matalinong Retrieval ng Memorya**\n", + " - Gumagamit ng graph-aware semantic search upang mahanap ang kaugnay na impormasyon sa lahat ng nakaimbak na kaalaman\n", + " - Nagfi-filter ng mga paghahanap batay sa mga subgroup ng data (impormasyon ng developer vs. mga prinsipyo)\n", + " - Pinagsasama ang maraming pinagmumulan ng data upang makapagbigay ng komprehensibong sagot\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Mga Paunang Kailangan at Setup\n", + "\n", + "### Mga Kinakailangan sa Sistema\n", + "\n", + "Bago magsimula, tiyakin na mayroon ka ng mga sumusunod:\n", + "\n", + "1. **Python Environment**\n", + " - Python 3.9 o mas mataas\n", + " - Virtual environment (inirerekomenda)\n", + " \n", + "2. **Redis Cache** (Kinakailangan para sa Session Management)\n", + " - Lokal na Redis: `docker run -d -p 6379:6379 redis`\n", + " - O gumamit ng isang managed Redis service\n", + " \n", + "3. **LLM API Access**\n", + " - OpenAI API key o iba pang provider (tingnan ang [dokumentasyon](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Database Configuration**\n", + " - Walang kinakailangang configuration bilang default. Gumagamit ang Cognee ng file-based databases (LanceDB at Kuzu)\n", + " - Opsyonal, maaari kang mag-setup ng Azure AI Search bilang vector store (tingnan ang [dokumentasyon](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Configuration ng Environment\n", + "\n", + "Gumawa ng `.env` file sa iyong project directory na may mga sumusunod na variable:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Pag-unawa sa Arkitektura ng Memorya ng Cognee\n", + "\n", + "### Paano Gumagana ang Cognee\n", + "\n", + "Ang Cognee ay nagbibigay ng isang sopistikadong sistema ng memorya na higit pa sa simpleng key-value storage:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Mga Pangunahing Komponent:\n", + "\n", + "1. **Knowledge Graph**: Nagtatago ng mga entidad, relasyon, at semantikong koneksyon\n", + "2. **Vector Embeddings**: Nagpapahintulot ng semantikong paghahanap sa lahat ng nakaimbak na impormasyon\n", + "3. **Session Cache**: Pinapanatili ang konteksto ng pag-uusap sa loob at labas ng mga sesyon\n", + "4. **NodeSets**: Inaayos ang data sa mga lohikal na kategorya para sa mas tiyak na retrieval\n", + "\n", + "### Mga Uri ng Memorya sa Tutorial na Ito:\n", + "\n", + "- **Persistent Memory**: Pangmatagalang imbakan sa knowledge graph\n", + "- **Session Memory**: Pansamantalang konteksto ng pag-uusap sa Redis cache\n", + "- **Semantic Memory**: Batay sa vector na paghahanap ng pagkakatulad sa lahat ng data\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Mag-install ng Mga Kinakailangang Package\n", + "\n", + "I-install ang Cognee na may suporta sa Redis para sa session management:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 I-set up ang Kapaligiran at I-load ang mga Library\n", + "\n", + "Siguraduhin na:\n", + "1. Tumatakbo ang Redis (hal., gamit ang Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Naka-set ang mga environment variable bago i-import ang mga cache module\n", + "3. Kung kinakailangan, i-restart ang kernel at patakbuhin ang mga cell nang sunud-sunod\n", + "\n", + "Ang sumusunod na cell ay gagawin ang mga sumusunod:\n", + "1. I-load ang mga environment variable mula sa `.env`\n", + "2. I-configure ang Cognee gamit ang iyong LLM settings\n", + "3. I-enable ang caching para sa session management\n", + "4. Siguraduhing maayos na nakakonekta ang lahat ng mga bahagi\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 I-configure ang mga Direktoryo ng Storage\n", + "\n", + "Gumagamit ang Cognee ng dalawang magkahiwalay na direktoryo para sa mga operasyon nito:\n", + "- **Data Root**: Nagtatabi ng mga dokumentong na-ingest at mga naprosesong data\n", + "- **System Root**: Naglalaman ng knowledge graph database at metadata ng sistema\n", + "\n", + "Gagawa tayo ng magkakahiwalay na direktoryo para sa tutorial na ito tulad ng sumusunod:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 I-reset ang Estado ng Memorya\n", + "\n", + "Bago tayo magsimula sa paggawa ng ating sistema ng memorya, tiyakin muna natin na nagsisimula tayo nang malinis.\n", + "\n", + "> 💡 **Tip**: Maaari mong laktawan ang hakbang na ito kung nais mong panatilihin ang mga umiiral na alaala mula sa iyong mga nakaraang pagtakbo kapag ginamit mo ang notebook na ito sa hinaharap.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Bahagi 1: Pagbuo ng Knowledge Base\n", + "\n", + "### Mga Pinagmulan ng Data para sa Ating Developer Assistant\n", + "\n", + "Tatlong uri ng data ang ating gagamitin upang makabuo ng komprehensibong knowledge base:\n", + "\n", + "1. **Profile ng Developer**: Personal na kadalubhasaan at teknikal na background\n", + "2. **Mga Pinakamahusay na Praktis sa Python**: Ang Zen of Python na may praktikal na gabay\n", + "3. **Mga Makasaysayang Usapan**: Mga nakaraang Q&A session sa pagitan ng mga developer at AI assistants\n", + "\n", + "Ang magkakaibang data na ito ay nagbibigay-daan sa ating agent na:\n", + "- Maunawaan ang teknikal na konteksto ng user\n", + "- Mag-apply ng pinakamahusay na praktis sa mga rekomendasyon\n", + "- Matuto mula sa mga nakaraang matagumpay na interaksyon\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Proseso ng Datos patungo sa Knowledge Graph\n", + "\n", + "Ngayon, babaguhin natin ang ating raw text sa isang nakaayos na memorya. Ang prosesong ito:\n", + "\n", + "1. **Nagdaragdag ng datos sa NodeSets**: Inaayos ang impormasyon sa lohikal na mga kategorya\n", + " - `developer_data`: Profile ng developer at mga pag-uusap\n", + " - `principles_data`: Mga pinakamahusay na kasanayan at gabay sa Python\n", + "\n", + "2. **Pinapatakbo ang Cognify Pipeline**: Kinukuha ang mga entity, relasyon, at gumagawa ng embeddings\n", + " - Tinutukoy ang mga pangunahing konsepto\n", + " - Lumilikha ng semantikong koneksyon sa pagitan ng magkakaugnay na impormasyon\n", + " - Gumagawa ng vector embeddings\n", + "\n", + "Maaaring tumagal ito ng ilang sandali habang pinoproseso ng LLM ang teksto at binubuo ang istruktura ng graph:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 I-visualize ang Knowledge Graph\n", + "\n", + "Tuklasin natin ang istruktura ng ating knowledge graph. Ang visualization ay nagpapakita ng:\n", + "- **Nodes**: Mga entity na nakuha mula sa teksto (mga konsepto, teknolohiya, tao)\n", + "- **Edges**: Mga relasyon at koneksyon sa pagitan ng mga entity\n", + "- **Clusters**: Mga kaugnay na konsepto na pinagsama batay sa semantikong pagkakatulad\n", + "\n", + "Buksan ang nalikhang HTML file sa iyong browser upang interaktibong tuklasin ang graph:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Pagyamanin ang Memorya gamit ang Memify\n", + "\n", + "Ang `memify()` na function ay sinusuri ang knowledge graph at bumubuo ng matatalinong alituntunin tungkol sa datos. Ang prosesong ito:\n", + "- Tinutukoy ang mga pattern at pinakamahusay na mga kasanayan\n", + "- Lumilikha ng mga praktikal na gabay batay sa nilalaman\n", + "- Nagpapalaganap ng ugnayan sa pagitan ng iba't ibang larangan ng kaalaman\n", + "\n", + "Ang mga alituntuning ito ay tumutulong sa ahente na gumawa ng mas maalam na desisyon kapag sumasagot ng mga tanong. Ang pagkuha ng pangalawang biswal na representasyon ay tumutulong sa iyo na maikumpara kung paano nagiging mas siksik ang graph kapag napagyaman.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Bahagi 2: Matalinong Pagkuha ng Impormasyon\n", + "\n", + "### Demonstrasyon 1: Pagsasama ng Kaalaman mula sa Iba't ibang Dokumento\n", + "\n", + "Ngayon na nabuo na ang ating knowledge graph, subukan natin kung paano pinagsasama ng Cognee ang impormasyon mula sa iba't ibang mapagkukunan upang sagutin ang masalimuot na mga tanong.\n", + "\n", + "Ang unang query ay nagpapakita ng:\n", + "- **Semantic na pag-unawa**: Paghahanap ng mga kaugnay na konsepto kahit hindi ito tahasang binanggit\n", + "- **Cross-referencing**: Pagsasama ng profile ng developer sa mga prinsipyo ng Python\n", + "- **Contextual na pangangatwiran**: Paglalapat ng pinakamahusay na mga kasanayan sa mga tiyak na implementasyon\n", + "\n", + "### Demonstrasyon 2: Piniling Paghahanap gamit ang NodeSets\n", + "\n", + "Ang pangalawang query ay nagpapakita kung paano mag-target ng mga tiyak na subset ng knowledge graph:\n", + "- Gumagamit ng `node_name` parameter upang maghanap lamang sa loob ng `principles_data`\n", + "- Nagbibigay ng nakatuon na sagot mula sa isang tiyak na domain ng kaalaman\n", + "- Kapaki-pakinabang kapag kailangan mo ng impormasyon na tiyak sa isang domain\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Bahagi 3: Pag-set up ng Pamamahala ng Session\n", + "\n", + "### Pag-enable ng Memorya ng Usapan\n", + "\n", + "Ang pamamahala ng session ay mahalaga para mapanatili ang konteksto sa maraming interaksyon. Dito natin gagawin ang sumusunod:\n", + "\n", + "1. **I-initialize ang Konteksto ng User**: Gumawa o kunin ang profile ng user para sa pagsubaybay ng session\n", + "2. **I-configure ang Cache Engine**: Kumonekta sa Redis para sa pag-iimbak ng kasaysayan ng usapan\n", + "3. **I-enable ang Mga Variable ng Session**: Mag-set up ng mga variable ng konteksto na nananatili sa bawat query\n", + "\n", + "> ⚠️ **Mahalaga**: Kinakailangan na tumatakbo ang Redis at `CACHING=true` sa iyong environment\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Helper Function: Tingnan ang Kasaysayan ng Session\n", + "\n", + "Ang utility function na ito ay nagbibigay-daan sa atin na suriin ang kasaysayan ng pag-uusap na nakaimbak sa Redis. Ito ay kapaki-pakinabang para sa:\n", + "- Pag-debug ng pamamahala ng session\n", + "- Pag-verify na ang mga pag-uusap ay nai-cache\n", + "- Pag-unawa kung anong konteksto ang magagamit para sa ahente\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Session 1: Async Support Lab — Unang Tanong\n", + "\n", + "Simulan ang sesyon ng `async-support-lab` sa pamamagitan ng pagtatanong tungkol sa mga telemetry-friendly na asyncio patterns para sa isang napakalaking web scraper. Alam na ng graph ang tungkol sa asyncio, aiohttp, at mga monitoring practices, kaya ang sagot ay dapat sumasalamin sa mga naunang pag-uusap habang iniangkop ang sagot sa bagong tanong.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Suriin ang Memorya ng Session 1 Pagkatapos ng Unang Palitan\n", + "\n", + "Ang pagtakbo ng `show_history(session_1)` kaagad pagkatapos ng unang tanong ay nagkukumpirma na isinulat ng Cognee ang parehong prompt at completion sa Redis. Makikita mo ang isang entry na may gabay sa concurrency.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Session 1: Pagsusuri sa Data Models\n", + "\n", + "Susunod nating tanungin, \"Kailan ko dapat piliin ang dataclasses kumpara sa Pydantic?\" gamit ang parehong session id. Dapat pagsamahin ni Cognee ang mga prinsipyo ng Python kasama ang mga naunang pag-uusap tungkol sa FastAPI upang magbigay ng mas detalyado at masusing payo—ipinapakita na ang konteksto ay naipapasa sa loob ng isang pinangalanang session.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Kumpirmahin na ang Kasaysayan ng Session 1 ay Naglalaman ng Parehong Mga Palitan\n", + "\n", + "Ang isa pang `show_history(session_1)` na tawag ay dapat magpakita ng dalawang Q&A na entry. Ito ay tumutugma sa \"memory replay\" na hakbang ng Mem0 lab at nagpapatunay na ang mga karagdagang palitan ay nagdaragdag sa parehong transcript.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Session 2: Thread ng Pagsusuri ng Disenyo — Bagong Session\n", + "\n", + "Para ipakita ang paghihiwalay sa pagitan ng mga thread, pinapatakbo namin ang `design-review-session` at humihingi ng gabay sa pag-log para sa pagsusuri ng insidente. Kahit pareho ang base ng kaalaman, ang bagong session id ay nagpapanatili ng hiwalay na mga transcript.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Pagsusuri ng Session 2 Kasaysayan\n", + "\n", + "`show_history(session_2)` ay dapat maglista lamang ng pares ng prompt/response para sa design-review. Ihambing ito sa Session 1 upang ipakita kung paano pinapanatili ng Cognee ang mga independiyenteng transcript habang muling ginagamit ang ibinahaging knowledge graph.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Buod\n", + "\n", + "Binabati kita! Nabigyan mo na ang iyong coding assistant ng isang tunay na pangmatagalang memory layer na pinapagana ng Cognee.\n", + "\n", + "Sa tutorial na ito, kinuha mo ang raw na nilalaman ng developer (code, dokumento, chat) at ginawang isang graph + vector memory na maaaring hanapin, pag-isipan, at patuloy na pagbutihin ng iyong agent.\n", + "\n", + "Ano ang Iyong Natutunan\n", + "\n", + "1. **Mula sa raw na teksto patungo sa AI memory**: Paano ini-ingest ng Cognee ang hindi istrukturang data at ginagawang matalino, mahanap na memory gamit ang pinagsamang vector + knowledge graph na arkitektura.\n", + "\n", + "2. **Pagpapayaman ng graph gamit ang memify**: Paano lampasan ang simpleng paggawa ng graph at gamitin ang memify upang magdagdag ng mga derived facts at mas mayamang relasyon sa ibabaw ng iyong umiiral na graph.\n", + "\n", + "3. **Iba't ibang estratehiya sa paghahanap**: Paano mag-query ng memory gamit ang iba't ibang uri ng paghahanap (graph-aware Q&A, RAG-style completion, insights, raw chunks, code search, atbp.) depende sa pangangailangan ng iyong agent.\n", + "\n", + "4. **Visual na eksplorasyon**: Paano inspeksyunin at i-debug ang ginawa ng Cognee gamit ang mga graph visualization at ang Cognee UI, upang makita mo kung paano nakaayos ang kaalaman.\n", + "\n", + "5. **Session-aware memory**: Paano pagsamahin ang per-session context sa persistent semantic memory upang maalala ng mga agent ang mga impormasyon sa bawat run nang hindi nagkakaroon ng pagtagas ng impormasyon sa pagitan ng mga user.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Mga Pangunahing Punto\n", + "1. Memorya bilang isang Knowledge Graph na sinusuportahan ng Embeddings\n", + "\n", + " - **Naka-istrukturang pag-unawa**: Pinagsasama ng Cognee ang isang vector store at isang graph store upang ang iyong data ay parehong mahanap batay sa kahulugan at konektado sa pamamagitan ng mga relasyon. Gumagamit ang Cognee ng mga file-based na database bilang default (LanceDB para sa vector-, Kuzu para sa graph database).\n", + "\n", + " - **Pagkuha na may kamalayan sa relasyon**: Ang mga sagot ay maaaring batay hindi lamang sa “katulad na teksto,” kundi pati na rin sa kung paano nauugnay ang mga entity.\n", + "\n", + " - **Buhay na memorya**: Ang memory layer ay umuunlad, lumalago, at nananatiling mahanap bilang isang konektadong graph.\n", + "\n", + "2. Mga Mode ng Paghahanap at Pangangatwiran\n", + " - **Hybrid retrieval**: Ang paghahanap ay pinagsasama ang vector similarity, graph structure, at LLM reasoning, mula sa raw chunk lookup hanggang sa graph-aware na pagsagot sa tanong.\n", + "\n", + " - **Iangkop ang mode sa trabaho**: Gumamit ng completion-style modes kapag gusto mo ng natural na sagot sa wika, at chunk/summary/graph modes kapag kailangan ng iyong agent ng raw na konteksto o upang magmaneho ng sariling pangangatwiran.\n", + "\n", + "3. Personalized, Session-Aware Agents\n", + " - **Session context + long-term memory**: Pinapanatili ng Cognee ang maikling “thread” context na hiwalay mula sa pangmatagalang memorya sa antas ng user o organisasyon.\n", + "\n", + "## Mga Aplikasyon sa Tunay na Mundo\n", + "\n", + "1. **Vertical AI Agents**\n", + "\n", + " Gamitin ang pattern mula sa notebook na ito upang paganahin ang domain-smart copilots na nakabase sa Cognee bilang retrieval at reasoning core:\n", + "\n", + "- **Developer copilots**: Code review, pagsusuri ng insidente, at mga assistant sa arkitektura na naglalakbay sa code, APIs, design docs, at mga ticket bilang isang memory graph.\n", + "\n", + "- **Customer-facing copilots**: Mga support o success agents na kumukuha mula sa product docs, FAQs, CRM notes, at mga nakaraang ticket gamit ang graph-aware retrieval at mga sagot na may citation.\n", + "\n", + "- **Internal expert copilots**: Mga assistant sa polisiya, legal, o seguridad na nangangatuwiran sa interconnected na mga patakaran, gabay, at mga desisyon sa kasaysayan sa halip na mga hiwalay na PDF.\n", + "\n", + " Ang Cognee ay tahasang nakaposisyon bilang persistent, accurate memory para sa AI agents, na nagbibigay ng isang buhay na knowledge graph na maaaring gamitin sa likod ng iyong agent at pumalit sa ad-hoc na kombinasyon ng vector stores at custom graph code.\n", + "\n", + "2. **Pag-iisa ng Data Silos sa Isang Memorya**\n", + "\n", + " Ang parehong approach ay tumutulong din sa pagbuo ng isang unified memory layer sa mga magkakahiwalay na sources:\n", + "\n", + "- **Mula sa silos patungo sa isang graph**: I-ingest ang structured (hal., databases) at unstructured data (hal., docs, chats) sa isang graph na sinusuportahan ng embeddings, sa halip na magkakahiwalay na indices para sa bawat sistema.\n", + "\n", + "- **Pangangatwiran sa cross-source na may citations**: Magpatakbo ng multi-step reasoning sa lahat—“i-join” ang logs, metrics, at docs sa pamamagitan ng graph—at magbalik pa rin ng grounded na sagot na may provenance.\n", + "\n", + "- **Knowledge hubs**: Para sa mga domain tulad ng banking o edukasyon, ginagamit na ang Cognee upang pag-isahin ang PDFs, internal systems, at app data sa isang knowledge graph na may vectors upang ang mga agents ay makasagot ng mga tanong na may eksaktong, cited na konteksto.\n", + "\n", + "## Mga Susunod na Hakbang\n", + "\n", + "Na-implement mo na ang core memory loop. Narito ang mga natural na extension na maaari mong subukan sa iyong sarili (tingnan ang [Cognee documentation](https://docs.cognee.ai/) para sa mga detalye):\n", + "\n", + "1. **Mag-eksperimento sa temporal awareness**: I-on ang temporal cognify upang mag-extract ng mga event at timestamps mula sa teksto.\n", + "\n", + "2. **Magpakilala ng ontology-driven reasoning**: Tukuyin ang isang OWL ontology para sa iyong domain. Gamitin ang suporta ng Cognee sa ontology upang ang mga na-extract na entity at relasyon ay nakabase sa schema na iyon, na nagpapabuti sa kalidad ng graph at mga sagot na partikular sa domain.\n", + "\n", + "3. **Magdagdag ng feedback loop**: Hayaan ang Cognee na ayusin ang graph edge weights mula sa aktwal na feedback ng user, upang ang retrieval ay patuloy na bumuti sa paglipas ng panahon sa halip na manatiling static.\n", + "\n", + "4. **I-tune para sa personalization at session behavior**: Gamitin ang user IDs, tenants, at datasets upang bigyan ang bawat tao o team ng kanilang sariling view sa shared memory engine.\n", + "\n", + "5. **Mag-scale out sa mas kumplikadong agents**: I-plug ang Cognee sa agent frameworks upang bumuo ng multi-agent systems na lahat ay nagbabahagi ng parehong memory layer. *Microsoft Agent Framework x Cognee plugin ay paparating na.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Paunawa**: \nAng dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, mangyaring tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na awtoritatibong pinagmulan. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:17:56+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "tl" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/tl/13-agent-memory/README.md b/translations/tl/13-agent-memory/README.md index 0ca53bff8..8494bf34b 100644 --- a/translations/tl/13-agent-memory/README.md +++ b/translations/tl/13-agent-memory/README.md @@ -1,56 +1,64 @@ -# Memory para sa AI Agents +# Memory para sa AI Agents [![Memory ng Agent](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.tl.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Kapag pinag-uusapan ang mga natatanging benepisyo ng paglikha ng AI Agents, dalawang bagay ang kadalasang binibigyang-diin: ang kakayahang gumamit ng mga tool para tapusin ang mga gawain at ang kakayahang mag-improve sa paglipas ng panahon. Ang memorya ang pundasyon ng paglikha ng self-improving agent na makapagbibigay ng mas mahusay na karanasan para sa ating mga user. +Kapag pinag-uusapan ang mga natatanging benepisyo ng paglikha ng AI Agents, dalawang bagay ang karaniwang binibigyang-diin: ang kakayahang gumamit ng mga tool para tapusin ang mga gawain at ang kakayahang mag-improve sa paglipas ng panahon. Ang memorya ang pundasyon ng paglikha ng self-improving agent na makakapagbigay ng mas mahusay na karanasan para sa ating mga user. -Sa araling ito, tatalakayin natin kung ano ang memorya para sa AI Agents at kung paano natin ito pamamahalaan at gagamitin para sa kapakinabangan ng ating mga aplikasyon. +Sa araling ito, tatalakayin natin kung ano ang memorya para sa AI Agents at kung paano natin ito mapapamahalaan at magagamit para sa kapakinabangan ng ating mga aplikasyon. ## Panimula -Ang araling ito ay tatalakay sa: +Saklaw ng araling ito ang: • **Pag-unawa sa Memorya ng AI Agent**: Ano ang memorya at bakit ito mahalaga para sa mga agent. • **Pagpapatupad at Pag-iimbak ng Memorya**: Praktikal na mga paraan para magdagdag ng kakayahan sa memorya sa iyong AI agents, na nakatuon sa short-term at long-term memory. -• **Pagpapahusay ng AI Agents**: Paano nagagamit ang memorya para matuto ang mga agent mula sa nakaraang interaksyon at mag-improve sa paglipas ng panahon. +• **Pagpapahusay ng AI Agents**: Paano nagagamit ang memorya upang matuto ang mga agent mula sa nakaraang interaksyon at mag-improve sa paglipas ng panahon. -## Mga Layunin sa Pag-aaral +## Mga Magagamit na Implementasyon + +Kasama sa araling ito ang dalawang komprehensibong notebook tutorial: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Nagpapatupad ng memorya gamit ang Mem0 at Azure AI Search sa Semantic Kernel framework. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Nagpapatupad ng structured memory gamit ang Cognee, awtomatikong gumagawa ng knowledge graph na suportado ng embeddings, nag-visualize ng graph, at may intelligent retrieval. + +## Mga Layunin sa Pagkatuto Pagkatapos makumpleto ang araling ito, malalaman mo kung paano: • **Pag-iba-ibahin ang iba't ibang uri ng memorya ng AI agent**, kabilang ang working, short-term, at long-term memory, pati na rin ang mga espesyal na anyo tulad ng persona at episodic memory. -• **Ipapatupad at pamahalaan ang short-term at long-term memory para sa AI agents** gamit ang Semantic Kernel framework, gamit ang mga tool tulad ng Mem0 at Whiteboard memory, at pagsasama sa Azure AI Search. +• **Ipapatupad at pamahalaan ang short-term at long-term memory para sa AI agents** gamit ang Semantic Kernel framework, gamit ang mga tool tulad ng Mem0, Cognee, Whiteboard memory, at pagsasama sa Azure AI Search. -• **Unawain ang mga prinsipyo sa likod ng self-improving AI agents** at kung paano nakakatulong ang matibay na memory management systems sa patuloy na pag-aaral at pag-aangkop. +• **Maunawaan ang mga prinsipyo sa likod ng self-improving AI agents** at kung paano nakakatulong ang matatag na memory management systems sa tuloy-tuloy na pagkatuto at pag-aangkop. ## Pag-unawa sa Memorya ng AI Agent -Sa pinakapundasyon nito, **ang memorya para sa AI agents ay tumutukoy sa mga mekanismo na nagpapahintulot sa kanila na magtago at magbalik ng impormasyon**. Ang impormasyong ito ay maaaring mga detalye tungkol sa isang pag-uusap, mga kagustuhan ng user, mga nakaraang aksyon, o kahit mga natutunang pattern. +Sa pinakapayak na anyo, **ang memorya para sa AI agents ay tumutukoy sa mga mekanismo na nagpapahintulot sa kanila na magpanatili at magbalik ng impormasyon**. Ang impormasyong ito ay maaaring mga detalye ng isang pag-uusap, mga kagustuhan ng user, mga nakaraang aksyon, o mga natutunang pattern. Kung walang memorya, ang mga AI application ay madalas na stateless, ibig sabihin, bawat interaksyon ay nagsisimula mula sa simula. Nagdudulot ito ng paulit-ulit at nakakainis na karanasan para sa user kung saan "nakakalimutan" ng agent ang nakaraang konteksto o mga kagustuhan. ### Bakit Mahalaga ang Memorya? -Ang katalinuhan ng isang agent ay malapit na konektado sa kakayahan nitong magbalik at gumamit ng nakaraang impormasyon. Ang memorya ay nagpapahintulot sa mga agent na maging: +Ang katalinuhan ng isang agent ay malapit na konektado sa kakayahan nitong maalala at magamit ang nakaraang impormasyon. Ang memorya ay nagpapahintulot sa mga agent na maging: -• **Reflective**: Natututo mula sa nakaraang mga aksyon at resulta. +• **Reflective**: Natututo mula sa mga nakaraang aksyon at resulta. -• **Interactive**: Napananatili ang konteksto sa isang patuloy na pag-uusap. +• **Interactive**: Pinapanatili ang konteksto sa isang patuloy na pag-uusap. -• **Proactive at Reactive**: Nahuhulaan ang mga pangangailangan o tumutugon nang naaayon batay sa nakaraang data. +• **Proactive at Reactive**: Nahuhulaan ang mga pangangailangan o tumutugon nang naaangkop batay sa nakaraang data. -• **Autonomous**: Mas malayang gumagana sa pamamagitan ng paggamit ng nakaimbak na kaalaman. +• **Autonomous**: Mas nagiging independent sa pamamagitan ng paggamit ng nakaimbak na kaalaman. Ang layunin ng pagpapatupad ng memorya ay gawing mas **maaasahan at may kakayahan** ang mga agent. @@ -58,57 +66,57 @@ Ang layunin ng pagpapatupad ng memorya ay gawing mas **maaasahan at may kakayaha #### Working Memory -Isipin ito bilang isang piraso ng scratch paper na ginagamit ng agent sa isang solong, patuloy na gawain o proseso ng pag-iisip. Nagtatago ito ng agarang impormasyon na kailangan para sa susunod na hakbang. +Isipin ito bilang isang piraso ng scratch paper na ginagamit ng agent sa isang solong gawain o proseso ng pag-iisip. Pinapanatili nito ang agarang impormasyon na kailangan para sa susunod na hakbang. -Para sa AI agents, ang working memory ay madalas na kumukuha ng pinaka-relevant na impormasyon mula sa isang pag-uusap, kahit na mahaba o putol ang buong chat history. Nakatuon ito sa pagkuha ng mga pangunahing elemento tulad ng mga kinakailangan, panukala, desisyon, at aksyon. +Para sa AI agents, ang working memory ay madalas na kumukuha ng pinaka-makabuluhang impormasyon mula sa isang pag-uusap, kahit na mahaba o putol-putol ang buong chat history. Nakatuon ito sa pagkuha ng mga pangunahing elemento tulad ng mga kinakailangan, panukala, desisyon, at aksyon. **Halimbawa ng Working Memory** -Sa isang travel booking agent, maaaring makuha ng working memory ang kasalukuyang kahilingan ng user, tulad ng "Gusto kong mag-book ng biyahe papuntang Paris". Ang partikular na kinakailangang ito ay hawak sa agarang konteksto ng agent upang gabayan ang kasalukuyang interaksyon. +Sa isang travel booking agent, maaaring makuha ng working memory ang kasalukuyang kahilingan ng user, tulad ng "Gusto kong mag-book ng biyahe papuntang Paris". Ang partikular na kahilingang ito ay nananatili sa agarang konteksto ng agent upang gabayan ang kasalukuyang interaksyon. #### Short Term Memory -Ang ganitong uri ng memorya ay nagtatago ng impormasyon sa tagal ng isang pag-uusap o session. Ito ang konteksto ng kasalukuyang chat, na nagpapahintulot sa agent na bumalik sa mga nakaraang bahagi ng usapan. +Ang ganitong uri ng memorya ay nagtatago ng impormasyon sa tagal ng isang pag-uusap o sesyon. Ito ang konteksto ng kasalukuyang chat, na nagpapahintulot sa agent na bumalik sa mga nakaraang bahagi ng diyalogo. **Halimbawa ng Short Term Memory** -Kung ang user ay magtanong, "Magkano ang flight papuntang Paris?" at pagkatapos ay magtanong, "Paano naman ang tirahan doon?", tinitiyak ng short-term memory na alam ng agent na ang "doon" ay tumutukoy sa "Paris" sa parehong pag-uusap. +Kung ang isang user ay magtanong, "Magkano ang flight papuntang Paris?" at pagkatapos ay mag-follow up ng "Paano naman ang tirahan doon?", tinitiyak ng short-term memory na alam ng agent na ang "doon" ay tumutukoy sa "Paris" sa parehong pag-uusap. #### Long Term Memory -Ito ay impormasyon na nananatili sa maraming pag-uusap o session. Pinapayagan nito ang mga agent na tandaan ang mga kagustuhan ng user, mga nakaraang interaksyon, o pangkalahatang kaalaman sa mahabang panahon. Mahalaga ito para sa personalisasyon. +Ito ay impormasyon na nananatili sa kabila ng maraming pag-uusap o sesyon. Pinapayagan nito ang mga agent na maalala ang mga kagustuhan ng user, mga nakaraang interaksyon, o pangkalahatang kaalaman sa mahabang panahon. Mahalaga ito para sa personalisasyon. **Halimbawa ng Long Term Memory** -Ang long-term memory ay maaaring mag-imbak ng impormasyon tulad ng "Mahilig si Ben sa skiing at outdoor activities, gusto niya ng kape na may tanawin ng bundok, at nais niyang iwasan ang advanced ski slopes dahil sa isang nakaraang injury". Ang impormasyong ito, na natutunan mula sa mga nakaraang interaksyon, ay nakakaimpluwensya sa mga rekomendasyon sa mga susunod na session ng pagpaplano ng biyahe, na ginagawang lubos na personalized. +Ang long-term memory ay maaaring mag-imbak ng impormasyon tulad ng "Mahilig si Ben sa skiing at outdoor activities, gusto niya ng kape na may tanawin ng bundok, at nais niyang iwasan ang advanced ski slopes dahil sa isang nakaraang pinsala". Ang impormasyong ito, na natutunan mula sa mga nakaraang interaksyon, ay nakakaimpluwensya sa mga rekomendasyon sa mga susunod na sesyon ng pagpaplano ng biyahe, na ginagawang mas personal ang mga ito. #### Persona Memory -Ang ganitong uri ng memorya ay tumutulong sa agent na bumuo ng isang pare-parehong "personality" o "persona". Pinapayagan nito ang agent na tandaan ang mga detalye tungkol sa sarili nito o sa nilalayong papel nito, na ginagawang mas natural at nakatuon ang mga interaksyon. +Ang ganitong uri ng memorya ay tumutulong sa isang agent na bumuo ng isang pare-parehong "personalidad" o "persona". Pinapayagan nito ang agent na maalala ang mga detalye tungkol sa sarili nito o sa nilalayong papel nito, na ginagawang mas maayos at nakatuon ang mga interaksyon. **Halimbawa ng Persona Memory** -Kung ang travel agent ay idinisenyo bilang isang "eksperto sa ski planning," maaaring palakasin ng persona memory ang papel na ito, na nakakaimpluwensya sa mga sagot nito upang tumugma sa tono at kaalaman ng isang eksperto. +Kung ang travel agent ay idinisenyo bilang isang "eksperto sa ski planning," maaaring palakasin ng persona memory ang papel na ito, na nakakaimpluwensya sa mga tugon nito upang umayon sa tono at kaalaman ng isang eksperto. #### Workflow/Episodic Memory -Ang memoryang ito ay nagtatago ng pagkakasunod-sunod ng mga hakbang na ginawa ng agent sa isang kumplikadong gawain, kabilang ang mga tagumpay at pagkabigo. Para itong pag-alala sa mga partikular na "episode" o nakaraang karanasan upang matuto mula rito. +Ang memoryang ito ay nagtatago ng pagkakasunod-sunod ng mga hakbang na ginagawa ng isang agent sa isang kumplikadong gawain, kabilang ang mga tagumpay at kabiguan. Para itong pag-alala sa mga partikular na "episode" o nakaraang karanasan upang matuto mula rito. **Halimbawa ng Episodic Memory** -Kung sinubukan ng agent na mag-book ng isang partikular na flight ngunit nabigo dahil sa kawalan ng availability, maaaring i-record ng episodic memory ang pagkabigong ito, na nagpapahintulot sa agent na subukan ang mga alternatibong flight o ipaalam sa user ang isyu sa mas impormadong paraan sa susunod na pagtatangka. +Kung sinubukan ng agent na mag-book ng isang partikular na flight ngunit nabigo dahil sa kawalan ng availability, maaaring i-record ng episodic memory ang kabiguang ito, na nagpapahintulot sa agent na subukan ang mga alternatibong flight o ipaalam sa user ang isyu sa mas may kaalamang paraan sa susunod na pagtatangka. #### Entity Memory -Ito ay tumutukoy sa pagkuha at pag-alala ng mga partikular na entity (tulad ng mga tao, lugar, o bagay) at mga kaganapan mula sa mga pag-uusap. Pinapayagan nito ang agent na bumuo ng isang structured na pag-unawa sa mga pangunahing elementong tinalakay. +Kasama rito ang pagkuha at pag-alala ng mga partikular na entity (tulad ng mga tao, lugar, o bagay) at mga kaganapan mula sa mga pag-uusap. Pinapayagan nito ang agent na bumuo ng isang structured na pag-unawa sa mga pangunahing elementong tinalakay. **Halimbawa ng Entity Memory** -Mula sa isang pag-uusap tungkol sa nakaraang biyahe, maaaring makuha ng agent ang "Paris," "Eiffel Tower," at "hapunan sa Le Chat Noir restaurant" bilang mga entity. Sa isang susunod na interaksyon, maaaring alalahanin ng agent ang "Le Chat Noir" at mag-alok na mag-book ng bagong reservation doon. +Mula sa isang pag-uusap tungkol sa isang nakaraang biyahe, maaaring makuha ng agent ang "Paris," "Eiffel Tower," at "hapunan sa Le Chat Noir restaurant" bilang mga entity. Sa isang hinaharap na interaksyon, maaaring maalala ng agent ang "Le Chat Noir" at mag-alok na mag-book muli ng reservation doon. #### Structured RAG (Retrieval Augmented Generation) -Bagama't ang RAG ay isang mas malawak na teknolohiya, ang "Structured RAG" ay binibigyang-diin bilang isang makapangyarihang memory technology. Kumukuha ito ng dense, structured na impormasyon mula sa iba't ibang source (mga pag-uusap, email, larawan) at ginagamit ito upang mapahusay ang precision, recall, at bilis ng mga sagot. Hindi tulad ng classic RAG na umaasa lamang sa semantic similarity, ang Structured RAG ay gumagana sa inherent structure ng impormasyon. +Habang ang RAG ay isang mas malawak na teknolohiya, ang "Structured RAG" ay binibigyang-diin bilang isang makapangyarihang memory technology. Kinukuha nito ang masinsinang, structured na impormasyon mula sa iba't ibang mapagkukunan (mga pag-uusap, email, larawan) at ginagamit ito upang mapahusay ang precision, recall, at bilis ng mga tugon. Hindi tulad ng klasikong RAG na umaasa lamang sa semantic similarity, ang Structured RAG ay gumagana sa inherent na istruktura ng impormasyon. **Halimbawa ng Structured RAG** @@ -118,43 +126,55 @@ Sa halip na tumugma lamang sa mga keyword, maaaring i-parse ng Structured RAG an Ang pagpapatupad ng memorya para sa AI agents ay nangangailangan ng sistematikong proseso ng **memory management**, na kinabibilangan ng pagbuo, pag-iimbak, pagkuha, pagsasama, pag-update, at kahit "pagkalimot" (o pagtanggal) ng impormasyon. Ang retrieval ay isang partikular na mahalagang aspeto. -### Mga Espesyal na Memory Tools +### Mga Espesyal na Tool sa Memorya + +#### Mem0 + +Isa sa mga paraan upang mag-imbak at pamahalaan ang memorya ng agent ay ang paggamit ng mga espesyal na tool tulad ng Mem0. Ang Mem0 ay gumagana bilang isang persistent memory layer, na nagpapahintulot sa mga agent na maalala ang mga kaugnay na interaksyon, mag-imbak ng mga kagustuhan ng user at factual context, at matuto mula sa mga tagumpay at kabiguan sa paglipas ng panahon. Ang ideya dito ay ang mga stateless agents ay nagiging stateful. + +Gumagana ito sa pamamagitan ng isang **two-phase memory pipeline: extraction at update**. Una, ang mga mensaheng idinagdag sa thread ng agent ay ipinapadala sa Mem0 service, na gumagamit ng Large Language Model (LLM) upang ibuod ang kasaysayan ng pag-uusap at kunin ang mga bagong memorya. Pagkatapos, ang isang LLM-driven update phase ay tumutukoy kung idaragdag, babaguhin, o tatanggalin ang mga memoryang ito, na iniimbak ang mga ito sa isang hybrid data store na maaaring magsama ng vector, graph, at key-value databases. Sinusuportahan din ng sistemang ito ang iba't ibang uri ng memorya at maaaring isama ang graph memory para sa pamamahala ng mga relasyon sa pagitan ng mga entity. + +#### Cognee + +Isa pang makapangyarihang paraan ay ang paggamit ng **Cognee**, isang open-source semantic memory para sa AI agents na nagbabago ng structured at unstructured data sa queryable knowledge graphs na suportado ng embeddings. Nagbibigay ang Cognee ng **dual-store architecture** na pinagsasama ang vector similarity search sa graph relationships, na nagpapahintulot sa mga agent na maunawaan hindi lamang kung anong impormasyon ang magkatulad, kundi kung paano nauugnay ang mga konsepto sa isa't isa. -Isang paraan upang mag-imbak at pamahalaan ang memorya ng agent ay ang paggamit ng mga espesyal na tool tulad ng Mem0. Ang Mem0 ay gumagana bilang isang persistent memory layer, na nagpapahintulot sa mga agent na alalahanin ang mga relevant na interaksyon, mag-imbak ng mga kagustuhan ng user at factual na konteksto, at matuto mula sa mga tagumpay at pagkabigo sa paglipas ng panahon. Ang ideya dito ay ang mga stateless agents ay nagiging stateful. +Mahusay ito sa **hybrid retrieval** na pinagsasama ang vector similarity, graph structure, at LLM reasoning - mula sa raw chunk lookup hanggang sa graph-aware question answering. Pinapanatili ng sistema ang **living memory** na patuloy na umuunlad at lumalago habang nananatiling queryable bilang isang konektadong graph, na sumusuporta sa parehong short-term session context at long-term persistent memory. -Ito ay gumagana sa pamamagitan ng **two-phase memory pipeline: extraction at update**. Una, ang mga mensaheng idinagdag sa thread ng agent ay ipinapadala sa Mem0 service, na gumagamit ng Large Language Model (LLM) upang i-summarize ang history ng pag-uusap at kunin ang mga bagong memorya. Pagkatapos, ang LLM-driven update phase ay nagtatakda kung idaragdag, babaguhin, o tatanggalin ang mga memoryang ito, na iniimbak ang mga ito sa isang hybrid data store na maaaring maglaman ng vector, graph, at key-value databases. Sinusuportahan din ng sistemang ito ang iba't ibang uri ng memorya at maaaring isama ang graph memory para sa pamamahala ng mga relasyon sa pagitan ng mga entity. +Ang Cognee notebook tutorial ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) ay nagpapakita ng paggawa ng unified memory layer na ito, na may mga praktikal na halimbawa ng pag-ingest ng iba't ibang mapagkukunan ng data, pag-visualize ng knowledge graph, at pag-query gamit ang iba't ibang search strategies na iniayon sa mga partikular na pangangailangan ng agent. ### Pag-iimbak ng Memorya gamit ang RAG -Bukod sa mga espesyal na memory tools tulad ng Mem0, maaari mong gamitin ang mga robust search services tulad ng **Azure AI Search bilang backend para sa pag-iimbak at pagkuha ng mga memorya**, lalo na para sa structured RAG. +Bukod sa mga espesyal na tool sa memorya tulad ng Mem0, maaari mong gamitin ang mga matatag na search services tulad ng **Azure AI Search bilang backend para sa pag-iimbak at pagkuha ng mga memorya**, lalo na para sa structured RAG. -Pinapayagan nito ang iyong agent na i-ground ang mga sagot nito gamit ang sarili mong data, na tinitiyak ang mas relevant at accurate na mga sagot. Ang Azure AI Search ay maaaring gamitin upang mag-imbak ng mga travel memorya ng user, mga catalog ng produkto, o anumang domain-specific na kaalaman. +Pinapayagan ka nitong i-ground ang mga tugon ng iyong agent gamit ang sarili mong data, na tinitiyak ang mas may kaugnayan at tumpak na mga sagot. Ang Azure AI Search ay maaaring gamitin upang mag-imbak ng mga user-specific travel memories, product catalogs, o anumang iba pang domain-specific knowledge. -Sinusuportahan ng Azure AI Search ang mga kakayahan tulad ng **Structured RAG**, na mahusay sa pagkuha at pag-retrieve ng dense, structured na impormasyon mula sa malalaking dataset tulad ng mga history ng pag-uusap, email, o kahit mga larawan. Nagbibigay ito ng "superhuman precision and recall" kumpara sa tradisyunal na text chunking at embedding approaches. +Sinusuportahan ng Azure AI Search ang mga kakayahan tulad ng **Structured RAG**, na mahusay sa pagkuha at pag-retrieve ng masinsinang, structured na impormasyon mula sa malalaking dataset tulad ng mga kasaysayan ng pag-uusap, email, o kahit mga larawan. Nagbibigay ito ng "superhuman precision and recall" kumpara sa tradisyunal na text chunking at embedding approaches. ## Pagpapahusay ng AI Agents Isang karaniwang pattern para sa self-improving agents ay ang pagpapakilala ng isang **"knowledge agent"**. Ang hiwalay na agent na ito ay nagmamasid sa pangunahing pag-uusap sa pagitan ng user at ng pangunahing agent. Ang papel nito ay: -1. **Tukuyin ang mahalagang impormasyon**: Alamin kung may bahagi ng pag-uusap na mahalagang i-save bilang pangkalahatang kaalaman o partikular na kagustuhan ng user. +1. **Tukuyin ang mahalagang impormasyon**: Tukuyin kung alinmang bahagi ng pag-uusap ang mahalagang i-save bilang pangkalahatang kaalaman o partikular na kagustuhan ng user. -2. **Kunin at i-summarize**: Kunin ang mahalagang natutunan o kagustuhan mula sa pag-uusap. +2. **Kunin at ibuod**: I-distill ang mahahalagang natutunan o kagustuhan mula sa pag-uusap. -3. **I-imbak sa knowledge base**: I-persist ang nakuhang impormasyon, kadalasan sa isang vector database, upang ma-retrieve ito sa hinaharap. +3. **I-imbak sa knowledge base**: I-persist ang nakuhang impormasyon, kadalasan sa isang vector database, upang ito ay ma-retrieve sa hinaharap. -4. **Palakasin ang mga susunod na query**: Kapag nagpasimula ang user ng bagong query, kinukuha ng knowledge agent ang relevant na nakaimbak na impormasyon at idinadagdag ito sa prompt ng user, na nagbibigay ng mahalagang konteksto sa pangunahing agent (katulad ng RAG). +4. **Palakasin ang mga susunod na query**: Kapag nagpasimula ang user ng bagong query, kinukuha ng knowledge agent ang kaugnay na nakaimbak na impormasyon at idinadagdag ito sa prompt ng user, na nagbibigay ng mahalagang konteksto sa pangunahing agent (katulad ng RAG). ### Mga Pag-optimize para sa Memorya -• **Pamamahala ng Latency**: Upang maiwasan ang pagbagal ng interaksyon ng user, maaaring gumamit ng mas mura at mas mabilis na modelo sa simula upang mabilis na suriin kung mahalagang i-store o i-retrieve ang impormasyon, at gagamitin lamang ang mas kumplikadong proseso ng extraction/retrieval kapag kinakailangan. +• **Pamamahala ng Latency**: Upang maiwasan ang pagbagal ng mga interaksyon ng user, maaaring gumamit ng mas mura at mas mabilis na modelo sa simula upang mabilis na suriin kung mahalagang i-store o i-retrieve ang impormasyon, at gagamitin lamang ang mas kumplikadong proseso ng extraction/retrieval kapag kinakailangan. -• **Pagpapanatili ng Knowledge Base**: Para sa lumalaking knowledge base, ang mas madalang gamitin na impormasyon ay maaaring ilipat sa "cold storage" upang pamahalaan ang gastos. +• **Pagpapanatili ng Knowledge Base**: Para sa lumalaking knowledge base, ang mas madalang gamitin na impormasyon ay maaaring ilipat sa "cold storage" upang mapamahalaan ang mga gastos. ## May Karagdagang Tanong Tungkol sa Memorya ng Agent? -Sumali sa [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) upang makipag-usap sa ibang mga nag-aaral, dumalo sa office hours, at makuha ang sagot sa iyong mga tanong tungkol sa AI Agents. +Sumali sa [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) upang makipag-usap sa iba pang mga nag-aaral, dumalo sa office hours, at masagot ang iyong mga tanong tungkol sa AI Agents. --- + **Paunawa**: -Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagama't sinisikap naming maging tumpak, mangyaring tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito. \ No newline at end of file +Ang dokumentong ito ay isinalin gamit ang AI translation service na [Co-op Translator](https://github.com/Azure/co-op-translator). Bagamat sinisikap naming maging tumpak, mangyaring tandaan na ang mga awtomatikong pagsasalin ay maaaring maglaman ng mga pagkakamali o hindi pagkakatugma. Ang orihinal na dokumento sa kanyang katutubong wika ang dapat ituring na opisyal na sanggunian. Para sa mahalagang impormasyon, inirerekomenda ang propesyonal na pagsasalin ng tao. Hindi kami mananagot sa anumang hindi pagkakaunawaan o maling interpretasyon na dulot ng paggamit ng pagsasaling ito. + \ No newline at end of file diff --git a/translations/tr/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/tr/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..a30f72831 --- /dev/null +++ b/translations/tr/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Cognee ile Kalıcı Belleğe Sahip AI Ajanları Oluşturma\n", + "\n", + "Bu not defteri, bağlam farkındalığına sahip AI sistemleri oluşturmak için bilgi grafikleri, anlamsal arama ve oturum yönetimini birleştiren açık kaynaklı bir AI belleği olan [**cognee**](https://www.cognee.ai/) kullanarak gelişmiş bellek yeteneklerine sahip zeki AI ajanları oluşturmayı gösterir.\n", + "\n", + "## 🎯 Öğrenme Hedefleri\n", + "\n", + "Bu eğitimin sonunda şunları anlayacaksınız:\n", + "- **Gömülü Bilgi Grafikleri Oluşturma**: Yapılandırılmamış metni yapılandırılmış, sorgulanabilir bilgiye dönüştürme\n", + "- **Oturum Belleği Uygulama**: Otomatik bağlam koruması ile çoklu dönüşlü konuşmalar oluşturma\n", + "- **Konuşmaları Kalıcı Hale Getirme**: Önemli etkileşimleri uzun vadeli bellek için isteğe bağlı olarak saklama\n", + "- **Doğal Dil Kullanarak Sorgulama**: Yeni konuşmalarda geçmiş bağlamı erişme ve kullanma\n", + "- **Belleği Görselleştirme**: Ajanınızın bilgi grafiğindeki ilişkileri keşfetme\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Ne İnşa Edeceksiniz\n", + "\n", + "Bu eğitimde, kalıcı hafızaya sahip bir **Kodlama Asistanı** oluşturacağız:\n", + "\n", + "### 1. **Bilgi Tabanı Oluşturma**\n", + " - Geliştirici profili ve uzmanlık bilgilerini alır\n", + " - Python programlama prensiplerini ve en iyi uygulamaları işler\n", + " - Geliştiriciler ve yapay zeka asistanları arasındaki geçmiş konuşmaları depolar\n", + "\n", + "### 2. **Oturum Farkındalığına Sahip Konuşmalar**\n", + " - Aynı oturumdaki birden fazla soru arasında bağlamı korur\n", + " - Her soru/cevap çiftini otomatik olarak önbelleğe alır ve verimli bir şekilde geri çağırır\n", + " - Konuşma geçmişine dayalı tutarlı ve bağlamsal yanıtlar sağlar\n", + "\n", + "### 3. **Uzun Süreli Hafıza**\n", + " - Önemli konuşmaları uzun süreli hafızaya kaydeder\n", + " - Yeni etkileşimleri bilgilendirmek için bilgi tabanından ve geçmiş oturumlardan ilgili anıları geri çağırır\n", + " - Zamanla gelişen bir bilgi tabanı oluşturur\n", + "\n", + "### 4. **Akıllı Hafıza Geri Çağırma**\n", + " - Tüm depolanan bilgiler arasında ilgili bilgileri bulmak için grafik farkındalıklı anlamsal arama kullanır\n", + " - Aramaları veri alt gruplarına göre filtreler (geliştirici bilgileri vs. prensipler)\n", + " - Kapsamlı yanıtlar sağlamak için birden fazla veri kaynağını birleştirir\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Ön Koşullar ve Kurulum\n", + "\n", + "### Sistem Gereksinimleri\n", + "\n", + "Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:\n", + "\n", + "1. **Python Ortamı**\n", + " - Python 3.9 veya daha üstü\n", + " - Sanal ortam (önerilir)\n", + " \n", + "2. **Redis Cache** (Oturum Yönetimi için Gerekli)\n", + " - Yerel Redis: `docker run -d -p 6379:6379 redis`\n", + " - Ya da yönetilen bir Redis hizmeti kullanabilirsiniz\n", + " \n", + "3. **LLM API Erişimi**\n", + " - OpenAI API anahtarı veya diğer sağlayıcılar (bkz. [dokümantasyon](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Veritabanı Yapılandırması**\n", + " - Varsayılan olarak herhangi bir yapılandırma gerekmez. Cognee dosya tabanlı veritabanları (LanceDB ve Kuzu) kullanır.\n", + " - İsteğe bağlı olarak, Azure AI Search'ü bir vektör deposu olarak kurabilirsiniz (bkz. [dokümantasyon](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Ortam Yapılandırması\n", + "\n", + "Proje dizininizde aşağıdaki değişkenlerle bir `.env` dosyası oluşturun:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Cognee'nin Bellek Mimarisi Anlama\n", + "\n", + "### Cognee Nasıl Çalışır\n", + "\n", + "Cognee, basit anahtar-değer depolamanın ötesine geçen gelişmiş bir bellek sistemi sunar:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Temel Bileşenler:\n", + "\n", + "1. **Bilgi Grafiği**: Varlıkları, ilişkileri ve anlamsal bağlantıları depolar\n", + "2. **Vektör Gömüleri**: Tüm depolanan bilgiler arasında anlamsal arama yapmayı sağlar\n", + "3. **Oturum Önbelleği**: Oturumlar sırasında ve arasında konuşma bağlamını korur\n", + "4. **DüğümSetleri**: Verileri hedefe yönelik erişim için mantıksal kategorilere ayırır\n", + "\n", + "### Bu Eğitimdeki Bellek Türleri:\n", + "\n", + "- **Kalıcı Bellek**: Bilgi grafiğinde uzun vadeli depolama\n", + "- **Oturum Belleği**: Redis önbelleğinde geçici konuşma bağlamı\n", + "- **Anlamsal Bellek**: Tüm veriler arasında vektör tabanlı benzerlik araması\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Gerekli Paketleri Yükleyin\n", + "\n", + "Oturum yönetimi için Redis desteğiyle birlikte Cognee'yi yükleyin:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Ortamı Başlat ve Kütüphaneleri Yükle\n", + "\n", + "Emin olun:\n", + "1. Redis çalışıyor (örneğin, Docker ile: `docker run -d -p 6379:6379 redis`)\n", + "2. Önbellek modüllerini içe aktarmadan önce ortam değişkenleri ayarlandı\n", + "3. Gerekirse, çekirdeği yeniden başlatın ve hücreleri sırayla çalıştırın\n", + "\n", + "Aşağıdaki hücre şunları yapacaktır:\n", + "1. Ortam değişkenlerini `.env` dosyasından yükleyecek\n", + "2. Cognee'yi LLM ayarlarınızla yapılandıracak\n", + "3. Oturum yönetimi için önbelleği etkinleştirecek\n", + "4. Tüm bileşenlerin düzgün bir şekilde bağlı olduğunu doğrulayacak\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Depolama Dizinlerini Yapılandırma\n", + "\n", + "Cognee, işlemleri için iki ayrı dizin kullanır:\n", + "- **Veri Kök Dizini**: Alınan belgeleri ve işlenmiş verileri depolar\n", + "- **Sistem Kök Dizini**: Bilgi grafiği veritabanını ve sistem meta verilerini içerir\n", + "\n", + "Bu eğitim için aşağıdaki gibi izole edilmiş dizinler oluşturacağız:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Bellek Durumunu Sıfırla\n", + "\n", + "Bellek sistemimizi oluşturmaya başlamadan önce, her şeyin sıfırdan başladığından emin olalım.\n", + "\n", + "> 💡 **İpucu**: Bu adımı atlayabilirsiniz, eğer bu not defterini daha sonra kullandığınızda önceki çalışmalardan kalan mevcut anıları korumak istiyorsanız.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Bölüm 1: Bilgi Tabanı Oluşturma\n", + "\n", + "### Geliştirici Asistanı için Veri Kaynakları\n", + "\n", + "Kapsamlı bir bilgi tabanı oluşturmak için üç tür veri alacağız:\n", + "\n", + "1. **Geliştirici Profili**: Kişisel uzmanlık ve teknik geçmiş\n", + "2. **Python En İyi Uygulamaları**: Python'un Zen'i ve pratik yönergeler\n", + "3. **Tarihi Konuşmalar**: Geliştiriciler ve yapay zeka asistanları arasındaki geçmiş Soru-Cevap oturumları\n", + "\n", + "Bu çeşitli veri, ajanımızın:\n", + "- Kullanıcının teknik bağlamını anlamasını\n", + "- Önerilerde en iyi uygulamaları kullanmasını\n", + "- Önceki başarılı etkileşimlerden öğrenmesini sağlar\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Verileri Bilgi Grafiğine Dönüştür\n", + "\n", + "Şimdi ham metnimizi yapılandırılmış bir hafızaya dönüştüreceğiz. Bu süreç:\n", + "\n", + "1. **Verileri NodeSets'e ekler**: Bilgiyi mantıksal kategorilere organize eder\n", + " - `developer_data`: Geliştirici profili ve konuşmalar\n", + " - `principles_data`: Python en iyi uygulamaları ve yönergeler\n", + "\n", + "2. **Cognify Pipeline'ı çalıştırır**: Varlıkları, ilişkileri çıkarır ve gömme işlemleri yapar\n", + " - Anahtar kavramları belirler\n", + " - İlgili bilgiler arasında anlamsal bağlantılar oluşturur\n", + " - Vektör gömmeleri oluşturur\n", + "\n", + "LLM metni işlerken ve grafik yapısını oluştururken bu işlem birkaç dakika sürebilir:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Bilgi Grafiğini Görselleştir\n", + "\n", + "Bilgi grafiğimizin yapısını inceleyelim. Görselleştirme şunları gösterir:\n", + "- **Düğümler**: Metinden çıkarılan varlıklar (kavramlar, teknolojiler, kişiler)\n", + "- **Kenarlar**: Varlıklar arasındaki ilişkiler ve bağlantılar\n", + "- **Kümeler**: Anlamsal benzerliklerine göre gruplanmış ilgili kavramlar\n", + "\n", + "Grafiği etkileşimli olarak keşfetmek için oluşturulan HTML dosyasını tarayıcınızda açın:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Hafızayı Memify ile Zenginleştirin\n", + "\n", + "`memify()` fonksiyonu bilgi grafiğini analiz eder ve veri hakkında akıllı kurallar oluşturur. Bu süreç:\n", + "- Kalıpları ve en iyi uygulamaları belirler\n", + "- İçeriğe dayalı uygulanabilir yönergeler oluşturur\n", + "- Farklı bilgi alanları arasındaki ilişkileri kurar\n", + "\n", + "Bu kurallar, ajanın soruları yanıtlarken daha bilinçli kararlar almasına yardımcı olur. İkinci bir görselleştirme yakalamak, grafiğin zenginleştirildikten sonra nasıl yoğunlaştığını karşılaştırmanıza olanak tanır.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Bölüm 2: Akıllı Hafıza Erişimi\n", + "\n", + "### Gösterim 1: Belgeler Arası Bilgi Entegrasyonu\n", + "\n", + "Artık bilgi grafiğimiz oluşturulduğuna göre, Cognee'nin karmaşık soruları yanıtlamak için birden fazla kaynaktan nasıl bilgi birleştirdiğini test edelim.\n", + "\n", + "İlk sorgu şunları gösterir:\n", + "- **Anlamsal anlayış**: Açıkça belirtilmese bile ilgili kavramları bulma\n", + "- **Çapraz referanslama**: Geliştirici profili ile Python prensiplerini birleştirme\n", + "- **Bağlamsal akıl yürütme**: En iyi uygulamaları belirli uygulamalara uyarlama\n", + "\n", + "### Gösterim 2: NodeSets ile Filtrelenmiş Arama\n", + "\n", + "İkinci sorgu, bilgi grafiğinin belirli alt kümelerini hedeflemenin nasıl mümkün olduğunu gösterir:\n", + "- Sadece `principles_data` içinde arama yapmak için `node_name` parametresini kullanır\n", + "- Belirli bir bilgi alanından odaklanmış yanıtlar sağlar\n", + "- Alan spesifik bilgilere ihtiyaç duyduğunuzda faydalıdır\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Bölüm 3: Oturum Yönetimi Ayarları\n", + "\n", + "### Konuşma Hafızasını Etkinleştirme\n", + "\n", + "Oturum yönetimi, birden fazla etkileşimde bağlamı korumak için çok önemlidir. Burada şunları yapacağız:\n", + "\n", + "1. **Kullanıcı Bağlamını Başlatma**: Oturum takibi için bir kullanıcı profili oluşturun veya alın\n", + "2. **Önbellek Motorunu Yapılandırma**: Konuşma geçmişini depolamak için Redis'e bağlanın\n", + "3. **Oturum Değişkenlerini Etkinleştirme**: Sorgular arasında kalıcı olan bağlam değişkenlerini ayarlayın\n", + "\n", + "> ⚠️ **Önemli**: Bunun için Redis'in çalışıyor olması ve ortamınızda `CACHING=true` ayarının yapılmış olması gereklidir\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Yardımcı Fonksiyon: Oturum Geçmişini Görüntüle\n", + "\n", + "Bu yardımcı fonksiyon, Redis'te saklanan konuşma geçmişini incelememizi sağlar. Şu durumlar için faydalıdır:\n", + "- Oturum yönetimini hata ayıklama\n", + "- Konuşmaların önbelleğe alındığını doğrulama\n", + "- Ajanın hangi bağlama sahip olduğunu anlama\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Oturum 1: Async Destek Laboratuvarı — İlk Soru\n", + "\n", + "`async-support-lab` oturumunu, büyük bir web kazıyıcı için telemetri dostu asyncio desenleri hakkında sorular sorarak başlatın. Grafik zaten asyncio, aiohttp ve izleme uygulamaları hakkında bilgi sahibi, bu yüzden yanıt önceki konuşmaları yansıtmalı ve yeni soruya uygun şekilde uyarlanmalıdır.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## İlk Etkileşimden Sonra Oturum 1 Belleğini İnceleme\n", + "\n", + "İlk sorudan hemen sonra `show_history(session_1)` çalıştırmak, Cognee'nin hem istemi hem de tamamlamayı Redis'e yazdığını doğrular. Eşzamanlılık rehberiyle birlikte bir giriş görmelisiniz.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Oturum 1: Veri Modelleri Üzerine Takip\n", + "\n", + "Şimdi şu soruyu soruyoruz: \"Dataclasses yerine Pydantic'i ne zaman seçmeliyim?\" Aynı oturum kimliğini kullanarak. Cognee, Python prensiplerini ve önceki FastAPI konuşmalarını birleştirerek bağlamın adlandırılmış bir oturum içinde devam ettiğini gösteren ayrıntılı tavsiyeler sunmalı.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Oturum 1 Geçmişinin Her İki Dönüşü İçerdiğini Doğrulayın\n", + "\n", + "Bir başka `show_history(session_1)` çağrısı, iki Soru-Cevap girişini göstermelidir. Bu, Mem0 laboratuvarının \"hafıza tekrar oynatma\" adımına uyar ve ek dönüşlerin aynı transkripti genişlettiğini kanıtlar.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Oturum 2: Tasarım İnceleme Konusu — Yeni Oturum\n", + "\n", + "Konular arasındaki izolasyonu göstermek için `design-review-session` başlatıyoruz ve olay incelemeleri için günlük tutma rehberliği istiyoruz. Temel bilgi tabanı aynı olsa da, yeni oturum kimliği transkriptleri ayrı tutar.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## İnceleme Oturumu 2 Geçmişi\n", + "\n", + "`show_history(session_2)` yalnızca tasarım inceleme istemi/cevap çiftini listelemelidir. Bunu Oturum 1 ile karşılaştırarak, Cognee'nin paylaşılan bilgi grafiğini yeniden kullanırken bağımsız transkriptleri nasıl koruduğunu vurgulayın.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Özet\n", + "\n", + "Tebrikler! Kodlama asistanınıza Cognee tarafından desteklenen gerçek bir uzun vadeli hafıza katmanı kazandırdınız.\n", + "\n", + "Bu eğitimde, ham geliştirici içeriğini (kod, belgeler, sohbetler) alıp, ajanınızın arama yapabileceği, mantık yürütebileceği ve sürekli geliştirebileceği bir grafik + vektör hafızasına dönüştürdünüz.\n", + "\n", + "Öğrendikleriniz\n", + "\n", + "1. **Ham metinden yapay zeka hafızasına**: Cognee'nin yapılandırılmamış verileri nasıl alıp, birleşik bir vektör + bilgi grafiği mimarisi kullanarak akıllı, aranabilir bir hafızaya dönüştürdüğünü öğrendiniz.\n", + "\n", + "2. **Memify ile grafik zenginleştirme**: Temel grafik oluşturmanın ötesine geçerek, mevcut grafiğinizin üzerine türetilmiş bilgiler ve daha zengin ilişkiler eklemek için memify'ı nasıl kullanacağınızı öğrendiniz.\n", + "\n", + "3. **Çoklu arama stratejileri**: Ajanınızın ihtiyaçlarına bağlı olarak farklı arama türleriyle (grafik farkındalıklı Soru-Cevap, RAG tarzı tamamlama, içgörüler, ham parçalar, kod arama vb.) hafızayı nasıl sorgulayacağınızı öğrendiniz.\n", + "\n", + "4. **Görsel keşif**: Cognee'nin oluşturduğu bilgiyi grafik görselleştirmeleri ve Cognee UI kullanarak nasıl inceleyip hata ayıklayabileceğinizi, böylece bilginin nasıl yapılandırıldığını görebileceğinizi öğrendiniz.\n", + "\n", + "5. **Oturum farkındalıklı hafıza**: Ajanların kullanıcılar arasında bilgi sızdırmadan oturumlar arası hatırlama yapabilmesi için oturum bazlı bağlamı kalıcı semantik hafıza ile nasıl birleştireceğinizi öğrendiniz.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Temel Çıkarımlar\n", + "1. Gömülerle Desteklenen Bir Bilgi Grafiği Olarak Bellek\n", + "\n", + " - **Yapılandırılmış Anlayış**: Cognee, verilerinizi hem anlamına göre aranabilir hem de ilişkilerle bağlantılı hale getiren bir vektör deposu ve grafik deposunu birleştirir. Cognee varsayılan olarak dosya tabanlı veritabanları kullanır (vektör için LanceDB, grafik veritabanı için Kuzu).\n", + "\n", + " - **İlişki farkındalığıyla erişim**: Yanıtlar yalnızca \"benzer metin\" temelinde değil, aynı zamanda varlıkların nasıl ilişkili olduğuna dayanarak da oluşturulabilir.\n", + "\n", + " - **Canlı bellek**: Bellek katmanı evrilir, büyür ve tek bir bağlı grafik olarak sorgulanabilir durumda kalır.\n", + "\n", + "2. Arama ve Akıl Yürütme Modları\n", + " - **Hibrit erişim**: Arama, vektör benzerliği, grafik yapısı ve LLM akıl yürütmesini birleştirir; ham parça aramadan grafik farkındalıklı soru yanıtlamaya kadar.\n", + "\n", + " - **Göreve uygun mod seçimi**: Doğal dil yanıtları istediğinizde tamamlama tarzı modları, ajanınızın ham bağlama ihtiyaç duyduğu veya kendi akıl yürütmesini yönlendirdiği durumlarda parça/özet/grafik modlarını kullanın.\n", + "\n", + "3. Kişiselleştirilmiş, Oturum Farkındalıklı Ajanlar\n", + " - **Oturum bağlamı + uzun vadeli bellek**: Cognee, kısa vadeli \"konu\" bağlamını uzun vadeli, kullanıcı veya organizasyon düzeyindeki bellekten ayrı tutar.\n", + "\n", + "## Gerçek Dünya Uygulamaları\n", + "\n", + "1. **Dikey AI Ajanları**\n", + "\n", + " Bu not defterindeki modeli kullanarak, Cognee'yi erişim ve akıl yürütme çekirdeği olarak kullanan alan bilgisine sahip yardımcılar oluşturabilirsiniz:\n", + "\n", + "- **Geliştirici yardımcıları**: Kod inceleme, olay analizi ve mimari asistanları, kod, API'ler, tasarım belgeleri ve biletleri tek bir bellek grafiği olarak tarar.\n", + "\n", + "- **Müşteri odaklı yardımcılar**: Ürün belgeleri, SSS'ler, CRM notları ve geçmiş biletlerden grafik farkındalıklı erişim ve kaynaklı yanıtlar çeken destek veya başarı ajanları.\n", + "\n", + "- **Dahili uzman yardımcılar**: Politika, hukuk veya güvenlik asistanları, izole edilmiş PDF'ler yerine birbirine bağlı kurallar, yönergeler ve geçmiş kararlar üzerinde akıl yürütür.\n", + "\n", + " Cognee, AI ajanları için kalıcı, doğru bir bellek olarak açıkça konumlandırılmıştır ve ajanınızın arkasına yerleşerek vektör depoları ve özel grafik kodlarının rastgele kombinasyonlarının yerini alır.\n", + "\n", + "2. **Veri Silolarını Tek Bir Bellekte Birleştirme**\n", + "\n", + " Aynı yaklaşım, dağınık kaynaklar arasında birleşik bir bellek katmanı oluşturmanıza da yardımcı olur:\n", + "\n", + "- **Silolardan tek bir grafiğe**: Yapılandırılmış (ör. veritabanları) ve yapılandırılmamış verileri (ör. belgeler, sohbetler) ayrı sistemler için ayrı dizinler yerine gömülerle desteklenen tek bir grafiğe aktarın.\n", + "\n", + "- **Kaynaklar arası akıl yürütme ve atıflar**: Her şey üzerinde çok adımlı akıl yürütme yapın—grafik aracılığıyla günlükleri, metrikleri ve belgeleri \"birleştirin\"—ve yine de kaynaklı yanıtlar döndürün.\n", + "\n", + "- **Bilgi merkezleri**: Bankacılık veya eğitim gibi alanlar için Cognee, PDF'leri, dahili sistemleri ve uygulama verilerini bir bilgi grafiğinde birleştirmek ve ajanların kesin, kaynaklı bağlamla soruları yanıtlamasını sağlamak için zaten kullanılmaktadır.\n", + "\n", + "## Sonraki Adımlar\n", + "\n", + "Temel bellek döngüsünü uyguladınız. İşte kendi başınıza deneyebileceğiniz doğal genişletmeler (ayrıntılar için [Cognee dokümantasyonuna](https://docs.cognee.ai/) bakın):\n", + "\n", + "1. **Zamansal farkındalıkla deney yapın**: Metinden olayları ve zaman damgalarını çıkarmak için zamansal cogniyayı etkinleştirin.\n", + "\n", + "2. **Ontoloji tabanlı akıl yürütme ekleyin**: Alanınız için bir OWL ontolojisi tanımlayın. Çıkarılan varlıklar ve ilişkiler bu şemaya dayandırılarak grafik kalitesini ve alan özelindeki yanıtları iyileştirmek için Cognee’nin ontoloji desteğini kullanın.\n", + "\n", + "3. **Bir geri bildirim döngüsü ekleyin**: Gerçek kullanıcı geri bildirimlerinden grafik kenar ağırlıklarını ayarlaması için Cognee'ye izin verin, böylece erişim zamanla iyileşir ve statik kalmaz.\n", + "\n", + "4. **Kişiselleştirme ve oturum davranışı için ayarlayın**: Her kişi veya ekibe paylaşılan bellek motoru üzerinde kendi görünümünü vermek için kullanıcı kimlikleri, kiracılar ve veri setlerini kullanın.\n", + "\n", + "5. **Daha karmaşık ajanlara ölçeklendirin**: Cognee'yi ajan çerçevelerine bağlayarak aynı bellek katmanını paylaşan çoklu ajan sistemleri oluşturun. *Microsoft Agent Framework x Cognee eklentisi yakında geliyor.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Feragatname**: \nBu belge, [Co-op Translator](https://github.com/Azure/co-op-translator) adlı yapay zeka çeviri hizmeti kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlamalar veya yanlış yorumlamalar için sorumluluk kabul edilmez.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:53:58+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "tr" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/tr/13-agent-memory/README.md b/translations/tr/13-agent-memory/README.md index 9066f0da3..a2e5400b4 100644 --- a/translations/tr/13-agent-memory/README.md +++ b/translations/tr/13-agent-memory/README.md @@ -1,8 +1,8 @@ **Feragatname**: -Bu belge, AI çeviri hizmeti [Co-op Translator](https://github.com/Azure/co-op-translator) kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlık içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlamalar veya yanlış yorumlamalar için sorumluluk kabul etmiyoruz. \ No newline at end of file +Bu belge, AI çeviri hizmeti [Co-op Translator](https://github.com/Azure/co-op-translator) kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çeviriler hata veya yanlışlıklar içerebilir. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlamalar veya yanlış yorumlamalardan sorumlu değiliz. + \ No newline at end of file diff --git a/translations/tw/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/tw/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..5f899bb39 --- /dev/null +++ b/translations/tw/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# 使用 Cognee 建立具有持久記憶的 AI 代理\n", + "\n", + "此筆記本展示如何使用 [**cognee**](https://www.cognee.ai/) 建立具有高級記憶功能的智能 AI 代理。Cognee 是一個開源的 AI 記憶系統,結合了知識圖譜、語義搜尋和會話管理,能夠創建具備上下文感知能力的 AI 系統。\n", + "\n", + "## 🎯 學習目標\n", + "\n", + "完成本教程後,您將能夠了解如何:\n", + "- **建立基於嵌入的知識圖譜**:將非結構化文本轉換為結構化、可查詢的知識\n", + "- **實現會話記憶**:創建多輪對話,並自動保留上下文\n", + "- **持久化對話**:選擇性地將重要的互動存儲於長期記憶中以供未來參考\n", + "- **使用自然語言查詢**:在新對話中訪問並利用歷史上下文\n", + "- **可視化記憶**:探索代理知識圖譜中的關係\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ 您將建立的內容\n", + "\n", + "在本教程中,我們將建立一個具有持久記憶的**程式助理**,其功能包括:\n", + "\n", + "### 1. **知識庫建構**\n", + " - 收集開發者的個人資料及專業資訊\n", + " - 處理 Python 程式設計原則及最佳實踐\n", + " - 儲存開發者與 AI 助理之間的歷史對話\n", + "\n", + "### 2. **會話感知對話**\n", + " - 在同一會話中保持多個問題的上下文\n", + " - 自動快取每個問題/答案對以提高檢索效率\n", + " - 根據對話歷史提供連貫且具上下文的回應\n", + "\n", + "### 3. **長期記憶**\n", + " - 將重要的對話保存到長期記憶中\n", + " - 從知識庫及過去的會話中檢索相關記憶以輔助新的互動\n", + " - 建立一個隨時間增長的知識庫以持續改進\n", + "\n", + "### 4. **智能記憶檢索**\n", + " - 使用圖形感知語義搜索來查找所有儲存知識中的相關資訊\n", + " - 根據數據子群組(開發者資訊 vs. 原則)篩選搜索結果\n", + " - 結合多個數據來源以提供全面的答案\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 先決條件與設定\n", + "\n", + "### 系統需求\n", + "\n", + "在開始之前,請確保您已具備以下條件:\n", + "\n", + "1. **Python 環境**\n", + " - Python 3.9 或更高版本\n", + " - 建議使用虛擬環境\n", + "\n", + "2. **Redis 快取**(用於會話管理)\n", + " - 本地 Redis:`docker run -d -p 6379:6379 redis`\n", + " - 或使用托管的 Redis 服務\n", + "\n", + "3. **LLM API 存取**\n", + " - OpenAI API 金鑰或其他提供者(請參閱[文件](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **資料庫設定**\n", + " - 預設情況下不需要任何設定。Cognee 使用基於檔案的資料庫(LanceDB 和 Kuzu)\n", + " - 可選擇性地設定 Azure AI Search 作為向量存儲(請參閱[文件](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### 環境設定\n", + "\n", + "在您的專案目錄中建立 `.env` 檔案,並加入以下變數:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ 理解 Cognee 的記憶體架構\n", + "\n", + "### Cognee 的運作方式\n", + "\n", + "Cognee 提供了一個超越簡單鍵值存儲的精密記憶體系統:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### 核心組成部分:\n", + "\n", + "1. **知識圖譜**:存儲實體、關係和語義連結\n", + "2. **向量嵌入**:實現對所有存儲資訊的語義搜索\n", + "3. **會話快取**:在會話內部及跨會話之間維持對話上下文\n", + "4. **節點集 (NodeSets)**:將數據組織成邏輯分類以便於目標檢索\n", + "\n", + "### 本教程中的記憶體類型:\n", + "\n", + "- **持久記憶體**:知識圖譜中的長期存儲\n", + "- **會話記憶體**:Redis 快取中的臨時對話上下文\n", + "- **語義記憶體**:基於向量的相似性搜索,涵蓋所有數據\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 安裝所需套件\n", + "\n", + "安裝 Cognee,並支援 Redis 用於會話管理:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 初始化環境並載入函式庫\n", + "\n", + "請確保:\n", + "1. Redis 已啟動(例如,透過 Docker:`docker run -d -p 6379:6379 redis`)\n", + "2. 在匯入快取模組之前已設定環境變數\n", + "3. 如有需要,重新啟動內核並按順序執行程式碼區塊\n", + "\n", + "以下的程式碼區塊將會:\n", + "1. 從 `.env` 載入環境變數\n", + "2. 使用您的 LLM 設定來配置 Cognee\n", + "3. 啟用快取以進行會話管理\n", + "4. 驗證所有元件是否正確連接\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 設定存儲目錄\n", + "\n", + "Cognee 使用兩個獨立的目錄進行操作:\n", + "- **資料根目錄**:存放已匯入的文件和處理後的數據\n", + "- **系統根目錄**:包含知識圖譜數據庫和系統元數據\n", + "\n", + "在本教程中,我們將建立獨立的目錄,如下所示:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 重置記憶狀態\n", + "\n", + "在我們開始建立記憶系統之前,先確保我們從頭開始。\n", + "\n", + "> 💡 **提示**:如果您希望在之後使用此筆記本時保留之前執行的現有記憶,可以跳過此步驟。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 第 1 部分:建立知識庫\n", + "\n", + "### 我們的開發者助手的數據來源\n", + "\n", + "我們將匯入三種類型的數據來建立一個全面的知識庫:\n", + "\n", + "1. **開發者檔案**:個人的專業知識與技術背景 \n", + "2. **Python 最佳實踐**:Python 之禪及實用指導方針 \n", + "3. **歷史對話**:開發者與 AI 助手之間的過去問答記錄 \n", + "\n", + "這些多樣化的數據能讓我們的代理: \n", + "- 理解使用者的技術背景 \n", + "- 在建議中應用最佳實踐 \n", + "- 從過去成功的互動中學習 \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 將資料轉換為知識圖譜\n", + "\n", + "現在我們將把原始文本轉換為結構化的記憶。此過程:\n", + "\n", + "1. **將資料添加到 NodeSets**:將資訊組織到邏輯分類中\n", + " - `developer_data`:開發者檔案和對話\n", + " - `principles_data`:Python 的最佳實踐和指導方針\n", + "\n", + "2. **執行 Cognify Pipeline**:提取實體、關係並建立嵌入\n", + " - 識別關鍵概念\n", + " - 在相關資訊之間建立語義連結\n", + " - 生成向量嵌入\n", + "\n", + "這可能需要一些時間,因為 LLM 正在處理文本並構建圖譜結構:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 視覺化知識圖譜\n", + "\n", + "讓我們來探索知識圖譜的結構。該視覺化圖表顯示:\n", + "- **節點**:從文本中提取的實體(概念、技術、人員)\n", + "- **邊**:實體之間的關係和連結\n", + "- **群集**:根據語義相似性分組的相關概念\n", + "\n", + "在瀏覽器中打開生成的 HTML 文件,以互動方式探索圖譜:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 使用 Memify 豐富記憶\n", + "\n", + "`memify()` 函數會分析知識圖譜並生成有關數據的智能規則。此過程:\n", + "- 識別模式和最佳實踐\n", + "- 根據內容創建可操作的指導方針\n", + "- 建立不同知識領域之間的關係\n", + "\n", + "這些規則幫助代理在回答問題時做出更明智的決策。捕捉第二次視覺化可以幫助您比較圖譜在豐富後如何變得更加密集。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 第二部分:智能記憶檢索\n", + "\n", + "### 示範 1:跨文件知識整合\n", + "\n", + "現在我們的知識圖譜已經建立完成,讓我們測試 Cognee 如何結合多個來源的信息來回答複雜問題。\n", + "\n", + "第一個查詢展示了:\n", + "- **語義理解**:即使未明確提及,也能找到相關概念\n", + "- **交叉引用**:結合開發者檔案與 Python 原則\n", + "- **情境推理**:將最佳實踐應用於特定實現\n", + "\n", + "### 示範 2:使用 NodeSets 的篩選搜尋\n", + "\n", + "第二個查詢展示如何針對知識圖譜的特定子集進行搜尋:\n", + "- 使用 `node_name` 參數僅在 `principles_data` 中搜尋\n", + "- 從特定知識領域提供專注的答案\n", + "- 當需要領域特定的信息時非常有用\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 第三部分:會話管理設置\n", + "\n", + "### 啟用對話記憶\n", + "\n", + "會話管理對於在多次互動中保持上下文至關重要。在這裡我們將:\n", + "\n", + "1. **初始化用戶上下文**:創建或檢索用戶檔案以進行會話追蹤 \n", + "2. **配置快取引擎**:連接到 Redis 以存儲對話歷史記錄 \n", + "3. **啟用會話變數**:設置在查詢間持續存在的上下文變數 \n", + "\n", + "> ⚠️ **重要**:這需要 Redis 正在運行,並且環境中設置了 `CACHING=true`\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ 輔助函式:查看會話歷史記錄\n", + "\n", + "此工具函式可讓我們檢視儲存在 Redis 中的會話歷史記錄。它的用途包括:\n", + "- 偵錯會話管理\n", + "- 驗證會話是否已被快取\n", + "- 瞭解代理可用的上下文\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## 第一節:非同步支援實驗室 — 第一個問題\n", + "\n", + "開始 `async-support-lab` 會話,詢問適合大量網頁爬取的具備遙測友好的 asyncio 模式。系統已經了解 asyncio、aiohttp 和監控實踐,因此回覆應反映之前的對話內容,同時針對新問題進行調整。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## 檢查第一次互動後的 Session 1 記憶體\n", + "\n", + "在初始問題之後立即執行 `show_history(session_1)`,可以確認 Cognee 已將提示和完成內容寫入 Redis。您應該會看到一個包含並發指導的條目。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## 第 1 節:資料模型的後續討論\n", + "\n", + "接下來我們問:「什麼時候應該選擇 dataclasses 而不是 Pydantic?」使用相同的會話 ID。Cognee 應該結合 Python 的原則以及之前關於 FastAPI 的討論,提供細緻的建議——展示出在命名會話中,背景資訊是可以延續的。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## 確認 Session 1 的歷史包含兩次對話\n", + "\n", + "再次呼叫 `show_history(session_1)` 應顯示兩個問答項目。這符合 Mem0 實驗室的「記憶重播」步驟,並證明額外的對話會延續相同的記錄。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## 第 2 節:設計審查討論串 — 新的會話\n", + "\n", + "為了展示討論串之間的隔離,我們啟動了 `design-review-session`,並請求針對事件審查提供記錄指導。即使底層的知識庫相同,新的會話 ID 仍能保持記錄分開。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## 檢視會議 2 歷史記錄\n", + "\n", + "`show_history(session_2)` 應該只列出設計檢視的提示/回應對。將其與會議 1 進行比較,以突顯 Cognee 如何在重複使用共享知識圖的同時,保持獨立的會議記錄。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## 摘要\n", + "\n", + "恭喜你!你剛剛為你的程式助理添加了一個由 Cognee 驅動的真正長期記憶層。\n", + "\n", + "在這個教學中,你將原始的開發者內容(程式碼、文件、聊天)轉化為一個圖形 + 向量記憶,讓你的代理可以進行搜尋、推理,並持續改進。\n", + "\n", + "你學到了什麼\n", + "\n", + "1. **從原始文本到 AI 記憶**:了解 Cognee 如何處理非結構化數據,並使用結合向量 + 知識圖譜的架構將其轉化為智能、可搜尋的記憶。\n", + "\n", + "2. **使用 memify 豐富圖譜**:學會如何超越基本的圖譜建立,利用 memify 在現有圖譜上添加衍生事實和更豐富的關係。\n", + "\n", + "3. **多種搜尋策略**:學習如何根據代理的需求,使用不同的搜尋類型(圖譜感知的問答、RAG 風格的補全、洞察、原始片段、程式碼搜尋等)來查詢記憶。\n", + "\n", + "4. **視覺化探索**:學會如何使用圖形視覺化和 Cognee UI 檢查和調試 Cognee 所建立的內容,讓你能夠實際看到知識的結構。\n", + "\n", + "5. **會話感知記憶**:了解如何結合每次會話的上下文與持久的語義記憶,讓代理能夠在多次運行中記住內容,同時避免用戶之間的信息洩漏。\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## 關鍵重點\n", + "1. 作為嵌入支持的知識圖譜的記憶\n", + "\n", + " - **結構化理解**:Cognee 結合了向量存儲和圖形存儲,因此您的數據既可以通過語意進行搜索,也可以通過關係進行連接。Cognee 預設使用基於文件的數據庫(LanceDB 用於向量存儲,Kuzu 用於圖形數據庫)。\n", + "\n", + " - **關係感知檢索**:答案不僅可以基於「相似文本」,還可以基於實體之間的關係。\n", + "\n", + " - **活的記憶**:記憶層會隨著時間演變、成長,並作為一個連接的圖譜保持可查詢。\n", + "\n", + "2. 搜索與推理模式\n", + " - **混合檢索**:搜索結合了向量相似性、圖形結構和 LLM 推理,從原始片段查詢到圖形感知的問題回答。\n", + "\n", + " - **根據需求選擇模式**:當您需要自然語言答案時,使用補全模式;當您的代理需要原始上下文或進行自身推理時,使用片段/摘要/圖形模式。\n", + "\n", + "3. 個性化、會話感知的代理\n", + " - **會話上下文 + 長期記憶**:Cognee 將短期「線索」上下文與長期的用戶或組織層級記憶分開。\n", + "\n", + "## 真實世界應用\n", + "\n", + "1. **垂直 AI 代理**\n", + "\n", + " 使用此筆記本中的模式,為基於 Cognee 的檢索和推理核心的領域智能助手提供支持:\n", + "\n", + "- **開發者助手**:代碼審查、事件分析和架構助手,將代碼、API、設計文檔和工單作為單一記憶圖譜進行遍歷。\n", + "\n", + "- **面向客戶的助手**:支持或成功代理,通過圖形感知檢索和引用答案,從產品文檔、常見問題解答、CRM 記錄和過去的工單中提取信息。\n", + "\n", + "- **內部專家助手**:政策、法律或安全助手,基於相互關聯的規則、指南和歷史決策進行推理,而不是孤立的 PDF。\n", + "\n", + " Cognee 明確定位為 AI 代理的持久、準確記憶,提供一個活的知識圖譜,作為代理的後端,取代臨時組合的向量存儲和自定義圖形代碼。\n", + "\n", + "2. **將數據孤島統一為一個記憶體系**\n", + "\n", + " 同樣的方法也可以幫助您在分散的來源之間構建統一的記憶層:\n", + "\n", + "- **從孤島到一個圖譜**:將結構化(例如數據庫)和非結構化數據(例如文檔、聊天記錄)導入到一個由嵌入支持的單一圖譜中,而不是為每個系統建立單獨的索引。\n", + "\n", + "- **帶有引用的跨來源推理**:在所有數據上運行多步推理——通過圖譜「連接」日誌、指標和文檔——並仍然返回具有來源依據的答案。\n", + "\n", + "- **知識中心**:對於像銀行或教育這樣的領域,Cognee 已經被用來將 PDF、內部系統和應用數據統一到一個帶有向量的知識圖譜中,讓代理能夠以精確且有引用的上下文回答問題。\n", + "\n", + "## 下一步\n", + "\n", + "您已經實現了核心記憶循環。以下是您可以自行嘗試的自然擴展(詳情請參閱 [Cognee 文件](https://docs.cognee.ai/)):\n", + "\n", + "1. **嘗試時間感知功能**:啟用時間感知功能,從文本中提取事件和時間戳。\n", + "\n", + "2. **引入本體驅動的推理**:為您的領域定義一個 OWL 本體。使用 Cognee 的本體支持,讓提取的實體和關係基於該架構,提升圖譜質量和領域特定的答案。\n", + "\n", + "3. **添加反饋循環**:讓 Cognee 根據真實用戶反饋調整圖譜邊權重,使檢索隨時間改進,而不是保持靜態。\n", + "\n", + "4. **針對個性化和會話行為進行調整**:使用用戶 ID、租戶和數據集,為每個人或團隊提供他們自己的共享記憶引擎視圖。\n", + "\n", + "5. **擴展到更複雜的代理**:將 Cognee 插入代理框架,構建共享相同記憶層的多代理系統。*Microsoft Agent Framework x Cognee 插件即將推出。*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**免責聲明**: \n本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們致力於提供準確的翻譯,請注意自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:31:24+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "tw" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/tw/13-agent-memory/README.md b/translations/tw/13-agent-memory/README.md index f9545180a..e0c773c71 100644 --- a/translations/tw/13-agent-memory/README.md +++ b/translations/tw/13-agent-memory/README.md @@ -1,8 +1,8 @@ **免責聲明**: -本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。 \ No newline at end of file +本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原文文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對於因使用本翻譯而產生的任何誤解或誤釋不承擔責任。 + \ No newline at end of file diff --git a/translations/uk/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/uk/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..d983350e6 --- /dev/null +++ b/translations/uk/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Створення AI-агентів із постійною пам'яттю за допомогою Cognee\n", + "\n", + "Цей ноутбук демонструє, як створювати інтелектуальних AI-агентів із розвиненими можливостями пам'яті, використовуючи [**cognee**](https://www.cognee.ai/) - відкриту платформу AI-пам'яті, яка поєднує графи знань, семантичний пошук і управління сесіями для створення контекстно-орієнтованих AI-систем.\n", + "\n", + "## 🎯 Навчальні цілі\n", + "\n", + "До кінця цього уроку ви навчитеся:\n", + "- **Створювати графи знань на основі ембеддінгів**: Перетворювати неструктурований текст у структуровані, доступні для запитів знання\n", + "- **Реалізовувати пам'ять сесій**: Створювати багатокрокові розмови з автоматичним збереженням контексту\n", + "- **Зберігати розмови**: За потреби зберігати важливі взаємодії в довгостроковій пам'яті для майбутнього використання\n", + "- **Запитувати за допомогою природної мови**: Доступ до історичного контексту та його використання в нових розмовах\n", + "- **Візуалізувати пам'ять**: Досліджувати взаємозв'язки у графі знань вашого агента\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Що Ви Побудуєте\n", + "\n", + "У цьому навчальному посібнику ми створимо **Помічника для Кодування** з постійною пам'яттю, який:\n", + "\n", + "### 1. **Створення бази знань**\n", + " - Збирає інформацію про профіль розробника та його експертизу\n", + " - Обробляє принципи програмування на Python та найкращі практики\n", + " - Зберігає історичні розмови між розробниками та AI-помічниками\n", + "\n", + "### 2. **Розмови з урахуванням сесії**\n", + " - Підтримує контекст у межах кількох запитань в одній сесії\n", + " - Автоматично кешує кожну пару запитання/відповідь для ефективного пошуку\n", + " - Надає узгоджені, контекстуальні відповіді на основі історії розмов\n", + "\n", + "### 3. **Довготривала пам'ять**\n", + " - Зберігає важливі розмови у довготривалу пам'ять\n", + " - Витягує релевантні спогади з бази знань та минулих сесій для інформування нових взаємодій\n", + " - Створює зростаючу базу знань, яка покращується з часом\n", + "\n", + "### 4. **Інтелектуальне витягування пам'яті**\n", + " - Використовує семантичний пошук, орієнтований на графи, для знаходження релевантної інформації у всій збереженій базі знань\n", + " - Фільтрує пошук за підгрупами даних (інформація про розробника vs. принципи)\n", + " - Поєднує кілька джерел даних для надання всебічних відповідей\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Передумови та налаштування\n", + "\n", + "### Системні вимоги\n", + "\n", + "Перед початком переконайтеся, що у вас є:\n", + "\n", + "1. **Середовище Python**\n", + " - Python 3.9 або новіше\n", + " - Віртуальне середовище (рекомендується)\n", + " \n", + "2. **Кеш Redis** (Необхідний для управління сесіями)\n", + " - Локальний Redis: `docker run -d -p 6379:6379 redis`\n", + " - Або скористайтеся керованим сервісом Redis\n", + " \n", + "3. **Доступ до API LLM**\n", + " - Ключ API OpenAI або інших провайдерів (див. [документацію](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Конфігурація бази даних**\n", + " - За замовчуванням конфігурація не потрібна. Cognee використовує файлові бази даних (LanceDB та Kuzu)\n", + " - За бажанням ви можете налаштувати Azure AI Search як векторне сховище (див. [документацію](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Конфігурація середовища\n", + "\n", + "Створіть файл `.env` у каталозі вашого проєкту з наступними змінними:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Розуміння архітектури пам'яті Cognee\n", + "\n", + "### Як працює Cognee\n", + "\n", + "Cognee забезпечує складну систему пам'яті, яка виходить за межі простого зберігання ключ-значення:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Основні компоненти:\n", + "\n", + "1. **Граф знань**: Зберігає сутності, зв'язки та семантичні зв’язки\n", + "2. **Векторні вбудовування**: Дозволяють семантичний пошук по всій збереженій інформації\n", + "3. **Кеш сесії**: Підтримує контекст розмови в межах і між сесіями\n", + "4. **NodeSets**: Організовують дані в логічні категорії для цільового отримання\n", + "\n", + "### Типи пам'яті в цьому підручнику:\n", + "\n", + "- **Постійна пам'ять**: Довготривале зберігання в графі знань\n", + "- **Пам'ять сесії**: Тимчасовий контекст розмови в кеші Redis\n", + "- **Семантична пам'ять**: Пошук за схожістю на основі векторів по всіх даних\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Встановлення необхідних пакетів\n", + "\n", + "Встановіть Cognee з підтримкою Redis для управління сесіями:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Ініціалізація середовища та завантаження бібліотек\n", + "\n", + "Переконайтеся, що:\n", + "1. Redis запущений (наприклад, через Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Змінні середовища встановлені перед імпортом модулів кешування\n", + "3. Якщо потрібно, перезапустіть ядро та виконайте комірки по порядку\n", + "\n", + "Наступна комірка:\n", + "1. Завантажить змінні середовища з `.env`\n", + "2. Налаштує Cognee з вашими параметрами LLM\n", + "3. Увімкне кешування для управління сесіями\n", + "4. Перевірить, чи всі компоненти правильно підключені\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Налаштування каталогів зберігання\n", + "\n", + "Cognee використовує два окремі каталоги для своєї роботи:\n", + "- **Корінь даних**: Зберігає завантажені документи та оброблені дані\n", + "- **Корінь системи**: Містить базу даних графа знань і метадані системи\n", + "\n", + "Для цього уроку ми створимо ізольовані каталоги наступним чином:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Скидання стану пам'яті\n", + "\n", + "Перш ніж почати створювати нашу систему пам'яті, давайте переконаємося, що ми починаємо з чистого аркуша.\n", + "\n", + "> 💡 **Порада**: Ви можете пропустити цей крок, якщо хочете зберегти існуючі спогади з попередніх запусків, коли будете використовувати цей ноутбук пізніше.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Частина 1: Створення бази знань\n", + "\n", + "### Джерела даних для нашого помічника розробника\n", + "\n", + "Ми будемо використовувати три типи даних для створення всебічної бази знань:\n", + "\n", + "1. **Профіль розробника**: Особистий досвід і технічний бекграунд\n", + "2. **Найкращі практики Python**: Дзен Python із практичними рекомендаціями\n", + "3. **Історичні розмови**: Минулі сесії запитань і відповідей між розробниками та AI-помічниками\n", + "\n", + "Ці різноманітні дані дозволяють нашому агенту:\n", + "- Розуміти технічний контекст користувача\n", + "- Застосовувати найкращі практики у рекомендаціях\n", + "- Навчатися на основі попередніх успішних взаємодій\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Перетворення даних у граф знань\n", + "\n", + "Тепер ми перетворимо наш необроблений текст у структуровану пам'ять. Цей процес:\n", + "\n", + "1. **Додає дані до NodeSets**: Організовує інформацію в логічні категорії\n", + " - `developer_data`: Профіль розробника та розмови\n", + " - `principles_data`: Найкращі практики та рекомендації з Python\n", + "\n", + "2. **Запускає Cognify Pipeline**: Витягує сутності, зв'язки та створює векторні представлення\n", + " - Визначає ключові концепції\n", + " - Створює семантичні зв'язки між пов'язаною інформацією\n", + " - Генерує векторні представлення\n", + "\n", + "Це може зайняти кілька хвилин, поки LLM обробляє текст і будує структуру графа:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Візуалізація графа знань\n", + "\n", + "Давайте дослідимо структуру нашого графа знань. Візуалізація показує:\n", + "- **Вузли**: Сутності, витягнуті з тексту (концепції, технології, люди)\n", + "- **Ребра**: Взаємозв'язки та зв'язки між сутностями\n", + "- **Кластери**: Пов'язані концепції, згруповані за семантичною схожістю\n", + "\n", + "Відкрийте згенерований HTML-файл у вашому браузері, щоб інтерактивно дослідити граф:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Збагачення пам'яті за допомогою Memify\n", + "\n", + "Функція `memify()` аналізує граф знань і генерує інтелектуальні правила щодо даних. Цей процес:\n", + "- Визначає шаблони та найкращі практики\n", + "- Створює практичні рекомендації на основі змісту\n", + "- Встановлює зв'язки між різними областями знань\n", + "\n", + "Ці правила допомагають агенту приймати більш обґрунтовані рішення при відповіді на запитання. Захоплення другої візуалізації дозволяє порівняти, як граф стає щільнішим після збагачення.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Частина 2: Інтелектуальне отримання пам'яті\n", + "\n", + "### Демонстрація 1: Інтеграція знань з різних документів\n", + "\n", + "Тепер, коли наш граф знань побудований, давайте перевіримо, як Cognee об'єднує інформацію з кількох джерел для відповіді на складні запитання.\n", + "\n", + "Перше запитання демонструє:\n", + "- **Семантичне розуміння**: Знаходження відповідних концепцій, навіть якщо вони явно не згадані\n", + "- **Перехресне посилання**: Поєднання профілю розробника з принципами Python\n", + "- **Контекстуальне мислення**: Застосування найкращих практик до конкретних реалізацій\n", + "\n", + "### Демонстрація 2: Фільтрований пошук із NodeSets\n", + "\n", + "Друге запитання показує, як орієнтуватися на конкретні підмножини графа знань:\n", + "- Використовує параметр `node_name` для пошуку лише в межах `principles_data`\n", + "- Надає зосереджені відповіді з певної області знань\n", + "- Корисно, коли потрібна інформація з конкретної доменної області\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Частина 3: Налаштування управління сесіями\n", + "\n", + "### Увімкнення пам'яті розмов\n", + "\n", + "Управління сесіями є важливим для збереження контексту під час кількох взаємодій. Тут ми:\n", + "\n", + "1. **Ініціалізуємо контекст користувача**: Створюємо або отримуємо профіль користувача для відстеження сесії\n", + "2. **Налаштовуємо кеш-двигун**: Підключаємося до Redis для збереження історії розмов\n", + "3. **Увімкнемо змінні сесії**: Налаштовуємо змінні контексту, які зберігаються між запитами\n", + "\n", + "> ⚠️ **Важливо**: Для цього необхідно, щоб Redis працював, а в середовищі було встановлено `CACHING=true`\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Допоміжна функція: Перегляд історії сесій\n", + "\n", + "Ця утиліта дозволяє нам переглядати історію розмов, збережену в Redis. Це корисно для:\n", + "- Налагодження управління сесіями\n", + "- Перевірки, чи розмови кешуються\n", + "- Розуміння, який контекст доступний агенту\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Сесія 1: Лабораторія підтримки асинхронності — Перше питання\n", + "\n", + "Розпочніть сесію `async-support-lab`, запитавши про дружні до телеметрії шаблони asyncio для масштабного веб-скрейпера. Граф уже знайомий з asyncio, aiohttp і практиками моніторингу, тому відповідь має відображати попередні розмови, адаптуючи її до нового запиту.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Перевірка пам'яті сесії 1 після першого обміну\n", + "\n", + "Запуск `show_history(session_1)` одразу після початкового запитання підтверджує, що Cognee записав як запит, так і відповідь у Redis. Ви повинні побачити один запис із рекомендацією щодо паралельності.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Сесія 1: Продовження обговорення моделей даних\n", + "\n", + "Далі ми запитуємо: \"Коли слід обирати dataclasses, а коли Pydantic?\" використовуючи той самий ідентифікатор сесії. Cognee має об'єднати принципи Python разом із попередніми розмовами про FastAPI, щоб надати детальну пораду — демонструючи, що контекст зберігається в межах названої сесії.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Підтвердження, що історія сесії 1 містить обидва оберти\n", + "\n", + "Ще один виклик `show_history(session_1)` має показати два записи запитань і відповідей. Це відповідає кроку \"відтворення пам'яті\" в лабораторії Mem0 і доводить, що додаткові оберти продовжують той самий транскрипт.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Сесія 2: Обговорення дизайну — Нова сесія\n", + "\n", + "Щоб продемонструвати ізоляцію між потоками, ми запускаємо `design-review-session` і запитуємо рекомендації щодо ведення журналу для аналізу інцидентів. Хоча база знань залишається тією ж, новий ідентифікатор сесії зберігає стенограми окремо.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Огляд Сесії 2 Історія\n", + "\n", + "`show_history(session_2)` має відображати лише пару запит/відповідь для огляду дизайну. Порівняйте це з Сесією 1, щоб підкреслити, як Cognee зберігає незалежні стенограми, одночасно використовуючи спільний граф знань.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Резюме\n", + "\n", + "Вітаємо! Ви щойно надали своєму асистенту з програмування справжній шар довготривалої пам’яті, що працює на базі Cognee.\n", + "\n", + "У цьому посібнику ви взяли сирий контент для розробників (код, документацію, чати) і перетворили його на граф + векторну пам’ять, яку ваш агент може шукати, аналізувати та постійно вдосконалювати.\n", + "\n", + "Що ви дізналися\n", + "\n", + "1. **Від сирого тексту до пам’яті ШІ**: Як Cognee обробляє неструктуровані дані та перетворює їх на інтелектуальну, доступну для пошуку пам’ять, використовуючи комбіновану архітектуру векторів + графа знань.\n", + "\n", + "2. **Збагачення графа за допомогою memify**: Як вийти за межі базового створення графа та використовувати memify для додавання похідних фактів і багатших зв’язків до вашого існуючого графа.\n", + "\n", + "3. **Різні стратегії пошуку**: Як здійснювати запити до пам’яті за допомогою різних типів пошуку (питання-відповідь з урахуванням графа, завершення в стилі RAG, інсайти, сирі фрагменти, пошук коду тощо) залежно від потреб вашого агента.\n", + "\n", + "4. **Візуальне дослідження**: Як перевіряти та налагоджувати те, що створив Cognee, за допомогою візуалізацій графа та інтерфейсу Cognee, щоб ви могли побачити, як структурована інформація.\n", + "\n", + "5. **Пам’ять, що враховує сесії**: Як поєднувати контекст кожної сесії з постійною семантичною пам’яттю, щоб агенти могли запам’ятовувати між сеансами без витоку інформації між користувачами.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Основні висновки\n", + "1. Пам'ять як граф знань, підкріплений вбудовуваннями\n", + "\n", + " - **Структуроване розуміння**: Cognee поєднує векторне сховище та графове сховище, щоб ваші дані були як пошуковими за змістом, так і пов'язаними через відносини. За замовчуванням Cognee використовує файлові бази даних (LanceDB для векторів, Kuzu для графової бази даних).\n", + "\n", + " - **Пошук з урахуванням відносин**: Відповіді можуть базуватися не лише на \"схожому тексті\", але й на тому, як пов'язані сутності.\n", + "\n", + " - **Жива пам'ять**: Шар пам'яті розвивається, зростає і залишається доступним для запитів як єдиний пов'язаний граф. \n", + "\n", + "2. Режими пошуку та міркування\n", + " - **Гібридний пошук**: пошук поєднує векторну схожість, структуру графа та міркування LLM, від пошуку сирих фрагментів до відповіді на запитання з урахуванням графа.\n", + "\n", + " - **Підбір режиму до завдання**: Використовуйте режими у стилі завершення, коли потрібні відповіді природною мовою, і режими фрагментів/резюме/графів, коли ваш агент потребує сирого контексту або для власного міркування.\n", + "\n", + "3. Персоналізовані агенти, що враховують сесії\n", + " - **Контекст сесії + довготривала пам'ять**: Cognee зберігає короткостроковий контекст \"нитки\" окремо від довготривалої пам'яті на рівні користувача або організації. \n", + "\n", + "## Реальні застосування\n", + "\n", + "1. **Вертикальні AI-агенти**\n", + "\n", + " Використовуйте цей шаблон для створення розумних доменних копілотів, які працюють на основі Cognee як ядра для пошуку та міркувань:\n", + "\n", + "- **Копілоти для розробників**: Асистенти для огляду коду, аналізу інцидентів та архітектури, які переглядають код, API, проектну документацію та тікети як єдиний граф пам'яті.\n", + "\n", + "- **Копілоти для клієнтів**: Агенти підтримки або успіху, які отримують інформацію з документації продукту, FAQ, нотаток CRM та минулих тікетів з урахуванням графа та з цитованими відповідями.\n", + "\n", + "- **Внутрішні експертні копілоти**: Асистенти з політики, права або безпеки, які міркують на основі взаємопов'язаних правил, керівництв та історичних рішень, а не ізольованих PDF.\n", + "\n", + " Cognee чітко позиціонується як постійна, точна пам'ять для AI-агентів, забезпечуючи живий граф знань, який інтегрується за вашим агентом і замінює випадкові комбінації векторних сховищ та кастомного графового коду. \n", + "\n", + "2. **Об'єднання даних з різних джерел в одну пам'ять**\n", + "\n", + " Такий самий підхід допомагає створити єдиний шар пам'яті з розрізнених джерел:\n", + "\n", + "- **Від ізольованих даних до одного графа**: Завантажуйте структуровані (наприклад, бази даних) та неструктуровані дані (наприклад, документи, чати) в єдиний граф, підкріплений вбудовуваннями, замість окремих індексів для кожної системи.\n", + "\n", + "- **Міркування між джерелами з цитатами**: Виконуйте багатокрокові міркування над усім — \"об'єднуйте\" журнали, метрики та документи через граф — і все одно повертайте обґрунтовані відповіді з посиланнями на джерела.\n", + "\n", + "- **Центри знань**: Для таких сфер, як банківська справа або освіта, Cognee вже використовується для об'єднання PDF, внутрішніх систем та даних додатків в один граф знань з векторами, щоб агенти могли відповідати на запитання з точним, цитованим контекстом. \n", + "\n", + "## Наступні кроки\n", + "\n", + "Ви реалізували основний цикл пам'яті. Ось природні розширення, які ви можете спробувати самостійно (див. [документацію Cognee](https://docs.cognee.ai/) для деталей):\n", + "\n", + "1. **Експериментуйте з часовою обізнаністю**: Увімкніть temporal cognify, щоб витягувати події та часові мітки з тексту.\n", + "\n", + "2. **Впровадьте міркування на основі онтології**: Визначте OWL-онтологію для вашої сфери. Використовуйте підтримку онтологій Cognee, щоб витягнуті сутності та відносини були прив'язані до цієї схеми, покращуючи якість графа та відповіді, специфічні для домену.\n", + "\n", + "3. **Додайте зворотний зв'язок**: Дозвольте Cognee коригувати ваги ребер графа на основі реального зворотного зв'язку від користувачів, щоб пошук покращувався з часом, а не залишався статичним.\n", + "\n", + "4. **Налаштуйте для персоналізації та поведінки сесій**: Використовуйте ідентифікатори користувачів, орендарів та набори даних, щоб надати кожній людині або команді власний вигляд на спільний механізм пам'яті.\n", + "\n", + "5. **Масштабуйте для складніших агентів**: Інтегруйте Cognee у фреймворки агентів, щоб створювати багатокомпонентні системи, які всі використовують один і той самий шар пам'яті. *Плагін Microsoft Agent Framework x Cognee скоро з'явиться.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Відмова від відповідальності**: \nЦей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, звертаємо вашу увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:44:30+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "uk" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/uk/13-agent-memory/README.md b/translations/uk/13-agent-memory/README.md index a2661b408..957dd3d52 100644 --- a/translations/uk/13-agent-memory/README.md +++ b/translations/uk/13-agent-memory/README.md @@ -1,52 +1,60 @@ -# Пам'ять для AI агентів +# Пам'ять для AI-агентів [![Пам'ять агента](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.uk.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -Коли йдеться про унікальні переваги створення AI агентів, зазвичай обговорюють дві основні речі: здатність викликати інструменти для виконання завдань і здатність покращуватися з часом. Пам'ять є основою створення самовдосконалюваних агентів, які можуть забезпечувати кращий досвід для наших користувачів. +Коли ми говоримо про унікальні переваги створення AI-агентів, зазвичай обговорюються дві речі: здатність викликати інструменти для виконання завдань і здатність покращуватися з часом. Пам'ять є основою для створення самовдосконалюваних агентів, які можуть забезпечити кращий досвід для наших користувачів. -У цьому уроці ми розглянемо, що таке пам'ять для AI агентів, як її можна управляти та використовувати для покращення наших додатків. +У цьому уроці ми розглянемо, що таке пам'ять для AI-агентів, як її можна керувати та використовувати для покращення наших застосунків. ## Вступ Цей урок охоплює: -• **Розуміння пам'яті AI агентів**: Що таке пам'ять і чому вона важлива для агентів. +• **Розуміння пам'яті AI-агентів**: Що таке пам'ять і чому вона важлива для агентів. -• **Реалізація та зберігання пам'яті**: Практичні методи додавання функцій пам'яті до ваших AI агентів, з акцентом на короткострокову та довгострокову пам'ять. +• **Реалізація та зберігання пам'яті**: Практичні методи додавання можливостей пам'яті до ваших AI-агентів, зосереджуючись на короткостроковій та довгостроковій пам'яті. -• **Створення самовдосконалюваних AI агентів**: Як пам'ять дозволяє агентам навчатися на основі минулих взаємодій і покращуватися з часом. +• **Створення самовдосконалюваних AI-агентів**: Як пам'ять дозволяє агентам навчатися на основі минулих взаємодій і покращуватися з часом. + +## Доступні реалізації + +Цей урок включає два детальні навчальні ноутбуки: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: Реалізує пам'ять за допомогою Mem0 та Azure AI Search із використанням Semantic Kernel. + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Реалізує структуровану пам'ять за допомогою Cognee, автоматично створюючи граф знань на основі ембедингів, візуалізуючи граф і забезпечуючи інтелектуальний пошук. ## Цілі навчання -Після завершення цього уроку ви зможете: +Після завершення цього уроку ви знатимете, як: -• **Розрізняти різні типи пам'яті AI агентів**, включаючи робочу, короткострокову та довгострокову пам'ять, а також спеціалізовані форми, такі як пам'ять персонажа та епізодична пам'ять. +• **Розрізняти різні типи пам'яті AI-агентів**, включаючи робочу, короткострокову, довгострокову пам'ять, а також спеціалізовані форми, такі як пам'ять персони та епізодична пам'ять. -• **Реалізовувати та управляти короткостроковою та довгостроковою пам'яттю для AI агентів** за допомогою фреймворку Semantic Kernel, використовуючи інструменти, такі як Mem0 і Whiteboard memory, та інтегруючи з Azure AI Search. +• **Реалізовувати та керувати короткостроковою та довгостроковою пам'яттю для AI-агентів** за допомогою Semantic Kernel, використовуючи інструменти, такі як Mem0, Cognee, Whiteboard memory, та інтегруючи з Azure AI Search. -• **Розуміти принципи створення самовдосконалюваних AI агентів** і як надійні системи управління пам'яттю сприяють безперервному навчанню та адаптації. +• **Розуміти принципи роботи самовдосконалюваних AI-агентів** і як надійні системи управління пам'яттю сприяють безперервному навчанню та адаптації. -## Розуміння пам'яті AI агентів +## Розуміння пам'яті AI-агентів -У своїй основі **пам'ять AI агентів стосується механізмів, які дозволяють їм зберігати та відтворювати інформацію**. Ця інформація може включати конкретні деталі розмови, уподобання користувача, минулі дії або навіть вивчені шаблони. +У своїй основі **пам'ять AI-агентів стосується механізмів, які дозволяють їм зберігати та відтворювати інформацію**. Ця інформація може включати конкретні деталі розмови, уподобання користувача, минулі дії або навіть вивчені шаблони. -Без пам'яті AI додатки часто є безстанними, тобто кожна взаємодія починається з нуля. Це призводить до повторюваного та розчаровуючого досвіду для користувача, коли агент "забуває" попередній контекст або уподобання. +Без пам'яті AI-застосунки часто є безстанними, тобто кожна взаємодія починається з нуля. Це призводить до повторюваного та розчаровуючого досвіду користувача, коли агент "забуває" попередній контекст або уподобання. ### Чому пам'ять важлива? -Інтелект агента тісно пов'язаний зі здатністю згадувати та використовувати минулу інформацію. Пам'ять дозволяє агентам бути: +Інтелект агента тісно пов'язаний із його здатністю згадувати та використовувати минулу інформацію. Пам'ять дозволяє агентам бути: • **Рефлексивними**: Навчатися на основі минулих дій і результатів. -• **Інтерактивними**: Зберігати контекст під час тривалої розмови. +• **Інтерактивними**: Підтримувати контекст упродовж поточної розмови. • **Проактивними та реактивними**: Передбачати потреби або відповідати відповідно до історичних даних. @@ -58,17 +66,17 @@ CO_OP_TRANSLATOR_METADATA: #### Робоча пам'ять -Уявіть це як аркуш паперу, який агент використовує під час виконання одного завдання або процесу мислення. Вона утримує актуальну інформацію, необхідну для виконання наступного кроку. +Уявіть це як аркуш паперу, який агент використовує під час виконання одного завдання або процесу мислення. Вона зберігає негайну інформацію, необхідну для виконання наступного кроку. -Для AI агентів робоча пам'ять часто захоплює найбільш релевантну інформацію з розмови, навіть якщо повна історія чату довга або скорочена. Вона зосереджується на ключових елементах, таких як вимоги, пропозиції, рішення та дії. +Для AI-агентів робоча пам'ять часто фіксує найбільш релевантну інформацію з розмови, навіть якщо вся історія чату є довгою або скороченою. Вона зосереджується на вилученні ключових елементів, таких як вимоги, пропозиції, рішення та дії. **Приклад робочої пам'яті** -У агента з бронювання подорожей робоча пам'ять може утримувати поточний запит користувача, наприклад: "Я хочу забронювати поїздку до Парижа". Ця конкретна вимога зберігається в контексті агента для керування поточною взаємодією. +У агента з бронювання подорожей робоча пам'ять може зберігати поточний запит користувача, наприклад: "Я хочу забронювати поїздку до Парижа". Ця конкретна вимога утримується в контексті агента для керування поточною взаємодією. #### Короткострокова пам'ять -Цей тип пам'яті утримує інформацію протягом однієї розмови або сеансу. Це контекст поточного чату, який дозволяє агенту посилатися на попередні репліки в діалозі. +Цей тип пам'яті зберігає інформацію протягом однієї розмови або сесії. Це контекст поточного чату, який дозволяє агенту посилатися на попередні репліки в діалозі. **Приклад короткострокової пам'яті** @@ -76,19 +84,19 @@ CO_OP_TRANSLATOR_METADATA: #### Довгострокова пам'ять -Це інформація, яка зберігається протягом кількох розмов або сеансів. Вона дозволяє агентам запам'ятовувати уподобання користувача, історичні взаємодії або загальні знання протягом тривалого часу. Це важливо для персоналізації. +Це інформація, яка зберігається протягом кількох розмов або сесій. Вона дозволяє агентам запам'ятовувати уподобання користувачів, історичні взаємодії або загальні знання протягом тривалого часу. Це важливо для персоналізації. **Приклад довгострокової пам'яті** -Довгострокова пам'ять може зберігати, що "Бен любить кататися на лижах і займатися активним відпочинком, любить каву з видом на гори і хоче уникати складних лижних трас через минулу травму". Ця інформація, отримана з попередніх взаємодій, впливає на рекомендації в майбутніх сеансах планування подорожей, роблячи їх максимально персоналізованими. +Довгострокова пам'ять може зберігати, що "Бен любить кататися на лижах і займатися активним відпочинком, любить каву з видом на гори і хоче уникати складних лижних трас через минулу травму". Ця інформація, отримана з попередніх взаємодій, впливає на рекомендації в майбутніх сесіях планування подорожей, роблячи їх дуже персоналізованими. -#### Пам'ять персонажа +#### Пам'ять персони -Цей спеціалізований тип пам'яті допомагає агенту розвивати послідовну "особистість" або "персону". Вона дозволяє агенту запам'ятовувати деталі про себе або свою призначену роль, роблячи взаємодії більш плавними та зосередженими. +Цей спеціалізований тип пам'яті допомагає агенту розвивати послідовну "особистість" або "персону". Вона дозволяє агенту запам'ятовувати деталі про себе або свою роль, роблячи взаємодії більш плавними та зосередженими. -**Приклад пам'яті персонажа** +**Приклад пам'яті персони** -Якщо агент з планування подорожей призначений бути "експертом з лижного планування", пам'ять персонажа може підкріплювати цю роль, впливаючи на його відповіді, щоб вони відповідали тону та знанням експерта. +Якщо агент з подорожей розроблений як "експерт з планування лижних поїздок", пам'ять персони може підкріплювати цю роль, впливаючи на його відповіді, щоб вони відповідали тону та знанням експерта. #### Пам'ять робочого процесу/епізодична пам'ять @@ -96,65 +104,77 @@ CO_OP_TRANSLATOR_METADATA: **Приклад епізодичної пам'яті** -Якщо агент намагався забронювати конкретний рейс, але це не вдалося через недоступність, епізодична пам'ять може записати цю невдачу, дозволяючи агенту спробувати альтернативні рейси або інформувати користувача про проблему більш обґрунтовано під час наступної спроби. +Якщо агент намагався забронювати конкретний рейс, але це не вдалося через відсутність місць, епізодична пам'ять може зафіксувати цю невдачу, дозволяючи агенту спробувати альтернативні рейси або інформувати користувача про проблему більш обґрунтовано під час наступної спроби. #### Пам'ять сутностей -Ця пам'ять включає вилучення та запам'ятовування конкретних сутностей (наприклад, людей, місць або речей) і подій з розмов. Вона дозволяє агенту створювати структуроване розуміння ключових елементів, які обговорюються. +Це включає вилучення та запам'ятовування конкретних сутностей (наприклад, людей, місць або речей) та подій із розмов. Це дозволяє агенту створювати структуроване розуміння ключових елементів, які обговорюються. **Приклад пам'яті сутностей** -З розмови про минулу подорож агент може вилучити "Париж", "Ейфелева вежа" і "вечеря в ресторані Le Chat Noir" як сутності. У майбутній взаємодії агент може згадати "Le Chat Noir" і запропонувати зробити нове бронювання там. +З розмови про минулу поїздку агент може вилучити "Париж", "Ейфелева вежа" та "вечеря в ресторані Le Chat Noir" як сутності. У майбутній взаємодії агент може згадати "Le Chat Noir" і запропонувати зробити нове бронювання там. #### Структурований RAG (Retrieval Augmented Generation) -Хоча RAG є ширшою технікою, "Структурований RAG" виділяється як потужна технологія пам'яті. Вона вилучає щільну, структуровану інформацію з різних джерел (розмов, електронних листів, зображень) і використовує її для підвищення точності, відтворення та швидкості відповідей. На відміну від класичного RAG, який покладається лише на семантичну схожість, Структурований RAG працює зі структурою інформації. +Хоча RAG є ширшою технікою, "структурований RAG" виділяється як потужна технологія пам'яті. Він вилучає щільну, структуровану інформацію з різних джерел (розмов, електронних листів, зображень) і використовує її для підвищення точності, відтворення та швидкості відповідей. На відміну від класичного RAG, який покладається лише на семантичну схожість, структурований RAG працює зі структурою інформації. **Приклад структурованого RAG** -Замість простого зіставлення ключових слів, Структурований RAG може аналізувати деталі рейсу (пункт призначення, дата, час, авіакомпанія) з електронного листа і зберігати їх у структурованому вигляді. Це дозволяє точні запити, такі як "Який рейс я забронював до Парижа у вівторок?" +Замість простого співставлення ключових слів, структурований RAG може аналізувати деталі рейсу (пункт призначення, дата, час, авіакомпанія) з електронного листа та зберігати їх у структурованому вигляді. Це дозволяє точні запити, наприклад: "Який рейс я забронював до Парижа у вівторок?" ## Реалізація та зберігання пам'яті -Реалізація пам'яті для AI агентів включає систематичний процес **управління пам'яттю**, який охоплює створення, зберігання, вилучення, інтеграцію, оновлення і навіть "забування" (або видалення) інформації. Вилучення є особливо важливим аспектом. +Реалізація пам'яті для AI-агентів включає систематичний процес **управління пам'яттю**, який включає створення, зберігання, отримання, інтеграцію, оновлення та навіть "забування" (або видалення) інформації. Отримання є особливо важливим аспектом. ### Спеціалізовані інструменти пам'яті -Один із способів зберігати та управляти пам'яттю агента — це використання спеціалізованих інструментів, таких як Mem0. Mem0 працює як постійний шар пам'яті, дозволяючи агентам згадувати релевантні взаємодії, зберігати уподобання користувача та фактичний контекст, а також навчатися на успіхах і невдачах з часом. Ідея полягає в тому, що безстанні агенти перетворюються на станні. +#### Mem0 + +Один із способів зберігати та керувати пам'яттю агента — це використання спеціалізованих інструментів, таких як Mem0. Mem0 працює як постійний шар пам'яті, дозволяючи агентам згадувати релевантні взаємодії, зберігати уподобання користувачів і фактичний контекст, а також навчатися на успіхах і невдачах з часом. Ідея полягає в тому, що безстанні агенти перетворюються на станні. + +Він працює через **двохетапний конвеєр пам'яті: вилучення та оновлення**. Спочатку повідомлення, додані до потоку агента, надсилаються до сервісу Mem0, який використовує велику мовну модель (LLM) для підсумовування історії розмови та вилучення нових спогадів. Потім етап оновлення, керований LLM, визначає, чи додавати, змінювати або видаляти ці спогади, зберігаючи їх у гібридному сховищі даних, яке може включати векторні, графові та ключ-значення бази даних. Ця система також підтримує різні типи пам'яті та може включати графову пам'ять для управління відносинами між сутностями. + +#### Cognee + +Ще один потужний підхід — використання **Cognee**, відкритого семантичного сховища пам'яті для AI-агентів, яке перетворює структуровані та неструктуровані дані в графи знань, що можна запитувати, підкріплені ембедингами. Cognee забезпечує **архітектуру подвійного сховища**, яка поєднує пошук за векторною схожістю з графовими відносинами, дозволяючи агентам розуміти не лише те, яка інформація схожа, але й як концепції пов'язані одна з одною. + +Він відзначається **гібридним пошуком**, який поєднує векторну схожість, структуру графа та логіку LLM — від пошуку сирих фрагментів до запитів, обізнаних про граф. Система підтримує **живу пам'ять**, яка розвивається та зростає, залишаючись доступною як один пов'язаний граф, підтримуючи як короткостроковий контекст сесії, так і довгострокову постійну пам'ять. -Він працює через **двофазний конвеєр пам'яті: вилучення та оновлення**. Спочатку повідомлення, додані до потоку агента, надсилаються до сервісу Mem0, який використовує велику мовну модель (LLM) для підсумовування історії розмови та вилучення нових спогадів. Потім етап оновлення, керований LLM, визначає, чи слід додати, змінити або видалити ці спогади, зберігаючи їх у гібридному сховищі даних, яке може включати векторні, графові та ключ-значення бази даних. Ця система також підтримує різні типи пам'яті і може включати графову пам'ять для управління відносинами між сутностями. +Навчальний ноутбук Cognee ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) демонструє створення цього уніфікованого шару пам'яті з практичними прикладами завантаження різноманітних джерел даних, візуалізації графа знань і запитів із різними стратегіями пошуку, адаптованими до конкретних потреб агента. ### Зберігання пам'яті за допомогою RAG -Окрім спеціалізованих інструментів пам'яті, таких як Mem0, ви можете використовувати потужні пошукові сервіси, такі як **Azure AI Search як бекенд для зберігання та вилучення спогадів**, особливо для структурованого RAG. +Окрім спеціалізованих інструментів пам'яті, таких як Mem0, ви можете використовувати надійні сервіси пошуку, такі як **Azure AI Search, як бекенд для зберігання та отримання спогадів**, особливо для структурованого RAG. -Це дозволяє вам базувати відповіді агента на ваших власних даних, забезпечуючи більш релевантні та точні відповіді. Azure AI Search можна використовувати для зберігання спогадів про подорожі користувача, каталогів продуктів або будь-яких інших знань, специфічних для домену. +Це дозволяє базувати відповіді вашого агента на ваших власних даних, забезпечуючи більш релевантні та точні відповіді. Azure AI Search можна використовувати для зберігання спогадів про подорожі користувачів, каталогів продуктів або будь-яких інших знань, специфічних для домену. -Azure AI Search підтримує функції, такі як **Структурований RAG**, який відмінно справляється з вилученням і вилученням щільної, структурованої інформації з великих наборів даних, таких як історії розмов, електронні листи або навіть зображення. Це забезпечує "надлюдську точність і відтворення" порівняно з традиційними підходами до розбиття тексту та вбудовування. +Azure AI Search підтримує можливості, такі як **структурований RAG**, який відзначається вилученням і отриманням щільної, структурованої інформації з великих наборів даних, таких як історії розмов, електронні листи або навіть зображення. Це забезпечує "надлюдську точність і відтворення" порівняно з традиційними підходами до розбиття тексту та ембедингів. -## Створення самовдосконалюваних AI агентів +## Створення самовдосконалюваних AI-агентів -Звичайний шаблон для самовдосконалюваних агентів передбачає введення **"агента знань"**. Цей окремий агент спостерігає за основною розмовою між користувачем і основним агентом. Його роль полягає в тому, щоб: +Загальний підхід до створення самовдосконалюваних агентів включає введення **"агента знань"**. Цей окремий агент спостерігає за основною розмовою між користувачем і основним агентом. Його роль полягає в тому, щоб: -1. **Визначати цінну інформацію**: Вирішувати, чи варто зберігати будь-яку частину розмови як загальні знання або конкретне уподобання користувача. +1. **Визначати цінну інформацію**: Вирішувати, чи варто зберігати якусь частину розмови як загальні знання або конкретні уподобання користувача. 2. **Вилучати та підсумовувати**: Виділяти основне навчання або уподобання з розмови. -3. **Зберігати в базі знань**: Зберігати вилучену інформацію, часто у векторній базі даних, щоб її можна було вилучити пізніше. +3. **Зберігати в базі знань**: Зберігати цю вилучену інформацію, часто у векторній базі даних, щоб її можна було отримати пізніше. -4. **Доповнювати майбутні запити**: Коли користувач ініціює новий запит, агент знань вилучає релевантну збережену інформацію і додає її до запиту користувача, забезпечуючи важливий контекст для основного агента (подібно до RAG). +4. **Доповнювати майбутні запити**: Коли користувач ініціює новий запит, агент знань отримує релевантну збережену інформацію та додає її до запиту користувача, забезпечуючи важливий контекст для основного агента (подібно до RAG). ### Оптимізації для пам'яті -• **Управління затримкою**: Щоб уникнути уповільнення взаємодії з користувачем, спочатку можна використовувати дешевшу, швидшу модель для швидкої перевірки, чи варто зберігати або вилучати інформацію, викликаючи більш складний процес вилучення/зберігання лише за необхідності. +• **Управління затримкою**: Щоб уникнути уповільнення взаємодії з користувачем, спочатку можна використовувати дешевшу, швидшу модель для швидкої перевірки, чи варто зберігати або отримувати інформацію, викликаючи більш складний процес вилучення/отримання лише за необхідності. -• **Обслуговування бази знань**: Для зростаючої бази знань менш часто використовувану інформацію можна перемістити до "холодного сховища" для управління витратами. +• **Обслуговування бази знань**: Для зростаючої бази знань менш часто використовувану інформацію можна перемістити в "холодне сховище" для управління витратами. -## Є ще питання про пам'ять агентів? +## Маєте більше запитань про пам'ять агентів? -Приєднуйтесь до [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord), щоб зустрітися з іншими учнями, відвідати години консультацій і отримати відповіді на ваші запитання про AI агентів. +Приєднуйтесь до [Azure AI Foundry Discord](https://aka.ms/ai-agents/discord), щоб поспілкуватися з іншими учнями, відвідати години консультацій і отримати відповіді на ваші запитання про AI-агентів. --- + **Відмова від відповідальності**: -Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ мовою оригіналу слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. \ No newline at end of file +Цей документ було перекладено за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, звертаємо вашу увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу. + \ No newline at end of file diff --git a/translations/ur/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/ur/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..4d0dd83d0 --- /dev/null +++ b/translations/ur/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,936 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# کوگنی کے ذریعے مستقل یادداشت کے ساتھ AI ایجنٹس بنانا\n", + "\n", + "یہ نوٹ بک دکھاتی ہے کہ کس طرح [**کوگنی**](https://www.cognee.ai/) کا استعمال کرتے ہوئے ذہین AI ایجنٹس بنائے جا سکتے ہیں - ایک اوپن سورس AI یادداشت جو علم کے گراف، سیمینٹک سرچ، اور سیشن مینجمنٹ کو یکجا کرتی ہے تاکہ سیاق و سباق سے آگاہ AI سسٹمز تخلیق کیے جا سکیں۔\n", + "\n", + "## 🎯 سیکھنے کے مقاصد\n", + "\n", + "اس ٹیوٹوریل کے اختتام تک، آپ سمجھ سکیں گے کہ:\n", + "- **ایمبیڈنگز کے ذریعے علم کے گراف بنانا**: غیر ساختہ متن کو ساختہ، قابل سوال علم میں تبدیل کریں\n", + "- **سیشن میموری نافذ کریں**: خودکار سیاق و سباق برقرار رکھنے کے ساتھ کثیر موڑ گفتگو تخلیق کریں\n", + "- **گفتگو کو محفوظ کریں**: اہم تعاملات کو طویل مدتی یادداشت میں اختیاری طور پر محفوظ کریں تاکہ مستقبل میں حوالہ دیا جا سکے\n", + "- **قدرتی زبان کے ذریعے سوال کریں**: نئی گفتگو میں تاریخی سیاق و سباق تک رسائی حاصل کریں اور اس کا فائدہ اٹھائیں\n", + "- **یادداشت کو بصری بنائیں**: اپنے ایجنٹ کے علم کے گراف میں تعلقات کو دریافت کریں\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ آپ کیا بنائیں گے\n", + "\n", + "اس سبق میں، ہم ایک **کوڈنگ اسسٹنٹ** بنائیں گے جو مستقل یادداشت کے ساتھ کام کرے گا:\n", + "\n", + "### 1. **علمی بنیاد کی تشکیل**\n", + " - ڈویلپر پروفائل اور مہارت کی معلومات کو شامل کرتا ہے\n", + " - Python پروگرامنگ کے اصولوں اور بہترین طریقوں کو پروسیس کرتا ہے\n", + " - ڈویلپرز اور AI اسسٹنٹس کے درمیان ہونے والی تاریخی گفتگو کو محفوظ کرتا ہے\n", + "\n", + "### 2. **سیشن سے آگاہ گفتگو**\n", + " - ایک ہی سیشن میں متعدد سوالات کے درمیان سیاق و سباق کو برقرار رکھتا ہے\n", + " - ہر سوال/جواب کے جوڑے کو خودکار طور پر کیش کرتا ہے تاکہ مؤثر بازیافت ممکن ہو\n", + " - گفتگو کی تاریخ کی بنیاد پر مربوط اور سیاقی جوابات فراہم کرتا ہے\n", + "\n", + "### 3. **طویل مدتی یادداشت**\n", + " - اہم گفتگو کو طویل مدتی یادداشت میں محفوظ کرتا ہے\n", + " - علمی بنیاد اور ماضی کے سیشنز سے متعلقہ یادداشتوں کو بازیافت کرتا ہے تاکہ نئی بات چیت کو بہتر بنایا جا سکے\n", + " - ایک بڑھتی ہوئی علمی بنیاد بناتا ہے جو وقت کے ساتھ بہتر ہوتی ہے\n", + "\n", + "### 4. **ذہین یادداشت کی بازیافت**\n", + " - گراف سے آگاہ معنوی تلاش کا استعمال کرتا ہے تاکہ تمام محفوظ شدہ علم میں سے متعلقہ معلومات تلاش کی جا سکیں\n", + " - تلاش کو ڈیٹا کے ذیلی گروپوں (ڈویلپر معلومات بمقابلہ اصول) کے ذریعے فلٹر کرتا ہے\n", + " - جامع جوابات فراہم کرنے کے لیے متعدد ڈیٹا ذرائع کو یکجا کرتا ہے\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 ضروریات اور سیٹ اپ\n", + "\n", + "### نظام کی ضروریات\n", + "\n", + "شروع کرنے سے پہلے، یقینی بنائیں کہ آپ کے پاس یہ موجود ہیں:\n", + "\n", + "1. **پائتھون ماحول**\n", + " - پائتھون 3.9 یا اس سے زیادہ\n", + " - ورچوئل ماحول (تجویز کردہ)\n", + "\n", + "2. **ریڈیس کیش** (سیشن مینجمنٹ کے لیے ضروری)\n", + " - لوکل ریڈیس: `docker run -d -p 6379:6379 redis`\n", + " - یا کسی منظم ریڈیس سروس کا استعمال کریں\n", + "\n", + "3. **ایل ایل ایم API تک رسائی**\n", + " - OpenAI API کلید یا دیگر فراہم کنندگان (مزید معلومات کے لیے [دستاویزات](https://docs.cognee.ai/setup-configuration/llm-providers) دیکھیں)\n", + "\n", + "4. **ڈیٹا بیس کی ترتیب**\n", + " - ڈیفالٹ کے طور پر کوئی ترتیب ضروری نہیں۔ Cognee فائل پر مبنی ڈیٹا بیسز (LanceDB اور Kuzu) استعمال کرتا ہے۔\n", + " - اختیاری طور پر، آپ Azure AI Search کو ایک ویکٹر اسٹور کے طور پر ترتیب دے سکتے ہیں (مزید معلومات کے لیے [دستاویزات](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch) دیکھیں)\n", + "\n", + "### ماحول کی ترتیب\n", + "\n", + "اپنے پروجیکٹ ڈائریکٹری میں ایک `.env` فائل بنائیں اور درج ذیل متغیرات شامل کریں:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ کوگنی کی میموری آرکیٹیکچر کو سمجھنا\n", + "\n", + "### کوگنی کیسے کام کرتا ہے\n", + "\n", + "کوگنی ایک جدید میموری سسٹم فراہم کرتا ہے جو سادہ کلید-قدر اسٹوریج سے آگے بڑھتا ہے:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### اہم اجزاء:\n", + "\n", + "1. **نالج گراف**: اداروں، تعلقات، اور معنوی روابط کو محفوظ کرتا ہے \n", + "2. **ویکٹر ایمبیڈنگز**: محفوظ شدہ تمام معلومات میں معنوی تلاش کو ممکن بناتا ہے \n", + "3. **سیشن کیش**: گفتگو کے سیاق و سباق کو سیشنز کے اندر اور ان کے درمیان برقرار رکھتا ہے \n", + "4. **نوڈ سیٹس**: ڈیٹا کو منطقی زمروں میں منظم کرتا ہے تاکہ ہدفی بازیافت ممکن ہو \n", + "\n", + "### اس ٹیوٹوریل میں میموری کی اقسام:\n", + "\n", + "- **مستقل میموری**: نالج گراف میں طویل مدتی اسٹوریج \n", + "- **سیشن میموری**: Redis کیش میں عارضی گفتگو کا سیاق و سباق \n", + "- **معنوی میموری**: تمام ڈیٹا میں ویکٹر پر مبنی مماثلت تلاش \n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 مطلوبہ پیکجز انسٹال کریں\n", + "\n", + "Redis سپورٹ کے ساتھ سیشن مینجمنٹ کے لیے Cognee انسٹال کریں:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 ماحول کو ترتیب دیں اور لائبریریاں لوڈ کریں\n", + "\n", + "یقینی بنائیں:\n", + "1. Redis چل رہا ہو (مثال کے طور پر، Docker کے ذریعے: `docker run -d -p 6379:6379 redis`)\n", + "2. ماحولیاتی متغیرات کو cache ماڈیولز درآمد کرنے سے پہلے ترتیب دیا گیا ہو\n", + "3. اگر ضرورت ہو، تو kernel کو دوبارہ شروع کریں اور سیلز کو ترتیب وار چلائیں\n", + "\n", + "مندرجہ ذیل سیل:\n", + "1. `.env` سے ماحولیاتی متغیرات لوڈ کرے گا\n", + "2. Cognee کو آپ کی LLM ترتیبات کے ساتھ ترتیب دے گا\n", + "3. سیشن مینجمنٹ کے لیے caching کو فعال کرے گا\n", + "4. تمام اجزاء کی درست کنکشن کی تصدیق کرے گا\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 اسٹوریج ڈائریکٹریز کو ترتیب دیں\n", + "\n", + "Cognee اپنی کارروائیوں کے لیے دو الگ الگ ڈائریکٹریز استعمال کرتا ہے:\n", + "- **ڈیٹا روٹ**: شامل کردہ دستاویزات اور پراسیس شدہ ڈیٹا کو محفوظ کرتا ہے\n", + "- **سسٹم روٹ**: نالج گراف ڈیٹا بیس اور سسٹم میٹا ڈیٹا پر مشتمل ہے\n", + "\n", + "ہم اس ٹیوٹوریل کے لیے الگ تھلگ ڈائریکٹریز اس طرح بنائیں گے:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 میموری کی حالت کو ری سیٹ کریں\n", + "\n", + "میموری سسٹم بنانے سے پہلے، یہ یقینی بنائیں کہ ہم نئے سرے سے شروع کر رہے ہیں۔\n", + "\n", + "> 💡 **ٹپ**: اگر آپ اس نوٹ بک کو بعد میں استعمال کرتے وقت اپنی پچھلی رنز کی موجودہ یادداشتوں کو محفوظ رکھنا چاہتے ہیں تو آپ اس مرحلے کو چھوڑ سکتے ہیں۔\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 حصہ 1: نالج بیس بنانا\n", + "\n", + "### ہمارے ڈیولپر اسسٹنٹ کے لیے ڈیٹا کے ذرائع\n", + "\n", + "ہم ایک جامع نالج بیس بنانے کے لیے تین قسم کے ڈیٹا شامل کریں گے:\n", + "\n", + "1. **ڈیولپر پروفائل**: ذاتی مہارت اور تکنیکی پس منظر \n", + "2. **پائتھون کے بہترین اصول**: پائتھون کے اصولوں کے ساتھ عملی رہنما خطوط \n", + "3. **تاریخی گفتگو**: ماضی کے سوال و جواب کے سیشنز جو ڈیولپرز اور AI اسسٹنٹس کے درمیان ہوئے \n", + "\n", + "یہ متنوع ڈیٹا ہمارے ایجنٹ کو یہ صلاحیت دیتا ہے کہ وہ: \n", + "- صارف کے تکنیکی سیاق و سباق کو سمجھے \n", + "- سفارشات میں بہترین اصولوں کا اطلاق کرے \n", + "- پچھلی کامیاب بات چیت سے سیکھے \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 ڈیٹا کو نالج گراف میں تبدیل کریں\n", + "\n", + "اب ہم اپنے خام متن کو ایک منظم یادداشت میں تبدیل کریں گے۔ یہ عمل:\n", + "\n", + "1. **ڈیٹا کو NodeSets میں شامل کرتا ہے**: معلومات کو منطقی زمروں میں ترتیب دیتا ہے\n", + " - `developer_data`: ڈویلپر پروفائل اور گفتگو\n", + " - `principles_data`: پائتھون کے بہترین اصول اور رہنما خطوط\n", + "\n", + "2. **Cognify Pipeline چلاتا ہے**: ادارے، تعلقات نکالتا ہے، اور ایمبیڈنگز بناتا ہے\n", + " - اہم تصورات کی شناخت کرتا ہے\n", + " - متعلقہ معلومات کے درمیان معنوی تعلقات بناتا ہے\n", + " - ویکٹر ایمبیڈنگز تیار کرتا ہے\n", + "\n", + "یہ عمل کچھ وقت لے سکتا ہے کیونکہ LLM متن کو پروسیس کرتا ہے اور گراف کا ڈھانچہ بناتا ہے:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 علم گراف کو بصری بنائیں\n", + "\n", + "آئیے اپنے علم گراف کی ساخت کو دریافت کریں۔ بصری نمائندگی یہ دکھاتی ہے:\n", + "- **نوڈز**: متن سے نکالی گئی ہستیاں (تصورات، ٹیکنالوجیز، افراد)\n", + "- **ایجز**: ہستیوں کے درمیان تعلقات اور روابط\n", + "- **کلسٹرز**: معنوی مشابہت کے ذریعے گروپ کیے گئے متعلقہ تصورات\n", + "\n", + "گراف کو انٹرایکٹو طور پر دریافت کرنے کے لیے تیار کردہ HTML فائل کو اپنے براؤزر میں کھولیں:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 یادداشت کو بہتر بنائیں میمیفائی کے ساتھ\n", + "\n", + "`memify()` فنکشن علم کے گراف کا تجزیہ کرتا ہے اور ڈیٹا کے بارے میں ذہین اصول تیار کرتا ہے۔ یہ عمل:\n", + "- نمونوں اور بہترین طریقوں کی شناخت کرتا ہے\n", + "- مواد کی بنیاد پر قابل عمل رہنما اصول بناتا ہے\n", + "- مختلف علم کے شعبوں کے درمیان تعلقات قائم کرتا ہے\n", + "\n", + "یہ اصول ایجنٹ کو سوالات کے جواب دیتے وقت زیادہ معلوماتی فیصلے کرنے میں مدد دیتے ہیں۔ دوسری بصری تصویر کو محفوظ کرنا آپ کو یہ موازنہ کرنے میں مدد دیتا ہے کہ گراف کس طرح بہتر ہونے کے بعد زیادہ گہرا ہو جاتا ہے۔\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 حصہ 2: ذہین یادداشت کی بازیافت\n", + "\n", + "### مظاہرہ 1: دستاویزات کے درمیان علم کا انضمام\n", + "\n", + "اب جب کہ ہمارا نالج گراف تیار ہو چکا ہے، آئیے دیکھتے ہیں کہ Cognee کس طرح مختلف ذرائع سے معلومات کو یکجا کر کے پیچیدہ سوالات کے جوابات دیتا ہے۔\n", + "\n", + "پہلا سوال یہ ظاہر کرتا ہے:\n", + "- **معنوی سمجھ بوجھ**: متعلقہ تصورات کو تلاش کرنا، چاہے وہ واضح طور پر ذکر نہ کیے گئے ہوں\n", + "- **بین الحوالہ جات**: ڈویلپر پروفائل کو Python اصولوں کے ساتھ جوڑنا\n", + "- **سیاق و سباق کی منطق**: بہترین طریقوں کو مخصوص عمل درآمد پر لاگو کرنا\n", + "\n", + "### مظاہرہ 2: NodeSets کے ساتھ فلٹرڈ تلاش\n", + "\n", + "دوسرا سوال یہ دکھاتا ہے کہ نالج گراف کے مخصوص ذیلی حصوں کو کیسے ہدف بنایا جائے:\n", + "- `node_name` پیرامیٹر کا استعمال کرتے ہوئے صرف `principles_data` کے اندر تلاش کرتا ہے\n", + "- مخصوص علم کے دائرے سے مرکوز جوابات فراہم کرتا ہے\n", + "- اس وقت مفید جب آپ کو کسی خاص شعبے کی معلومات درکار ہوں\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 حصہ 3: سیشن مینجمنٹ سیٹ اپ\n", + "\n", + "### گفتگو کی یادداشت کو فعال کرنا\n", + "\n", + "سیشن مینجمنٹ متعدد تعاملات کے دوران سیاق و سباق کو برقرار رکھنے کے لیے بہت اہم ہے۔ یہاں ہم کریں گے:\n", + "\n", + "1. **یوزر کانٹیکسٹ کو انیشیالائز کریں**: سیشن ٹریکنگ کے لیے یوزر پروفائل بنائیں یا حاصل کریں \n", + "2. **کیچ انجن کو کنفیگر کریں**: گفتگو کی تاریخ کو محفوظ کرنے کے لیے Redis سے جڑیں \n", + "3. **سیشن ویریبلز کو فعال کریں**: ایسے کانٹیکسٹ ویریبلز سیٹ اپ کریں جو سوالات کے درمیان برقرار رہیں \n", + "\n", + "> ⚠️ **اہم**: اس کے لیے Redis کا چلنا اور آپ کے ماحول میں `CACHING=true` ہونا ضروری ہے\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ مددگار فنکشن: سیشن کی تاریخ دیکھیں\n", + "\n", + "یہ یوٹیلیٹی فنکشن ہمیں Redis میں محفوظ کی گئی گفتگو کی تاریخ کا جائزہ لینے کی اجازت دیتا ہے۔ یہ درج ذیل کے لیے مفید ہے:\n", + "- سیشن مینجمنٹ کی ڈیبگنگ\n", + "- اس بات کی تصدیق کرنا کہ گفتگو محفوظ ہو رہی ہیں\n", + "- یہ سمجھنا کہ ایجنٹ کے لیے کون سا سیاق و سباق دستیاب ہے\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## سیشن 1: غیر ہم وقت معاونت لیب — پہلا سوال\n", + "\n", + "`async-support-lab` سیشن کا آغاز ایک بڑے ویب اسکریپر کے لیے ٹیلیمیٹری کے موافق asyncio پیٹرنز کے بارے میں پوچھ کر کریں۔ گراف پہلے ہی asyncio، aiohttp، اور مانیٹرنگ کے طریقوں کے بارے میں جانتا ہے، لہذا جواب کو پچھلی گفتگوؤں کی عکاسی کرتے ہوئے نئے سوال کے مطابق ڈھالنا چاہیے۔\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## سیشن 1 کی میموری کا جائزہ لیں پہلی بات چیت کے بعد\n", + "\n", + "`show_history(session_1)` چلانے سے فوراً ابتدائی سوال کے بعد تصدیق ہوتی ہے کہ Cognee نے دونوں پرامپٹ اور تکمیل کو Redis میں محفوظ کیا۔ آپ کو ایک اندراج نظر آئے گا جس میں ہم وقتی رہنمائی شامل ہوگی۔\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## سیشن 1: ڈیٹا ماڈلز پر فالو اپ\n", + "\n", + "اب ہم پوچھتے ہیں، \"مجھے ڈیٹاکلاسز اور Pydantic میں سے کس کا انتخاب کب کرنا چاہیے؟\" اسی سیشن آئی ڈی کا استعمال کرتے ہوئے۔ Cognee کو چاہیے کہ وہ Python کے اصولوں اور پچھلی FastAPI گفتگوؤں کو جوڑ کر تفصیلی مشورہ فراہم کرے—یہ ظاہر کرتے ہوئے کہ ایک نامزد سیشن کے اندر سیاق و سباق برقرار رہتا ہے۔\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## تصدیق کریں کہ سیشن 1 کی تاریخ دونوں تبادلے پر مشتمل ہے\n", + "\n", + "ایک اور `show_history(session_1)` کال کو دو سوال و جواب کے اندراجات ظاہر کرنے چاہئیں۔ یہ Mem0 لیب کے \"یادداشت دوبارہ چلانے\" کے مرحلے سے میل کھاتا ہے اور ثابت کرتا ہے کہ اضافی تبادلے اسی نقل کو بڑھاتے ہیں۔\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## سیشن 2: ڈیزائن جائزہ تھریڈ — نیا سیشن\n", + "\n", + "تھریڈز کے درمیان علیحدگی دکھانے کے لیے ہم `design-review-session` کو شروع کرتے ہیں اور واقعہ جائزوں کے لیے لاگنگ رہنمائی طلب کرتے ہیں۔ حالانکہ بنیادی معلوماتی بنیاد ایک جیسی ہے، نیا سیشن آئی ڈی ٹرانسکرپٹس کو الگ رکھتا ہے۔\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## جائزہ سیشن 2 تاریخ\n", + "\n", + "`show_history(session_2)` کو صرف ڈیزائن-جائزہ کے پرامپٹ/جواب کے جوڑے کو ظاہر کرنا چاہیے۔ اس کا موازنہ سیشن 1 سے کریں تاکہ یہ واضح ہو کہ کس طرح Cognee آزاد ٹرانسکرپٹس کو برقرار رکھتا ہے جبکہ مشترکہ نالج گراف کو دوبارہ استعمال کرتا ہے۔\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## خلاصہ\n", + "\n", + "مبارک ہو! آپ نے اپنے کوڈنگ اسسٹنٹ کو Cognee کی مدد سے ایک حقیقی طویل مدتی میموری لیئر فراہم کی ہے۔\n", + "\n", + "اس ٹیوٹوریل میں، آپ نے خام ڈیولپر مواد (کوڈ، دستاویزات، چیٹس) کو ایک گراف + ویکٹر میموری میں تبدیل کیا، جسے آپ کا ایجنٹ تلاش کر سکتا ہے، اس پر غور کر سکتا ہے، اور مسلسل بہتر بنا سکتا ہے۔\n", + "\n", + "آپ نے کیا سیکھا:\n", + "\n", + "1. **خام متن سے AI میموری تک**: Cognee کس طرح غیر منظم ڈیٹا کو لے کر اسے ایک ذہین، قابل تلاش میموری میں تبدیل کرتا ہے، جو ویکٹر + نالج گراف آرکیٹیکچر کے امتزاج سے کام کرتا ہے۔\n", + "\n", + "2. **میمیفائی کے ذریعے گراف کو بہتر بنانا**: بنیادی گراف تخلیق سے آگے بڑھ کر میمیفائی کا استعمال کرتے ہوئے موجودہ گراف پر اضافی حقائق اور زیادہ بھرپور تعلقات شامل کرنے کا طریقہ۔\n", + "\n", + "3. **متعدد تلاش کی حکمت عملیاں**: مختلف تلاش کی اقسام (گراف-آگاہ سوال و جواب، RAG-اسٹائل تکمیل، بصیرت، خام حصے، کوڈ تلاش وغیرہ) کے ذریعے میموری کو سوال کرنے کا طریقہ، جو آپ کے ایجنٹ کی ضرورت کے مطابق ہو۔\n", + "\n", + "4. **بصری جائزہ**: گراف کی تصویری وضاحتوں اور Cognee UI کا استعمال کرتے ہوئے Cognee نے جو بنایا ہے اسے جانچنے اور ڈیبگ کرنے کا طریقہ، تاکہ آپ دیکھ سکیں کہ علم کس طرح منظم ہے۔\n", + "\n", + "5. **سیشن-آگاہ میموری**: فی سیشن سیاق و سباق کو مستقل سیمینٹک میموری کے ساتھ جوڑنے کا طریقہ، تاکہ ایجنٹس مختلف رنز کے دوران یاد رکھ سکیں بغیر صارفین کے درمیان معلومات لیک کیے۔\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## اہم نکات\n", + "\n", + "1. علم گراف کے طور پر میموری، جسے ایمبیڈنگز کی مدد حاصل ہے\n", + "\n", + " - **منظم فہم**: Cognee ایک ویکٹر اسٹور اور گراف اسٹور کو یکجا کرتا ہے تاکہ آپ کا ڈیٹا نہ صرف معنی کے لحاظ سے تلاش کیا جا سکے بلکہ تعلقات کے ذریعے بھی جڑا ہوا ہو۔ Cognee ڈیفالٹ طور پر فائل بیسڈ ڈیٹا بیسز استعمال کرتا ہے (ویکٹر کے لیے LanceDB، گراف ڈیٹا بیس کے لیے Kuzu)۔\n", + "\n", + " - **تعلقات سے آگاہ بازیافت**: جوابات نہ صرف \"مشابہ متن\" پر مبنی ہو سکتے ہیں بلکہ اس پر بھی کہ ادارے ایک دوسرے سے کیسے جڑے ہوئے ہیں۔\n", + "\n", + " - **زندہ میموری**: میموری کی تہہ ارتقاء پذیر، بڑھتی ہوئی، اور ایک جڑے ہوئے گراف کے طور پر قابل سوال رہتی ہے۔\n", + "\n", + "2. تلاش اور استدلال کے طریقے\n", + " - **ہائبرڈ بازیافت**: تلاش ویکٹر کی مشابہت، گراف کی ساخت، اور LLM استدلال کو یکجا کرتی ہے، خام چنک تلاش سے لے کر گراف سے آگاہ سوالات کے جوابات تک۔\n", + "\n", + " - **کام کے مطابق طریقہ اپنائیں**: جب آپ کو قدرتی زبان میں جوابات چاہئیں تو تکمیل کے انداز استعمال کریں، اور جب آپ کے ایجنٹ کو خام سیاق و سباق یا اپنی استدلال کو چلانے کی ضرورت ہو تو چنک/خلاصہ/گراف کے انداز اپنائیں۔\n", + "\n", + "3. ذاتی نوعیت کے، سیشن سے آگاہ ایجنٹس\n", + " - **سیشن کا سیاق و سباق + طویل مدتی میموری**: Cognee مختصر مدتی \"تھریڈ\" سیاق و سباق کو طویل مدتی، صارف یا تنظیم کی سطح کی میموری سے الگ رکھتا ہے۔\n", + "\n", + "## حقیقی دنیا کی ایپلیکیشنز\n", + "\n", + "1. **عمودی AI ایجنٹس**\n", + "\n", + " اس نوٹ بک کے پیٹرن کو استعمال کریں تاکہ ڈومین-سمارٹ کوپائلٹس کو طاقتور بنایا جا سکے جو Cognee کو اپنی بازیافت اور استدلال کے مرکز کے طور پر استعمال کرتے ہیں:\n", + "\n", + "- **ڈویلپر کوپائلٹس**: کوڈ ریویو، واقعہ تجزیہ، اور آرکیٹیکچر اسسٹنٹس جو کوڈ، APIs، ڈیزائن ڈاکس، اور ٹکٹس کو ایک واحد میموری گراف کے طور پر عبور کرتے ہیں۔\n", + "\n", + "- **کسٹمر کے لیے کوپائلٹس**: سپورٹ یا کامیابی کے ایجنٹس جو پروڈکٹ ڈاکس، FAQs، CRM نوٹس، اور پچھلے ٹکٹس سے گراف سے آگاہ بازیافت اور حوالہ شدہ جوابات نکالتے ہیں۔\n", + "\n", + "- **داخلی ماہر کوپائلٹس**: پالیسی، قانونی، یا سیکیورٹی اسسٹنٹس جو الگ تھلگ PDFs کے بجائے باہم جڑے ہوئے اصولوں، رہنما خطوط، اور تاریخی فیصلوں پر استدلال کرتے ہیں۔\n", + "\n", + " Cognee کو خاص طور پر AI ایجنٹس کے لیے مستقل، درست میموری کے طور پر پوزیشن کیا گیا ہے، جو ایک زندہ علم گراف فراہم کرتا ہے جو آپ کے ایجنٹ کے پیچھے فٹ بیٹھتا ہے اور ویکٹر اسٹورز اور کسٹم گراف کوڈ کے عارضی امتزاج کی جگہ لیتا ہے۔\n", + "\n", + "2. **ڈیٹا کے سلوز کو ایک میموری میں یکجا کرنا**\n", + "\n", + " یہی طریقہ آپ کو بکھرے ہوئے ذرائع کے درمیان ایک متحد میموری تہہ بنانے میں بھی مدد دیتا ہے:\n", + "\n", + "- **سلوز سے ایک گراف تک**: ساختی (مثلاً ڈیٹا بیسز) اور غیر ساختی ڈیٹا (مثلاً ڈاکس، چیٹس) کو ایک گراف میں ایمبیڈنگز کے ساتھ شامل کریں، بجائے اس کے کہ ہر سسٹم کے لیے الگ الگ انڈیکس ہوں۔\n", + "\n", + "- **حوالہ جات کے ساتھ کراس سورس استدلال**: ہر چیز پر کثیر مرحلہ استدلال چلائیں—گراف کے ذریعے لاگز، میٹرکس، اور ڈاکس کو \"جوائن\" کریں—اور پھر بھی حوالہ جات کے ساتھ بنیاد پرست جوابات واپس کریں۔\n", + "\n", + "- **علمی مراکز**: بینکنگ یا تعلیم جیسے ڈومینز کے لیے، Cognee پہلے ہی PDFs، داخلی سسٹمز، اور ایپ ڈیٹا کو ایک علم گراف میں یکجا کرنے کے لیے استعمال کیا جا رہا ہے، تاکہ ایجنٹس درست، حوالہ شدہ سیاق و سباق کے ساتھ سوالات کے جوابات دے سکیں۔\n", + "\n", + "## اگلے اقدامات\n", + "\n", + "آپ نے بنیادی میموری لوپ کو نافذ کر لیا ہے۔ یہاں کچھ قدرتی توسیعات ہیں جنہیں آپ خود آزما سکتے ہیں (تفصیلات کے لیے [Cognee دستاویزات](https://docs.cognee.ai/) دیکھیں):\n", + "\n", + "1. **وقتی آگاہی کے ساتھ تجربہ کریں**: وقتی Cognify کو آن کریں تاکہ متن سے واقعات اور ٹائم اسٹیمپس نکال سکیں۔\n", + "\n", + "2. **اونٹولوجی پر مبنی استدلال متعارف کروائیں**: اپنے ڈومین کے لیے ایک OWL اونٹولوجی کی وضاحت کریں۔ Cognee کی اونٹولوجی سپورٹ کا استعمال کریں تاکہ نکالے گئے ادارے اور تعلقات اس اسکیمہ میں جڑے ہوں، گراف کے معیار اور ڈومین کے مخصوص جوابات کو بہتر بنائیں۔\n", + "\n", + "3. **ایک فیڈبیک لوپ شامل کریں**: Cognee کو حقیقی صارف کی رائے سے گراف ایج ویٹس کو ایڈجسٹ کرنے دیں، تاکہ بازیافت وقت کے ساتھ بہتر ہو جائے بجائے اس کے کہ جامد رہے۔\n", + "\n", + "4. **ذاتی نوعیت اور سیشن کے رویے کے لیے ٹیون کریں**: صارف IDs، کرایہ داروں، اور ڈیٹاسیٹس کا استعمال کریں تاکہ ہر شخص یا ٹیم کو مشترکہ میموری انجن پر اپنی نظر فراہم کی جا سکے۔\n", + "\n", + "5. **زیادہ پیچیدہ ایجنٹس کے لیے توسیع کریں**: Cognee کو ایجنٹ فریم ورکس میں پلگ کریں تاکہ کثیر ایجنٹ سسٹمز بنائے جا سکیں جو سب ایک ہی میموری تہہ کا اشتراک کرتے ہیں۔ *Microsoft Agent Framework x Cognee پلگ ان جلد آ رہا ہے۔*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**اعلانِ لاتعلقی**: \nیہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کے ذریعے ترجمہ کی گئی ہے۔ ہم درستگی کی بھرپور کوشش کرتے ہیں، لیکن براہ کرم آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا غیر درستیاں ہو سکتی ہیں۔ اصل دستاویز کو اس کی اصل زبان میں مستند ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے لیے ہم ذمہ دار نہیں ہیں۔\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:24:24+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "ur" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/ur/13-agent-memory/README.md b/translations/ur/13-agent-memory/README.md index ae10913d3..6063603a9 100644 --- a/translations/ur/13-agent-memory/README.md +++ b/translations/ur/13-agent-memory/README.md @@ -1,159 +1,180 @@ -# AI ایجنٹس کے لیے میموری +# اے آئی ایجنٹس کے لیے میموری [![ایجنٹ میموری](../../../translated_images/lesson-13-thumbnail.959e3bc52d210c64a614a3bece6b170a2c472138dc0a14c7fbde07306ef95ae7.ur.png)](https://youtu.be/QrYbHesIxpw?si=qNYW6PL3fb3lTPMk) -جب AI ایجنٹس بنانے کے منفرد فوائد پر بات کی جاتی ہے، تو دو چیزیں خاص طور پر زیر بحث آتی ہیں: ٹاسک مکمل کرنے کے لیے ٹولز کا استعمال اور وقت کے ساتھ بہتر ہونے کی صلاحیت۔ میموری ایک خود کو بہتر بنانے والے ایجنٹ کی بنیاد ہے جو ہمارے صارفین کے لیے بہتر تجربات فراہم کر سکتی ہے۔ +جب اے آئی ایجنٹس بنانے کے منفرد فوائد پر بات کی جاتی ہے، تو دو چیزیں خاص طور پر زیر بحث آتی ہیں: ٹاسک مکمل کرنے کے لیے ٹولز کا استعمال اور وقت کے ساتھ بہتر ہونے کی صلاحیت۔ میموری ایک خود کو بہتر بنانے والے ایجنٹ کی بنیاد ہے جو ہمارے صارفین کے لیے بہتر تجربات تخلیق کر سکتی ہے۔ -اس سبق میں، ہم دیکھیں گے کہ AI ایجنٹس کے لیے میموری کیا ہے اور ہم اسے اپنے ایپلیکیشنز کے فائدے کے لیے کیسے منظم اور استعمال کر سکتے ہیں۔ +اس سبق میں، ہم دیکھیں گے کہ اے آئی ایجنٹس کے لیے میموری کیا ہے اور ہم اسے اپنے ایپلیکیشنز کے فائدے کے لیے کیسے منظم اور استعمال کر سکتے ہیں۔ -## تعارف +## تعارف -اس سبق میں شامل ہوگا: +یہ سبق درج ذیل موضوعات کا احاطہ کرے گا: -• **AI ایجنٹ میموری کو سمجھنا**: میموری کیا ہے اور ایجنٹس کے لیے یہ کیوں ضروری ہے۔ +• **اے آئی ایجنٹ میموری کو سمجھنا**: میموری کیا ہے اور ایجنٹس کے لیے یہ کیوں ضروری ہے۔ -• **میموری کو نافذ کرنا اور محفوظ کرنا**: اپنے AI ایجنٹس میں میموری کی صلاحیتیں شامل کرنے کے عملی طریقے، خاص طور پر مختصر مدتی اور طویل مدتی میموری پر توجہ مرکوز کرتے ہوئے۔ +• **میموری کو نافذ کرنا اور محفوظ کرنا**: آپ کے اے آئی ایجنٹس میں میموری کی صلاحیتوں کو شامل کرنے کے عملی طریقے، خاص طور پر قلیل مدتی اور طویل مدتی میموری پر توجہ مرکوز کرتے ہوئے۔ -• **AI ایجنٹس کو خود کو بہتر بنانے کے قابل بنانا**: میموری کیسے ایجنٹس کو ماضی کی بات چیت سے سیکھنے اور وقت کے ساتھ بہتر ہونے میں مدد دیتی ہے۔ +• **اے آئی ایجنٹس کو خود کو بہتر بنانے کے قابل بنانا**: میموری کس طرح ایجنٹس کو ماضی کی بات چیت سے سیکھنے اور وقت کے ساتھ بہتر ہونے کے قابل بناتی ہے۔ -## سیکھنے کے اہداف +## دستیاب عمل درآمد + +یہ سبق دو جامع نوٹ بک ٹیوٹوریلز شامل کرتا ہے: + +• **[13-agent-memory.ipynb](./13-agent-memory.ipynb)**: میموری کو Mem0 اور Azure AI Search کے ساتھ Semantic Kernel فریم ورک کا استعمال کرتے ہوئے نافذ کرتا ہے۔ + +• **[13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)**: Cognee کا استعمال کرتے ہوئے ساختی میموری کو نافذ کرتا ہے، جو خود بخود ایمبیڈنگ کے ذریعے نالج گراف بناتا ہے، گراف کو بصری بناتا ہے، اور ذہین بازیافت فراہم کرتا ہے۔ + +## سیکھنے کے مقاصد اس سبق کو مکمل کرنے کے بعد، آپ جان سکیں گے کہ: -• **AI ایجنٹ میموری کی مختلف اقسام میں فرق کرنا**، بشمول ورکنگ، مختصر مدتی، اور طویل مدتی میموری، نیز خصوصی اقسام جیسے پرسونا اور ایپیسوڈک میموری۔ +• **اے آئی ایجنٹ میموری کی مختلف اقسام میں فرق کریں**، بشمول ورکنگ، قلیل مدتی، اور طویل مدتی میموری، نیز خصوصی اقسام جیسے پرسونا اور ایپیسوڈک میموری۔ -• **AI ایجنٹس کے لیے مختصر مدتی اور طویل مدتی میموری کو نافذ اور منظم کرنا**، Semantic Kernel فریم ورک کا استعمال کرتے ہوئے، Mem0 اور وائٹ بورڈ میموری جیسے ٹولز کا فائدہ اٹھاتے ہوئے، اور Azure AI Search کے ساتھ انضمام کرتے ہوئے۔ +• **اے آئی ایجنٹس کے لیے قلیل مدتی اور طویل مدتی میموری کو نافذ کریں اور منظم کریں** Semantic Kernel فریم ورک کا استعمال کرتے ہوئے، جیسے Mem0، Cognee، وائٹ بورڈ میموری، اور Azure AI Search کے ساتھ انضمام۔ -• **خود کو بہتر بنانے والے AI ایجنٹس کے اصولوں کو سمجھنا** اور کیسے مضبوط میموری مینجمنٹ سسٹمز مسلسل سیکھنے اور موافقت میں مدد دیتے ہیں۔ +• **خود کو بہتر بنانے والے اے آئی ایجنٹس کے اصولوں کو سمجھیں** اور کس طرح مضبوط میموری مینجمنٹ سسٹمز مسلسل سیکھنے اور موافقت میں معاون ہیں۔ -## AI ایجنٹ میموری کو سمجھنا +## اے آئی ایجنٹ میموری کو سمجھنا -بنیادی طور پر، **AI ایجنٹس کے لیے میموری ان میکانزمز کو کہتے ہیں جو انہیں معلومات کو برقرار رکھنے اور یاد کرنے کی اجازت دیتے ہیں**۔ یہ معلومات کسی بات چیت کی مخصوص تفصیلات، صارف کی ترجیحات، ماضی کے اعمال، یا سیکھے گئے پیٹرنز ہو سکتی ہیں۔ +بنیادی طور پر، **اے آئی ایجنٹس کے لیے میموری ان میکانزمز کو کہتے ہیں جو انہیں معلومات کو برقرار رکھنے اور یاد کرنے کے قابل بناتے ہیں**۔ یہ معلومات کسی بات چیت کی مخصوص تفصیلات، صارف کی ترجیحات، ماضی کے اعمال، یا سیکھے گئے نمونوں پر مشتمل ہو سکتی ہیں۔ -میموری کے بغیر، AI ایپلیکیشنز اکثر اسٹیٹ لیس ہوتی ہیں، یعنی ہر تعامل نئے سرے سے شروع ہوتا ہے۔ اس سے ایک بار بار اور مایوس کن صارف تجربہ پیدا ہوتا ہے جہاں ایجنٹ پچھلے سیاق و سباق یا ترجیحات کو "بھول" جاتا ہے۔ +میموری کے بغیر، اے آئی ایپلیکیشنز اکثر اسٹیٹ لیس ہوتی ہیں، یعنی ہر تعامل نئے سرے سے شروع ہوتا ہے۔ اس سے ایک دہرانے والا اور مایوس کن صارف تجربہ پیدا ہوتا ہے جہاں ایجنٹ پچھلے سیاق و سباق یا ترجیحات کو "بھول" جاتا ہے۔ -### میموری کیوں اہم ہے؟ +### میموری کیوں اہم ہے؟ -ایجنٹ کی ذہانت اس کی ماضی کی معلومات کو یاد کرنے اور استعمال کرنے کی صلاحیت سے گہری جڑی ہوئی ہے۔ میموری ایجنٹس کو درج ذیل بناتی ہے: +کسی ایجنٹ کی ذہانت اس کی ماضی کی معلومات کو یاد کرنے اور استعمال کرنے کی صلاحیت سے گہرا تعلق رکھتی ہے۔ میموری ایجنٹس کو درج ذیل خصوصیات فراہم کرتی ہے: • **عکاس**: ماضی کے اعمال اور نتائج سے سیکھنا۔ • **تفاعلی**: جاری بات چیت کے دوران سیاق و سباق کو برقرار رکھنا۔ -• **پیشگی اور ردعملی**: تاریخی ڈیٹا کی بنیاد پر ضروریات کا اندازہ لگانا یا مناسب جواب دینا۔ +• **پیشگی اور ردعمل**: تاریخی ڈیٹا کی بنیاد پر ضروریات کا اندازہ لگانا یا مناسب جواب دینا۔ -• **خود مختار**: ذخیرہ شدہ علم کا استعمال کرتے ہوئے زیادہ آزادانہ طور پر کام کرنا۔ +• **خود مختار**: ذخیرہ شدہ علم کو استعمال کرتے ہوئے زیادہ آزادانہ طور پر کام کرنا۔ میموری کو نافذ کرنے کا مقصد ایجنٹس کو زیادہ **قابل اعتماد اور قابل** بنانا ہے۔ -### میموری کی اقسام +### میموری کی اقسام + +#### ورکنگ میموری + +اسے ایک قسم کے نوٹ پیڈ کے طور پر سوچیں جو ایجنٹ کسی ایک جاری ٹاسک یا سوچ کے عمل کے دوران استعمال کرتا ہے۔ یہ فوری معلومات کو رکھتا ہے جو اگلے مرحلے کا حساب لگانے کے لیے ضروری ہوتی ہیں۔ + +اے آئی ایجنٹس کے لیے، ورکنگ میموری اکثر بات چیت سے سب سے زیادہ متعلقہ معلومات کو قید کرتی ہے، چاہے مکمل چیٹ ہسٹری طویل ہو یا مختصر۔ یہ کلیدی عناصر جیسے ضروریات، تجاویز، فیصلے، اور اعمال کو نکالنے پر توجہ مرکوز کرتا ہے۔ + +**ورکنگ میموری کی مثال** + +ایک ٹریول بکنگ ایجنٹ میں، ورکنگ میموری صارف کی موجودہ درخواست کو قید کر سکتی ہے، جیسے "میں پیرس کا سفر بک کرنا چاہتا ہوں"۔ یہ مخصوص ضرورت موجودہ تعامل کی رہنمائی کے لیے ایجنٹ کے فوری سیاق و سباق میں رکھی جاتی ہے۔ + +#### قلیل مدتی میموری -#### ورکنگ میموری +یہ قسم کی میموری ایک ہی بات چیت یا سیشن کے دوران معلومات کو برقرار رکھتی ہے۔ یہ موجودہ چیٹ کا سیاق و سباق ہے، جو ایجنٹ کو مکالمے کے پچھلے موڑ کا حوالہ دینے کی اجازت دیتا ہے۔ -اسے ایک قسم کے اسکریچ پیپر کے طور پر سوچیں جو ایجنٹ ایک واحد، جاری ٹاسک یا سوچنے کے عمل کے دوران استعمال کرتا ہے۔ یہ فوری معلومات کو رکھتا ہے جو اگلے قدم کا حساب لگانے کے لیے ضروری ہے۔ +**قلیل مدتی میموری کی مثال** -AI ایجنٹس کے لیے، ورکنگ میموری اکثر بات چیت سے سب سے زیادہ متعلقہ معلومات کو پکڑتی ہے، چاہے مکمل چیٹ ہسٹری طویل ہو یا مختصر۔ یہ کلیدی عناصر جیسے ضروریات، تجاویز، فیصلے، اور اعمال کو نکالنے پر توجہ مرکوز کرتا ہے۔ +اگر کوئی صارف پوچھے، "پیرس کے لیے فلائٹ کی قیمت کتنی ہوگی؟" اور پھر اس کے بعد کہے، "وہاں رہائش کے بارے میں کیا خیال ہے؟"، قلیل مدتی میموری اس بات کو یقینی بناتی ہے کہ ایجنٹ جانتا ہو کہ "وہاں" کا مطلب "پیرس" ہے۔ -**ورکنگ میموری کی مثال** +#### طویل مدتی میموری -ایک ٹریول بکنگ ایجنٹ میں، ورکنگ میموری صارف کی موجودہ درخواست کو پکڑ سکتی ہے، جیسے "مجھے پیرس کا سفر بک کرنا ہے"۔ یہ مخصوص ضرورت ایجنٹ کے فوری سیاق و سباق میں رکھی جاتی ہے تاکہ موجودہ تعامل کی رہنمائی کی جا سکے۔ +یہ وہ معلومات ہے جو متعدد بات چیت یا سیشنز کے دوران برقرار رہتی ہے۔ یہ ایجنٹس کو صارف کی ترجیحات، تاریخی تعاملات، یا عمومی علم کو طویل عرصے تک یاد رکھنے کی اجازت دیتی ہے۔ یہ ذاتی نوعیت کے لیے اہم ہے۔ -#### مختصر مدتی میموری +**طویل مدتی میموری کی مثال** -یہ قسم کی میموری ایک واحد بات چیت یا سیشن کے دوران معلومات کو برقرار رکھتی ہے۔ یہ موجودہ چیٹ کا سیاق و سباق ہے، جو ایجنٹ کو مکالمے کے پچھلے موڑوں کا حوالہ دینے کی اجازت دیتا ہے۔ +ایک طویل مدتی میموری یہ ذخیرہ کر سکتی ہے کہ "بین کو اسکیئنگ اور آؤٹ ڈور سرگرمیاں پسند ہیں، کافی پہاڑی منظر کے ساتھ پسند ہے، اور ماضی کی چوٹ کی وجہ سے ایڈوانسڈ اسکی سلوپس سے بچنا چاہتا ہے"۔ یہ معلومات، پچھلے تعاملات سے سیکھی گئی، مستقبل کے ٹریول پلاننگ سیشنز میں سفارشات کو متاثر کرتی ہے، انہیں انتہائی ذاتی بناتی ہے۔ -**مختصر مدتی میموری کی مثال** +#### پرسونا میموری -اگر کوئی صارف پوچھے، "پیرس کے لیے فلائٹ کی قیمت کتنی ہوگی؟" اور پھر اس کے بعد پوچھے، "وہاں رہائش کے بارے میں کیا خیال ہے؟"، مختصر مدتی میموری اس بات کو یقینی بناتی ہے کہ ایجنٹ جانتا ہے کہ "وہاں" کا مطلب "پیرس" ہے اسی بات چیت کے دوران۔ +یہ ایک خاص قسم کی میموری ہے جو ایجنٹ کو ایک مستقل "شخصیت" یا "پرسونا" تیار کرنے میں مدد دیتی ہے۔ یہ ایجنٹ کو اپنے بارے میں یا اپنے مطلوبہ کردار کے بارے میں تفصیلات یاد رکھنے کی اجازت دیتی ہے، جس سے تعاملات زیادہ روانی اور مرکوز ہو جاتے ہیں۔ -#### طویل مدتی میموری +**پرسونا میموری کی مثال** -یہ وہ معلومات ہے جو متعدد بات چیت یا سیشنز کے دوران برقرار رہتی ہے۔ یہ ایجنٹس کو صارف کی ترجیحات، تاریخی تعاملات، یا عمومی معلومات کو طویل عرصے تک یاد رکھنے کی اجازت دیتی ہے۔ یہ ذاتی نوعیت کے لیے اہم ہے۔ +اگر ٹریول ایجنٹ کو "ماہر اسکی پلانر" کے طور پر ڈیزائن کیا گیا ہے، تو پرسونا میموری اس کردار کو تقویت دے سکتی ہے، اس کے جوابات کو ماہر کے لہجے اور علم کے مطابق متاثر کرتی ہے۔ -**طویل مدتی میموری کی مثال** +#### ورک فلو/ایپیسوڈک میموری -طویل مدتی میموری یہ ذخیرہ کر سکتی ہے کہ "بین کو اسکیئنگ اور آؤٹ ڈور سرگرمیاں پسند ہیں، پہاڑ کے نظارے کے ساتھ کافی پسند ہے، اور ماضی کی چوٹ کی وجہ سے ایڈوانس اسکی سلوپس سے بچنا چاہتا ہے"۔ یہ معلومات، پچھلے تعاملات سے سیکھی گئی، مستقبل کے ٹریول پلاننگ سیشنز میں سفارشات کو انتہائی ذاتی نوعیت کی بناتی ہے۔ +یہ میموری ایک پیچیدہ ٹاسک کے دوران ایجنٹ کے اٹھائے گئے اقدامات کی ترتیب کو ذخیرہ کرتی ہے، بشمول کامیابیاں اور ناکامیاں۔ یہ ماضی کے مخصوص "اقساط" یا تجربات کو یاد رکھنے جیسا ہے تاکہ ان سے سیکھا جا سکے۔ -#### پرسونا میموری +**ایپیسوڈک میموری کی مثال** -یہ ایک خاص قسم کی میموری ہے جو ایجنٹ کو ایک مستقل "شخصیت" یا "کردار" تیار کرنے میں مدد دیتی ہے۔ یہ ایجنٹ کو اپنے بارے میں یا اپنے مطلوبہ کردار کے بارے میں تفصیلات یاد رکھنے کی اجازت دیتی ہے، جس سے تعاملات زیادہ روانی اور مرکوز ہو جاتے ہیں۔ +اگر ایجنٹ نے ایک مخصوص فلائٹ بک کرنے کی کوشش کی لیکن یہ عدم دستیابی کی وجہ سے ناکام ہو گئی، تو ایپیسوڈک میموری اس ناکامی کو ریکارڈ کر سکتی ہے، جس سے ایجنٹ کو متبادل فلائٹس آزمانے یا کسی بعد کی کوشش میں صارف کو مسئلے کے بارے میں زیادہ معلومات فراہم کرنے کی اجازت ملتی ہے۔ -**پرسونا میموری کی مثال** -اگر ٹریول ایجنٹ کو "ماہر اسکی پلانر" کے طور پر ڈیزائن کیا گیا ہے، تو پرسونا میموری اس کردار کو تقویت دے سکتی ہے، جس سے اس کے جوابات ماہر کے لہجے اور علم کے مطابق ہوں۔ +#### اینٹیٹی میموری -#### ورک فلو/ایپیسوڈک میموری +یہ بات چیت سے مخصوص اداروں (جیسے لوگ، مقامات، یا چیزیں) اور واقعات کو نکالنے اور یاد رکھنے پر مشتمل ہے۔ یہ ایجنٹ کو زیر بحث کلیدی عناصر کی ایک ساختہ تفہیم بنانے کی اجازت دیتی ہے۔ -یہ میموری ایک پیچیدہ کام کے دوران ایجنٹ کے اٹھائے گئے اقدامات کی ترتیب کو ذخیرہ کرتی ہے، بشمول کامیابیاں اور ناکامیاں۔ یہ مخصوص "اقساط" یا ماضی کے تجربات کو یاد رکھنے جیسا ہے تاکہ ان سے سیکھا جا سکے۔ +**اینٹیٹی میموری کی مثال** -**ایپیسوڈک میموری کی مثال** +ایک ماضی کے سفر کے بارے میں بات چیت سے، ایجنٹ "پیرس"، "ایفل ٹاور"، اور "لی شاٹ نوئر ریسٹورنٹ میں ڈنر" کو اداروں کے طور پر نکال سکتا ہے۔ ایک مستقبل کے تعامل میں، ایجنٹ "لی شاٹ نوئر" کو یاد کر سکتا ہے اور وہاں ایک نئی ریزرویشن کرنے کی پیشکش کر سکتا ہے۔ -اگر ایجنٹ نے ایک مخصوص فلائٹ بک کرنے کی کوشش کی لیکن یہ دستیاب نہ ہونے کی وجہ سے ناکام ہو گئی، تو ایپیسوڈک میموری اس ناکامی کو ریکارڈ کر سکتی ہے، جس سے ایجنٹ کو متبادل فلائٹس آزمانے یا صارف کو مسئلے کے بارے میں زیادہ معلوماتی انداز میں آگاہ کرنے کی اجازت ملتی ہے۔ +#### ساختہ RAG (ریٹریول آگمینٹڈ جنریشن) -#### اینٹیٹی میموری +جبکہ RAG ایک وسیع تکنیک ہے، "ساختہ RAG" کو ایک طاقتور میموری ٹیکنالوجی کے طور پر اجاگر کیا گیا ہے۔ یہ مختلف ذرائع (بات چیت، ای میلز، تصاویر) سے گھنی، ساختہ معلومات نکالتا ہے اور اسے جوابات میں درستگی، یادداشت، اور رفتار بڑھانے کے لیے استعمال کرتا ہے۔ کلاسک RAG کے برعکس جو صرف سیمینٹک مماثلت پر انحصار کرتا ہے، ساختہ RAG معلومات کی اندرونی ساخت کے ساتھ کام کرتا ہے۔ -یہ بات چیت سے مخصوص اداروں (جیسے لوگ، جگہیں، یا چیزیں) اور واقعات کو نکالنے اور یاد رکھنے سے متعلق ہے۔ یہ ایجنٹ کو زیر بحث کلیدی عناصر کی ایک منظم تفہیم بنانے کی اجازت دیتی ہے۔ +**ساختہ RAG کی مثال** -**اینٹیٹی میموری کی مثال** +صرف کلیدی الفاظ سے میل کھانے کے بجائے، ساختہ RAG ای میل سے فلائٹ کی تفصیلات (منزل، تاریخ، وقت، ایئر لائن) کو پارس کر سکتا ہے اور انہیں ایک ساختہ طریقے سے ذخیرہ کر سکتا ہے۔ یہ درست سوالات جیسے "میں نے منگل کو پیرس کے لیے کون سی فلائٹ بک کی؟" کے لیے اجازت دیتا ہے۔ -ماضی کے سفر کے بارے میں بات چیت سے، ایجنٹ "پیرس"، "ایفل ٹاور"، اور "لی چیٹ نوئر ریسٹورنٹ میں ڈنر" کو اداروں کے طور پر نکال سکتا ہے۔ مستقبل کے تعامل میں، ایجنٹ "لی چیٹ نوئر" کو یاد کر سکتا ہے اور وہاں ایک نئی ریزرویشن کرنے کی پیشکش کر سکتا ہے۔ +## میموری کو نافذ کرنا اور محفوظ کرنا -#### اسٹرکچرڈ RAG (ریٹریول آگمنٹڈ جنریشن) +اے آئی ایجنٹس کے لیے میموری کو نافذ کرنا **میموری مینجمنٹ** کے ایک منظم عمل پر مشتمل ہے، جس میں معلومات پیدا کرنا، ذخیرہ کرنا، بازیافت کرنا، انضمام کرنا، اپ ڈیٹ کرنا، اور یہاں تک کہ "بھولنا" (یا حذف کرنا) شامل ہے۔ بازیافت ایک خاص طور پر اہم پہلو ہے۔ -جبکہ RAG ایک وسیع تکنیک ہے، "اسٹرکچرڈ RAG" کو ایک طاقتور میموری ٹیکنالوجی کے طور پر اجاگر کیا گیا ہے۔ یہ مختلف ذرائع (بات چیت، ای میلز، تصاویر) سے گہری، منظم معلومات نکالتا ہے اور اسے جواب دینے میں درستگی، یادداشت، اور رفتار کو بڑھانے کے لیے استعمال کرتا ہے۔ کلاسک RAG کے برعکس جو صرف سیمینٹک مماثلت پر انحصار کرتا ہے، اسٹرکچرڈ RAG معلومات کی اندرونی ساخت کے ساتھ کام کرتا ہے۔ +### خصوصی میموری ٹولز -**اسٹرکچرڈ RAG کی مثال** +#### Mem0 -صرف کلیدی الفاظ سے مماثلت کرنے کے بجائے، اسٹرکچرڈ RAG فلائٹ کی تفصیلات (منزل، تاریخ، وقت، ایئرلائن) کو ای میل سے پارس کر سکتا ہے اور انہیں منظم طریقے سے ذخیرہ کر سکتا ہے۔ یہ درست سوالات جیسے "میں نے پیرس کے لیے منگل کو کون سی فلائٹ بک کی تھی؟" کے لیے اجازت دیتا ہے۔ +ایجنٹ میموری کو ذخیرہ کرنے اور منظم کرنے کا ایک طریقہ خصوصی ٹولز جیسے Mem0 کا استعمال ہے۔ Mem0 ایک مستقل میموری لیئر کے طور پر کام کرتا ہے، جو ایجنٹس کو متعلقہ تعاملات کو یاد کرنے، صارف کی ترجیحات اور حقیقی سیاق و سباق کو ذخیرہ کرنے، اور وقت کے ساتھ کامیابیوں اور ناکامیوں سے سیکھنے کی اجازت دیتا ہے۔ یہاں خیال یہ ہے کہ اسٹیٹ لیس ایجنٹس کو اسٹیٹ فل میں تبدیل کیا جائے۔ -## میموری کو نافذ کرنا اور محفوظ کرنا +یہ **دو مرحلہ میموری پائپ لائن: نکالنا اور اپ ڈیٹ کرنا** کے ذریعے کام کرتا ہے۔ پہلے، ایجنٹ کے تھریڈ میں شامل پیغامات Mem0 سروس کو بھیجے جاتے ہیں، جو بات چیت کی تاریخ کا خلاصہ کرنے اور نئی یادیں نکالنے کے لیے ایک بڑے لینگویج ماڈل (LLM) کا استعمال کرتی ہے۔ اس کے بعد، ایک LLM سے چلنے والا اپ ڈیٹ مرحلہ ان یادوں کو شامل کرنے، ترمیم کرنے، یا حذف کرنے کا تعین کرتا ہے، انہیں ایک ہائبرڈ ڈیٹا اسٹور میں ذخیرہ کرتا ہے جس میں ویکٹر، گراف، اور کلیدی قدر کے ڈیٹا بیس شامل ہو سکتے ہیں۔ یہ نظام مختلف میموری اقسام کی بھی حمایت کرتا ہے اور اداروں کے درمیان تعلقات کو منظم کرنے کے لیے گراف میموری کو شامل کر سکتا ہے۔ -AI ایجنٹس کے لیے میموری کو نافذ کرنا **میموری مینجمنٹ** کے ایک منظم عمل پر مشتمل ہوتا ہے، جس میں معلومات کو پیدا کرنا، ذخیرہ کرنا، بازیافت کرنا، انضمام کرنا، اپ ڈیٹ کرنا، اور یہاں تک کہ "بھولنا" (یا حذف کرنا) شامل ہے۔ بازیافت خاص طور پر ایک اہم پہلو ہے۔ +#### Cognee -### خصوصی میموری ٹولز +ایک اور طاقتور طریقہ **Cognee** کا استعمال ہے، جو اے آئی ایجنٹس کے لیے ایک اوپن سورس سیمینٹک میموری ہے جو ساختہ اور غیر ساختہ ڈیٹا کو قابل سوال نالج گراف میں تبدیل کرتی ہے جو ایمبیڈنگ کے ذریعے تعاون یافتہ ہے۔ Cognee ایک **دوہری اسٹور آرکیٹیکچر** فراہم کرتا ہے جو ویکٹر مماثلت تلاش کو گراف تعلقات کے ساتھ جوڑتا ہے، ایجنٹس کو یہ سمجھنے کے قابل بناتا ہے کہ نہ صرف کون سی معلومات ملتی جلتی ہیں بلکہ تصورات ایک دوسرے سے کیسے متعلق ہیں۔ -ایجنٹ میموری کو ذخیرہ اور منظم کرنے کا ایک طریقہ خصوصی ٹولز جیسے Mem0 کا استعمال ہے۔ Mem0 ایک مستقل میموری لیئر کے طور پر کام کرتا ہے، جو ایجنٹس کو متعلقہ تعاملات کو یاد کرنے، صارف کی ترجیحات اور حقائق کے سیاق و سباق کو ذخیرہ کرنے، اور وقت کے ساتھ کامیابیوں اور ناکامیوں سے سیکھنے کی اجازت دیتا ہے۔ یہاں خیال یہ ہے کہ اسٹیٹ لیس ایجنٹس کو اسٹیٹ فل میں تبدیل کیا جائے۔ +یہ **ہائبرڈ بازیافت** میں مہارت رکھتا ہے جو ویکٹر مماثلت، گراف ڈھانچے، اور LLM استدلال کو یکجا کرتا ہے - خام چنک تلاش سے لے کر گراف سے آگاہ سوالات کے جوابات تک۔ یہ نظام **زندہ میموری** کو برقرار رکھتا ہے جو بڑھتی اور ترقی کرتی ہے جبکہ ایک جڑے ہوئے گراف کے طور پر قابل سوال رہتی ہے، جو قلیل مدتی سیشن سیاق و سباق اور طویل مدتی مستقل میموری دونوں کی حمایت کرتی ہے۔ -یہ **دو مرحلے کی میموری پائپ لائن: نکالنا اور اپ ڈیٹ کرنا** کے ذریعے کام کرتا ہے۔ پہلے، ایجنٹ کے تھریڈ میں شامل پیغامات Mem0 سروس کو بھیجے جاتے ہیں، جو ایک بڑے لینگویج ماڈل (LLM) کا استعمال کرتے ہوئے بات چیت کی تاریخ کا خلاصہ کرتا ہے اور نئی یادداشتیں نکالتا ہے۔ اس کے بعد، ایک LLM سے چلنے والا اپ ڈیٹ مرحلہ ان یادداشتوں کو شامل کرنے، ترمیم کرنے، یا حذف کرنے کا تعین کرتا ہے، انہیں ایک ہائبرڈ ڈیٹا اسٹور میں ذخیرہ کرتا ہے جو ویکٹر، گراف، اور کلیدی قدر کے ڈیٹا بیس شامل کر سکتا ہے۔ یہ نظام مختلف میموری اقسام کی بھی حمایت کرتا ہے اور اداروں کے درمیان تعلقات کو منظم کرنے کے لیے گراف میموری کو شامل کر سکتا ہے۔ +Cognee نوٹ بک ٹیوٹوریل ([13-agent-memory-cognee.ipynb](./13-agent-memory-cognee.ipynb)) اس متحد میموری لیئر کی تعمیر کا مظاہرہ کرتا ہے، متنوع ڈیٹا ذرائع کو شامل کرنے، نالج گراف کو بصری بنانے، اور مخصوص ایجنٹ کی ضروریات کے مطابق مختلف تلاش کی حکمت عملیوں کے ساتھ سوالات کرنے کی عملی مثالوں کے ساتھ۔ -### RAG کے ساتھ میموری کو ذخیرہ کرنا +### RAG کے ساتھ میموری کو ذخیرہ کرنا -Mem0 جیسے خصوصی میموری ٹولز کے علاوہ، آپ مضبوط سرچ سروسز جیسے **Azure AI Search کو میموری ذخیرہ کرنے اور بازیافت کرنے کے لیے بیک اینڈ کے طور پر استعمال کر سکتے ہیں**، خاص طور پر اسٹرکچرڈ RAG کے لیے۔ +خصوصی میموری ٹولز جیسے Mem0 کے علاوہ، آپ **Azure AI Search** جیسی مضبوط تلاش کی خدمات کو میموری ذخیرہ کرنے اور بازیافت کرنے کے لیے استعمال کر سکتے ہیں، خاص طور پر ساختہ RAG کے لیے۔ -یہ آپ کے ایجنٹ کے جوابات کو آپ کے اپنے ڈیٹا کے ساتھ بنیاد فراہم کرنے کی اجازت دیتا ہے، جس سے زیادہ متعلقہ اور درست جوابات یقینی بنتے ہیں۔ Azure AI Search کو صارف کے مخصوص سفر کی یادداشتیں، پروڈکٹ کیٹلاگز، یا کسی بھی دوسرے ڈومین مخصوص علم کو ذخیرہ کرنے کے لیے استعمال کیا جا سکتا ہے۔ +یہ آپ کو اپنے ایجنٹ کے جوابات کو اپنے ڈیٹا کے ساتھ بنیاد فراہم کرنے کی اجازت دیتا ہے، اس بات کو یقینی بناتے ہوئے کہ جوابات زیادہ متعلقہ اور درست ہوں۔ Azure AI Search کو صارف کے مخصوص ٹریول میموری، پروڈکٹ کیٹلاگ، یا کسی بھی دوسرے ڈومین مخصوص علم کو ذخیرہ کرنے کے لیے استعمال کیا جا سکتا ہے۔ -Azure AI Search **اسٹرکچرڈ RAG** جیسی صلاحیتوں کی حمایت کرتا ہے، جو بات چیت کی تاریخ، ای میلز، یا یہاں تک کہ تصاویر جیسے بڑے ڈیٹا سیٹس سے گہری، منظم معلومات نکالنے اور بازیافت کرنے میں مہارت رکھتا ہے۔ یہ روایتی ٹیکسٹ چنکنگ اور ایمبیڈنگ کے طریقوں کے مقابلے میں "انسانی سے زیادہ درستگی اور یادداشت" فراہم کرتا ہے۔ +Azure AI Search **ساختہ RAG** جیسی صلاحیتوں کی حمایت کرتا ہے، جو بات چیت کی تاریخ، ای میلز، یا یہاں تک کہ تصاویر جیسے بڑے ڈیٹا سیٹس سے گھنی، ساختہ معلومات نکالنے اور بازیافت کرنے میں مہارت رکھتا ہے۔ یہ روایتی ٹیکسٹ چنکنگ اور ایمبیڈنگ کے طریقوں کے مقابلے میں "سپر ہیومن درستگی اور یادداشت" فراہم کرتا ہے۔ -## AI ایجنٹس کو خود کو بہتر بنانا +## اے آئی ایجنٹس کو خود کو بہتر بنانا -خود کو بہتر بنانے والے ایجنٹس کے لیے ایک عام پیٹرن **"علم ایجنٹ"** کو متعارف کرانا شامل ہے۔ یہ الگ ایجنٹ صارف اور بنیادی ایجنٹ کے درمیان اہم بات چیت کا مشاہدہ کرتا ہے۔ اس کا کردار یہ ہے: +خود کو بہتر بنانے والے ایجنٹس کے لیے ایک عام نمونہ **"نالج ایجنٹ"** متعارف کرانا شامل ہے۔ یہ الگ ایجنٹ صارف اور پرائمری ایجنٹ کے درمیان مرکزی بات چیت کا مشاہدہ کرتا ہے۔ اس کا کردار یہ ہے: -1. **قیمتی معلومات کی شناخت کرنا**: یہ تعین کرنا کہ بات چیت کا کوئی حصہ عمومی علم یا مخصوص صارف کی ترجیح کے طور پر محفوظ کرنے کے قابل ہے۔ +1. **قیمتی معلومات کی شناخت کریں**: یہ تعین کریں کہ کیا بات چیت کا کوئی حصہ عام علم یا کسی مخصوص صارف کی ترجیح کے طور پر محفوظ کرنے کے قابل ہے۔ -2. **نکالنا اور خلاصہ کرنا**: بات چیت سے ضروری سیکھنے یا ترجیح کو کشید کرنا۔ +2. **نکالیں اور خلاصہ کریں**: بات چیت سے ضروری سیکھنے یا ترجیح کو کشید کریں۔ -3. **علمی بنیاد میں ذخیرہ کرنا**: اس نکالی گئی معلومات کو برقرار رکھنا، اکثر ویکٹر ڈیٹا بیس میں، تاکہ اسے بعد میں بازیافت کیا جا سکے۔ +3. **نالج بیس میں محفوظ کریں**: اس نکالی گئی معلومات کو مستقل کریں، اکثر ایک ویکٹر ڈیٹا بیس میں، تاکہ اسے بعد میں بازیافت کیا جا سکے۔ -4. **مستقبل کے سوالات کو بڑھانا**: جب صارف نیا سوال شروع کرتا ہے، تو علم ایجنٹ متعلقہ ذخیرہ شدہ معلومات کو بازیافت کرتا ہے اور اسے صارف کے پرامپٹ میں شامل کرتا ہے، بنیادی ایجنٹ کو اہم سیاق و سباق فراہم کرتا ہے (RAG کی طرح)۔ +4. **مستقبل کے سوالات کو بڑھائیں**: جب صارف ایک نیا سوال شروع کرتا ہے، تو نالج ایجنٹ متعلقہ ذخیرہ شدہ معلومات کو بازیافت کرتا ہے اور اسے صارف کے پرامپٹ میں شامل کرتا ہے، پرائمری ایجنٹ کو اہم سیاق و سباق فراہم کرتا ہے (RAG کی طرح)۔ -### میموری کے لیے اصلاحات +### میموری کے لیے اصلاحات -• **لیٹنسی مینجمنٹ**: صارف کے تعاملات کو سست ہونے سے بچانے کے لیے، ایک سستا، تیز ماڈل ابتدائی طور پر استعمال کیا جا سکتا ہے تاکہ جلدی سے چیک کیا جا سکے کہ معلومات ذخیرہ کرنے یا بازیافت کرنے کے قابل ہے یا نہیں، صرف زیادہ پیچیدہ نکالنے/بازیافت کے عمل کو ضرورت پڑنے پر استعمال کیا جائے۔ +• **لیٹنسی مینجمنٹ**: صارف کے تعاملات کو سست ہونے سے بچانے کے لیے، ایک سستا، تیز ماڈل ابتدائی طور پر استعمال کیا جا سکتا ہے تاکہ یہ جلدی سے چیک کیا جا سکے کہ معلومات ذخیرہ کرنے یا بازیافت کرنے کے قابل ہے یا نہیں، صرف اس وقت زیادہ پیچیدہ نکالنے/بازیافت کے عمل کو مدعو کیا جائے جب ضروری ہو۔ -• **علمی بنیاد کی دیکھ بھال**: بڑھتی ہوئی علمی بنیاد کے لیے، کم کثرت سے استعمال ہونے والی معلومات کو "کولڈ اسٹوریج" میں منتقل کیا جا سکتا ہے تاکہ اخراجات کا انتظام کیا جا سکے۔ +• **نالج بیس کی دیکھ بھال**: بڑھتے ہوئے نالج بیس کے لیے، کم کثرت سے استعمال ہونے والی معلومات کو "کولڈ اسٹوریج" میں منتقل کیا جا سکتا ہے تاکہ اخراجات کا انتظام کیا جا سکے۔ -## ایجنٹ میموری کے بارے میں مزید سوالات ہیں؟ +## ایجنٹ میموری کے بارے میں مزید سوالات ہیں؟ -[Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) میں شامل ہوں تاکہ دوسرے سیکھنے والوں سے ملاقات کریں، آفس آورز میں شرکت کریں، اور اپنے AI ایجنٹس کے سوالات کے جوابات حاصل کریں۔ +[Azure AI Foundry Discord](https://aka.ms/ai-agents/discord) میں شامل ہوں تاکہ دوسرے سیکھنے والوں سے ملاقات کریں، آفس آورز میں شرکت کریں، اور اپنے اے آئی ایجنٹس کے سوالات کے جوابات حاصل کریں۔ --- -**اعلانِ لاتعلقی**: -یہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کا استعمال کرتے ہوئے ترجمہ کی گئی ہے۔ ہم درستگی کے لیے کوشش کرتے ہیں، لیکن براہ کرم آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا خامیاں ہو سکتی ہیں۔ اصل دستاویز کو اس کی اصل زبان میں مستند ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے لیے ہم ذمہ دار نہیں ہیں۔ \ No newline at end of file + +**ڈسکلیمر**: +یہ دستاویز AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کا استعمال کرتے ہوئے ترجمہ کی گئی ہے۔ ہم درستگی کے لیے کوشش کرتے ہیں، لیکن براہ کرم آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا غیر درستیاں ہو سکتی ہیں۔ اصل دستاویز کو اس کی اصل زبان میں مستند ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ ہم اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے ذمہ دار نہیں ہیں۔ + \ No newline at end of file diff --git a/translations/vi/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/vi/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..19b55beb5 --- /dev/null +++ b/translations/vi/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# Xây dựng các tác nhân AI với bộ nhớ lâu dài bằng Cognee\n", + "\n", + "Notebook này hướng dẫn cách xây dựng các tác nhân AI thông minh với khả năng bộ nhớ tiên tiến sử dụng [**cognee**](https://www.cognee.ai/) - một bộ nhớ AI mã nguồn mở kết hợp đồ thị tri thức, tìm kiếm ngữ nghĩa và quản lý phiên để tạo ra các hệ thống AI nhận thức ngữ cảnh.\n", + "\n", + "## 🎯 Mục tiêu học tập\n", + "\n", + "Sau khi hoàn thành hướng dẫn này, bạn sẽ hiểu cách:\n", + "- **Xây dựng đồ thị tri thức dựa trên embeddings**: Chuyển đổi văn bản không cấu trúc thành tri thức có cấu trúc, có thể truy vấn\n", + "- **Triển khai bộ nhớ phiên**: Tạo các cuộc hội thoại nhiều lượt với khả năng tự động lưu giữ ngữ cảnh\n", + "- **Lưu trữ cuộc hội thoại**: Tùy chọn lưu các tương tác quan trọng vào bộ nhớ dài hạn để tham khảo trong tương lai\n", + "- **Truy vấn bằng ngôn ngữ tự nhiên**: Truy cập và tận dụng ngữ cảnh lịch sử trong các cuộc hội thoại mới\n", + "- **Trực quan hóa bộ nhớ**: Khám phá các mối quan hệ trong đồ thị tri thức của tác nhân\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ Những gì bạn sẽ xây dựng\n", + "\n", + "Trong hướng dẫn này, chúng ta sẽ tạo một **Trợ lý Lập trình** với khả năng ghi nhớ lâu dài, bao gồm:\n", + "\n", + "### 1. **Xây dựng cơ sở tri thức**\n", + " - Tiếp nhận thông tin hồ sơ và chuyên môn của nhà phát triển\n", + " - Xử lý các nguyên tắc và thực hành tốt nhất trong lập trình Python\n", + " - Lưu trữ các cuộc hội thoại lịch sử giữa nhà phát triển và trợ lý AI\n", + "\n", + "### 2. **Hội thoại nhận thức theo phiên**\n", + " - Duy trì ngữ cảnh qua nhiều câu hỏi trong cùng một phiên\n", + " - Tự động lưu trữ từng cặp câu hỏi/đáp án để truy xuất hiệu quả\n", + " - Cung cấp các phản hồi mạch lạc, có ngữ cảnh dựa trên lịch sử hội thoại\n", + "\n", + "### 3. **Bộ nhớ dài hạn**\n", + " - Lưu trữ các cuộc hội thoại quan trọng vào bộ nhớ dài hạn\n", + " - Truy xuất các ký ức liên quan từ cơ sở tri thức và các phiên trước để hỗ trợ tương tác mới\n", + " - Xây dựng cơ sở tri thức ngày càng phát triển và cải thiện theo thời gian\n", + "\n", + "### 4. **Truy xuất ký ức thông minh**\n", + " - Sử dụng tìm kiếm ngữ nghĩa dựa trên đồ thị để tìm thông tin liên quan trong toàn bộ dữ liệu đã lưu trữ\n", + " - Lọc tìm kiếm theo các nhóm dữ liệu con (thông tin nhà phát triển so với nguyên tắc)\n", + " - Kết hợp nhiều nguồn dữ liệu để cung cấp câu trả lời toàn diện\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 Yêu cầu & Cài đặt\n", + "\n", + "### Yêu cầu hệ thống\n", + "\n", + "Trước khi bắt đầu, hãy đảm bảo bạn có:\n", + "\n", + "1. **Môi trường Python**\n", + " - Python 3.9 hoặc cao hơn\n", + " - Môi trường ảo (khuyến nghị)\n", + " \n", + "2. **Redis Cache** (Yêu cầu cho Quản lý Phiên)\n", + " - Redis cục bộ: `docker run -d -p 6379:6379 redis`\n", + " - Hoặc sử dụng dịch vụ Redis được quản lý\n", + " \n", + "3. **Truy cập API LLM**\n", + " - Khóa API OpenAI hoặc các nhà cung cấp khác (xem [tài liệu](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **Cấu hình cơ sở dữ liệu**\n", + " - Không cần cấu hình theo mặc định. Cognee sử dụng cơ sở dữ liệu dựa trên tệp (LanceDB và Kuzu)\n", + " - Tùy chọn, bạn có thể thiết lập Azure AI Search làm kho vector (xem [tài liệu](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### Cấu hình môi trường\n", + "\n", + "Tạo tệp `.env` trong thư mục dự án của bạn với các biến sau:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ Hiểu về Kiến trúc Bộ nhớ của Cognee\n", + "\n", + "### Cách Cognee Hoạt Động\n", + "\n", + "Cognee cung cấp một hệ thống bộ nhớ tinh vi vượt xa việc lưu trữ đơn giản theo kiểu key-value:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### Các Thành Phần Chính:\n", + "\n", + "1. **Đồ thị Tri thức**: Lưu trữ các thực thể, mối quan hệ và kết nối ngữ nghĩa\n", + "2. **Vector Embeddings**: Cho phép tìm kiếm ngữ nghĩa trên toàn bộ thông tin được lưu trữ\n", + "3. **Bộ nhớ đệm Phiên**: Duy trì ngữ cảnh hội thoại trong và giữa các phiên\n", + "4. **NodeSets**: Tổ chức dữ liệu thành các danh mục logic để truy xuất mục tiêu\n", + "\n", + "### Các Loại Bộ Nhớ trong Hướng Dẫn Này:\n", + "\n", + "- **Bộ nhớ Dài hạn**: Lưu trữ lâu dài trong đồ thị tri thức\n", + "- **Bộ nhớ Phiên**: Ngữ cảnh hội thoại tạm thời trong bộ nhớ đệm Redis\n", + "- **Bộ nhớ Ngữ nghĩa**: Tìm kiếm tương đồng dựa trên vector trên toàn bộ dữ liệu\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 Cài đặt các gói cần thiết\n", + "\n", + "Cài đặt Cognee với hỗ trợ Redis để quản lý phiên:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 Khởi tạo môi trường và tải thư viện\n", + "\n", + "Đảm bảo rằng:\n", + "1. Redis đang chạy (ví dụ, qua Docker: `docker run -d -p 6379:6379 redis`)\n", + "2. Các biến môi trường được thiết lập trước khi nhập các module cache\n", + "3. Nếu cần, khởi động lại kernel và chạy các cell theo thứ tự\n", + "\n", + "Cell sau sẽ:\n", + "1. Tải các biến môi trường từ `.env`\n", + "2. Cấu hình Cognee với các thiết lập LLM của bạn\n", + "3. Kích hoạt bộ nhớ đệm để quản lý phiên làm việc\n", + "4. Xác minh tất cả các thành phần được kết nối đúng cách\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 Cấu hình Thư mục Lưu trữ\n", + "\n", + "Cognee sử dụng hai thư mục riêng biệt cho các hoạt động của nó:\n", + "- **Data Root**: Lưu trữ các tài liệu đã nhập và dữ liệu đã xử lý\n", + "- **System Root**: Chứa cơ sở dữ liệu đồ thị tri thức và siêu dữ liệu hệ thống\n", + "\n", + "Chúng ta sẽ tạo các thư mục riêng biệt cho hướng dẫn này như sau:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 Đặt lại trạng thái bộ nhớ\n", + "\n", + "Trước khi chúng ta bắt đầu xây dựng hệ thống bộ nhớ, hãy đảm bảo rằng chúng ta đang bắt đầu từ đầu.\n", + "\n", + "> 💡 **Mẹo**: Bạn có thể bỏ qua bước này nếu muốn giữ lại các bộ nhớ hiện có từ các lần chạy trước khi sử dụng notebook này sau.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 Phần 1: Xây dựng cơ sở tri thức\n", + "\n", + "### Nguồn dữ liệu cho Trợ lý Nhà phát triển của chúng ta\n", + "\n", + "Chúng ta sẽ thu thập ba loại dữ liệu để tạo ra một cơ sở tri thức toàn diện:\n", + "\n", + "1. **Hồ sơ nhà phát triển**: Chuyên môn cá nhân và nền tảng kỹ thuật\n", + "2. **Các thực hành tốt nhất về Python**: Triết lý Zen của Python cùng các hướng dẫn thực tiễn\n", + "3. **Các cuộc hội thoại lịch sử**: Các phiên hỏi đáp trước đây giữa nhà phát triển và trợ lý AI\n", + "\n", + "Dữ liệu đa dạng này cho phép tác nhân của chúng ta:\n", + "- Hiểu được bối cảnh kỹ thuật của người dùng\n", + "- Áp dụng các thực hành tốt nhất trong các khuyến nghị\n", + "- Học hỏi từ những tương tác thành công trước đó\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 Xử lý Dữ liệu thành Đồ thị Tri thức\n", + "\n", + "Bây giờ chúng ta sẽ chuyển đổi văn bản thô thành một bộ nhớ có cấu trúc. Quá trình này:\n", + "\n", + "1. **Thêm dữ liệu vào NodeSets**: Tổ chức thông tin thành các danh mục hợp lý\n", + " - `developer_data`: Hồ sơ nhà phát triển và các cuộc trò chuyện\n", + " - `principles_data`: Các thực hành tốt nhất và hướng dẫn Python\n", + "\n", + "2. **Chạy Cognify Pipeline**: Trích xuất thực thể, mối quan hệ và tạo embeddings\n", + " - Xác định các khái niệm chính\n", + " - Tạo kết nối ngữ nghĩa giữa các thông tin liên quan\n", + " - Tạo vector embeddings\n", + "\n", + "Quá trình này có thể mất một chút thời gian khi LLM xử lý văn bản và xây dựng cấu trúc đồ thị:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 Trực quan hóa Đồ thị Kiến thức\n", + "\n", + "Hãy khám phá cấu trúc của đồ thị kiến thức của chúng ta. Hình ảnh trực quan hiển thị:\n", + "- **Nút**: Các thực thể được trích xuất từ văn bản (khái niệm, công nghệ, con người)\n", + "- **Cạnh**: Các mối quan hệ và kết nối giữa các thực thể\n", + "- **Cụm**: Các khái niệm liên quan được nhóm lại theo sự tương đồng ngữ nghĩa\n", + "\n", + "Mở tệp HTML đã tạo trong trình duyệt của bạn để khám phá đồ thị một cách tương tác:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 Làm giàu trí nhớ với Memify\n", + "\n", + "Hàm `memify()` phân tích đồ thị tri thức và tạo ra các quy tắc thông minh về dữ liệu. Quá trình này:\n", + "- Xác định các mẫu và thực tiễn tốt nhất\n", + "- Tạo ra các hướng dẫn có thể hành động dựa trên nội dung\n", + "- Thiết lập mối quan hệ giữa các lĩnh vực tri thức khác nhau\n", + "\n", + "Những quy tắc này giúp tác nhân đưa ra quyết định sáng suốt hơn khi trả lời câu hỏi. Việc chụp một hình ảnh trực quan thứ hai giúp bạn so sánh cách đồ thị trở nên dày đặc hơn sau khi được làm giàu.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 Phần 2: Truy xuất thông tin thông minh\n", + "\n", + "### Minh họa 1: Tích hợp kiến thức từ nhiều tài liệu\n", + "\n", + "Bây giờ khi đồ thị tri thức của chúng ta đã được xây dựng, hãy kiểm tra cách Cognee kết hợp thông tin từ nhiều nguồn để trả lời các câu hỏi phức tạp.\n", + "\n", + "Truy vấn đầu tiên minh họa:\n", + "- **Hiểu ngữ nghĩa**: Tìm các khái niệm liên quan ngay cả khi không được đề cập rõ ràng\n", + "- **Tham chiếu chéo**: Kết hợp hồ sơ nhà phát triển với các nguyên tắc Python\n", + "- **Lý luận theo ngữ cảnh**: Áp dụng các thực hành tốt nhất vào các triển khai cụ thể\n", + "\n", + "### Minh họa 2: Tìm kiếm có lọc với NodeSets\n", + "\n", + "Truy vấn thứ hai cho thấy cách nhắm mục tiêu vào các tập hợp con cụ thể của đồ thị tri thức:\n", + "- Sử dụng tham số `node_name` để chỉ tìm kiếm trong `principles_data`\n", + "- Cung cấp câu trả lời tập trung từ một miền tri thức cụ thể\n", + "- Hữu ích khi bạn cần thông tin chuyên biệt theo miền\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 Phần 3: Thiết lập Quản lý Phiên\n", + "\n", + "### Kích hoạt Bộ nhớ Hội thoại\n", + "\n", + "Quản lý phiên rất quan trọng để duy trì ngữ cảnh qua nhiều tương tác. Ở đây chúng ta sẽ:\n", + "\n", + "1. **Khởi tạo Ngữ cảnh Người dùng**: Tạo hoặc truy xuất hồ sơ người dùng để theo dõi phiên\n", + "2. **Cấu hình Bộ nhớ Cache**: Kết nối với Redis để lưu trữ lịch sử hội thoại\n", + "3. **Kích hoạt Biến Phiên**: Thiết lập các biến ngữ cảnh duy trì qua các truy vấn\n", + "\n", + "> ⚠️ **Quan trọng**: Điều này yêu cầu Redis đang chạy và `CACHING=true` trong môi trường của bạn\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ Hàm Hỗ Trợ: Xem Lịch Sử Phiên\n", + "\n", + "Hàm tiện ích này cho phép chúng ta kiểm tra lịch sử hội thoại được lưu trữ trong Redis. Nó hữu ích cho:\n", + "- Gỡ lỗi quản lý phiên\n", + "- Xác minh rằng các hội thoại đang được lưu vào bộ nhớ đệm\n", + "- Hiểu rõ ngữ cảnh nào đang có sẵn cho tác nhân\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## Phiên 1: Phòng thí nghiệm hỗ trợ bất đồng bộ — Câu hỏi đầu tiên\n", + "\n", + "Bắt đầu phiên `async-support-lab` bằng cách hỏi về các mẫu asyncio thân thiện với việc thu thập dữ liệu từ xa cho một trình thu thập dữ liệu web quy mô lớn. Biểu đồ đã biết về asyncio, aiohttp và các thực hành giám sát, vì vậy câu trả lời nên phản ánh các cuộc trò chuyện trước đó đồng thời điều chỉnh câu trả lời cho câu hỏi mới.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## Kiểm tra Bộ nhớ Phiên 1 Sau Lần Trao Đổi Đầu Tiên\n", + "\n", + "Chạy `show_history(session_1)` ngay sau câu hỏi ban đầu xác nhận rằng Cognee đã ghi cả phần gợi ý và phần hoàn thành vào Redis. Bạn sẽ thấy một mục với hướng dẫn về tính đồng thời.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## Phiên 1: Theo dõi về Mô hình Dữ liệu\n", + "\n", + "Tiếp theo, chúng ta đặt câu hỏi, \"Khi nào tôi nên chọn dataclasses thay vì Pydantic?\" sử dụng cùng một id phiên. Cognee nên kết hợp các nguyên tắc Python cùng với các cuộc thảo luận FastAPI trước đó để đưa ra lời khuyên chi tiết—cho thấy rằng ngữ cảnh được duy trì trong một phiên có tên.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## Xác nhận Lịch sử Phiên 1 Chứa Cả Hai Lượt\n", + "\n", + "Một lần gọi `show_history(session_1)` khác nên hiển thị hai mục Hỏi & Đáp. Điều này phù hợp với bước \"phát lại bộ nhớ\" của phòng thí nghiệm Mem0 và chứng minh rằng các lượt bổ sung sẽ mở rộng cùng một bản ghi.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## Phiên 2: Chuỗi Đánh Giá Thiết Kế — Phiên Mới\n", + "\n", + "Để thể hiện sự tách biệt giữa các chuỗi, chúng tôi khởi chạy `design-review-session` và yêu cầu hướng dẫn ghi nhật ký cho các đánh giá sự cố. Mặc dù cơ sở kiến thức cơ bản là giống nhau, nhưng id phiên mới giữ cho các bản ghi chép được tách biệt.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## Xem lại Phiên 2 Lịch sử\n", + "\n", + "`show_history(session_2)` chỉ nên liệt kê cặp yêu cầu/phản hồi trong buổi đánh giá thiết kế. So sánh với Phiên 1 để làm rõ cách Cognee giữ các bản ghi độc lập trong khi tái sử dụng đồ thị tri thức chung.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## Tóm tắt\n", + "\n", + "Chúc mừng bạn! Bạn vừa trang bị cho trợ lý lập trình của mình một lớp trí nhớ dài hạn thực sự nhờ vào Cognee.\n", + "\n", + "Trong hướng dẫn này, bạn đã lấy nội dung thô của nhà phát triển (mã nguồn, tài liệu, cuộc trò chuyện) và biến nó thành một đồ thị + trí nhớ vector mà tác nhân của bạn có thể tìm kiếm, suy luận và cải thiện liên tục.\n", + "\n", + "Những gì bạn đã học được\n", + "\n", + "1. **Từ văn bản thô đến trí nhớ AI**: Cách Cognee tiếp nhận dữ liệu không có cấu trúc và biến nó thành trí nhớ thông minh, có thể tìm kiếm được bằng cách sử dụng kiến trúc kết hợp giữa vector + đồ thị tri thức.\n", + "\n", + "2. **Làm giàu đồ thị với memify**: Cách vượt qua việc tạo đồ thị cơ bản và sử dụng memify để thêm các thông tin suy diễn và mối quan hệ phong phú hơn vào đồ thị hiện có của bạn.\n", + "\n", + "3. **Nhiều chiến lược tìm kiếm**: Cách truy vấn trí nhớ với các loại tìm kiếm khác nhau (Hỏi & Đáp nhận thức đồ thị, hoàn thành kiểu RAG, thông tin chi tiết, đoạn thô, tìm kiếm mã, v.v.) tùy thuộc vào nhu cầu của tác nhân.\n", + "\n", + "4. **Khám phá trực quan**: Cách kiểm tra và gỡ lỗi những gì Cognee đã xây dựng bằng cách sử dụng hình ảnh hóa đồ thị và giao diện người dùng Cognee, để bạn có thể thực sự thấy cách kiến thức được cấu trúc.\n", + "\n", + "5. **Trí nhớ nhận thức theo phiên**: Cách kết hợp ngữ cảnh theo từng phiên với trí nhớ ngữ nghĩa liên tục để các tác nhân có thể ghi nhớ qua các lần chạy mà không làm rò rỉ thông tin giữa các người dùng.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## Những Điểm Chính\n", + "1. Bộ nhớ như một Đồ thị Kiến thức được hỗ trợ bởi Embeddings\n", + "\n", + " - **Hiểu biết có cấu trúc**: Cognee kết hợp một kho vector và một kho đồ thị để dữ liệu của bạn vừa có thể tìm kiếm theo ý nghĩa vừa được kết nối bởi các mối quan hệ. Cognee mặc định sử dụng cơ sở dữ liệu dựa trên tệp (LanceDB cho vector, Kuzu cho cơ sở dữ liệu đồ thị).\n", + "\n", + " - **Truy xuất nhận thức mối quan hệ**: Câu trả lời không chỉ dựa trên “văn bản tương tự” mà còn dựa vào cách các thực thể liên kết với nhau.\n", + "\n", + " - **Bộ nhớ sống động**: Lớp bộ nhớ phát triển, mở rộng và luôn có thể truy vấn như một đồ thị được kết nối.\n", + "\n", + "2. Chế độ Tìm kiếm & Lý luận\n", + " - **Truy xuất kết hợp**: Tìm kiếm kết hợp sự tương đồng vector, cấu trúc đồ thị và lý luận LLM, từ việc tra cứu đoạn văn bản thô đến trả lời câu hỏi nhận thức đồ thị.\n", + "\n", + " - **Phù hợp chế độ với công việc**: Sử dụng chế độ kiểu hoàn thành khi bạn muốn câu trả lời ngôn ngữ tự nhiên, và chế độ đoạn văn/tóm tắt/đồ thị khi tác nhân của bạn cần ngữ cảnh thô hoặc để tự đưa ra lý luận.\n", + "\n", + "3. Tác nhân Cá nhân hóa, Nhận thức Phiên làm việc\n", + " - **Ngữ cảnh phiên làm việc + bộ nhớ dài hạn**: Cognee giữ ngữ cảnh “chuỗi” ngắn hạn tách biệt với bộ nhớ dài hạn ở cấp độ người dùng hoặc tổ chức.\n", + "\n", + "## Ứng Dụng Thực Tế\n", + "\n", + "1. **Tác nhân AI Chuyên ngành**\n", + "\n", + " Sử dụng mẫu từ notebook này để cung cấp năng lượng cho các trợ lý thông minh theo lĩnh vực, hoạt động dựa trên Cognee như lõi truy xuất và lý luận của chúng:\n", + "\n", + "- **Trợ lý nhà phát triển**: Xem xét mã, phân tích sự cố, và trợ lý kiến trúc có thể duyệt qua mã, API, tài liệu thiết kế, và các ticket như một đồ thị bộ nhớ duy nhất.\n", + "\n", + "- **Trợ lý hướng khách hàng**: Các tác nhân hỗ trợ hoặc thành công có thể truy xuất từ tài liệu sản phẩm, FAQ, ghi chú CRM, và các ticket trước đây với truy xuất nhận thức đồ thị và câu trả lời có trích dẫn.\n", + "\n", + "- **Trợ lý chuyên gia nội bộ**: Trợ lý về chính sách, pháp lý, hoặc bảo mật có thể lý luận dựa trên các quy tắc, hướng dẫn, và quyết định lịch sử được kết nối thay vì các tệp PDF riêng lẻ.\n", + "\n", + " Cognee được định vị rõ ràng như bộ nhớ chính xác, lâu dài cho các tác nhân AI, cung cấp một đồ thị kiến thức sống động thay thế các kết hợp tùy chỉnh giữa kho vector và mã đồ thị.\n", + "\n", + "2. **Hợp nhất Các Kho Dữ liệu thành Một Bộ nhớ**\n", + "\n", + " Cách tiếp cận tương tự cũng giúp bạn xây dựng một lớp bộ nhớ thống nhất trên các nguồn phân tán:\n", + "\n", + "- **Từ các kho dữ liệu đến một đồ thị**: Nhập dữ liệu có cấu trúc (ví dụ: cơ sở dữ liệu) và dữ liệu không cấu trúc (ví dụ: tài liệu, cuộc trò chuyện) vào một đồ thị duy nhất được hỗ trợ bởi embeddings, thay vì các chỉ mục riêng biệt cho từng hệ thống.\n", + "\n", + "- **Lý luận qua các nguồn với trích dẫn**: Thực hiện lý luận nhiều bước trên tất cả—“kết hợp” nhật ký, số liệu, và tài liệu qua đồ thị—và vẫn trả về câu trả lời có căn cứ với nguồn gốc.\n", + "\n", + "- **Trung tâm kiến thức**: Đối với các lĩnh vực như ngân hàng hoặc giáo dục, Cognee đã được sử dụng để hợp nhất các tệp PDF, hệ thống nội bộ, và dữ liệu ứng dụng thành một đồ thị kiến thức với vector để các tác nhân có thể trả lời câu hỏi với ngữ cảnh chính xác, có trích dẫn.\n", + "\n", + "## Các Bước Tiếp Theo\n", + "\n", + "Bạn đã triển khai vòng lặp bộ nhớ cốt lõi. Dưới đây là các phần mở rộng tự nhiên bạn có thể thử (xem [tài liệu Cognee](https://docs.cognee.ai/) để biết chi tiết):\n", + "\n", + "1. **Thử nghiệm với nhận thức thời gian**: Bật tính năng nhận thức thời gian để trích xuất sự kiện và dấu thời gian từ văn bản.\n", + "\n", + "2. **Giới thiệu lý luận dựa trên ontology**: Xác định một ontology OWL cho lĩnh vực của bạn. Sử dụng hỗ trợ ontology của Cognee để các thực thể và mối quan hệ được trích xuất được gắn vào schema đó, cải thiện chất lượng đồ thị và câu trả lời cụ thể theo lĩnh vực.\n", + "\n", + "3. **Thêm vòng phản hồi**: Để Cognee điều chỉnh trọng số cạnh đồ thị từ phản hồi thực tế của người dùng, giúp truy xuất cải thiện theo thời gian thay vì giữ nguyên.\n", + "\n", + "4. **Tùy chỉnh cho cá nhân hóa & hành vi phiên làm việc**: Sử dụng ID người dùng, tenant, và tập dữ liệu để cung cấp cho mỗi người hoặc nhóm một góc nhìn riêng trên động cơ bộ nhớ chia sẻ.\n", + "\n", + "5. **Mở rộng ra các tác nhân phức tạp hơn**: Kết nối Cognee vào các framework tác nhân để xây dựng hệ thống đa tác nhân, tất cả đều chia sẻ cùng một lớp bộ nhớ. *Microsoft Agent Framework x Cognee plugin sẽ sớm ra mắt.*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**Tuyên bố miễn trừ trách nhiệm**: \nTài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn thông tin chính thức. Đối với thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp từ con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này.\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T14:12:36+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "vi" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/vi/13-agent-memory/README.md b/translations/vi/13-agent-memory/README.md index 3a5d2f0c2..262f06404 100644 --- a/translations/vi/13-agent-memory/README.md +++ b/translations/vi/13-agent-memory/README.md @@ -1,8 +1,8 @@ **Tuyên bố miễn trừ trách nhiệm**: -Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn thông tin chính thức. Đối với các thông tin quan trọng, khuyến nghị sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này. \ No newline at end of file +Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn thông tin chính thức. Đối với thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này. + \ No newline at end of file diff --git a/translations/zh/13-agent-memory/13-agent-memory-cognee.ipynb b/translations/zh/13-agent-memory/13-agent-memory-cognee.ipynb new file mode 100644 index 000000000..f00450cc8 --- /dev/null +++ b/translations/zh/13-agent-memory/13-agent-memory-cognee.ipynb @@ -0,0 +1,935 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7a807409", + "metadata": {}, + "source": [ + "# 使用 Cognee 构建具有持久记忆的 AI 代理\n", + "\n", + "本笔记本演示了如何使用 [**cognee**](https://www.cognee.ai/) 构建具有复杂记忆功能的智能 AI 代理。Cognee 是一种开源的 AI 记忆系统,它结合了知识图谱、语义搜索和会话管理,能够创建具有上下文感知能力的 AI 系统。\n", + "\n", + "## 🎯 学习目标\n", + "\n", + "通过本教程,你将学会:\n", + "- **构建基于嵌入的知识图谱**:将非结构化文本转化为结构化、可查询的知识\n", + "- **实现会话记忆**:创建多轮对话并自动保留上下文\n", + "- **持久化对话**:可选择将重要的交互存储在长期记忆中以供将来参考\n", + "- **使用自然语言查询**:在新对话中访问并利用历史上下文\n", + "- **可视化记忆**:探索代理知识图谱中的关系\n" + ] + }, + { + "cell_type": "markdown", + "id": "e5195e5f", + "metadata": {}, + "source": [ + "## 🏗️ 您将构建的内容\n", + "\n", + "在本教程中,我们将创建一个具有持久记忆的**编码助手**,其功能包括:\n", + "\n", + "### 1. **知识库构建**\n", + " - 获取开发者的个人资料和专业信息\n", + " - 处理 Python 编程原则和最佳实践\n", + " - 存储开发者与 AI 助手之间的历史对话\n", + "\n", + "### 2. **会话感知对话**\n", + " - 在同一会话中保持上下文关联\n", + " - 自动缓存每个问题/答案对以提高检索效率\n", + " - 基于对话历史提供连贯且有上下文的回复\n", + "\n", + "### 3. **长期记忆**\n", + " - 将重要对话存储到长期记忆中\n", + " - 从知识库和过去的会话中检索相关记忆以辅助新交互\n", + " - 构建一个不断增长的知识库,随着时间推移不断改进\n", + "\n", + "### 4. **智能记忆检索**\n", + " - 使用图感知语义搜索在所有存储的知识中查找相关信息\n", + " - 按数据子组(开发者信息 vs. 编程原则)过滤搜索\n", + " - 结合多个数据源提供全面的答案\n" + ] + }, + { + "cell_type": "markdown", + "id": "e10fdf9d", + "metadata": {}, + "source": [ + "## 📋 前置条件与设置\n", + "\n", + "### 系统要求\n", + "\n", + "在开始之前,请确保您具备以下条件:\n", + "\n", + "1. **Python 环境**\n", + " - Python 3.9 或更高版本\n", + " - 推荐使用虚拟环境\n", + "\n", + "2. **Redis 缓存**(用于会话管理,必需)\n", + " - 本地 Redis: `docker run -d -p 6379:6379 redis`\n", + " - 或使用托管的 Redis 服务\n", + "\n", + "3. **LLM API 访问**\n", + " - OpenAI API 密钥或其他提供商(参见[文档](https://docs.cognee.ai/setup-configuration/llm-providers))\n", + "\n", + "4. **数据库配置**\n", + " - 默认无需配置。Cognee 使用基于文件的数据库(LanceDB 和 Kuzu)\n", + " - 可选:您可以设置 Azure AI Search 作为向量存储(参见[文档](https://github.com/topoteretes/cognee-community/tree/main/packages/vector/azureaisearch))\n", + "\n", + "### 环境配置\n", + "\n", + "在您的项目目录中创建一个 `.env` 文件,并包含以下变量:\n", + "\n", + "```ini\n", + "# LLM Configuration (Required)\n", + "LLM_API_KEY=your-openai-api-key-here\n", + "\n", + "# Cache Configuration (Required for Sessions)\n", + "CACHING=true # Must be enabled for session history\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "c712f70d", + "metadata": {}, + "source": [ + "## 🏛️ 理解Cognee的记忆架构\n", + "\n", + "### Cognee的工作原理\n", + "\n", + "Cognee提供了一个复杂的记忆系统,超越了简单的键值存储:\n", + "\n", + "```\n", + "┌──────────────────────────┐\n", + "│ 30+ data sources │\n", + "└───────────┬──────────────┘\n", + " │\n", + " ▼\n", + "┌──────────────────────────────────────────┐\n", + "│ Dynamically evolving memory layers │\n", + "│ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Knowledge Graph in Graph Database │ │\n", + "│ └────────────────────────────────────┘ │\n", + "│ ┌────────────────────────────────────┐ │\n", + "│ │ Embeddings in Vector Store │ │\n", + "│ │ (e.g., Azure AI Search) │ │\n", + "│ └────────────────────────────────────┘ │\n", + "└───────────┬──────────────────────────────┘\n", + " │ ▲ \n", + " ▼ │(optional)\n", + "┌────────────────┐ ┌────────────────┐\n", + "│ cognee │(optional) │ Cognee Session │\n", + "│ retrievers │──────────▶│ Cache │\n", + "│ │ │ (Redis) │\n", + "└───────┬────────┘ └────────────────┘\n", + " ▲\n", + " │\n", + "┌──────────────────────────┐\n", + "│ Agents │\n", + "└──────────────────────────┘\n", + "\n", + "```\n", + "\n", + "### 关键组件:\n", + "\n", + "1. **知识图谱**:存储实体、关系和语义连接\n", + "2. **向量嵌入**:支持对所有存储信息的语义搜索\n", + "3. **会话缓存**:在会话内及跨会话维持对话上下文\n", + "4. **节点集**:将数据组织成逻辑类别以便于目标检索\n", + "\n", + "### 本教程中的记忆类型:\n", + "\n", + "- **持久记忆**:知识图谱中的长期存储\n", + "- **会话记忆**:Redis缓存中的临时对话上下文\n", + "- **语义记忆**:基于向量的相似性搜索覆盖所有数据\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cadf87c", + "metadata": {}, + "source": [ + "## 📦 安装所需软件包\n", + "\n", + "安装带有 Redis 支持的 Cognee 以进行会话管理:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b92b2d1", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install --quiet \"cognee[redis]==0.4.0\"" + ] + }, + { + "cell_type": "markdown", + "id": "e0048beb", + "metadata": {}, + "source": [ + "## 🔧 初始化环境并加载库\n", + "\n", + "确保:\n", + "1. Redis 正在运行(例如,通过 Docker:`docker run -d -p 6379:6379 redis`)\n", + "2. 在导入缓存模块之前设置环境变量\n", + "3. 如果需要,重新启动内核并按顺序运行单元格\n", + "\n", + "以下单元格将会:\n", + "1. 从 `.env` 文件加载环境变量\n", + "2. 使用您的 LLM 设置配置 Cognee\n", + "3. 启用会话管理的缓存功能\n", + "4. 验证所有组件是否正确连接\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "136f5f09", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "from dotenv import load_dotenv\n", + "\n", + "# Load environment variables\n", + "load_dotenv()\n", + "\n", + "# cognee Configuration\n", + "os.environ[\"LLM_API_KEY\"] = os.getenv(\"LLM_API_KEY\", None)\n", + "os.environ[\"CACHING\"] = os.getenv(\"CACHING\", \"true\")\n", + "\n", + "\n", + "import cognee\n", + "\n", + "print(f\"Cognee version: {cognee.__version__}\")\n", + "print(f\"CACHING: {os.environ.get('CACHING')}\")\n", + "print(f\"LLM_API_KEY: {os.environ.get('LLM_API_KEY')}\")" + ] + }, + { + "cell_type": "markdown", + "id": "e2c029e9", + "metadata": {}, + "source": [ + "## 📁 配置存储目录\n", + "\n", + "Cognee 使用两个独立的目录进行操作:\n", + "- **数据根目录**:存储已导入的文档和处理后的数据\n", + "- **系统根目录**:包含知识图谱数据库和系统元数据\n", + "\n", + "在本教程中,我们将创建独立的目录,如下所示:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c0011f23", + "metadata": {}, + "outputs": [], + "source": [ + "DATA_ROOT = Path('.data_storage').resolve()\n", + "SYSTEM_ROOT = Path('.cognee_system').resolve()\n", + "\n", + "DATA_ROOT.mkdir(parents=True, exist_ok=True)\n", + "SYSTEM_ROOT.mkdir(parents=True, exist_ok=True)\n", + "\n", + "cognee.config.data_root_directory(str(DATA_ROOT))\n", + "cognee.config.system_root_directory(str(SYSTEM_ROOT))\n", + "\n", + "print(f\"Data root: {DATA_ROOT}\")\n", + "print(f\"System root: {SYSTEM_ROOT}\")" + ] + }, + { + "cell_type": "markdown", + "id": "06eb31e1", + "metadata": {}, + "source": [ + "## 🧹 重置记忆状态\n", + "\n", + "在我们开始构建记忆系统之前,先确保我们从头开始。\n", + "\n", + "> 💡 **提示**:如果您希望在以后使用此笔记本时保留之前运行的现有记忆,可以跳过此步骤。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8df6adcd", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.prune.prune_data()\n", + "await cognee.prune.prune_system(metadata=True)\n", + "print('Cleared previous Cognee state.')" + ] + }, + { + "cell_type": "markdown", + "id": "4386bd5e", + "metadata": {}, + "source": [ + "## 📚 第1部分:构建知识库\n", + "\n", + "### 我们开发者助手的数据来源\n", + "\n", + "我们将引入三种类型的数据来创建一个全面的知识库:\n", + "\n", + "1. **开发者档案**:个人专业知识和技术背景 \n", + "2. **Python最佳实践**:Python之禅及其实用指南 \n", + "3. **历史对话**:开发者与AI助手之间的过去问答记录 \n", + "\n", + "这些多样化的数据使我们的代理能够: \n", + "- 理解用户的技术背景 \n", + "- 在推荐中应用最佳实践 \n", + "- 从以往成功的互动中学习 \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "448056c6", + "metadata": {}, + "outputs": [], + "source": [ + "developer_intro = (\n", + " \"Hi, I'm an AI/Backend engineer. \"\n", + " \"I build FastAPI services with Pydantic, heavy asyncio/aiohttp pipelines, \"\n", + " \"and production testing via pytest-asyncio. \"\n", + " \"I've shipped low-latency APIs on AWS, Azure, and GoogleCloud.\"\n", + ")\n", + "\n", + "python_zen_principles = (\n", + " \"\"\"\n", + " # The Zen of Python: Practical Guide\n", + "\n", + " ## Overview\n", + " Use these principles as a checklist during design, coding, and reviews.\n", + "\n", + " ## Key Principles With Guidance\n", + "\n", + " ### 1. Beautiful is better than ugly\n", + " Prefer descriptive names, clear structure, and consistent formatting.\n", + "\n", + " ### 2. Explicit is better than implicit\n", + " Be clear about behavior, imports, and types.\n", + " ```python\n", + " from datetime import datetime, timedelta\n", + "\n", + " def get_future_date(days_ahead: int) -> datetime:\n", + " return datetime.now() + timedelta(days=days_ahead)\n", + " ```\n", + "\n", + " ### 3. Simple is better than complex\n", + " Choose straightforward solutions first.\n", + "\n", + " ### 4. Complex is better than complicated\n", + " When complexity is needed, organize it with clear abstractions.\n", + "\n", + " ### 5. Flat is better than nested\n", + " Use early returns to reduce indentation.\n", + "\n", + " ## Modern Python Tie-ins\n", + " - Type hints reinforce explicitness\n", + " - Context managers enforce safe resource handling\n", + " - Dataclasses improve readability for data containers\n", + "\n", + " ## Quick Review Checklist\n", + " - Is it readable and explicit?\n", + " - Is this the simplest working solution?\n", + " - Are errors explicit and logged?\n", + " - Are modules/namespaces used appropriately?\n", + " \"\"\"\n", + ")\n", + "\n", + "human_agent_conversations = (\n", + " \"\"\"\n", + " \"conversations\": [\n", + " {\n", + " \"id\": \"conv_001\",\n", + " \"timestamp\": \"2024-01-15T10:30:00Z\",\n", + " \"topic\": \"async/await patterns\",\n", + " \"user_query\": \"I'm building a web scraper that needs to handle thousands of URLs concurrently. What's the best way to structure this with asyncio?\",\n", + " \"assistant_response\": \"Use asyncio with aiohttp, a semaphore to cap concurrency, TCPConnector for connection pooling, context managers for session lifecycle, and robust exception handling for failed requests.\",\n", + " \"code_context\": {\n", + " \"file\": \"scraper.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"async/await\", \"context_managers\", \"semaphores\", \"aiohttp\", \"error_handling\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I add retry logic for failed requests?\",\n", + " \"What's the best way to parse the scraped HTML content?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_002\",\n", + " \"timestamp\": \"2024-01-16T14:20:00Z\",\n", + " \"topic\": \"dataclass vs pydantic\",\n", + " \"user_query\": \"When should I use dataclasses vs Pydantic models? I'm building an API and need to handle user input validation.\",\n", + " \"assistant_response\": \"For API input/output, prefer Pydantic: it provides runtime validation, type coercion, JSON serialization, enums for roles, field constraints, and custom validators; integrates cleanly with FastAPI for automatic request validation and error reporting.\",\n", + " \"code_context\": {\n", + " \"file\": \"models.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pydantic\", \"dataclasses\", \"validation\", \"fastapi\", \"type_hints\", \"enums\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I handle nested validation with Pydantic?\",\n", + " \"Can I use Pydantic with SQLAlchemy models?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_003\",\n", + " \"timestamp\": \"2024-01-17T09:15:00Z\",\n", + " \"topic\": \"testing patterns\",\n", + " \"user_query\": \"I'm struggling with testing async code and database interactions. What's the best approach for pytest with async functions?\",\n", + " \"assistant_response\": \"Recommended using pytest-asyncio, async fixtures, and an isolated test database or mocks to reliably test async functions and database interactions in FastAPI.\",\n", + " \"code_context\": {\n", + " \"file\": \"test_users.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"pytest\", \"async_testing\", \"fixtures\", \"mocking\", \"database_testing\", \"fastapi_testing\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I test WebSocket connections?\",\n", + " \"What's the best way to test database migrations?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_004\",\n", + " \"timestamp\": \"2024-01-18T16:45:00Z\",\n", + " \"topic\": \"performance optimization\",\n", + " \"user_query\": \"My FastAPI app is getting slow with large datasets. How can I optimize database queries and response times?\",\n", + " \"assistant_response\": \"Suggested optimizing database queries (indexes, pagination, selecting only needed columns), adding caching, streaming or chunked responses for large datasets, background tasks for heavy work, and monitoring to find bottlenecks.\",\n", + " \"code_context\": {\n", + " \"file\": \"optimizations.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"performance_optimization\", \"caching\", \"database_optimization\", \"async_patterns\", \"monitoring\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I implement database connection pooling properly?\",\n", + " \"What's the best way to handle memory usage with large datasets?\"\n", + " ]\n", + " },\n", + " {\n", + " \"id\": \"conv_005\",\n", + " \"timestamp\": \"2024-01-19T11:30:00Z\",\n", + " \"topic\": \"error handling and logging\",\n", + " \"user_query\": \"I need to implement proper error handling and logging across my Python application. What's the best approach for production-ready error management?\",\n", + " \"assistant_response\": \"Proposed centralized error handling with custom exceptions, structured logging, FastAPI middleware or decorators, and integration points for external monitoring/alerting tools.\",\n", + " \"code_context\": {\n", + " \"file\": \"error_handling.py\",\n", + " \"language\": \"python\",\n", + " \"patterns_discussed\": [\"error_handling\", \"logging\", \"exceptions\", \"middleware\", \"decorators\", \"fastapi\"]\n", + " },\n", + " \"follow_up_questions\": [\n", + " \"How do I integrate this with external monitoring tools like Sentry?\",\n", + " \"What's the best way to handle errors in background tasks?\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"total_conversations\": 5,\n", + " \"date_range\": \"2024-01-15 to 2024-01-19\",\n", + " \"topics_covered\": [\n", + " \"async/await patterns\",\n", + " \"dataclass vs pydantic\",\n", + " \"testing patterns\",\n", + " \"performance optimization\",\n", + " \"error handling and logging\"\n", + " ],\n", + " \"code_patterns_discussed\": [\n", + " \"asyncio\", \"aiohttp\", \"semaphores\", \"context_managers\",\n", + " \"pydantic\", \"fastapi\", \"type_hints\", \"validation\",\n", + " \"pytest\", \"async_testing\", \"fixtures\", \"mocking\",\n", + " \"performance_optimization\", \"caching\", \"database_optimization\",\n", + " \"error_handling\", \"logging\", \"exceptions\", \"middleware\"\n", + " ],\n", + " \"difficulty_levels\": {\n", + " \"beginner\": 1,\n", + " \"intermediate\": 2,\n", + " \"advanced\": 2\n", + " }\n", + " }\n", + " \"\"\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cd8f8ae7", + "metadata": {}, + "source": [ + "## 🔄 将数据转化为知识图谱\n", + "\n", + "现在我们将把原始文本转化为结构化的记忆。这个过程包括:\n", + "\n", + "1. **将数据添加到 NodeSets**:将信息组织到逻辑分类中\n", + " - `developer_data`:开发者资料和对话\n", + " - `principles_data`:Python最佳实践和指导原则\n", + "\n", + "2. **运行 Cognify Pipeline**:提取实体、关系并创建嵌入\n", + " - 识别关键概念\n", + " - 在相关信息之间创建语义连接\n", + " - 生成向量嵌入\n", + "\n", + "这可能需要一些时间,因为LLM正在处理文本并构建图谱结构:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea749bab", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.add(developer_intro, node_set=[\"developer_data\"])\n", + "await cognee.add(human_agent_conversations, node_set=[\"developer_data\"])\n", + "await cognee.add(python_zen_principles, node_set=[\"principles_data\"])\n", + "\n", + "await cognee.cognify()" + ] + }, + { + "cell_type": "markdown", + "id": "7e816d20", + "metadata": {}, + "source": [ + "## 📊 可视化知识图谱\n", + "\n", + "让我们来探索知识图谱的结构。可视化内容包括:\n", + "- **节点**:从文本中提取的实体(概念、技术、人物)\n", + "- **边**:实体之间的关系和连接\n", + "- **聚类**:按语义相似性分组的相关概念\n", + "\n", + "在浏览器中打开生成的 HTML 文件,以交互方式探索图谱:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ef436a73", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee import visualize_graph\n", + "await visualize_graph('./visualization_1.html')" + ] + }, + { + "cell_type": "markdown", + "id": "947a7365", + "metadata": {}, + "source": [ + "## 🧠 用 Memify 丰富记忆\n", + "\n", + "`memify()` 函数会分析知识图谱并生成关于数据的智能规则。这个过程:\n", + "- 识别模式和最佳实践\n", + "- 根据内容创建可操作的指导方针\n", + "- 建立不同知识领域之间的关系\n", + "\n", + "这些规则帮助代理在回答问题时做出更明智的决策。捕获第二个可视化可以帮助您比较图谱在丰富后如何变得更加密集。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69e96b12", + "metadata": {}, + "outputs": [], + "source": [ + "await cognee.memify()\n", + "\n", + "await visualize_graph('./visualization_2.html')" + ] + }, + { + "cell_type": "markdown", + "id": "7c0da911", + "metadata": {}, + "source": [ + "## 🔍 第2部分:智能记忆检索\n", + "\n", + "### 示例 1:跨文档知识整合\n", + "\n", + "现在我们的知识图谱已经构建完成,让我们测试一下Cognee如何结合多个来源的信息来回答复杂问题。\n", + "\n", + "第一个查询展示了:\n", + "- **语义理解**:即使未明确提及,也能找到相关概念\n", + "- **交叉引用**:结合开发者档案与Python原则\n", + "- **上下文推理**:将最佳实践应用于具体实现\n", + "\n", + "### 示例 2:使用NodeSets进行筛选搜索\n", + "\n", + "第二个查询展示了如何针对知识图谱的特定子集进行搜索:\n", + "- 使用`node_name`参数仅在`principles_data`中搜索\n", + "- 从特定知识领域提供集中答案\n", + "- 当需要领域特定信息时非常有用\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9a77034d", + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate cross-document knowledge retrieval from multiple data sources\n", + "from cognee.modules.search.types import SearchType\n", + "\n", + "results = await cognee.search(\n", + " query_text=\"How does my AsyncWebScraper implementation align with Python's design principles?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + ")\n", + "print(\"Python Pattern Analysis:\", results)\n", + "\n", + "# demonstrate filtered search using NodeSet to query only specific subsets of memory\n", + "from cognee.modules.engine.models.node_set import NodeSet\n", + "results = await cognee.search(\n", + " query_text=\"How should variables be named?\",\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " node_type=NodeSet,\n", + " node_name=[\"principles_data\"],\n", + ")\n", + "print(\"Filtered search result:\", results)" + ] + }, + { + "cell_type": "markdown", + "id": "dc4dece6", + "metadata": {}, + "source": [ + "## 🔐 第三部分:会话管理设置\n", + "\n", + "### 启用对话记忆\n", + "\n", + "会话管理对于在多次交互中保持上下文至关重要。在这里我们将:\n", + "\n", + "1. **初始化用户上下文**:创建或检索用户档案以进行会话跟踪\n", + "2. **配置缓存引擎**:连接到 Redis 以存储对话历史记录\n", + "3. **启用会话变量**:设置在查询之间持久化的上下文变量\n", + "\n", + "> ⚠️ **重要**:这需要 Redis 正在运行,并且环境中设置了 `CACHING=true`\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "794944bf", + "metadata": {}, + "outputs": [], + "source": [ + "from cognee.modules.users.methods import get_default_user\n", + "from cognee.context_global_variables import set_session_user_context_variable \n", + "from cognee.infrastructure.databases.cache import get_cache_engine\n", + "\n", + "user = await get_default_user()\n", + "await set_session_user_context_variable(user)\n", + "print(f\"Using user id: {getattr(user, 'id', 'unknown')}\")\n", + "\n", + "cache_engine = get_cache_engine()\n", + "if cache_engine is None:\n", + " raise RuntimeError('Cache engine is not available. Double-check your cache configuration.')\n", + "print('Session cache is ready.')\n" + ] + }, + { + "cell_type": "markdown", + "id": "5ea9820b", + "metadata": {}, + "source": [ + "## 🛠️ 辅助函数:查看会话历史\n", + "\n", + "此工具函数允许我们检查存储在 Redis 中的会话历史记录。它的用途包括:\n", + "- 调试会话管理\n", + "- 验证对话是否被缓存\n", + "- 了解代理可用的上下文\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddc87384", + "metadata": {}, + "outputs": [], + "source": [ + "async def show_history(session_id: str) -> None:\n", + " # Let's check the cache directly\n", + " cache_engine = get_cache_engine()\n", + " if cache_engine:\n", + " # Try to get history directly from cache\n", + " user_id = str(user.id) if hasattr(user, 'id') else None\n", + " if user_id:\n", + " history_entries = await cache_engine.get_latest_qa(user_id, session_id, last_n=10)\n", + " print(f\"\\nDirect cache query for user_id={user_id}, session_id={session_id}:\")\n", + " print(f\"Found {len(history_entries)} entries\")\n", + " if history_entries:\n", + " for i, entry in enumerate(history_entries, 1):\n", + " print(f\"\\nEntry {i}:\")\n", + " print(f\" Question: {entry.get('question', 'N/A')[:100]}...\")\n", + " print(f\" Answer: {entry.get('answer', 'N/A')[:100]}...\")\n", + " else:\n", + " print(\"No user_id available\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "4409a744", + "metadata": {}, + "source": [ + "## 第1节:异步支持实验室——第一个问题\n", + "\n", + "开始 `async-support-lab` 课程,询问适用于大规模网页抓取的支持遥测的 asyncio 模式。图谱已经了解 asyncio、aiohttp 和监控实践,因此回答应反映之前的讨论,同时针对新问题进行调整。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c6179fe", + "metadata": {}, + "outputs": [], + "source": [ + "session_1 = \"async-support-lab\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"I'm building a web scraper that hits thousands of URLs concurrently. What's a reliable asyncio pattern with telemetry?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a13bc8c0", + "metadata": {}, + "source": [ + "## 检查会话 1 在第一次交互后的内存\n", + "\n", + "在初始问题后立即运行 `show_history(session_1)` 可以确认 Cognee 已将提示和完成内容都写入了 Redis。你应该会看到一个包含并发指导的条目。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5efa5a3a", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "897156e8", + "metadata": {}, + "source": [ + "## 第1节:数据模型的后续讨论\n", + "\n", + "接下来我们问:“什么时候应该选择 dataclasses 而不是 Pydantic?”使用相同的会话 ID。Cognee 应该结合 Python 原则以及之前关于 FastAPI 的讨论,提供细致的建议——展示在命名会话中上下文是可以延续的。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96eb0479", + "metadata": {}, + "outputs": [], + "source": [ + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"When should I pick dataclasses versus Pydantic for this work?\",\n", + " session_id=session_1\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "a805b433", + "metadata": {}, + "source": [ + "## 确认会话 1 的历史记录包含两个回合\n", + "\n", + "再次调用 `show_history(session_1)` 应该会显示两个问答条目。这与 Mem0 实验室的“记忆重播”步骤相符,并证明了额外的回合会扩展相同的对话记录。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ef51215", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_1)" + ] + }, + { + "cell_type": "markdown", + "id": "7686cbec", + "metadata": {}, + "source": [ + "## 第2节:设计评审线程 — 新会话\n", + "\n", + "为了展示线程之间的隔离,我们启动了 `design-review-session`,并请求关于事件评审的日志指导。尽管底层知识库是相同的,但新的会话 ID 会将记录分开。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e29876d9", + "metadata": {}, + "outputs": [], + "source": [ + "session_2 = \"design-review-session\"\n", + "\n", + "result = await cognee.search(\n", + " query_type=SearchType.GRAPH_COMPLETION,\n", + " query_text=\"We're drafting logging guidance for incident reviews. Capture the key principles please.\",\n", + " session_id=session_2\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c1c522c7", + "metadata": {}, + "source": [ + "## 审查会话 2 历史记录\n", + "\n", + "`show_history(session_2)` 应仅列出设计审查的提示/响应对。将其与会话 1 进行比较,以突出显示 Cognee 如何在重用共享知识图的同时保持独立的记录。\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fdc2d477", + "metadata": {}, + "outputs": [], + "source": [ + "await show_history(session_2)" + ] + }, + { + "cell_type": "markdown", + "id": "def225fb", + "metadata": {}, + "source": [ + "## 总结\n", + "\n", + "恭喜你!你刚刚为你的编码助手添加了一个由 Cognee 提供支持的真正的长期记忆层。\n", + "\n", + "在本教程中,你将原始开发者内容(代码、文档、聊天记录)转化为一个图形 + 向量记忆,使你的代理能够进行搜索、推理并不断改进。\n", + "\n", + "你学到了什么\n", + "\n", + "1. **从原始文本到 AI 记忆**:了解 Cognee 如何摄取非结构化数据,并通过结合向量 + 知识图谱架构将其转化为智能、可搜索的记忆。\n", + "\n", + "2. **通过 memify 丰富图谱**:学习如何超越基本的图谱创建,使用 memify 在现有图谱之上添加推导出的事实和更丰富的关系。\n", + "\n", + "3. **多种搜索策略**:学习如何根据代理的需求,使用不同的搜索类型(图感知问答、RAG 风格补全、洞察、原始片段、代码搜索等)查询记忆。\n", + "\n", + "4. **可视化探索**:学习如何使用图形可视化和 Cognee UI 检查和调试 Cognee 构建的内容,从而直观地了解知识的结构。\n", + "\n", + "5. **会话感知记忆**:学习如何将每次会话的上下文与持久的语义记忆结合起来,使代理能够在多次运行中记住内容,同时避免在用户之间泄露信息。\n" + ] + }, + { + "cell_type": "markdown", + "id": "49959443", + "metadata": {}, + "source": [ + "## 关键要点\n", + "1. 基于嵌入的知识图谱记忆\n", + "\n", + " - **结构化理解**:Cognee结合了向量存储和图存储,使您的数据既可以通过语义搜索,也可以通过关系连接进行检索。Cognee默认使用基于文件的数据库(LanceDB用于向量存储,Kuzu用于图数据库)。\n", + "\n", + " - **关系感知检索**:答案不仅可以基于“相似文本”,还可以基于实体之间的关系。\n", + "\n", + " - **动态记忆**:记忆层不断演变、增长,并作为一个连接的图谱保持可查询。\n", + "\n", + "2. 搜索与推理模式\n", + " - **混合检索**:搜索结合了向量相似性、图结构和LLM推理,从原始块查找到基于图的问答。\n", + "\n", + " - **根据任务选择模式**:当需要自然语言答案时使用补全模式;当代理需要原始上下文或驱动自身推理时使用块/摘要/图模式。\n", + "\n", + "3. 个性化、会话感知的代理\n", + " - **会话上下文 + 长期记忆**:Cognee将短期“线程”上下文与长期用户或组织级记忆分开。\n", + "\n", + "## 实际应用\n", + "\n", + "1. **垂直领域AI代理**\n", + "\n", + " 使用此笔记本中的模式,为基于Cognee的检索和推理核心的领域智能助手提供支持:\n", + "\n", + "- **开发者助手**:代码审查、事件分析和架构助手,能够遍历代码、API、设计文档和工单,作为一个单一的记忆图谱。\n", + "\n", + "- **面向客户的助手**:支持或成功代理,从产品文档、常见问题解答、CRM笔记和过去的工单中提取信息,进行基于图的检索并提供引用答案。\n", + "\n", + "- **内部专家助手**:政策、法律或安全助手,能够基于互相关联的规则、指南和历史决策进行推理,而不是孤立的PDF。\n", + "\n", + " Cognee明确定位为AI代理的持久、准确记忆,提供一个动态知识图谱,作为代理的后端,取代临时组合的向量存储和自定义图代码。\n", + "\n", + "2. **将数据孤岛统一为一个记忆层**\n", + "\n", + " 同样的方法也可以帮助您在分散的来源之间构建统一的记忆层:\n", + "\n", + "- **从孤岛到一个图谱**:将结构化数据(如数据库)和非结构化数据(如文档、聊天记录)导入一个由嵌入支持的单一图谱,而不是为每个系统创建单独的索引。\n", + "\n", + "- **带引用的跨来源推理**:在所有数据上运行多步推理——通过图谱“连接”日志、指标和文档——并仍然返回有出处的答案。\n", + "\n", + "- **知识中心**:在银行或教育等领域,Cognee已经用于将PDF、内部系统和应用数据统一为一个带向量的知识图谱,使代理能够以精确、引用的上下文回答问题。\n", + "\n", + "## 下一步\n", + "\n", + "您已经实现了核心记忆循环。以下是您可以自行尝试的自然扩展(详见 [Cognee文档](https://docs.cognee.ai/)):\n", + "\n", + "1. **尝试时间感知**:开启时间认知功能,从文本中提取事件和时间戳。\n", + "\n", + "2. **引入基于本体的推理**:为您的领域定义一个OWL本体。使用Cognee的本体支持,使提取的实体和关系基于该架构,从而提高图谱质量和领域特定答案。\n", + "\n", + "3. **添加反馈循环**:让Cognee根据真实用户反馈调整图边权重,使检索随着时间的推移不断改进,而不是保持静态。\n", + "\n", + "4. **优化个性化和会话行为**:使用用户ID、租户和数据集,为每个人或团队提供共享记忆引擎的专属视图。\n", + "\n", + "5. **扩展到更复杂的代理**:将Cognee接入代理框架,构建共享同一记忆层的多代理系统。*Microsoft Agent Framework x Cognee插件即将推出。*\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n\n\n**免责声明**: \n本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。\n\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.0" + }, + "coopTranslator": { + "original_hash": "8f66e98ab87f8d72c25e5525d85710a1", + "translation_date": "2025-12-09T13:25:47+00:00", + "source_file": "13-agent-memory/13-agent-memory-cognee.ipynb", + "language_code": "zh" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/translations/zh/13-agent-memory/README.md b/translations/zh/13-agent-memory/README.md index 5510934e2..a1c79d50f 100644 --- a/translations/zh/13-agent-memory/README.md +++ b/translations/zh/13-agent-memory/README.md @@ -1,8 +1,8 @@ **免责声明**: -本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。 \ No newline at end of file +本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于重要信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。 + \ No newline at end of file