Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Junte-se a nós no Amazon Web Services re:Invent 2024! Saiba como usar o MongoDB para casos de uso de AI .
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
Atlaschevron-right

Construindo aplicativos de AI e RAG com MongoDB, Anyscale e PyMongo

Pavel Duchovny7 min read • Published Jul 17, 2024 • Updated Jul 17, 2024
IAPythonAtlas
SNIPPET
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Início rápido
star-empty
star-empty
star-empty
star-empty
star-empty
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.

Implemente seu cluster do Atlas

Se você não criou um Atlas cluster, siga nosso guia.
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 à rede0.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.

Crie uma coleção e um índice vetorial 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 dadosanyscale_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}

Cadastre-se para uma conta Anyscale

Registre-se para uma conta e obtenha créditos de computação gratuitos para experimentar a plataforma Anyscale.

Implantar modelos auto-hospedados para o serviço RAG

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:
  • Inicie este modelo para implementar o modelo de incorporação thenlper/gth-large.
  • Inicie este modelo para implantar o modelo LLM llama-2-70b.
Usaremos os valores padrão, pois eles oferecem um bom ponto de partida para as configurações de hardware e autoscaling.
Para saber mais sobre o modelo usado, consulte a página de documentação do Anyscale.
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:
1https://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:
1https://YYYYYYYYYYYYY.anyscaleuserdata.com
Anote o portador LLM, pois ele será usado como nossa chave de API para tarefas relacionadas ao LLM.

Construa o serviço RAG

Crie um espaço de trabalho na plataforma Anyscale

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. Espaços de trabalho
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á...
1pip install pymongo openai fastapi
...ao clicar na aba Dependências, conforme mostrado na captura de tela abaixo: Dependencies
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.
1from typing import Any
2from fastapi import FastAPI, HTTPException
3from pydantic import BaseModel
4from pymongo import MongoClient
5import os
6import openai
7from dotenv import load_dotenv
8from ray import serve
9import logging
10
11# Initialize FastAPI
12fastapi = FastAPI()
13
14# Initialize logger
15logger = logging.getLogger("ray.serve")
16
17# Data model for the request
18class QueryModel(BaseModel):
19 query: str
20
21@serve.deployment
22@serve.ingress(fastapi)
23class 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 @fastapi.post("/rag_endpoint/")
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
95my_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étodorag_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):
1from pymongo import MongoClient
2import os
3import openai
4from dotenv import load_dotenv
5
6client = MongoClient(os.getenv("MONGODB_ATLAS_URI"))
7db = client["anyscale_db"]
8collection = db["stories"]
9
10# Embedding endpoint for vector embeddings
11openai_embedding = openai.OpenAI(
12 base_url="https://XXXXXXXXXXXX.anyscaleuserdata.com/v1",
13 api_key=os.getenv('EMBEDDING_API_KEY')
14)
15
16def 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
40generate_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:
1python generate.py
A collection foi adicionada com as seguintes histórias e incorporações: Docsincorporados
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:
1serve run main:my_app --non-blocking
Agora, o endpoint RAG está ativo em ras_endpoint:
1payload = {"query": "Main character list"}
2
3
4# Perform the POST request
5response = requests.post("http://localhost:8000/rag_endpoint", json=payload)
6
7# Print the response in JSON format
8print(response.json())
O resultado esperado:
1Based on the provided context, the main character list is:
2
3
41. Jessica
52. Rio
63. Karl

Implemente o serviço RAG

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.
1anyscale 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: Serviço implantado
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:
1curl -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."

Conclusão

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.

Principais conclusões

  • 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.
Participe de nossos fóruns e configure sua conta Atlas com Anyscale!
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.
Iniciar a conversa

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Início rápido
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

IoT e MongoDB: impulsionando a análise de séries temporais do consumo doméstico de energia


Aug 28, 2024 | 6 min read
Início rápido

Integração do Atlas Search com o BuildSship


Oct 15, 2024 | 4 min read
Artigo

Ouça o Scale Up com os serviços de aplicativos do Atlas


Sep 09, 2024 | 3 min read
exemplo de código

Comece a usar o MongoDB Atlas e o AWS CloudFormation


Jan 23, 2024 | 3 min read
Sumário