Este pequeño proyecto tiene como objetivo incorporar entradas de blog de WordPress en una base de conocimientos que utiliza técnicas de recuperación-generación aumentada (RAG).
La premisa de este proyecto es simple: una serie de scripts realizarán acciones específicas a través de la línea de comando. Cada guión es autónomo, lo que ayuda a demostrar cada acción dentro de su propio contexto, de forma relativamente sencilla.
De forma predeterminada, los scripts incluidos utilizan bibliotecas y modelos gratuitos y de código abierto, aunque hay una opción disponible para usar los LLM de OpenAI si tiene acceso. Este ejemplo debería poder ejecutarse en la CPU si no tienes una GPU compatible, sino YMMV.
RAG utiliza dos componentes: un sistema de recuperación y un modelo de lenguaje generativo. El sistema de recuperación consulta documentos relevantes para una consulta de un almacén de datos/base de conocimientos (por ejemplo, una colección de publicaciones de blog). Los documentos recuperados luego se introducen en un modelo de lenguaje, que produce respuestas informadas para el usuario. Uno de los principales beneficios de usar RAG es que permite que el sistema de IA se extienda más allá de los datos de entrenamiento sin la necesidad de realizar ajustes o volver a entrenar: los datos se pueden agregar y actualizar dinámicamente en el almacén de datos. Los resultados de la consulta pueden incluir no sólo el texto proporcionado por el modelo de lenguaje, sino también una colección de documentos o fuentes relevantes. Puede leer más sobre RAG en el Blog de investigación de IBM.
Este es un proyecto bastante fácil de poner en marcha...
Primero configure el entorno virtual del proyecto y actívelo.
python3 -m venv virtualenv
source ./virtualenv/bin/activate
Puede instalar todas las dependencias de este proyecto utilizando el archivo requirements.txt
. Si lo hace, no es necesario instalar manualmente otros paquetes mediante pip
en este documento.
pip install -r requirements.txt
Cree un archivo .env
usando env.example
como guía.
cp env.example .env
Esto será importante para descargar sus datos de WordPress. Asegúrese de copiar su nombre de usuario de Wordpress, contraseña de la aplicación y dominio del blog en el archivo .env
. NOTA: Esto supone que el blog está en la ruta raíz.
pip install --upgrade python-dotenv requests pandas langchain langchain_community html2text sentence_transformers
Descargue el contenido de WordPress al directorio ./data
(esto supone que su blog está en la raíz del dominio, por ahora):
python3 wordpress-dl.py
PGVector se utiliza para almacenar y consultar incrustaciones de texto (vectores) en una base de datos Postgresql. Un beneficio de PGVector es que se puede agregar a sistemas de bases de datos existentes y no requiere productos propietarios de terceros.
Para soporte de incrustación de pgvector:
pip install pgvector psycopg2-binary
Asegúrese de tener los valores .env
adecuados. Si bien los valores predeterminados están bien para el desarrollo local, existe la posibilidad de que tenga algo diferente si utiliza una base de datos Postgres existente (es decir, si no ejecuta la imagen de la ventana acoplable). Aquí, utilizamos una imagen de Docker para mantener la configuración simple, pero podría usar fácilmente otra instancia de PostgreSQL si puede agregar y cargar la extensión pgvector usted mismo.
Para ejecutar la imagen de la ventana acoplable en ./postgres
:
docker compose up
Ejecute el script de incrustaciones para realizar la descarga de WordPress y guardar las incrustaciones en la base de datos de Postgres. Esto puede llevar algún tiempo. _Si desea insertar datos en la base de datos, es decir, borrar y comenzar con datos limpios, pase el argumento CLI --embed
:
python3 embed.py --embed
De forma predeterminada, solo se inserta 1 registro para la prueba (es decir, al no especificar --limit
y luego algún número entero > 1, solo se creará la incrustación del vector para el primer registro), por lo que puede realizar pruebas más fácilmente sin gastar demasiado tiempo de cálculo adicional.
Si tiene curiosidad sobre información adicional, pase --verbose
Una invocación de ejemplo podría verse así:
python3 embed.py --verbose --embed --limit 100
...pero aumenta tu límite de tamaño adecuado para tu blog de WordPress. No hay problema si el número es mayor que el número de entradas: es lo suficientemente inteligente como para importar hasta el recuento máximo de registros.
Este repositorio demuestra casos de uso locales y basados en API. Uno de los beneficios de un modelo ejecutado localmente es que sus datos permanecen privados y no se utilizarán para entrenar los modelos de otros. Además, puede haber algunas mejoras en el rendimiento al mantener las consultas locales en un servidor o red, pero no genera costos de uso de API en sistemas autohospedados. Por otro lado, es posible que se desee el uso de API, ya que OpenAI tiene ventanas de contexto mucho más grandes que el modelo utilizado en este proyecto, y los modelos de OpenAI pueden ser bastante buenos.
El uso del modelo de idioma local necesitará el paquete python trsnformers
y pytorch ( torch
).
pip install transformers torch llama-cpp-python
A continuación, descargue el modelo utilizado en este método sin conexión. Debido a que los modelos de lenguaje pueden ser grandes (varios GB), elegí un modelo Llama más pequeño que lo demuestra. Se pueden utilizar modelos incluso más pequeños, pero a menudo en el límite de las ventanas de contexto, lo que puede aliviarse, pero fuera del alcance de este proyecto. Este proyecto utiliza TheBloke/Llama-2-7b-Chat-GGUF
( Q4_K_M
)
(Si no tienes instalado huggingface-cli
, puedes encontrar detalles aquí).
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 descargará el modelo al director de caché de la cuenta de usuario y creará un enlace simbólico desde el directorio de modelos.
Una vez descargado el modelo, puede ejecutar la inferencia local, que es la opción predeterminada. Consulte la siguiente sección, Consulta para obtener instrucciones.
Instalación necesaria para el uso de la API OpenAI
pip install langchain_openai
Asegúrese de tener su clave API de OpenAI guardada en su archivo .env
. Puede configurarlo en la pestaña Clave API de OpenAI Platform: OPENAI_API_KEY="...
Los documentos (incrustados y recuperados, por cierto) tienen la siguiente estructura general en este proyecto.
## document
## page_content
## metadata
## id
## link
## title
## categories
## tags
Los resultados a menudo se devuelven como una List
de tuplas (idx, documento), por lo que es apropiado enumerar sobre la lista:
for ( idx , doc ) in enumerate ( results [" docs ]):
print ( f" { doc . metadata [ 'title' ] } " )
Los datos más útiles para aumentar las respuestas del LLM se incluirán en la propiedad metadata
, un diccionario de datos que se introduce durante la incorporación.
Ejecutar consultas desde la CLI es simple.
...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
Después de unos momentos, espere ver una respuesta 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 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
********************************************************************************
Hay argumentos adicionales que pueden resultar útiles al probar sus datos y modelos. ejecute python3 query.py --help
para obtener más opciones.