Como usar o MongoDB Atlas e os LLMs do IBM watsonx.ai em seus aplicativos de GenAI sem interrupções
Ashwin Gangadhar9 min read • Published Sep 18, 2024 • Updated Sep 18, 2024
Avalie esse Tutorial
Um dos desafios dos aplicativos de e-commerce é fornecer recomendações de produtos relevantes e personalizadas aos clientes. Os métodos tradicionais de pesquisa baseados em palavras-chave muitas vezes falham na captura do significado semântica e da intenção das queries de pesquisa do usuário e retornam resultados que não atendem às necessidades do usuário. Por sua vez, eles não conseguem converter em uma venda bem-sucedida. Para resolver esse problema, o RAG (geração aumentada de recuperação) é usado como uma estrutura alimentada pelo MongoDB Atlas Vector Search, LangChaine IBM watsonx.ai.
O RAG é uma técnica de geração de linguagem natural (TLG) que aproveita um módulo retriever para buscar documentos relevantes de um grande corpus e um módulo gerador para produzir texto condicional nos documentos recuperados. Aqui, a estrutura RAG é usada para alimentar recomendações de produtos como uma extensão das técnicas de pesquisa semântica existentes.
- Os casos de uso do RAG podem ser facilmente criados usando os recursos de pesquisa vetorial do MongoDB Atlas para armazenar e consultar incorporações de produtos em grande escala que representam os recursos e atributos de cada produto. Devido ao esquema flexível do MongoDB, eles são armazenados junto com as incorporações do produto, eliminando a complexidade e a latência de ter que recuperar os dados de tabelas ou bancos de dados separados.
- O RAG então recupera os produtos mais semelhantes à consulta do usuário com base na semelhança cossenoidal de suas incorporações e gera motivos de linguagem natural que destacam por que esses produtos são relevantes e atraentes para o usuário.
- O RAG também pode melhorar a experiência do usuário (UX) ao lidar com queries de pesquisa complexas e diversas, como "um suéter quente para o verão" ou "um presente para minha filha que se interessou por ciência", e fornece recomendações de produtos precisas e envolventes que aumentam Satisfação e Lealdade do Cliente.
Para permitir que o RAG recupere documentos relevantes, precisamos de um mecanismo de busca vetorial que possa armazenar e consultar com eficiência incorporações de documentos em grande escala. O MongoDB Atlas nos permite indexar documentos com base em suas incorporações e realizar pesquisas de similaridade usando distância cosseno, distância euclidiano ou produto pontual. O MongoDB Atlas também fornece esquema flexível, escalabilidade, segurança e recursos de desempenho em que mais de 45,000 organizações — de startups a empresas e organizações governamentais — dependem.
Ao usar o RAG com o MongoDB Atlas Vector Search, podemos melhorar a experiência do usuário em relação às recomendações de produtos de várias maneiras. Primeiro, podemos fornecer recomendações mais personalizadas e diversas que correspondem à query ou ao contexto do usuário. Em segundo lugar, podemos gerar respostas mais informativas e envolventes que podem explicar por que cada produto é recomendado e como ele se compara a outros. Terceiro, podemos melhorar a relevância e a precisão das recomendações atualizando as incorporações de documentos, pois o MongoDB é principalmente uma camada de dados operacionais (ODL) que fornece recursos de transação.
O Amazonx.ai é o Enterprise Studio de última geração da IBM para construtores de AI, reunindo novos recursos generativos de AI com o tradicional machine learning (ML) que abrange todo o ciclo de vida da AI. Com o watsonx.ai, você pode treinar, validar, ajustar e implantar modelos de ML básicos e tradicionais.
watsonx.ai gera uma biblioteca selecionada de modelos de base, incluindo modelos desenvolvidos pela IBM, modelos de código aberto e modelos fornecidos de fornecedores terceirizados. Nem todos os modelos são criados iguais, e a biblioteca curada oferece às empresas a opcionalidade de selecionar o modelo mais adequado para um caso de uso específico, setor, domínio ou até mesmo desempenho do preço. Além disso, os modelos desenvolvidos pela IBM, como a série de modelos Granite, oferecem outro nível de prontidão empresarial, Transparência e Indenização para casos de uso de produção. Usaremos modelos de Granite em nossa demonstração. Para o leitor interessado, a IBM publicou informações sobre seus dados e metodologia de treinamento para seus modelos de base Granite.
Para este tutorial, usaremos um conjunto dedados de produtos de e-commerce contendo mais 10,000 detalhes do produto. Usaremos o modelophrase-transformers/all-mpnet-base-v2 da Hugging Face para gerar as incorporações vetoriais para armazenar e recuperar informações do produto. Você precisará de um bloco de anotações Python ou um IDE, uma conta MongoDB Atlas e uma contahastonx.ai para experiência prática.
langchain
: framework de orquestraçãoibm-watson-machine-learning
: para IBM LLMswget
: Para baixar dados da base de conhecimentosentence-transformers
Para modelo de incorporaçãopymongo
Para o armazenamento de vetores do MongoDB Atlas
Usaremos os modelos de base do watsonx.ai e do Python SDK para implementar nosso pipeline RAG no LangChain.
- Criar um projeto watsonx.ai. Durante a integração, um projeto de sandbox pode ser criado rapidamente para você. Você pode usar o projeto sandbox ou criar um; o link funcionará depois que você se registrar e configurar o vatsonx.ai. Se precisar de mais ajuda, você pode ler a documentação.
- Crie uma chave de API para acessar os modelos de base do watsonx.ai. Siga as etapas para criar sua chave de API.
- Instale e use watsonx.ai. Também conhecido como IBM Atlas Machine Learning SDK, asinformações do watsonx.ai SDK estão disponíveis no Github. Como qualquer outro módulo Python, você pode instalá-lo com uma instalação pip. Nosso exemplo de bloco de anotações trata disso para você.
Executaremos todos os trechos de código abaixo em um notebook Jupyter. Você pode optar por executá-los no VS Code ou em qualquer outro IDE de sua escolha.
Inicializar o LLM
Inicialize a URL watsonx para se conectar executando os blocos de código abaixo em seu bloco de anotações Jupyter:
1 # watsonx URL 2 3 try: 4 wxa_url = os.environ["WXA_URL"] 5 6 except KeyError: 7 wxa_url = getpass.getpass("Please enter your watsonx.ai URL domain (hit enter): ")
Para poder acessar os modelos LLM e outros serviços de AI no watsonx, você precisa inicializar a chave da API. Para iniciar a chave da API, execute o seguinte bloco de código em seu notebook Jupyter:
1 # watsonx API Key 2 3 try: 4 wxa_api_key = os.environ["WXA_API_KEY"] 5 except KeyError: 6 wxa_api_key = getpass.getpass("Please enter your watsonx.ai API key (hit enter): ")
Quando executar o código acima, você será solicitado a adicionar a chave de API do IAM que foi obtida anteriormente.
Cada experimento pode ser marcado ou executado em projetos específicos. Para buscar o projeto relevante, podemos inicializar a ID do projeto executando o bloco de código abaixo no bloco de anotações Jupyter:
1 # watsonx Project ID 2 3 try: 4 wxa_project_id = os.environ["WXA_PROJECT_ID"] 5 except KeyError: 6 wxa_project_id = getpass.getpass("Please enter your watsonx.ai Project ID (hit enter): ")
Você pode encontrar a ID do projeto ao lado da chave de API do IAM no painel de configurações no portal do watsonx.ai.
Modelo de linguagem
No exemplo de código abaixo, inicializaremos o Granite LLM da IBM e, em seguida, demonstraremos como usar o LLM inicializado com a estrutura LangChain antes de construirmos nosso RAG.
Usaremos a pergunta: "Quero apresentar minha filha à ciência e Spark seu entusiasmo. Que tipo de presentes devo dar a ela?"
Isso nos ajudará a demonstrar como o LLM e a pesquisa vetorial funcionam em uma estrutura RAG em cada etapa.
Em primeiro lugar, vamos inicializar o LLM hospedado na nuvem watsonx. Para acessar o modelo de Granito relevante do watsonx, você precisa executar o seguinte bloco de código para inicializar e testar o modelo com nossa consulta de exemplo no bloco de notas do Jupyter:
1 from ibm_watson_machine_learning.foundation_models.utils.enums import ModelTypes 2 from ibm_watson_machine_learning.foundation_models import Model 3 from ibm_watson_machine_learning.metanames import GenTextParamsMetaNames as GenParams 4 from ibm_watson_machine_learning.foundation_models.utils.enums import DecodingMethods 5 6 parameters = { 7 GenParams.DECODING_METHOD: DecodingMethods.GREEDY, 8 GenParams.MIN_NEW_TOKENS: 1, 9 GenParams.MAX_NEW_TOKENS: 100 10 } 11 12 model = Model( 13 model_id=ModelTypes.GRANITE_13B_INSTRUCT, 14 params=parameters, 15 credentials={ 16 "url": wxa_url, 17 "apikey": wxa_api_key 18 }, 19 project_id=wxa_project_id 20 ) 21 22 from ibm_watson_machine_learning.foundation_models.extensions.langchain import WatsonxLLM 23 24 granite_llm_ibm = WatsonxLLM(model=model) 25 26 # Sample query chosen in the example to evaluate the RAG use case 27 query = "I want to introduce my daughter to science and spark her enthusiasm. What kind of gifts should I get her?" 28 29 # Sample LLM query without RAG framework 30 result = granite_llm_ibm(query)
Saída:
Antes de iniciar esta seção, você já deve ter configurado um MongoDB Atlas. Se você ainda não tiver criado uma para si mesmo, poderá seguir as etapas do tutorial do MongoDB Atlas para criar uma conta no Atlas (a plataforma de dados do desenvolvedor) e um MongoDB Atlas dedicated cluster com o qual podemos armazenar e recuperar dados. Também é aconselhável que os usuários gerenciem um MongoDB Atlas dedicated cluster com tamanho M10 ou superior para este tutorial.
Agora, vejamos como podemos configurar o MongoDB Atlas para fornecer informações relevantes para aumentar nossa estrutura RAG.
Cliente mongo
Podemos nos conectar ao cluster do MongoDB Atlas usando a string de conexão conforme detalhado no link do tutorial acima. Para inicializar a connection string, execute o bloco de código abaixo em seu bloco de notas Jupyter:
1 from pymongo import MongoClient 2 3 try: 4 MONGO_CONN = os.environ["MONGO_CONN"] 5 except KeyError: 6 MONGO_CONN = getpass.getpass("Please enter your MongoDB connection String (hit enter): ")
Quando solicitado, você pode inserir sua connection string do MongoDB Atlas.
Baixar e carregar dados no MongoDB Atlas
Nas etapas abaixo, demonstramos como baixar o conjunto de dados de produtos a partir do link de URL fornecido e adicionar os documentos à respectiva coleção no MongoDB Atlas. Também incorporaremos os textos brutos do produto como vetores antes de adicioná-los no MongoDB. Você pode fazer isso executando as seguintes linhas de código em seu notebook Jupyter:
1 import wget 2 3 filename = './amazon-products.jsonl' 4 url = "https://github.com/ashwin-gangadhar-mdb/mbd-watson-rag/raw/main/amazon-products.jsonl" 5 6 if not os.path.isfile(filename): 7 wget.download(url, out=filename) 8 9 # Load the documents using Langchain Document Loader 10 from langchain.document_loaders import JSONLoader 11 12 loader = JSONLoader(file_path=filename, jq_schema=".text",text_content=False,json_lines=True) 13 docs = loader.load() 14 15 # Initialize Embedding for transforming raw documents to vectors** 16 from langchain.embeddings import HuggingFaceEmbeddings 17 from tqdm import tqdm as notebook_tqdm 18 19 embeddings = HuggingFaceEmbeddings() 20 21 # Initialize MongoDB client along with Langchain connector module 22 from langchain.vectorstores import MongoDBAtlasVectorSearch 23 24 client = MongoClient(MONGO_CONN) 25 vcol = client["amazon"]["products"] 26 vectorstore = MongoDBAtlasVectorSearch(vcol, embeddings) 27 28 # Load documents to collection in MongoDB** 29 vectorstore.add_documents(docs)
Você poderá ver os documentos que foram criados no banco de dados
amazon
na collection products
.Agora que todas as informações sobre o produto foram adicionadas à respectiva coleção, podemos Go em frente e criar um índice vetorial seguindo as etapas fornecidas no Atlas Search. Você pode criar o índice de pesquisa usando o Atlas e também de forma programática. Vamos dar uma olhada nas etapas se estivermos fazendo isso usando o Atlas.
Você pode selecionar a visualização do Editor JSON para inserir a configuração do índice do vetor Atlas Search como mostrado na imagem. Insira o seguinte mapeamento para criar os índices de vetor.
1 { 2 "mappings": { 3 "dynamic": true, 4 "fields": { 5 "embedding": [ 6 { 7 "dimensions": 768, 8 "similarity": "cosine", 9 "type": "knnVector" 10 } 11 ] 12 } 13 } 14 }
Depois de atualizar os índices de pesquisa vetorial na UI do Atlas, será iniciado um processo automático para criar os índices de pesquisa vetorial para a collection pela primeira vez. Isso também indexará automaticamente qualquer novo documento adicionado à coleção. Sem problemas, você poderá atualizar a collection em tempo real à medida que adicionar novos produtos e aumentar o RAG para que os usuários sempre recebam os melhores e mais recentes produtos que você está oferecendo.
Para obter uma descrição dos outros campos dessa configuração, consulte a documentação do Vector Search.
Exemplo de consulta para pesquisa vetorial
Podemos testar a similaridade vetorial do Atlas Search executando a query de amostra com o conector MongoDB MongoDB Atlas Vector Search connector do . Execute o seguinte código em seu bloco de anotações do Jupyter:
1 texts_sim = vectorstore.similarity_search(query, k=3) 2 3 print("Number of relevant texts: " + str(len(texts_sim))) 4 print("First 100 characters of relevant texts.") 5 6 for i in range(len(texts_sim)): 7 print("Text " + str(i) + ": " + str(texts_sim[i].page_content[0:100]))
No código de exemplo acima, podemos usar nossa query de texto de exemplo para recuperar três produtos relevantes. Mais adiante no tutorial, vejamos como podemos combinar os recursos dos LLMs e da pesquisa vetorial para criar uma framework RAG. Para obter mais informações sobre várias operações que você pode executar com o módulo
MongoDBAtlasVectorSearch
no LangChain, acesse a documentação do MongoDB Atlas Vector Search.Nos trechos de código abaixo, demonstramos como inicializar e consultar a cadeia RAG. Também apresentamos métodos para melhorar a saída do RAG para que você possa personalizar sua saída para atender a necessidades específicas, como o motivo por trás da recomendação do produto, tradução do idioma, resumo etc.
Então, você pode configurar a cadeia RAG e executar para obter a resposta para nossa query de exemplo executando as seguintes linhas de código em seu bloco de notas Jupyter:
1 from langchain.chains import RetrievalQA 2 from langchain.prompts import PromptTemplate 3 4 prompt = PromptTemplate(template=""" 5 6 Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer. 7 8 {context} 9 10 ##Question:{question} \n\ 11 12 ##Top 3 recommnedations from Products and reason:\n""",input_variables=["context","question"]) 13 14 chain_type_kwargs = {"prompt": prompt} 15 retriever = vectorstore.as_retriever(search_type="mmr", search_kwargs={'k': 6, 'lambda_mult': 0.25}) 16 17 qa = RetrievalQA.from_chain_type(llm=granite_llm_ibm, chain_type="stuff", 18 retriever=retriever, 19 chain_type_kwargs=chain_type_kwargs) 20 21 res = qa.run(query) 22 23 print(f"{'-'*50}") 24 print("Query: " + query) 25 print(f"Response:\n{res}\n{'-'*50}\n")
O resultado será:
Você pode ver no exemplo de saída onde o RAG é capaz de recomendar produtos com base na consulta, bem como fornecer um raciocínio ou explicação sobre como essa sugestão de produto é relevante para a consulta, aprimorando assim a experiência do usuário.
Neste tutorial, demonstramos como usar LLMs watsonx junto com o Atlas Vector Search para criar uma estrutura RAG. Também demonstramos como usar com eficiência a estrutura RAG para personalizar as necessidades do aplicativo, como o raciocínio para sugestões de produtos. Seguindo as etapas do artigo, também conseguimos trazer o poder dos modelos de aprendizado de máquina para uma base de conhecimento privada que é armazenada na Atlas Developer Data Platform.
Em resumo, o RAG é uma técnica SLG poderosa que pode gerar recomendações de produtos como uma extensão da pesquisa semântica usando recursos de pesquisa vetorial fornecidos pelo MongoDB Atlas. O RAG também pode melhorar a UX das recomendações de produtos, fornecendo descrições mais personalizadas, diversas, informativas e envolventes.
Explore mais detalhes sobre como construir aplicativos de AI generativa usando várias tecnologias assistidas e o MongoDB Atlas Vector Search.
Para saber mais sobre o Atlas Vector Search, acesse a página do produto ou a documentação para criar um índice de pesquisa vetorial ou executar consultas de pesquisa vetorial.
Principais comentários nos fóruns
jack_Woehrjack woehr2 trimestres atrás
Agora você está falando a minha linguagem!