developer-docs-ai-agent
Normalmente, os agentes de IA são considerados como alguns bots que podem fazer coisas e um pouco inteligentes. Mas, na prática, os agentes de desenvolvimento mais úteis são agentes especializados super-focados com conhecimento privado e altamente curado. Por exemplo: os documentos oficiais de uma linguagem de programação ou talvez a referência interna da API de um protocolo/empresa.
O Gaia fornece as três peças que permitem a qualquer pessoa criar um agente especializado deste tipo sem grande complexidade. Uma base de conhecimentos que pode ser conectada e da qual se podem extrair fragmentos, uma pilha de conversação com reconhecimento de RAG que fala o estilo OPENAI v1/chat/completions e avisos de sistema modulares.
Um agente de documentação da linguagem de contrato inteligente Vyper
Vamos em frente e criar um agente para a linguagem de contrato inteligente Vyper (uma alternativa ao Solidity com sabor a Python). Tudo o que você vê aqui - layout de diretório, comandos de embedding, flags de configuração de nós - traduz de 1 para 1 para qualquer outro conjunto de documentos: capítulos de livros de Rust, documentos da API REST do Django, um arquivo RFC ou qualquer documento.
Certifique-se de que tem o seu docker a funcionar e o vetor qdrant
instalado executando docker pull qdrant/qdrant
Pré-requisitos: Ferramentas instaladas uma vez
Tempo de execução WasmEdge - O utilitário de incorporação de Gaia é fornecido como um módulo WebAssembly leve; WasmEdge é o motor de execução que o executa nativamente em Linux/macOS/Windows:
curl -sSf https://raw.githubusercontent.com/WasmEdge/WasmEdge/master/utils/install_v2.sh | bash -s
Por que Wasm? Porque obtém um artefacto de construção (um único ficheiro .wasm) que nunca precisa de ser instalado pelo pip. As equipas de segurança adoram o binário determinístico; o DevOps adora a história da dependência zero.
Incorporar pesos do modelo - O modelo que produz os seus vectores de frases de 768 dimensões vive no Hugging Face:
curl -LO https://huggingface.co/gaianet/Nomic-embed-text-v1.5-Embedding-GGUF/resolve/main/nomic-embed-text-v1.5.f16.gguf
Estes pesos estão no formato GGUF, o sucessor moderno do GGML, que transmite eficientemente a partir do disco e suporta variantes quantizadas para caixas apenas com CPU.
Vamos criar duas pastas como qdrant_storage
e instantâneos do qdrant
. Encontraremos a nossa base de conhecimentos instantânea no interior instantâneos do qdrant
.
mkdir qdrant_storage
mkdir qdrant_snapshots
nohup docker run -d -p 6333:6333 -p 6334:6334 \
-v $(pwd)/qdrant_storage:/qdrant/storage:z \
-v $(pwd)/qdrant_snapshots:/qdrant/snapshots:z \
qdrant/qdrant
Algumas notas de boas práticas:
- Mapeie 6333 (REST/JSON) e 6334 (gRPC) se pensa que alguma vez fará uploads em massa ou executará benchmarks com os clientes Rust/Go Qdrant.
- Persistir o qdrant_storage num volume montado significa que os seus vectores sobrevivem a um reinício do contentor e podem ser tar-gz'd para snapshots mais tarde.
Criar a coleção
Começamos de novo porque a coleção de amostras predefinida do Gaia utiliza um tamanho de dimensão diferente.
Vamos remover se temos dados:
# Limpar quaisquer dados obsoletos
curl -X APAGAR 'http://localhost:6333/collections/default'
Em seguida, execute o seguinte.
# Provision a 768-dimensional, cosine-distance space
curl -X PUT 'http://localhost:6333/collections/default' \
-H 'Content-Type: application/json' \
--data-raw '{
"vectors": {
"size": 768,
"distance": "Cosine",
"on_disk": true
}
}'
A opção on_disk é sua amiga quando o corpus cresce para centenas de milhares de pedaços; o Qdrant mapeia os vectores em memória e deixa a RAM para o seu LLM.
Produzindo os Embeddings
Vamos pegar a CLI de incorporação
curl -LO https://github.com/GaiaNet-AI/embedding-tools/raw/main/csv_embed/csv_embed.wasm
Prepare a sua documentação como
Porquê CSV em vez de Markdown? Achei mais fácil utilizar CSV do que markdown e é melhor se colares cada parte em colunas diferentes e uma célula por coluna. Não hesite em utilizar llm_info.txt
se for essa a sua preferência.
Eu usei o gitingest para transformar o repositório git de documentos do vyper em um simples resumo de texto de sua base de código, o que é realmente útil para alimentar uma base de código/documentos no LLM.
Gerar os vectores
Vamos certificar-nos de que o ficheiro csv/o ficheiro llm_info.txt se encontra no mesmo diretório e vamos gerar os vectores.
wasmedge --dir .:. \
--nn-preload embedding:GGML:AUTO:nomic-embed-text-v1.5.f16.gguf \
csv_embed.wasm embedding default 768 seus_docs.csv --ctx_size 8192
- Repartição das bandeiras:
- -dir .:. dá ao wasm sandbox leitura/escrita no diretório de trabalho, para que ele possa transmitir o CSV e escrever vetores de volta para o Qdrant.
- -nn-preload embedding:GGML:AUTO:... pré-carrega o modelo uma vez, economizando ~2 s por 1.000 pedaços.
- ctx_size é a janela de token secundária utilizada no modelo de incorporação, não no modelo de chat; aumente-a se os parágrafos do seu documento forem longos e vir truncamentos nos registos.
Pode executar o comando várias vezes com --start_vector_id para anexar novos fragmentos sem colisões; os Qdrant IDs são inteiros, por isso escolha um offset como 100_000 se planeia actualizações trimestrais de documentos.
Empacotamento e distribuição da base de conhecimentos
Um snapshot nada mais é do que um diretório de arquivos JSON e Parquet que o Qdrant pode restaurar atomicamente. A compressão geralmente dá um ganho de tamanho de 3 para 1 porque os vetores são altamente repetitivos.
curl -X POST 'http://localhost:6333/collections/default/snapshots'
Agora é altura de comprimir os instantâneos, vamos até qdrant_snapshots/default
e, em seguida, comprimi-lo através da execução.
tar czvf meu.instantâneo.tar.gz meu.snapshot
Em vez de my.snapshot
basta usar o nome do ficheiro. Carregue o ficheiro my.snapshot.tar.gz para o huggingface, é necessário ter uma conta lá. Agora clique em new dataset (novo conjunto de dados) e carregue a sua base de conhecimentos.
Algumas práticas recomendadas (aprendidas da maneira mais difícil)
-
Estratégia de fragmentação
O objetivo é ter 200-500 tokens por vetor. Se for demasiado curto, o índice é inundado com milhares de embeddings quase idênticos (ruído). Demasiado longo e o passo de recuperação devolve blocos que o modelo nunca lê completamente.
-
Engenharia de sistemas rápidos
Capacidades de frase e barreiras de proteção. Exemplo:
"És um assistente linguístico Vyper. Se lhe fizerem perguntas que não sejam Vyper, recuse-as educadamente com um pedido de desculpas de uma só frase. Cite os números das linhas de código em todas as respostas."
-
Ciclo de avaliação contínua
Transfira as consultas dos utilizadores reais para uma folha de cálculo, classifique-as à mão como "Útil/Não Útil" e procure padrões: as pessoas pedem mais práticas recomendadas de segurança do que sintaxe? Isso diz-lhe que secções do documento precisam de exemplos mais ricos.
Depois de carregar a base de conhecimento no huggingface, é hora de mudar a base de conhecimento para o nosso llm. Se você ainda não teve a oportunidade de rodar seu próprio nó, você pode ir até aqui e começar.
Se quisermos selecionar um nó específico, vamos até aqui e escolhemos um LLM que funcione para mim.
Após a instalação, será necessário executar o seguinte:
gaianet config \
--snapshot https://cara de abraço.co/conjuntos de dados/miau-ai/vyper-lang/resolver/principal/padrão-845259036638694-2025-04-22-09-28-18.instantâneo.tar.gz \
--sistema-aviso "És um útil instrutor de vyper lang, por favor responde às perguntas"
Aqui --snapshot https://huggingface.co/...
é o link para descarregar a minha base de conhecimentos que carreguei no huggingface.
Verá algo como o seguinte no seu terminal:
[+] Atualização o prompt do sistema do modelo de chat ...
* Antigo prompt do sistema: Tu é um instrutor vyper lang útil, por favor, responda às perguntas
* Novo prompt do sistema: Tu é um instrutor web3 útil, por favor, responda às perguntas
[+] Atualização o url do instantâneo ...
* antigo url: https://cara de abraço.co/conjuntos de dados/miau-ai/web3-conhecimento-base/resolver/principal/padrão-8461598741381726-2025-04-29-07-50-41.instantâneo.tar.gz
* Novo url: https://cara de abraço.co/conjuntos de dados/miau-ai/vyper-lang/resolver/principal/padrão-845259036638694-2025-04-22-09-28-18.instantâneo.tar.gz
✅ CONCLUÍDO! A configuração.json é atualizado com sucesso.
Agora deves ir em frente e iniciar o nó gaia usando início da gaianet
.
Agora, o nó usará a base de conhecimento do vyper que acabamos de atualizar. Criámos com sucesso o nosso agente de documentação.