@oliverlessa/gemini-agent-lib
Version:
Uma biblioteca NodeJS para criar agentes de IA com Gemini LLM
123 lines (104 loc) • 5.5 kB
JavaScript
/**
* Exemplo de ingestão de dados na SemanticMemory usando ChromaDB.
*
* Este exemplo demonstra como ingerir dados (do arquivo README.md) em uma
* SemanticMemory usando o ChromaDBMemoryAdapter e o VertexAIEmbeddingFunction.
* Ele se conecta a um servidor ChromaDB que deve estar rodando localmente.
*
* Pré-requisitos:
* 1. Servidor ChromaDB rodando localmente (padrão: http://localhost:8000).
* Para iniciar um facilmente com Docker:
* docker run -p 8000:8000 chromadb/chroma
* 2. Variáveis de ambiente GOOGLE_CLOUD_PROJECT_ID e GOOGLE_APPLICATION_CREDENTIALS configuradas (ou definidas em um arquivo .env).
*/
require('dotenv').config(); // Carrega variáveis do arquivo .env
const path = require('path');
// Importar componentes do index.js atualizado
const { memory, embedding, loaders } = require('../index');
// --- Configuração ---
// Substitua pelos seus dados reais do Google Cloud e Vertex AI
const GOOGLE_CLOUD_PROJECT_ID = process.env.GOOGLE_CLOUD_PROJECT_ID || 'seu-projeto-id'; // Use variável de ambiente ou substitua
const VERTEX_LOCATION = process.env.VERTEX_LOCATION || 'us-east5'; // Use variável de ambiente ou substitua
// const VERTEX_LOCATION = 'us-east5'; // Use variável de ambiente ou substitua
const VERTEX_EMBEDDING_MODEL_ID = 'text-embedding-005'; // Modelo de embedding
const CHROMA_COLLECTION_NAME = 'documentos_rag_exemplo';
const FILE_TO_INGEST = path.join(__dirname, '../README.md'); // Arquivo a ser ingerido
const LOADER_CHUNK_SIZE = 500; // Tamanho menor para o exemplo
const LOADER_CHUNK_OVERLAP = 50;
// --- Função Principal Assíncrona ---
async function main() {
console.log("Iniciando processo de ingestão para Semantic Memory...");
// 1. Validar Configuração Básica
if (GOOGLE_CLOUD_PROJECT_ID === 'seu-projeto-id') {
console.warn("AVISO: Usando placeholder para GOOGLE_CLOUD_PROJECT_ID. Defina a variável de ambiente ou edite o script.");
// Poderia lançar um erro aqui se preferir exigir a configuração
// throw new Error("GOOGLE_CLOUD_PROJECT_ID não configurado.");
}
try {
// 2. Instanciar Componentes
console.log("Instanciando componentes...");
const embeddingFunction = new embedding.VertexAIEmbeddingFunction({ // Usar embedding.VertexAIEmbeddingFunction
projectId: GOOGLE_CLOUD_PROJECT_ID,
location: VERTEX_LOCATION,
modelId: VERTEX_EMBEDDING_MODEL_ID,
// clientOptions: {} // Adicione opções de cliente gRPC se necessário
});
// Conectando ao servidor ChromaDB local padrão
const memoryAdapter = new memory.ChromaDBMemoryAdapter({ // Usar memory.ChromaDBMemoryAdapter
path: 'http://localhost:8000', // Especifica o caminho para o servidor ChromaDB
collectionName: CHROMA_COLLECTION_NAME,
embeddingFunction: embeddingFunction,
// collectionMetadata: { 'hnsw:space': 'cosine' } // Metadados opcionais da coleção
});
const loader = new loaders.TextLoader({ // Usar loaders.TextLoader
chunkSize: LOADER_CHUNK_SIZE,
chunkOverlap: LOADER_CHUNK_OVERLAP,
});
// 3. Inicializar Adaptador de Memória
console.log(`Inicializando adaptador ChromaDB para coleção "${CHROMA_COLLECTION_NAME}"...`);
await memoryAdapter.init(); // Garante que a coleção está pronta
// 4. Carregar e Dividir o Documento
console.log(`Carregando e dividindo o arquivo: ${FILE_TO_INGEST}...`);
const loadedChunks = await loader.load(FILE_TO_INGEST);
console.log(`Arquivo dividido em ${loadedChunks.length} chunks.`);
if (loadedChunks.length === 0) {
console.log("Nenhum chunk gerado. Encerrando.");
return;
}
// 5. Preparar Documentos para Ingestão
// O ChromaDBMemoryAdapter espera o formato DocumentInput da SemanticMemory
const documentsToIngest = loadedChunks.map(chunk => ({
content: chunk.content,
metadata: chunk.metadata,
// ID será gerado pelo adaptador se não fornecido
}));
// 6. Adicionar Documentos à Memória Semântica
console.log(`Adicionando ${documentsToIngest.length} chunks à coleção ChromaDB...`);
const addedIds = await memoryAdapter.add(documentsToIngest);
console.log(`Documentos adicionados com sucesso. IDs: ${addedIds.join(', ')}`);
// 7. (Opcional) Verificar com uma busca simples
if (documentsToIngest.length > 0) {
console.log("\nRealizando uma busca de exemplo...");
const query = "O que é gemini-agent-lib?"; // Consulta de exemplo
const searchResults = await memoryAdapter.search(query, 3); // Buscar os 3 mais relevantes
console.log(`Resultados da busca para "${query}":`);
if (searchResults.length > 0) {
searchResults.forEach((result, index) => {
console.log(`--- Resultado ${index + 1} (Score: ${result.score?.toFixed(4)}) ---`);
console.log(`ID: ${result.id}`);
console.log(`Metadados: ${JSON.stringify(result.metadata)}`);
console.log(`Conteúdo (trecho): ${result.content.substring(0, 150)}...`);
console.log("---");
});
} else {
console.log("Nenhum resultado encontrado para a consulta de exemplo.");
}
}
console.log("\nProcesso de ingestão concluído com sucesso!");
} catch (error) {
console.error("\nOcorreu um erro durante a ingestão:", error);
process.exit(1); // Sai com código de erro
}
}
// --- Executar a Função Principal ---
main();