Este pequeno projeto visa incorporar entradas de blog WordPress em uma base de conhecimento que utiliza técnicas de Retrieval-Augmented Generation (RAG).
A premissa deste projeto é simples – uma série de scripts executará ações específicas por meio da linha de comando. Cada script é independente, o que ajuda a demonstrar cada ação dentro de seu próprio contexto, de forma relativamente simples.
Por padrão, os scripts incluídos usam bibliotecas e modelos gratuitos e de código aberto, embora uma opção para usar LLMs da OpenAI esteja disponível se você tiver acesso. Este exemplo deve poder ser executado na CPU se você não tiver uma GPU compatível, mas sim YMMV.
O RAG faz uso de dois componentes: um sistema de recuperação e um modelo de linguagem generativo. O sistema de recuperação consulta documentos relevantes para uma consulta de um armazenamento de dados/base de conhecimento (por exemplo, uma coleção de postagens de blog). Os documentos recuperados são então inseridos em um modelo de linguagem, que produz respostas informadas para o usuário. Um dos principais benefícios do uso do RAG é que ele permite que o sistema de IA se estenda além dos dados de treinamento sem a necessidade de ajuste fino ou novo treinamento - os dados podem ser adicionados e atualizados no armazenamento de dados de forma dinâmica. Os resultados da consulta podem incluir não apenas o texto fornecido pelo modelo de linguagem, mas também uma coleção de documentos ou fontes relevantes. Você pode ler mais sobre o RAG no IBM Research Blog.
Este é um projeto bastante fácil de colocar em funcionamento ...
Primeiro configure o ambiente virtual do projeto e ative-o
python3 -m venv virtualenv
source ./virtualenv/bin/activate
Você pode instalar todas as dependências deste projeto usando o arquivo requirements.txt
. Se você fizer isso, não há necessidade de instalar manualmente outros pacotes via pip
neste documento.
pip install -r requirements.txt
Crie um arquivo .env
usando env.example
como guia.
cp env.example .env
Isso será importante para baixar seus dados do WordPress. Certifique-se de copiar seu nome de usuário do Wordpress, senha do aplicativo e domínio do blog para .env
. NOTA: Isso pressupõe que o blog esteja no caminho raiz.
pip install --upgrade python-dotenv requests pandas langchain langchain_community html2text sentence_transformers
Baixe o conteúdo do wordpress para o diretório ./data
(isso pressupõe que seu blog esteja na raiz do domínio, por enquanto):
python3 wordpress-dl.py
PGVector é usado para armazenar e consultar incorporações de texto (vetores) em um banco de dados Postgresql. Um benefício do PGVector é que ele pode ser adicionado a sistemas de banco de dados existentes e não requer produtos proprietários de terceiros.
Para suporte de incorporação de pgvector:
pip install pgvector psycopg2-binary
Certifique-se de ter os valores .env
adequados. Embora os padrões sejam adequados para desenvolvimento local, há uma chance de que você tenha algo diferente se estiver usando um banco de dados Postgres existente (ou seja, não executando a imagem do Docker). Aqui, usamos uma imagem Docker para manter a configuração simples, mas você pode facilmente usar outra instância do PostgreSQL se puder adicionar e carregar a extensão pgvector sozinho.
Para executar a imagem do Docker em ./postgres
:
docker compose up
Execute o script de embeddings para fazer o download do wordpress e salvar os embeddings no banco de dados postgres. Isso pode levar algum tempo. _Se você deseja inserir dados no banco de dados, ou seja, limpar e iniciar com dados limpos, passe o argumento CLI --embed
:
python3 embed.py --embed
Por padrão, apenas 1 registro é inserido para teste (ou seja, ao não especificar --limit
e, em seguida, algum número inteiro > 1, ele criará apenas a incorporação de vetor para o primeiro registro) - para que você possa testar mais facilmente sem gastar muito tempo extra de computação.
Se você estiver curioso sobre informações adicionais, passe --verbose
Um exemplo de invocação poderia ser assim:
python3 embed.py --verbose --embed --limit 100
... mas aumente seu limite com o tamanho adequado para o seu blog wordpress. Não há problema se o número for maior que o número de entradas - é inteligente o suficiente para importar até a contagem máxima de registros.
Este repositório demonstra casos de uso locais e baseados em API. Um dos benefícios de um modelo executado localmente é que seus dados permanecem privados e não serão usados para treinar modelos de terceiros. Além disso, pode haver alguns ganhos de desempenho mantendo as consultas locais em um servidor ou rede, o que não acarreta custos de uso de API em sistemas auto-hospedados. Por outro lado, o uso da API pode ser desejado, pois o OpenAI possui janelas de contexto muito maiores do que o modelo usado neste projeto, e os modelos do OpenAI podem ser bastante bons.
O uso do modelo de linguagem local precisará do pacote trsnformers
python e pytorch ( torch
)
pip install transformers torch llama-cpp-python
A seguir, baixe o modelo usado nesta abordagem offline. Como os modelos de linguagem podem ser grandes (vários GB), escolhi um modelo Llama menor que demonstra isso. Modelos ainda menores podem ser utilizados, mas muitas vezes no limite das janelas de contexto, o que pode ser amenizado, mas fora do escopo deste projeto. Este projeto usa TheBloke/Llama-2-7b-Chat-GGUF
( Q4_K_M
)
(Se você não tiver huggingface-cli
instalado, poderá encontrar detalhes aqui).
huggingface-cli download TheBloke/Llama-2-7b-Chat-GGUF llama-2-7b-chat.Q4_K_M.gguf --local-dir ./models/ --local-dir-use-symlinks True
Este comando fará o download do modelo para o diretor de cache da conta do usuário e criará um link simbólico do diretório de modelos.
Depois que o modelo for baixado, você poderá executar a inferência local, que é a opção padrão. Consulte a próxima seção, Consulta para obter instruções.
Instalação necessária para uso da API OpenAI
pip install langchain_openai
Certifique-se de ter sua chave de API OpenAI salva em seu arquivo .env
. Você pode configurá-lo na guia Chave de API da plataforma OpenAI: OPENAI_API_KEY="...
Os documentos (incorporados e recuperados, aliás) têm a seguinte estrutura geral neste projeto.
## document
## page_content
## metadata
## id
## link
## title
## categories
## tags
Os resultados geralmente são retornados como uma List
de tuplas (idx, documento), portanto é apropriado enumerar a lista:
for ( idx , doc ) in enumerate ( results [" docs ]):
print ( f" { doc . metadata [ 'title' ] } " )
Os dados mais úteis para aumentar as respostas do LLM serão incluídos na propriedade metadata
, um dicionário de dados alimentados durante a incorporação.
Executar consultas a partir da CLI é simples.
...modelo local:
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? "
...usando OpenAI:
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? " --use-api
Depois de alguns momentos, espere ver uma resposta como esta,
❓ 'Does RaspberryPi have GPIO that swift can use?'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yes, RasbperryPi has GPIO that swift can use as per the context given.
- - Supporing Docs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
? Accessing Raspberry Pi GPIO Pins (With Swift) ? https://archive.mistercameron.com/2016/06/accessing-raspberry-pi-gpio-pins-with-swift/
? Currently, Swift on Raspberry Pi3 ? https://archive.mistercameron.com/2016/04/currently-swift-on-raspberry-pi3/
? Compile Swift 3.0 on Your ARM computers (Raspberry Pi, BeagleBone Black, etc) ? https://archive.mistercameron.com/2016/06/compile-swift-3-0-on-your-arm-computer/
? Ready Your Raspberry Pi for Swift ? https://archive.mistercameron.com/2016/05/ready-your-raspberry-pi-for-swift/
~ ~ ~ ~ ~ Finished in 14.80s ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
********************************************************************************
Existem argumentos adicionais que podem ser úteis ao testar seus dados e modelos. execute python3 query.py --help
para mais opções.