[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EC3VX2YRMBGD8BVSXHX6Y4":3,"skill-same:01M6EC3VX2YRMBGD8BVSXHX6Y4":82},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":30,"linkOnly":31,"markdownContent":32,"markdownBody":33,"frontMatter":34,"refName":40,"commitSha":41,"skillDirectory":42,"forksCount":43,"repositoryHtmlUrl":44,"repositoryHomepageUrl":45,"ownerHtmlUrl":46,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":47,"install":48,"resources":61},"01M6EC3VX2YRMBGD8BVSXHX6Y4","rag-implementation",null,"Rag Implementation — Skill especializada para rag implementation","kursku\u002Fskills","kursku","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F15705647?v=4","01M6E5VWJKMRJQ1PNFP2P0PYVZ","01M6E5VWSCHN2C3RVE67795NRC",126,"MIT","https:\u002F\u002Fgithub.com\u002Fkursku\u002Fskills\u002Fblob\u002Fmaster\u002Fpacks\u002Fkit-510-ptbr\u002F12-ia-automacao\u002Frag-implementation\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[23,24,25,26,27,28,29],"rag","rag implementation","implementation","safe","code","para","ia","2026-11-10 10:12:30",false,"---\nname: rag-implementation\ndescription: \"Rag Implementation — Skill especializada para rag implementation\"\nlicense: MIT\nmetadata:\n  version: 1.0.0\n  author: Cafe Code AI\n  category: 12-ia-automacao\n  updated: 2026-03-01\nrisk: safe\n---\n\n# Rag Implementation\n\nCapacita o Claude a projetar, implementar e otimizar sistemas de Retrieval Augmented Generation (RAG) em fluxos de trabalho de automação e chatbots, conectando LLMs a bases de conhecimento externas e atualizadas.\n\n---\n\n## Keywords\n\nRAG, Vector Database, Embeddings, Chunking, Retrieval, Generation, LLM Integration, Semantic Search, Context Window, Pinecone, ChromaDB, Weaviate, LangChain, LlamaIndex, Prompt Engineering, N8N, Make.com, API.\n\n---\n\n## Quick Start\n\n1.  **Escolha e Configure o Banco de Dados Vetorial**: Selecione um provedor como ChromaDB (local\u002Fauto-hospedado) ou Pinecone (nuvem).\n2.  **Prepare a Base de Conhecimento**: Colete documentos (PDFs, Markdown, HTML, CSV) e implemente um script Python para segmentação (chunking) e geração de embeddings.\n3.  **Ingestão de Dados**: Envie os chunks com seus embeddings para o banco de dados vetorial.\n4.  **Fluxo de Consulta RAG**: Receba uma pergunta do usuário, gere seu embedding, consulte o banco vetorial para recuperar os chunks mais relevantes.\n5.  **Geração de Resposta**: Combine os chunks recuperados com a pergunta do usuário em um prompt estruturado para o LLM.\n\n---\n\n## Core Workflows\n\n### Workflow 1: Implementação de RAG com ChromaDB e Make.com para Chatbot de Suporte\n\nEste workflow detalha a criação de um chatbot de suporte que responde a perguntas usando uma base de conhecimento interna armazenada no ChromaDB, orquestrado via Make.com.\n\n**Passos Detalhados:**\n\n1.  **Configuração do ChromaDB**:\n    *   **Instalação (se local)**: `pip install chromadb`\n    *   **Criação de Coleção**:\n        ```python\n        import chromadb\n        from chromadb.utils import embedding_functions\n\n        # Cliente persistente para armazenar dados localmente\n        client = chromadb.PersistentClient(path=\".\u002Fchroma_db\")\n        \n        # Usar um modelo de embedding de HuggingFace via sentence-transformers\n        # Certifique-se de que 'sentence-transformers' está instalado: pip install sentence-transformers\n        ef = embedding_functions.SentenceTransformerEmbeddingFunction(model_name=\"all-MiniLM-L6-v2\")\n\n        collection_name = \"faq_suporte_tecnico\"\n        try:\n            collection = client.get_collection(name=collection_name, embedding_function=ef)\n            print(f\"Coleção '{collection_name}' já existe.\")\n        except:\n            collection = client.create_collection(name=collection_name, embedding_function=ef)\n            print(f\"Coleção '{collection_name}' criada.\")\n        ```\n\n2.  **Ingestão de Documentos (Exemplo de script Python)**:\n    *   Suponha que você tenha um diretório `docs\u002F` com arquivos `.md`.\n    *   **Script `ingest_docs.py`**:\n        ```python\n        import os\n        import chromadb\n        from chromadb.utils import embedding_functions\n        from langchain.text_splitter import RecursiveCharacterTextSplitter\n\n        client = chromadb.PersistentClient(path=\".\u002Fchroma_db\")\n        ef = embedding_functions.SentenceTransformerEmbeddingFunction(model_name=\"all-MiniLM-L6-v2\")\n        collection = client.get_collection(name=\"faq_suporte_tecnico\", embedding_function=ef)\n\n        text_splitter = RecursiveCharacterTextSplitter(\n            chunk_size=500,\n            chunk_overlap=100,\n            length_function=len,\n            separators=[\"\\n\\n\", \"\\n\", \" \", \"\"]\n        )\n\n        doc_dir = \"data\u002Fdocs_suporte\u002F\" # Ex: \"data\u002Fdocs_suporte\u002Fpolitica_reembolso.md\"\n        documents_to_add = []\n        metadatas_to_add = []\n        ids_to_add = []\n        \n        for i, filename in enumerate(os.listdir(doc_dir)):\n            if filename.endswith(\".md\"):\n                filepath = os.path.join(doc_dir, filename)\n                with open(filepath, 'r', encoding='utf-8') as f:\n                    content = f.read()\n                    \n                chunks = text_splitter.split_text(content)\n                for j, chunk in enumerate(chunks):\n                    documents_to_add.append(chunk)\n                    metadatas_to_add.append({\"source\": filename, \"chunk_id\": f\"{filename}-{j}\"})\n                    ids_to_add.append(f\"{filename.replace('.md', '')}-{j}\")\n\n        if documents_to_add:\n            collection.add(\n                documents=documents_to_add,\n                metadatas=metadatas_to_add,\n                ids=ids_to_add\n            )\n            print(f\"Adicionados {len(documents_to_add)} chunks ao ChromaDB.\")\n        else:\n            print(\"Nenhum documento para adicionar.\")\n        ```\n    *   **Execução**: `python ingest_docs.py` (garanta que o diretório `data\u002Fdocs_suporte\u002F` exista com seus arquivos).\n\n3.  **Configuração do Make.com (Cenário de Automação)**:\n    *   **Módulo 1: Webhook Custom (Entrada)**: Recebe a pergunta do usuário do chatbot.\n        *   **Configuração**: Crie um Webhook Custom. Copie o endereço do webhook.\n        *   **Exemplo de Payload de Teste**:\n            ```json\n            {\n              \"question\": \"Como faço para solicitar um reembolso?\"\n            }\n            ```\n    *   **Módulo 2: HTTP - Make a request (Para executar script Python local)**:\n        *   Para simular o acesso ao ChromaDB, você precisaria de um servidor Python intermediário ou executar o script Python diretamente em um ambiente que o Make.com possa chamar (e.g., um serviço na nuvem, ou um servidor local exposto via ngrok).\n        *   **Exemplo (simplificado, assumindo um endpoint API)**:\n            *   **URL**: `http:\u002F\u002Fseu_servidor_rag:5000\u002Fquery_rag`\n            *   **Method**: `POST`\n            *   **Headers**: `Content-Type: application\u002Fjson`\n            *   **Body (JSON)**:\n                ```json\n                {\n                  \"query\": \"{{1.question}}\"\n                }\n                ```\n            *   O servidor `seu_servidor_rag` teria um endpoint que:\n                1.  Recebe a `query`.\n                2.  Gera o embedding da `query`.\n                3.  Consulta o ChromaDB para os top `k` chunks (e.g., `k=3`).\n                4.  Retorna os chunks em formato de texto.\n                *   **Exemplo de endpoint Flask (`rag_api.py`)**:\n                    ```python\n                    from flask import Flask, request, jsonify\n                    import chromadb\n                    from chromadb.utils import embedding_functions\n\n                    app = Flask(__name__)\n                    client = chromadb.PersistentClient(path=\".\u002Fchroma_db\")\n                    ef = embedding_functions.SentenceTransformerEmbeddingFunction(model_name=\"all-MiniLM-L6-v2\")\n                    collection = client.get_collection(name=\"faq_suporte_tecnico\", embedding_function=ef)\n\n                    @app.route('\u002Fquery_rag', methods=['POST'])\n                    def query_rag():\n                        data = request.json\n                        query = data.get('query')\n                        if not query:\n                            return jsonify({\"error\": \"Query parameter is missing\"}), 400\n\n                        results = collection.query(\n                            query_texts=[query],\n                            n_results=3 # Recupera os 3 chunks mais relevantes\n                        )\n                        \n                        retrieved_docs = results['documents'][0] if results['documents'] else []\n                        context_str = \"\\n\\n\".join(retrieved_docs)\n                        \n                        return jsonify({\"context\": context_str})\n\n                    if __name__ == '__main__':\n                        app.run(host='0.0.0.0', port=5000)\n                    ```\n                    *   **Execução**: `python rag_api.py` (e use ngrok para expor se estiver local: `ngrok http 5000`)\n    *   **Módulo 3: Claude - Create a Completion**:\n        *   **Model**: `claude-3-sonnet-20240229` (ou outro modelo Claude)\n        *   **Prompt**: Use o template de prompt RAG e insira o contexto do Módulo 2 e a pergunta do Módulo 1.\n\n### Workflow 2: Otimização de RAG para Redução de Latência e Aumento de Precisão\n\nEste workflow foca em refinar um sistema RAG existente para melhorar seu desempenho.\n\n**Passos Detalhados:**\n\n1.  **Estratégias de Chunking Avançadas**:\n    *   **Chunking Semântico**: Em vez de tamanhos fixos, divida o texto em partes que representam ideias completas, usando técnicas como `SentenceTransformers` para agrupar sentenças semanticamente próximas ou `LlamaIndex` para nós de documentos.\n    *   **Hierarchical Chunking**: Crie chunks menores para busca detalhada e chunks maiores para contexto geral, recuperando ambos e priorizando o detalhe.\n    *   **Overlap Otimizado**: Experimente overlaps de 10-20% do tamanho do chunk para garantir que o contexto não seja cortado abruptamente. Por exemplo, chunk de 512 tokens com 50 tokens de overlap.\n\n2.  **Re-ranking de Documentos Recuperados**:\n    *   **Problema**: A busca por similaridade de cosseno pode trazer documentos semanticamente próximos, mas não os mais diretamente relevantes para a pergunta.\n    *   **Solução**: Após recuperar os `N` chunks iniciais (e.g., N=10), use um modelo de re-ranking (e.g., Cohere Rerank API, `cross-encoder\u002Fms-marco-TinyBERT-L-2-v2`) para classificar esses `N` chunks e selecionar os `K` mais relevantes (e.g., K=3) para enviar ao LLM.\n    *   **Exemplo de integração (Python, após `results` do ChromaDB)**:\n        ```python\n        from sentence_transformers import CrossEncoder\n\n        model = CrossEncoder('cross-encoder\u002Fms-marco-TinyBERT-L-2-v2')\n        \n        query = \"Como faço para redefinir minha senha?\"\n        retrieved_docs = [\"doc1_sobre_login\", \"doc2_sobre_recuperacao\", \"doc3_sobre_seguranca\"] # Exemplo de docs do ChromaDB\n        \n        # Cria pares (pergunta, documento) para o re-ranker\n        sentence_pairs = [[query, doc] for doc in retrieved_docs]\n        \n        # Obtém scores de relevância\n        rerank_scores = model.predict(sentence_pairs)\n        \n        # Ordena os documentos com base nos scores\n        ranked_docs = sorted(zip(rerank_scores, retrieved_docs), key=lambda x: x[0], reverse=True)\n        \n        # Seleciona os top K documentos para o LLM\n        top_k_docs = [doc for score, doc in ranked_docs[:3]]\n        print(f\"Documentos re-rankeados para o LLM: {top_k_docs}\")\n        ```\n\n3.  **Cache de Embeddings e Respostas**:\n    *   Para perguntas frequentes, armazene em cache os embeddings das perguntas e, se possível, as respostas geradas pelo LLM.\n    *   **Tecnologia**: Redis, Memcached ou um simples dicionário em memória para casos de uso menos exigentes.\n    *   **Exemplo**: Antes de consultar o ChromaDB, verifique se o embedding da `query` ou a `query` em si está no cache. Se sim, use o resultado cacheado para reduzir latência e custos.\n\n4.  **Monitoramento e Testes A\u002FB**:\n    *   Monitore continuamente a latência da recuperação (tempo para obter chunks) e da geração (tempo para o LLM responder).\n    *   Implemente testes A\u002FB para comparar diferentes estratégias de chunking, modelos de embedding ou algoritmos de re-ranking, avaliando a qualidade da resposta e a performance. Use métricas como Recall@k e MRR (Mean Reciprocal Rank).\n\n---\n\n## Templates\n\n### Template de Prompt para Geração RAG Otimizada\n\n```\nVocê é um assistente de IA especializado em fornecer respostas claras e concisas baseadas em informações factuais.\n\nINSTRUÇÕES:\n1. Use EXCLUSIVAMENTE as informações contidas no CONTEXTO fornecido para formular sua resposta.\n2. Não adicione informações externas ou faça suposições.\n3. Se o CONTEXTO não contiver informações suficientes para responder à PERGUNTA, responda: \"Não tenho informações suficientes para responder a essa pergunta com base no contexto fornecido.\"\n4. Mantenha a resposta concisa e direta ao ponto.\n\nCONTEXTO:\n- Documento 1: \"A política de reembolso para produtos digitais permite o estorno total em até 7 dias após a compra, desde que o produto não tenha sido baixado ou acessado por completo. Após 7 dias, não há reembolso.\"\n- Documento 2: \"Para solicitar um reembolso, o cliente deve enviar um e-mail para suporte@empresa.com.br com o número do pedido e o motivo da solicitação. O processamento pode levar até 5 dias úteis.\"\n- Documento 3: \"Produtos físicos têm uma política de devolução de 30 dias, exigindo que o item esteja em sua embalagem original e sem sinais de uso.\"\n\nPERGUNTA:\nQual é o procedimento para solicitar um reembolso de um produto digital?\n\nRESPOSTA:\n```\n\n### Template de Configuração de Webhook no Make.com para RAG\n\n```json\n{\n  \"event\": \"message.received\",\n  \"payload\": {\n    \"session_id\": \"sess_xyz789\",\n    \"user_id\": \"user_123ab\",\n    \"question\": \"Como posso resetar minha senha de administrador?\",\n    \"metadata\": {\n      \"origin\": \"chatbot_website\",\n      \"timestamp\": \"2024-07-20T10:30:00Z\",\n      \"priority\": \"normal\"\n    }\n  }\n}\n```\n\n---\n\n## Checklist\n\n- [x] Fontes de dados para RAG claramente definidas e acessíveis (APIs, bancos de dados, documentos).\n- [x] Estratégia de chunking (tamanho, overlap, tipo de divisor) otimizada para o domínio.\n- [x] Modelo de embedding escolhido (e.g., `text-embedding-ada-002`, `all-MiniLM-L6-v2`) e sua performance validada.\n- [x] Banco de dados vetorial (Pinecone, ChromaDB, Weaviate) configurado, escalável e indexado.\n- [x] Pipeline de ingestão de dados (ETL para embeddings) automatizado e resiliente.\n- [x] Função de recuperação implementada com busca por similaridade de cosseno e filtro de metadados.\n- [x] Template de prompt de geração RAG formatado com instruções explícitas sobre o uso do contexto.\n- [x] Mecanismo de tratamento para cenários onde o contexto não contém a resposta (\"Não sei\").\n- [x] Monitoramento de latência e custo por consulta RAG em ambiente de produção.\n- [x] Implementação de re-ranking dos documentos recuperados para maior precisão.\n- [x] Estratégias de cache (embeddings, respostas) para otimização de performance e custo.\n- [x] Fluxo de feedback do usuário para contínuo refinamento da base de conhecimento e do RAG.\n\n---\n\n## Métricas de Referência\n\n| Métrica                      | Benchmark (Bom) | Meta (Excelente) |\n|------------------------------|-----------------|------------------|\n| **Recall@5 (Recuperação)**   | 0.85            | 0.95             |\n| **Latência Média da Resposta** | \u003C 2.0 segundos  | \u003C 1.0 segundos   |\n| **Custo por Consulta RAG**   | \u003C $0.01         | \u003C $0.005         |\n| **Taxa de Respostas Irrelevantes** | \u003C 5%            | \u003C 2%             |\n| **Taxa de Alucinação (Hallucination Rate)** | \u003C 3%            | \u003C 1%             |\n| **MRR (Mean Reciprocal Rank)** | 0.70            | 0.85             |\n\n---\n\n## Erros Comuns\n\n1.  **Chunking Inadequado**: Contexto fragmentado demais (perdendo sentido) ou grande demais (diluindo a informação relevante e excedendo o limite de tokens do LLM).\n    *   **Como evitar**: Experimentar tamanhos de chunk entre 256 e 1024 tokens com overlaps de 10-20% (`RecursiveCharacterTextSplitter` é uma boa base). Para documentos estruturados, usar divisores baseados em títulos ou seções. Exemplo: Testar chunks de 512 tokens com overlap de 50 tokens e comparar com 1024 tokens sem overlap.\n2.  **Embeddings de Baixa Qualidade ou Inadequados**: O modelo de embedding escolhido não representa bem a semântica do domínio, resultando em recuperação de chunks irrelevantes.\n    *   **Como evitar**: Utilizar modelos de embedding robustos e treinados em grandes volumes de texto (e.g., `OpenAI text-embedding-ada-002`, `E5-large-v2`). Para domínios muito específicos, considerar finetuning de um modelo de embedding ou usar modelos `cross-encoder` para re-ranking. Exemplo: Trocar `all-MiniLM-L6-v2` por `text-embedding-ada-002` da OpenAI para textos em inglês ou multilingual.\n3.  **Prompt RAG Mal Formatado ou Ambíguo**: O LLM ignora o contexto fornecido ou alucina por falta de instruções claras.\n    *   **Como evitar**: Incluir instruções explícitas no prompt para que o LLM use APENAS o contexto fornecido e trate a ausência de informações de forma específica. Exemplo: \"Use EXCLUSIVAMENTE o CONTEXTO fornecido. Se a resposta não estiver no contexto, responda 'Não encontrei a resposta no contexto disponível'.\"\n4.  **Latência Excessiva na Recuperação**: O processo de consulta ao banco de dados vetorial é lento, prejudicando a experiência do usuário.\n    *   **Como evitar**: Otimizar o banco de dados vetorial (escalar recursos, usar índices eficientes como HNSW), implementar cache para embeddings de perguntas frequentes ou para os chunks recuperados. Exemplo: Utilizar um serviço de cache como Redis para armazenar resultados de consultas recentes por 10 minutos.\n\n---\n\n## Dicas Avançadas\n\n1.  **RAG com Re-ranking Híbrido**: Combine a busca por similaridade vetorial (semântica) com um algoritmo de re-ranking baseado em palavras-chave (e.g., BM25) ou um modelo de re-ranking neural (e.g., Cohere Rerank API, `cross-encoder\u002Fms-marco-TinyBERT-L-2-v2`). Primeiro, recupere um número maior de chunks (e.g., 20) via vetores, depois re-rankeie-os para selecionar os 3-5 mais relevantes para o prompt do LLM. Isso melhora a precisão significativamente.\n2.  **Multi-hop RAG e Geração de Sub-perguntas**: Para perguntas complexas que exigem informações de múltiplos documentos ou uma cadeia de raciocínio, o LLM pode ser instruído a gerar sub-perguntas com base na pergunta original. Cada sub-pergunta aciona uma nova busca RAG, e os resultados são combinados para uma resposta final mais completa. Exemplo: \"Quais são os requisitos de hardware para o software X e qual o custo de licenciamento anual?\" pode se transformar em duas consultas RAG separadas.\n3.  **Adaptação de Chunking por Tipo de Conteúdo**: A estratégia de segmentação não deve ser universal. Documentos estruturados (e.g., PDFs com seções, tabelas, figuras) podem se beneficiar de extratores específicos que respeitam a hierarquia do documento, enquanto textos planos podem usar segmentação baseada em sentenças ou parágrafos. Ferramentas como `LlamaParse` (para PDFs) ou `Unstructured.io` são úteis aqui. Exemplo: Para um manual técnico em PDF, use um parser que extraia seções inteiras como chunks, mantendo a coerência temática.\n4.  **Aproveitamento de Metadados para Filtragem Pré-Recuperação**: Armazene metadados ricos (autor, data, tipo de documento, departamento) junto com seus chunks no banco vetorial. Use esses metadados para filtrar os resultados da busca por similaridade ANTES de enviá-los ao LLM. Isso é crucial para controlar o escopo da resposta. Exemplo: Para uma pergunta sobre \"política de RH\", filtre os chunks para `{\"departamento\": \"RH\"}` antes da busca vetorial.\n5.  **Feedback Loop Contínuo com Avaliação Humana (Human-in-the-Loop)**: Implemente um sistema onde usuários possam dar feedback sobre a qualidade das respostas (e.g., \"útil\" \u002F \"não útil\"). Use esses dados para identificar falhas no RAG (chunks irrelevantes, alucinações) e direcionar aprimoramentos, como re-rotulagem de dados para finetuning de embeddings ou ajuste de prompts. Exemplo: Se uma resposta for marcada como \"não útil\", registre a pergunta, a resposta e os chunks que foram usados para análise manual.","# Rag Implementation\n\nCapacita o Claude a projetar, implementar e otimizar sistemas de Retrieval Augmented Generation (RAG) em fluxos de trabalho de automação e chatbots, conectando LLMs a bases de conhecimento externas e atualizadas.\n\n---\n\n## Keywords\n\nRAG, Vector Database, Embeddings, Chunking, Retrieval, Generation, LLM Integration, Semantic Search, Context Window, Pinecone, ChromaDB, Weaviate, LangChain, LlamaIndex, Prompt Engineering, N8N, Make.com, API.\n\n---\n\n## Quick Start\n\n1.  **Escolha e Configure o Banco de Dados Vetorial**: Selecione um provedor como ChromaDB (local\u002Fauto-hospedado) ou Pinecone (nuvem).\n2.  **Prepare a Base de Conhecimento**: Colete documentos (PDFs, Markdown, HTML, CSV) e implemente um script Python para segmentação (chunking) e geração de embeddings.\n3.  **Ingestão de Dados**: Envie os chunks com seus embeddings para o banco de dados vetorial.\n4.  **Fluxo de Consulta RAG**: Receba uma pergunta do usuário, gere seu embedding, consulte o banco vetorial para recuperar os chunks mais relevantes.\n5.  **Geração de Resposta**: Combine os chunks recuperados com a pergunta do usuário em um prompt estruturado para o LLM.\n\n---\n\n## Core Workflows\n\n### Workflow 1: Implementação de RAG com ChromaDB e Make.com para Chatbot de Suporte\n\nEste workflow detalha a criação de um chatbot de suporte que responde a perguntas usando uma base de conhecimento interna armazenada no ChromaDB, orquestrado via Make.com.\n\n**Passos Detalhados:**\n\n1.  **Configuração do ChromaDB**:\n    *   **Instalação (se local)**: `pip install chromadb`\n    *   **Criação de Coleção**:\n        ```python\n        import chromadb\n        from chromadb.utils import embedding_functions\n\n        # Cliente persistente para armazenar dados localmente\n        client = chromadb.PersistentClient(path=\".\u002Fchroma_db\")\n        \n        # Usar um modelo de embedding de HuggingFace via sentence-transformers\n        # Certifique-se de que 'sentence-transformers' está instalado: pip install sentence-transformers\n        ef = embedding_functions.SentenceTransformerEmbeddingFunction(model_name=\"all-MiniLM-L6-v2\")\n\n        collection_name = \"faq_suporte_tecnico\"\n        try:\n            collection = client.get_collection(name=collection_name, embedding_function=ef)\n            print(f\"Coleção '{collection_name}' já existe.\")\n        except:\n            collection = client.create_collection(name=collection_name, embedding_function=ef)\n            print(f\"Coleção '{collection_name}' criada.\")\n        ```\n\n2.  **Ingestão de Documentos (Exemplo de script Python)**:\n    *   Suponha que você tenha um diretório `docs\u002F` com arquivos `.md`.\n    *   **Script `ingest_docs.py`**:\n        ```python\n        import os\n        import chromadb\n        from chromadb.utils import embedding_functions\n        from langchain.text_splitter import RecursiveCharacterTextSplitter\n\n        client = chromadb.PersistentClient(path=\".\u002Fchroma_db\")\n        ef = embedding_functions.SentenceTransformerEmbeddingFunction(model_name=\"all-MiniLM-L6-v2\")\n        collection = client.get_collection(name=\"faq_suporte_tecnico\", embedding_function=ef)\n\n        text_splitter = RecursiveCharacterTextSplitter(\n            chunk_size=500,\n            chunk_overlap=100,\n            length_function=len,\n            separators=[\"\\n\\n\", \"\\n\", \" \", \"\"]\n        )\n\n        doc_dir = \"data\u002Fdocs_suporte\u002F\" # Ex: \"data\u002Fdocs_suporte\u002Fpolitica_reembolso.md\"\n        documents_to_add = []\n        metadatas_to_add = []\n        ids_to_add = []\n        \n        for i, filename in enumerate(os.listdir(doc_dir)):\n            if filename.endswith(\".md\"):\n                filepath = os.path.join(doc_dir, filename)\n                with open(filepath, 'r', encoding='utf-8') as f:\n                    content = f.read()\n                    \n                chunks = text_splitter.split_text(content)\n                for j, chunk in enumerate(chunks):\n                    documents_to_add.append(chunk)\n                    metadatas_to_add.append({\"source\": filename, \"chunk_id\": f\"{filename}-{j}\"})\n                    ids_to_add.append(f\"{filename.replace('.md', '')}-{j}\")\n\n        if documents_to_add:\n            collection.add(\n                documents=documents_to_add,\n                metadatas=metadatas_to_add,\n                ids=ids_to_add\n            )\n            print(f\"Adicionados {len(documents_to_add)} chunks ao ChromaDB.\")\n        else:\n            print(\"Nenhum documento para adicionar.\")\n        ```\n    *   **Execução**: `python ingest_docs.py` (garanta que o diretório `data\u002Fdocs_suporte\u002F` exista com seus arquivos).\n\n3.  **Configuração do Make.com (Cenário de Automação)**:\n    *   **Módulo 1: Webhook Custom (Entrada)**: Recebe a pergunta do usuário do chatbot.\n        *   **Configuração**: Crie um Webhook Custom. Copie o endereço do webhook.\n        *   **Exemplo de Payload de Teste**:\n            ```json\n            {\n              \"question\": \"Como faço para solicitar um reembolso?\"\n            }\n            ```\n    *   **Módulo 2: HTTP - Make a request (Para executar script Python local)**:\n        *   Para simular o acesso ao ChromaDB, você precisaria de um servidor Python intermediário ou executar o script Python diretamente em um ambiente que o Make.com possa chamar (e.g., um serviço na nuvem, ou um servidor local exposto via ngrok).\n        *   **Exemplo (simplificado, assumindo um endpoint API)**:\n            *   **URL**: `http:\u002F\u002Fseu_servidor_rag:5000\u002Fquery_rag`\n            *   **Method**: `POST`\n            *   **Headers**: `Content-Type: application\u002Fjson`\n            *   **Body (JSON)**:\n                ```json\n                {\n                  \"query\": \"{{1.question}}\"\n                }\n                ```\n            *   O servidor `seu_servidor_rag` teria um endpoint que:\n                1.  Recebe a `query`.\n                2.  Gera o embedding da `query`.\n                3.  Consulta o ChromaDB para os top `k` chunks (e.g., `k=3`).\n                4.  Retorna os chunks em formato de texto.\n                *   **Exemplo de endpoint Flask (`rag_api.py`)**:\n                    ```python\n                    from flask import Flask, request, jsonify\n                    import chromadb\n                    from chromadb.utils import embedding_functions\n\n                    app = Flask(__name__)\n                    client = chromadb.PersistentClient(path=\".\u002Fchroma_db\")\n                    ef = embedding_functions.SentenceTransformerEmbeddingFunction(model_name=\"all-MiniLM-L6-v2\")\n                    collection = client.get_collection(name=\"faq_suporte_tecnico\", embedding_function=ef)\n\n                    @app.route('\u002Fquery_rag', methods=['POST'])\n                    def query_rag():\n                        data = request.json\n                        query = data.get('query')\n                        if not query:\n                            return jsonify({\"error\": \"Query parameter is missing\"}), 400\n\n                        results = collection.query(\n                            query_texts=[query],\n                            n_results=3 # Recupera os 3 chunks mais relevantes\n                        )\n                        \n                        retrieved_docs = results['documents'][0] if results['documents'] else []\n                        context_str = \"\\n\\n\".join(retrieved_docs)\n                        \n                        return jsonify({\"context\": context_str})\n\n                    if __name__ == '__main__':\n                        app.run(host='0.0.0.0', port=5000)\n                    ```\n                    *   **Execução**: `python rag_api.py` (e use ngrok para expor se estiver local: `ngrok http 5000`)\n    *   **Módulo 3: Claude - Create a Completion**:\n        *   **Model**: `claude-3-sonnet-20240229` (ou outro modelo Claude)\n        *   **Prompt**: Use o template de prompt RAG e insira o contexto do Módulo 2 e a pergunta do Módulo 1.\n\n### Workflow 2: Otimização de RAG para Redução de Latência e Aumento de Precisão\n\nEste workflow foca em refinar um sistema RAG existente para melhorar seu desempenho.\n\n**Passos Detalhados:**\n\n1.  **Estratégias de Chunking Avançadas**:\n    *   **Chunking Semântico**: Em vez de tamanhos fixos, divida o texto em partes que representam ideias completas, usando técnicas como `SentenceTransformers` para agrupar sentenças semanticamente próximas ou `LlamaIndex` para nós de documentos.\n    *   **Hierarchical Chunking**: Crie chunks menores para busca detalhada e chunks maiores para contexto geral, recuperando ambos e priorizando o detalhe.\n    *   **Overlap Otimizado**: Experimente overlaps de 10-20% do tamanho do chunk para garantir que o contexto não seja cortado abruptamente. Por exemplo, chunk de 512 tokens com 50 tokens de overlap.\n\n2.  **Re-ranking de Documentos Recuperados**:\n    *   **Problema**: A busca por similaridade de cosseno pode trazer documentos semanticamente próximos, mas não os mais diretamente relevantes para a pergunta.\n    *   **Solução**: Após recuperar os `N` chunks iniciais (e.g., N=10), use um modelo de re-ranking (e.g., Cohere Rerank API, `cross-encoder\u002Fms-marco-TinyBERT-L-2-v2`) para classificar esses `N` chunks e selecionar os `K` mais relevantes (e.g., K=3) para enviar ao LLM.\n    *   **Exemplo de integração (Python, após `results` do ChromaDB)**:\n        ```python\n        from sentence_transformers import CrossEncoder\n\n        model = CrossEncoder('cross-encoder\u002Fms-marco-TinyBERT-L-2-v2')\n        \n        query = \"Como faço para redefinir minha senha?\"\n        retrieved_docs = [\"doc1_sobre_login\", \"doc2_sobre_recuperacao\", \"doc3_sobre_seguranca\"] # Exemplo de docs do ChromaDB\n        \n        # Cria pares (pergunta, documento) para o re-ranker\n        sentence_pairs = [[query, doc] for doc in retrieved_docs]\n        \n        # Obtém scores de relevância\n        rerank_scores = model.predict(sentence_pairs)\n        \n        # Ordena os documentos com base nos scores\n        ranked_docs = sorted(zip(rerank_scores, retrieved_docs), key=lambda x: x[0], reverse=True)\n        \n        # Seleciona os top K documentos para o LLM\n        top_k_docs = [doc for score, doc in ranked_docs[:3]]\n        print(f\"Documentos re-rankeados para o LLM: {top_k_docs}\")\n        ```\n\n3.  **Cache de Embeddings e Respostas**:\n    *   Para perguntas frequentes, armazene em cache os embeddings das perguntas e, se possível, as respostas geradas pelo LLM.\n    *   **Tecnologia**: Redis, Memcached ou um simples dicionário em memória para casos de uso menos exigentes.\n    *   **Exemplo**: Antes de consultar o ChromaDB, verifique se o embedding da `query` ou a `query` em si está no cache. Se sim, use o resultado cacheado para reduzir latência e custos.\n\n4.  **Monitoramento e Testes A\u002FB**:\n    *   Monitore continuamente a latência da recuperação (tempo para obter chunks) e da geração (tempo para o LLM responder).\n    *   Implemente testes A\u002FB para comparar diferentes estratégias de chunking, modelos de embedding ou algoritmos de re-ranking, avaliando a qualidade da resposta e a performance. Use métricas como Recall@k e MRR (Mean Reciprocal Rank).\n\n---\n\n## Templates\n\n### Template de Prompt para Geração RAG Otimizada\n\n```\nVocê é um assistente de IA especializado em fornecer respostas claras e concisas baseadas em informações factuais.\n\nINSTRUÇÕES:\n1. Use EXCLUSIVAMENTE as informações contidas no CONTEXTO fornecido para formular sua resposta.\n2. Não adicione informações externas ou faça suposições.\n3. Se o CONTEXTO não contiver informações suficientes para responder à PERGUNTA, responda: \"Não tenho informações suficientes para responder a essa pergunta com base no contexto fornecido.\"\n4. Mantenha a resposta concisa e direta ao ponto.\n\nCONTEXTO:\n- Documento 1: \"A política de reembolso para produtos digitais permite o estorno total em até 7 dias após a compra, desde que o produto não tenha sido baixado ou acessado por completo. Após 7 dias, não há reembolso.\"\n- Documento 2: \"Para solicitar um reembolso, o cliente deve enviar um e-mail para suporte@empresa.com.br com o número do pedido e o motivo da solicitação. O processamento pode levar até 5 dias úteis.\"\n- Documento 3: \"Produtos físicos têm uma política de devolução de 30 dias, exigindo que o item esteja em sua embalagem original e sem sinais de uso.\"\n\nPERGUNTA:\nQual é o procedimento para solicitar um reembolso de um produto digital?\n\nRESPOSTA:\n```\n\n### Template de Configuração de Webhook no Make.com para RAG\n\n```json\n{\n  \"event\": \"message.received\",\n  \"payload\": {\n    \"session_id\": \"sess_xyz789\",\n    \"user_id\": \"user_123ab\",\n    \"question\": \"Como posso resetar minha senha de administrador?\",\n    \"metadata\": {\n      \"origin\": \"chatbot_website\",\n      \"timestamp\": \"2024-07-20T10:30:00Z\",\n      \"priority\": \"normal\"\n    }\n  }\n}\n```\n\n---\n\n## Checklist\n\n- [x] Fontes de dados para RAG claramente definidas e acessíveis (APIs, bancos de dados, documentos).\n- [x] Estratégia de chunking (tamanho, overlap, tipo de divisor) otimizada para o domínio.\n- [x] Modelo de embedding escolhido (e.g., `text-embedding-ada-002`, `all-MiniLM-L6-v2`) e sua performance validada.\n- [x] Banco de dados vetorial (Pinecone, ChromaDB, Weaviate) configurado, escalável e indexado.\n- [x] Pipeline de ingestão de dados (ETL para embeddings) automatizado e resiliente.\n- [x] Função de recuperação implementada com busca por similaridade de cosseno e filtro de metadados.\n- [x] Template de prompt de geração RAG formatado com instruções explícitas sobre o uso do contexto.\n- [x] Mecanismo de tratamento para cenários onde o contexto não contém a resposta (\"Não sei\").\n- [x] Monitoramento de latência e custo por consulta RAG em ambiente de produção.\n- [x] Implementação de re-ranking dos documentos recuperados para maior precisão.\n- [x] Estratégias de cache (embeddings, respostas) para otimização de performance e custo.\n- [x] Fluxo de feedback do usuário para contínuo refinamento da base de conhecimento e do RAG.\n\n---\n\n## Métricas de Referência\n\n| Métrica                      | Benchmark (Bom) | Meta (Excelente) |\n|------------------------------|-----------------|------------------|\n| **Recall@5 (Recuperação)**   | 0.85            | 0.95             |\n| **Latência Média da Resposta** | \u003C 2.0 segundos  | \u003C 1.0 segundos   |\n| **Custo por Consulta RAG**   | \u003C $0.01         | \u003C $0.005         |\n| **Taxa de Respostas Irrelevantes** | \u003C 5%            | \u003C 2%             |\n| **Taxa de Alucinação (Hallucination Rate)** | \u003C 3%            | \u003C 1%             |\n| **MRR (Mean Reciprocal Rank)** | 0.70            | 0.85             |\n\n---\n\n## Erros Comuns\n\n1.  **Chunking Inadequado**: Contexto fragmentado demais (perdendo sentido) ou grande demais (diluindo a informação relevante e excedendo o limite de tokens do LLM).\n    *   **Como evitar**: Experimentar tamanhos de chunk entre 256 e 1024 tokens com overlaps de 10-20% (`RecursiveCharacterTextSplitter` é uma boa base). Para documentos estruturados, usar divisores baseados em títulos ou seções. Exemplo: Testar chunks de 512 tokens com overlap de 50 tokens e comparar com 1024 tokens sem overlap.\n2.  **Embeddings de Baixa Qualidade ou Inadequados**: O modelo de embedding escolhido não representa bem a semântica do domínio, resultando em recuperação de chunks irrelevantes.\n    *   **Como evitar**: Utilizar modelos de embedding robustos e treinados em grandes volumes de texto (e.g., `OpenAI text-embedding-ada-002`, `E5-large-v2`). Para domínios muito específicos, considerar finetuning de um modelo de embedding ou usar modelos `cross-encoder` para re-ranking. Exemplo: Trocar `all-MiniLM-L6-v2` por `text-embedding-ada-002` da OpenAI para textos em inglês ou multilingual.\n3.  **Prompt RAG Mal Formatado ou Ambíguo**: O LLM ignora o contexto fornecido ou alucina por falta de instruções claras.\n    *   **Como evitar**: Incluir instruções explícitas no prompt para que o LLM use APENAS o contexto fornecido e trate a ausência de informações de forma específica. Exemplo: \"Use EXCLUSIVAMENTE o CONTEXTO fornecido. Se a resposta não estiver no contexto, responda 'Não encontrei a resposta no contexto disponível'.\"\n4.  **Latência Excessiva na Recuperação**: O processo de consulta ao banco de dados vetorial é lento, prejudicando a experiência do usuário.\n    *   **Como evitar**: Otimizar o banco de dados vetorial (escalar recursos, usar índices eficientes como HNSW), implementar cache para embeddings de perguntas frequentes ou para os chunks recuperados. Exemplo: Utilizar um serviço de cache como Redis para armazenar resultados de consultas recentes por 10 minutos.\n\n---\n\n## Dicas Avançadas\n\n1.  **RAG com Re-ranking Híbrido**: Combine a busca por similaridade vetorial (semântica) com um algoritmo de re-ranking baseado em palavras-chave (e.g., BM25) ou um modelo de re-ranking neural (e.g., Cohere Rerank API, `cross-encoder\u002Fms-marco-TinyBERT-L-2-v2`). Primeiro, recupere um número maior de chunks (e.g., 20) via vetores, depois re-rankeie-os para selecionar os 3-5 mais relevantes para o prompt do LLM. Isso melhora a precisão significativamente.\n2.  **Multi-hop RAG e Geração de Sub-perguntas**: Para perguntas complexas que exigem informações de múltiplos documentos ou uma cadeia de raciocínio, o LLM pode ser instruído a gerar sub-perguntas com base na pergunta original. Cada sub-pergunta aciona uma nova busca RAG, e os resultados são combinados para uma resposta final mais completa. Exemplo: \"Quais são os requisitos de hardware para o software X e qual o custo de licenciamento anual?\" pode se transformar em duas consultas RAG separadas.\n3.  **Adaptação de Chunking por Tipo de Conteúdo**: A estratégia de segmentação não deve ser universal. Documentos estruturados (e.g., PDFs com seções, tabelas, figuras) podem se beneficiar de extratores específicos que respeitam a hierarquia do documento, enquanto textos planos podem usar segmentação baseada em sentenças ou parágrafos. Ferramentas como `LlamaParse` (para PDFs) ou `Unstructured.io` são úteis aqui. Exemplo: Para um manual técnico em PDF, use um parser que extraia seções inteiras como chunks, mantendo a coerência temática.\n4.  **Aproveitamento de Metadados para Filtragem Pré-Recuperação**: Armazene metadados ricos (autor, data, tipo de documento, departamento) junto com seus chunks no banco vetorial. Use esses metadados para filtrar os resultados da busca por similaridade ANTES de enviá-los ao LLM. Isso é crucial para controlar o escopo da resposta. Exemplo: Para uma pergunta sobre \"política de RH\", filtre os chunks para `{\"departamento\": \"RH\"}` antes da busca vetorial.\n5.  **Feedback Loop Contínuo com Avaliação Humana (Human-in-the-Loop)**: Implemente um sistema onde usuários possam dar feedback sobre a qualidade das respostas (e.g., \"útil\" \u002F \"não útil\"). Use esses dados para identificar falhas no RAG (chunks irrelevantes, alucinações) e direcionar aprimoramentos, como re-rotulagem de dados para finetuning de embeddings ou ajuste de prompts. Exemplo: Se uma resposta for marcada como \"não útil\", registre a pergunta, a resposta e os chunks que foram usados para análise manual.",{"name":5,"risk":26,"license":14,"metadata":35,"description":7},{"author":36,"updated":37,"version":38,"category":39},"Cafe Code AI",1772323200000,"1.0.0","12-ia-automacao","master","346c313fd2ec241a088c68274da26c538422568b","packs\u002Fkit-510-ptbr\u002F12-ia-automacao\u002Frag-implementation",35,"https:\u002F\u002Fgithub.com\u002Fkursku\u002Fskills","https:\u002F\u002Fclaude.ai","https:\u002F\u002Fgithub.com\u002Fkursku","2026-03-27 22:43:37",{"source":8,"skillName":5,"commands":49,"prompt":59,"zipAvailable":60},[50,53,56],{"tool":51,"command":52},"npx","npx skills add kursku\u002Fskills --skill rag-implementation",{"tool":54,"command":55},"bunx","bunx skills add kursku\u002Fskills --skill rag-implementation",{"tool":57,"command":58},"pnpm","pnpm dlx skills add kursku\u002Fskills --skill rag-implementation","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkursku\u002Fskills\u002Fblob\u002Fmaster\u002Fpacks\u002Fkit-510-ptbr\u002F12-ia-automacao\u002Frag-implementation\u002FSKILL.md",true,[62,68,72,76],{"path":63,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":66,"sourceHtmlUrl":67},"BENCHMARK.md","REFERENCE","参考文档",2870,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fmcore-linting-and-formatting\u002FBENCHMARK.md",{"path":69,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":70,"sourceHtmlUrl":71},"evals\u002Fevals.json",3,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fmcore-linting-and-formatting\u002Fevals\u002Fevals.json",{"path":73,"resourceType":64,"resourceTypeDesc":65,"sizeBytes":74,"sourceHtmlUrl":75},"skill-card.md",2581,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fmcore-linting-and-formatting\u002Fskill-card.md",{"path":77,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":80,"sourceHtmlUrl":81},"skill.oms.sig","OTHER","其他",4605,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fmcore-linting-and-formatting\u002Fskill.oms.sig",[83,102,113,125,136,146],{"skillNo":84,"name":85,"nameZh":6,"description":86,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":97,"publishedAt":30},"01M6ECKM7725267ZM3XNYWH608","wedding-marketing","Wedding Marketing — Skill especializada para criar e executar estratégias de marketing digital para o mercado de casamentos, focando em noivos e fornecedores.","https:\u002F\u002Fgithub.com\u002Fkursku\u002Fskills\u002Fblob\u002Fmaster\u002Fpacks\u002Fkit-510-ptbr\u002F16-nichos-especificos\u002Fwedding-marketing\u002FSKILL.md",[89,92],{"categoryNo":90,"categoryName":91,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000019","营销推广",{"categoryNo":93,"categoryName":94,"taxonomyType":95,"taxonomyTypeDesc":96},"01JBSEEDCAT000000000000035","市场营销","PROFESSION","适用职业",[98,99,100,101,28,27],"wedding marketing","marketing","marketing digital","de",{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":110,"publishedAt":30},"01M6ECKGP656JQC2C6CK5JH3ZG","travel-marketing","Travel Marketing — Skill especializada para travel marketing","https:\u002F\u002Fgithub.com\u002Fkursku\u002Fskills\u002Fblob\u002Fmaster\u002Fpacks\u002Fkit-510-ptbr\u002F16-nichos-especificos\u002Ftravel-marketing\u002FSKILL.md",[108,109],{"categoryNo":90,"categoryName":91,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":93,"categoryName":94,"taxonomyType":95,"taxonomyTypeDesc":96},[111,112,99,28,27,26],"travel marketing","travel",{"skillNo":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":121,"publishedAt":30},"01M6ECKBY53SJ7E167D6BXTMRK","tech-startup-marketing","Tech Startup Marketing — Skill especializada para tech startup marketing","https:\u002F\u002Fgithub.com\u002Fkursku\u002Fskills\u002Fblob\u002Fmaster\u002Fpacks\u002Fkit-510-ptbr\u002F16-nichos-especificos\u002Ftech-startup-marketing\u002FSKILL.md",[119,120],{"categoryNo":90,"categoryName":91,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":93,"categoryName":94,"taxonomyType":95,"taxonomyTypeDesc":96},[122,123,99,124,28,27,26],"tech startup marketing","tech","startup",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":133,"publishedAt":30},"01M6ECK7W2W0J5MZ8BZHFM516P","saas-marketing","Saas Marketing — Skill especializada para desenvolver e executar estratégias de marketing digital focadas no crescimento de produtos SaaS.","https:\u002F\u002Fgithub.com\u002Fkursku\u002Fskills\u002Fblob\u002Fmaster\u002Fpacks\u002Fkit-510-ptbr\u002F16-nichos-especificos\u002Fsaas-marketing\u002FSKILL.md",[131,132],{"categoryNo":90,"categoryName":91,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":93,"categoryName":94,"taxonomyType":95,"taxonomyTypeDesc":96},[134,99,135,26,100,101,28,27],"saas marketing","saas",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":144,"publishedAt":30},"01M6ECK42ZSX5ND0SCTRKD7XKB","restaurant-marketing","Restaurant Marketing — Skill especializada para otimizar a presença digital, atrair e reter clientes em restaurantes.","https:\u002F\u002Fgithub.com\u002Fkursku\u002Fskills\u002Fblob\u002Fmaster\u002Fpacks\u002Fkit-510-ptbr\u002F16-nichos-especificos\u002Frestaurant-marketing\u002FSKILL.md",[142,143],{"categoryNo":90,"categoryName":91,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":93,"categoryName":94,"taxonomyType":95,"taxonomyTypeDesc":96},[145,99,27,28],"restaurant marketing",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":154,"publishedAt":30},"01M6ECK0S48CPYE9P7PRAG9R3T","real-estate-marketing","Real Estate Marketing — Skill especializada para criação e execução de estratégias de marketing digital para o setor imobiliário.","https:\u002F\u002Fgithub.com\u002Fkursku\u002Fskills\u002Fblob\u002Fmaster\u002Fpacks\u002Fkit-510-ptbr\u002F16-nichos-especificos\u002Freal-estate-marketing\u002FSKILL.md",[152,153],{"categoryNo":90,"categoryName":91,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":93,"categoryName":94,"taxonomyType":95,"taxonomyTypeDesc":96},[99,155,156,27,28,101,100,26],"real estate","real estate marketing"]