Mais um cache, mas para o ChatGPT
ChatGPT é uma tecnologia impressionante que permite que desenvolvedores criem aplicações revolucionárias. No entanto, o desempenho e o custo dos modelos de linguagem (LLMs) são questões significativas que dificultam sua aplicação ampla em diversos campos. Por exemplo, enquanto desenvolvíamos um chatbot https://osschat.io/ para a comunidade open-source, o ChatGPT era um grande gargalo que impedia nossa aplicação de responder tão rapidamente quanto esperado. O custo também é outro obstáculo que nos impede de atender mais comunidades open-source.
Em um almoço da equipe, uma ideia veio à mente: por que não adicionar outra camada de cache para as respostas geradas por LLM? Essa camada de cache seria semelhante a como Redis e Memcache foram criados no passado para acelerar e reduzir o custo de acesso a bancos de dados. Com esse cache, podemos diminuir as despesas para gerar conteúdo e fornecer respostas em tempo real mais rápidas. Além disso, o cache pode ser usado para simular respostas, o que nos ajuda a verificar os recursos da nossa aplicação sem incorrer em despesas extras em nossos testes.
Caches tradicionais só recuperam dados quando a chave é idêntica. Essa limitação apresenta um problema significativo para aplicações AIGC, que frequentemente trabalham com linguagem natural e precisam de restrições de sintaxe mais específicas ou mecanismos adicionais de limpeza de dados. Para resolver esse problema, criamos Yet Another Cache para aplicações nativas de AIGC, que chamamos de GPTCache (https://github.com/zilliztech/GPTCache), já que ele é criado nativamente para acelerar o ChatGPT e otimizado para busca semântica.
Com GPTCache, você pode armazenar em cache suas respostas de LLM com apenas algumas linhas de alterações no código, tornando suas aplicações de LLM 100 vezes mais rápidas. Nesta postagem do blog, descreveremos como construímos o cache semântico e algumas das escolhas de design que fizemos.
Por que um cache ajudaria em nossos casos de uso?
Nosso chatbot permite que usuários façam perguntas gerais sobre projetos open-source no GitHub e perguntas detalhadas sobre repositórios específicos do GitHub e suas páginas de documentação associadas. À medida que nosso serviço ganha popularidade, as despesas associadas a chamadas às APIs da OpenAI aumentam. Observamos que certos tipos de conteúdo, como tópicos populares ou em alta e repositórios do GitHub em destaque, são acessados com mais frequência. Perguntas do tipo "O que é" são as mais comumente acessadas, junto com a lista de perguntas recomendadas na página inicial do serviço.
Assim como aplicações tradicionais, o acesso de usuários em aplicações AIGC tem localidade temporal e espacial. Podemos aproveitar isso implementando um sistema de cache que reduz o número de chamadas ao ChatGPT. Dado o tempo de resposta lento e o alto custo das APIs da OpenAI, esse sistema de cache é essencial, já que normalmente cobra vários dólares por 1M tokens e leva alguns segundos para responder. Ao realizar uma busca vetorial entre milhões de vetores em cache e recuperar o resultado armazenado em cache a partir de um banco de dados, podemos reduzir significativamente o tempo médio de resposta de ponta a ponta do nosso serviço e diminuir o custo do serviço da OpenAI.
Por que o Redis não funcionará em cenários AIGC?
Sou um grande fã do Redis por causa de sua flexibilidade e desempenho, o que o torna adequado para vários casos de uso. No entanto, ele não é minha primeira escolha para construir um cache para o ChatGPT. O Redis usa um modelo de dados chave-valor e não consegue consultar chaves aproximadas.
Por exemplo, suponha que um usuário faça perguntas como "Quais são as vantagens e desvantagens de todos os frameworks de deep learning?" ou "Fale-me sobre PyTorch vs. TensorFlow vs. JAX?". Nesse caso, eles estão perguntando a mesma coisa. No entanto, o Redis não consegue acertar a consulta, quer você armazene em cache a pergunta inteira ou apenas armazene em cache as palavras-chave geradas por um tokenizador. Essa falha ocorre porque palavras diferentes podem ter o mesmo significado em linguagem natural, e modelos de deep learning são melhores em revelar essa semântica do que regras. Portanto, devemos incorporar busca por similaridade vetorial como parte de um cache semântico.
Outro motivo pelo qual o Redis pode não ser uma opção perfeita para cache de AIGC é seu alto custo. As chaves e os valores são grandes devido ao contexto longo, portanto armazenar tudo no Redis pode rapidamente se tornar caro. Fazer cache com um banco de dados baseado em disco pode ser uma alternativa melhor, porque as respostas do chatGPT são lentas, então não importa se o cache consegue responder em submilissegundos ou em dezenas de milissegundos.
Construir o GPTCache do Zero
Estamos entusiasmados com essa ideia e a discutimos durante a noite. Como resultado, criamos um diagrama de arquitetura útil mostrado abaixo:
Arquitetura de Alto Nível do GPTCache | Zilliz
Mais tarde, decidimos simplificar a implementação pulando o gerenciador de contexto. Apesar dessas mudanças, o sistema ainda consiste em cinco componentes principais. Listamos abaixo as funcionalidades significativas de cada um dos componentes:
- Adaptador de LLM: Adaptadores convertem solicitações de LLM em protocolo de cache e os resultados em cache em respostas de LLM. Nosso objetivo é tornar esse cache transparente, sem exigir esforço extra para integrá-lo ao nosso sistema ou a qualquer outro sistema que dependa do ChatGPT. O adaptador deve facilitar a integração fácil de todos os LLMs e ser extensível para futuros modelos multimodais. Inicialmente, implementamos adaptadores OpenAI e langchain porque nosso sistema depende muito deles. Múltiplas implementações também garantiram que nossa interface fizesse sentido para todas as APIs de LLM, para que pudéssemos estender ainda mais o adaptador.
- Gerador de Embeddings: O gerador de embeddings codifica consultas em embeddings, permitindo buscas por similaridade. Para atender às necessidades de diferentes usuários, oferecemos suporte a duas formas de gerar embeddings. A primeira é por meio de serviços em nuvem como OpenAI, Hugging Face e Cohere. A segunda é por meio de um modelo local servido em ONNX. Além disso, planejamos oferecer suporte a geradores de embeddings PyTorch e codificar imagens, arquivos de áudio e outros tipos de dados não estruturados.
- Gerenciador de Cache: O gerenciador de cache é o componente central do GPTCache, servindo a três funções: armazenamento de cache, que armazena as solicitações dos usuários e suas respostas de LLM; armazenamento vetorial, que armazena embeddings vetoriais e busca resultados semelhantes; e gerenciamento de despejo, que controla a capacidade do cache e despeja dados expirados quando o cache está cheio, usando a política LRU ou FIFO. O Gerenciador de Cache usa um design plugável. Inicialmente, o implementamos com SQLite e FAISS como backend. Posteriormente, o expandimos para incluir outras implementações, como MySQL, PostgreSQL, Milvus, e outros bancos de dados vetoriais, tornando-o ainda mais escalável. O Gerenciador de Despejo libera memória removendo dados antigos e não utilizados do GPTCache. Ele remove entradas tanto do cache quanto do armazenamento vetorial quando necessário. No entanto, exclusões frequentes na maioria dos sistemas de armazenamento vetorial podem causar uma queda no desempenho. O GPTCache aciona operações assíncronas, como construção de índice ou compactação, assim que o limite de exclusão é atingido, para mitigar esse problema.
- Avaliador de Similaridade: O GPTCache recupera as k respostas mais semelhantes de seu cache e usa uma função de avaliação de similaridade para determinar se uma resposta em cache corresponde à consulta de entrada. O GPTCache oferece suporte a três funções de avaliação: avaliação de correspondência exata, avaliação de distância de embeddings e avaliação de modelo ONNX. O módulo de avaliação de similaridade é crucial para a eficácia do GPTCache. Após investigação, usamos uma versão ajustada do modelo ALBERT. No entanto, sempre há espaço para melhorias usando outros modelos de linguagem ajustados ou outros LLMs, como LLaMa-7b. Quaisquer contribuições ou sugestões seriam muito bem-vindas.
- Pós-processadores: O Pós-processador auxilia na preparação da resposta final para o usuário. Ele pode retornar a resposta mais semelhante ou adicionar aleatoriedade com base na temperatura da solicitação. Se nenhuma resposta semelhante puder ser encontrada no cache, a solicitação será delegada aos LLMs para gerar e armazenar em cache uma nova resposta.
Avaliação
Para ilustrar nossa ideia, descobrimos um conjunto de dados contendo três pares de frases: amostras positivas com semântica idêntica, amostras negativas com semântica relacionada, mas não idêntica, e frases entre amostras positivas e negativas com semântica completamente não relacionada. Você pode encontrar o conjunto de dados em nosso repo.
Experimento 1
Para estabelecer uma linha de base, primeiro armazenamos em cache as chaves de todas as 30.000 amostras positivas. Em seguida, selecionamos aleatoriamente 1.000 amostras e usamos seus valores pares como consultas. Aqui estão os resultados que obtivemos:
| Acerto de Cache | Falha de Cache | Positivo | Negativo | Latência de Acerto |
|---|---|---|---|---|
| 876 | 124 | 837 | 39 | 0.20s |
Descobrimos que definir o limiar de similaridade do GPTCache como 0,7 alcança um bom equilíbrio entre as taxas de acertos e de positivos. Portanto, usaremos essa configuração para todos os testes subsequentes.
Para determinar se o resultado em cache é positivo ou negativo em relação à consulta, usamos a pontuação de similaridade gerada pelo ChatGPT e definimos o limiar positivo como 0,6. Geramos essa pontuação de similaridade usando o seguinte prompt:
Por favor, avalie a similaridade das duas perguntas a seguir em uma escala de 0 a 1, em que 0 significa não relacionadas e 1 significa exatamente o mesmo significado.
As perguntas "What are some good tips for self-study?" e "What are the smart tips for self-studying?" são muito semelhantes, com uma pontuação de similaridade de 1.0.
As perguntas "What are some essential things for wilderness survival?" e "What are the things you need for survival?" são bastante semelhantes, com uma pontuação de similaridade de 0.8.
As perguntas "What advice would you give to 16-year-old you?" e "Where should I promote my business online?" são completamente diferentes, então a pontuação de similaridade é 0.
Então, as perguntas "Which app lets you watch live football for free?" e "How can I watch a football live match on my phone?" A pontuação de similaridade é
Experimento 2
Emitimos consultas compostas por 50% de amostras positivas e 50% de amostras negativas (consultas não relacionadas). Como resultado, após executar 1160 solicitações, obtivemos os seguintes resultados:
| Acerto de Cache | Falha de Cache | Positivo | Negativo | Latência do Acerto |
|---|---|---|---|---|
| 570 | 590 | 549 | 21 | 0.17s |
A taxa de acertos é quase 50%, e a taxa de negativos entre os resultados com acerto é semelhante à do experimento 1, o que significa que o GPTCache fez um trabalho incrível ao distinguir consultas relacionadas e não relacionadas.
Experimento 3
Conduzimos outro experimento, inserindo todas as amostras negativas no cache e usando seus valores correspondentes como consultas. Embora alguns pares de amostras negativas tivessem uma pontuação de similaridade alta (maior que 0,9, de acordo com o ChatGPT), para nossa surpresa, nenhum dos exemplos negativos acertou o cache. Isso provavelmente ocorre porque o modelo usado no avaliador de similaridade foi ajustado nesse conjunto de dados, e quase todas as pontuações de similaridade para amostras negativas foram subestimadas.
Avaliação futura
Integramos o GPTCache ao nosso site OSSChat e agora estamos trabalhando na coleta de estatísticas de produção. Então, fique atento ao lançamento do nosso próximo benchmark, que incluirá casos de uso do mundo real.
É o fim do blog, mas apenas o começo para o GPTCache
Estamos satisfeitos com a rapidez com que conseguimos implementar e tornar open-source um trabalho tão incrível em menos de duas semanas. Bravo! Esperamos que agora você entenda completamente a ideia do GPTCache, como ele foi implementado, e tenha uma abundância de ideias sobre como ele pode ser integrado ao seu sistema.
Vamos recapitular rapidamente alguns dos pontos-chave sobre o GPTCache:
- O ChatGPT é impressionante, mas pode ser caro e lento às vezes.
- Como em outras aplicações, podemos ver localidade em casos de uso de AIGC.
- Para utilizar totalmente essa localidade, tudo de que você precisa é um cache semântico.
- Para criar um cache semântico, incorpore o contexto da sua consulta e armazene-o em um banco de dados vetorial. Em seguida, procure consultas semelhantes no cache antes de enviar a solicitação aos LLMs.
- Lembre-se de gerenciar a capacidade do cache!
Atualmente, estamos trabalhando na integração do GPTCache com mais LLMs e bancos de dados vetoriais. Em breve, lançaremos o GPTCache Bootcamp, que explicará como usar o GPTCache junto com LangChain e Hugging Face, bem como outras ideias para tornar o GPTCache multimodal. Agradecemos quaisquer contribuições ou sugestões e incentivamos você a nos mostrar como o GPTCache ajuda você na sua aplicação!
Saiba Mais sobre o GPTCache
Continue lendo

Data Deduplication at Trillion Scale: How to Solve the Biggest Bottleneck of LLM Training
Explore how MinHash LSH and Milvus handle data deduplication at the trillion-scale level, solving key bottlenecks in LLM training for improved AI model performance.

Balancing Precision and Performance: How Zilliz Cloud's New Parameters Help You Optimize Vector Search
Optimize vector search with Zilliz Cloud’s level and recall features to tune accuracy, balance performance, and power AI applications.

Similarity Metrics for Vector Search
Exploring five similarity metrics for vector search: L2 or Euclidean distance, cosine distance, inner product, and hamming distance.



