Construindo aplicativos de AI e RAG com MongoDB, Anyscale e PyMongo
Avalie esse Início rápido
O coluna AI se tornou uma consideração significativa em aplicativos modernos. O setor empresarial está muito interessado em modernização e envolvimento de modelos de AI em aplicativos empresariais. No entanto, o uso de APIs disponíveis publicamente e a dependência de serviços públicos não são adequados para todas as empresas, especialmente se elas exigirem uma segregação de dados segura e em alta escala.
Dito isso, cada vez mais empresas estão migrando para a nuvem para criar aplicativos em escala em ciclos rápidos e competitivos, utilizando serviços de implantação inteligentes e robustos. É aqui que entram a plataforma de dados MongoDB Atlas e a plataforma de computação Anyscale AI.
Anyscale é uma plataforma para executar aplicativos distribuídos usando Key, um framework de código aberto para criar aplicativos escaláveis. A integração do MongoDB Atlas com Anyscale e PyMongopode ajudá-lo a gerenciar e analisar com eficiência grandes conjuntos de dados, aproveitando os recursos de computação distribuída de Rey ao usar o MongoDB como banco de dados de backend.
Usando o para uma inferência rápida e eficiente LLM e a MongoDB Atlas indexação vetorial escalável do para o Atlas Search contextual, os usuários podem construir e implantarRAG fluxos e sistemas de agentes super escaláveis de geração de recuperação baseada em IA.
Neste tutorial, abordaremos os seguintes aspectos principais da criação de um backend RAG escalável para seu aplicativo:
- Implemente um armazenamento de vetor escalável usando o MongoDB Atlas.
- Implemente o modelo de incorporação necessário e o LLM no Anyscale.
- Conecte o armazenamento de vetores com seu serviço distribuído usando os serviços do PyMongo e Anyscale.
Obtenha a cadeia de conexão do MongoDB e permita o acesso a partir de endereços IP relevantes. Para este tutorial, você usará a lista de acesso à rede
0.0.0.0/0
.Para implementações de produção, os usuários podem gerenciar VPCs e redes privadas na plataforma Anyscale e conectá-las com segurança por meio de emparelhamento de VPC ou endpoints privados de nuvem ao Atlas.
Usando o Data Explorer ou uma conexão MongoDB Compass, crie a seguinte collection para hospedar nosso contexto de aplicativo para o processo RAG. Use o nome do banco de dados
anyscale_db
e o nome da collection stories
. Depois que a collection for criada, vá para a guia Atlas Search (ou a guia Índice no MongoDB Compass usando o botão de alternância de pesquisa do Atlas) e crie o seguinte índice vetorial:nome : vector_index
1 { 2 "fields": [ 3 { 4 "type": "vector", 5 "path": "embedding", 6 "numDimensions": 1024, 7 "similarity": "cosine" 8 } 9 ] 10 }
Registre-se para uma conta e obtenha créditos de computação gratuitos para experimentar a plataforma Anyscale.
O Anyscale oferece um modelo simples de seguir que você pode iniciar a partir da plataforma Anyscale para auto-hospedar de forma ideal os modelos para seu serviço RAG aproveitando o ray-LLM. ray-LLM usa as melhores otimizações da classe de bibliotecas de inferência como o vLLM e oferece uma API compatível com OpenAI para nossos modelos implementados.
Com o Anyscale, você tem a flexibilidade de escolher as configurações de hardware e autoscaling para os modelos, de modo que possa compensar custo e desempenho de acordo com seu caso de uso.
Para os fins de nosso guia, vamos:
Usaremos os valores padrão, pois eles oferecem um bom ponto de partida para as configurações de hardware e autoscaling.
Observe que alguns modelos exigem aprovação no site do Abraçando a Face.
Depois de implantar os modelos acima, você deve ter dois serviços funcionais com URL de API acessível e tokens de portador:
Digamos que o serviço de incorporação implantado esteja ativado:
1 https://XXXXXXXXXXXX.anyscaleuserdata.com
Anote o portador da incorporação, pois ele será usado como nossa chave de API para incorporar tarefas relacionadas.
O LLM é implantado em outro endpoint:
1 https://YYYYYYYYYYYYY.anyscaleuserdata.com
Anote o portador LLM, pois ele será usado como nossa chave de API para tarefas relacionadas ao LLM.
Crie um modelo de espaço de trabalho para construir nosso serviço RAG. Recomendamos que você inicie o modelo Introdução aos serviços para obter um espaço de trabalho em execução que mostre como implantar seu primeiro serviço Anyscale.
Você pode pensar em um espaço de trabalho em qualquer escala como um IDE (Visual Studio) executado em um cluster de computação elasticamente escalável.
Usaremos este espaço de trabalho para criar todos os nossos serviços.
Vamos começar especificando as dependências e variáveis de ambiente que nosso serviço RAG exigirá...
1 pip install pymongo openai fastapi
...ao clicar na aba Dependências, conforme mostrado na captura de tela abaixo:
Você precisará colocar as chaves de API como variáveis de ambiente em Espaço de trabalho > Seu nome > Dependências:
- Coloque o portador de incorporação como uma variável de ambiente no espaço de trabalho:
EMBEDDING_API_KEY
- Coloque o portador LLM como uma variável de ambiente em nosso espaço de trabalho:
LLM_API_KEY
- Coloque sua connection string do Atlas (por exemplo,
mongodb+srv://<user>:<pass>@cluster0.abcd.mongodb.net/
):MONGODB_ATLAS_URI
Lembre-se de substituir os valores pela connection string do cluster e pelas suas chaves.
Agora, você pode usar esses serviços para criar seu serviço RAG para usar endpoints de incorporação privada e LLM. Eles são compatíveis com o cliente OpenAI e, portanto, você pode usar o cliente OpenAI como parte do nosso serviço MongoDB RAG da seguinte forma.
Crie um novo arquivo chamado
main.py
no diretório raiz do espaço de trabalho.1 from typing import Any 2 from fastapi import FastAPI, HTTPException 3 from pydantic import BaseModel 4 from pymongo import MongoClient 5 import os 6 import openai 7 from dotenv import load_dotenv 8 from ray import serve 9 import logging 10 11 # Initialize FastAPI 12 fastapi = FastAPI() 13 14 # Initialize logger 15 logger = logging.getLogger("ray.serve") 16 17 # Data model for the request 18 class QueryModel(BaseModel): 19 query: str 20 21 22 23 class MongoDBRag: 24 25 def __init__(self): 26 # MongoDB connection 27 client = MongoClient(os.getenv("MONGODB_ATLAS_URI")) 28 db = client["anyscale_db"] 29 self.collection = db["stories"] 30 31 # AI Client initialization 32 # LLM endpoint for text generation 33 self.openai_llm = openai.OpenAI( 34 base_url="https://YYYYYYYYYYYYY.anyscaleuserdata.com/v1", 35 api_key=os.getenv('LLM_API_KEY') 36 ) 37 38 # Embedding endpoint for vector embeddings 39 self.openai_embedding = openai.OpenAI( 40 base_url="https://XXXXXXXXXXXX.anyscaleuserdata.com/v1", 41 api_key=os.getenv('EMBEDDING_API_KEY') 42 ) 43 44 45 async def rag_endpoint(self, query: QueryModel) -> Any: 46 try: 47 # Generate embedding for the input query 48 embedding = self.openai_embedding.embeddings.create( 49 model="thenlper/gte-large", 50 input=query.query, 51 ) 52 53 # Perform vector search in MongoDB to find relevant context 54 context = list(self.collection.aggregate([ 55 {"$vectorSearch": { 56 "queryVector": embedding.data[0].embedding, 57 "index": "vector_index", 58 "numCandidates": 3, 59 "path": "embedding", 60 "limit": 1 61 }}, 62 { 63 "$project": { 64 "_id": 0, 65 "embedding": 0 66 } 67 } 68 ])) 69 70 # Construct prompt with context and query 71 prompt = f""" Based on the following context please answer and elaborate the user query. 72 context: {context} 73 74 query: {query.query} 75 Answer: """ 76 77 # Generate response using LLM 78 chat_completion = self.openai_llm.chat.completions.create( 79 model="meta-llama/Llama-2-70b-chat-hf", 80 messages=[ 81 {"role": "system", "content": "You are a helpful QA assistant"}, 82 {"role": "user", "content": prompt} 83 ], 84 temperature=0.7 85 ) 86 87 answer = chat_completion.choices[0].message.content 88 89 return answer 90 91 except Exception as e: 92 raise HTTPException(status_code=500, detail=str(e)) 93 94 # Bind the deployment 95 my_app = MongoDBRag.bind()
Esse serviço utiliza o ReyServe integrado ao FastAPI para conectar oMongoDB Atlas ao modelo de incorporação e aos serviços LLM que implantamos anteriormente.
Com Ray Serve, podemos definir uma implantação automaticamente escalonável decorando uma classe onde:
- Toda inicialização de estado (por exemplo, carregamento de pesos de modelo, criação de banco de dados e conexões de cliente) é definida nométodo " init".
- As rotas HTTP são definidas envolvendo um método com o construtor FastAPI correspondente, como fizemos com o método
rag_endpoint
.
Para gerar um subconjunto de dados de amostra para testar nosso serviço RAG, sugerimos executar o trecho de código abaixo (por exemplo,
generate_embeddings.py
):1 from pymongo import MongoClient 2 import os 3 import openai 4 from dotenv import load_dotenv 5 6 client = MongoClient(os.getenv("MONGODB_ATLAS_URI")) 7 db = client["anyscale_db"] 8 collection = db["stories"] 9 10 # Embedding endpoint for vector embeddings 11 openai_embedding = openai.OpenAI( 12 base_url="https://XXXXXXXXXXXX.anyscaleuserdata.com/v1", 13 api_key=os.getenv('EMBEDDING_API_KEY') 14 ) 15 16 def generate_data() -> str: 17 # Sample data to be inserted into MongoDB 18 data = [ 19 "Karl lives in NYC and works as a chef", 20 "Rio lives in Brasil and works as a barman", 21 "Jessica lives in Paris and works as a programmer." 22 ] 23 24 for info in data: 25 # Generate embedding for each piece of information 26 embedding = openai_embedding.embeddings.create( 27 model="thenlper/gte-large", 28 input=info, 29 ) 30 31 # Update or insert the data with its embedding into MongoDB 32 collection.update_one( 33 {'story': info}, 34 {'$set': {'embedding': embedding.data[0].embedding}}, 35 upsert=True 36 ) 37 38 return "Data Ingested Successfully" 39 40 generate_data()
Agora você pode acessar o serviço. Vamos alimentar os dados para criar a coleção com incorporações e preencher nossa coleção "stories " com três documentos de exemplo:
1 data = [ 2 "Karl lives in NYC and works as a chef", 3 "Rio lives in Brasil and works as a barman", 4 "Jessica lives in Paris and works as a programmer." 5 ]
Use o seguinte comando para carregar dados:
1 python generate.py
A collection foi adicionada com as seguintes histórias e incorporações:
Observação para escalar horizontalmente a geração de inserção de texto, você pode seguir o modelo de workspace para calcular inserções de texto em escala. Este modelo aproveita as práticas recomendadas para inferência em lote de modelos de inserção para maximizar a taxa de transferência do cluster heterogêneo subjacente de CPUs e GPUs.
Agora, execute o serviço localmente:
1 serve run main:my_app --non-blocking
Agora, o endpoint RAG está ativo em ras_endpoint:
1 payload = {"query": "Main character list"} 2 3 4 # Perform the POST request 5 response = requests.post("http://localhost:8000/rag_endpoint", json=payload) 6 7 # Print the response in JSON format 8 print(response.json())
O resultado esperado:
1 Based on the provided context, the main character list is: 2 3 4 1. Jessica 5 2. Rio 6 3. Karl
Agora que você testou o serviço executando localmente no espaço de trabalho, pode prosseguir para implantá-lo como um serviço Anyscale independente, acessível por meio de um URL e um token de portador para usuários externos.
1 anyscale services deploy main:my_app --name=my-rag-service
Depois que o comando for propagado com sucesso, você obterá o URL do ponto de extremidade do serviço e seu token "bearer " para autorização:
1 (anyscale +2.0s) Starting new service 'my-rag-service'. 2 (anyscale +4.5s) Using workspace runtime dependencies env vars: {'MONGODB_ATLAS_URI': '<YOUR_URI>', 'LLM_API_KEY': '<YOURKEY>', 'EMBEDDING_API_KEY': '<YOURKEY>'}. 3 (anyscale +4.5s) Uploading local dir '.' to cloud storage. 4 (anyscale +5.5s) Including workspace-managed pip dependencies. 5 (anyscale +6.1s) Service 'my-rag-service' deployed. 6 (anyscale +6.1s) View the service in the UI: 'https://console.anyscale.com/services/service2_wx8ar3cbuf84g9u87g3yvx2cq8' 7 (anyscale +6.1s) Query the service once it's running using the following curl command: 8 (anyscale +6.1s) curl -H 'Authorization: Bearer xxxxxxx' https://my-rag-service-yyyy.xxxxxxxxxxxx.s.anyscaleuserdata.com/
O serviço que você implementou estará visível na aba Serviços na plataforma Anyscale:
Quando o serviço estiver íntegro, você poderá acessá-lo por meio da URL e das credenciais fornecidas da mesma forma que no espaço de trabalho:
1 curl -X POST \ 2 -H "Authorization: Bearer XXXX" \ 3 -H "Content-Type: application/json" \ 4 https://my-rag-service-yyyy.cld-yga7qm8f6yamqev7.s.anyscaleuserdata.com/rag_endpoint/ \ 5 --data-raw '{"query": "What are the main character names?" }' 6 "The main character names mentioned in the stories are Jessica, Karl and Rio."
A integração do MongoDB com o Anyscale e o PyMongo habilita fluxos de trabalho de análise e processamento de dados distribuídos avançados. Ao combinar o MongoDB's document model, a escalabilidade integrada da plataforma de dados para desenvolvedores Atlas e os recursos de pesquisa vetorial com a plataforma de computação distribuída do Anyscale, os desenvolvedores podem criar pipelines RAG escaláveis e aplicativos baseados em IA.
- MongoDB Atlas fornece uma solução de banco de dados gerenciado com indexação vetorial para Atlas Search semântica.
- A Anyscale oferece uma plataforma para executar aplicativos Python distribuídos usando o Rey.
- O PyMongo permite fácil interação com o MongoDB a partir do Python. Essas tecnologias permitem a criação de sistemas RAG de alto desempenho que podem ser dimensionados.
Este tutorial passou pela configuração de um serviço RAG básico usando modelos de linguagem MongoDB, Anyscale e open-source. Para casos de uso de produção, considere:
- Modelos de ajuste fino em dados específicos de domínio.
- Implementação de cache e lote para melhorar o desempenho.
- Adiciona monitoramento e observabilidade.
- Aumentar os recursos de computação conforme necessário.
A integração do MongoDB e do Anyscale abre possibilidades interessantes para a criação de aplicativos de AI que podem processar e raciocinar com eficiência sobre grandes conjuntos de dados. Incentivamos você a explorar mais e ultrapassar os limites do que é possível com essas ferramentas poderosas.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.