Esta aplicación Node.js realiza generación aumentada web utilizando varios proveedores de LLM y resultados de búsqueda web de SearXNG.
Clonar el repositorio:
git clone https://github.com/jparkerweb/web-augmented-generation.git
cd web-augmented-generation
Instalar dependencias:
npm ci
Copie el archivo .env.example
a .env
:
cp .env.example .env
Edite el archivo .env
y actualice los valores según sea necesario:
# #####################
# # General Settings ##
# #####################
NUM_URLS = 10 # Number of URLs to fetch
SEARXNG_URL = https://searx.be/ # URL of the SearXNG server
SEARXNG_URL_EXTRA_PARAMETER = "key=optional_auth_key_here&language=en" # Extra parameter for SearXNG URL
SEARXNG_FORMAT = html # Format for SearXNG results (html or json)
FETCH_TIMEOUT_MS = 5000 # Timeout for fetching URLs
DISABLE_SSL_VALIDATION = true # Whether to disable SSL validation
# #################
# # LLM Settings ##
# #################
LLM_STREAM_RESPONSE = true # Whether to stream the LLM response
# Ollama Local Configuration
LLM_BASE_URL = http://localhost:11434/v1 # Base URL for the LLM API (OpenAI format)
LLM_API_KEY = ollama!!! # API key for the LLM (use 'ollama' for Ollama)
LLM_MODEL = llama3.2:1b # Model to use with the LLM API
# ###################################
# # Scraped Page Content Settings ##
# ###################################
# Semantic Chunking Settings
CHUNK_CONTENT = true # Enable semantic chunking for better quality answers
CHUNK_CONTENT_USE_HYBRID_FALLBACK = true # Enable hybrid mode to fallback to summarization if no chunks found
# # The following parameters are only used by the `chunk-match` library (if CHUNK_CONTENT is set to true)
CHUNK_CONTENT_MAX_RESULTS = 10
CHUNK_CONTENT_MIN_SIMILARITY = 0.375
CHUNK_CONTENT_MAX_TOKEN_SIZE = 500
CHUNK_CONTENT_SIMILARITY_THRESHOLD = 0.4
CHUNK_CONTENT_DYNAMIC_THRESHOLD_LOWER_BOUND = 0.3
CHUNK_CONTENT_DYNAMIC_THRESHOLD_UPPER_BOUND = 0.5
CHUNK_CONTENT_NUM_SIMILARITY_SENTENCES_LOOKAHEAD = 3
CHUNK_CONTENT_COMBINE_CHUNKS = true
CHUNK_CONTENT_COMBINE_CHUNKS_SIMILARITY_THRESHOLD = 0.5
CHUNK_CONTENT_ONNX_EMBEDDING_MODEL = " Xenova/all-MiniLM-L6-v2 "
CHUNK_CONTENT_DTYPE = " q8 "
# Raw Content Settings (used when CHUNK_CONTENT=false)
WEB_PAGE_CONTENT_MAX_LENGTH = 1000 # Maximum length of raw page content to send to LLM
Configuraciones alternativas de proveedores de LLM:
# together.ai Configuration
LLM_BASE_URL = https://api.together.xyz/v1
LLM_API_KEY = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
LLM_MODEL = meta-llama/Llama-3.2-3B-Instruct-Turbo
# llama.cpp Configuration
LLM_BASE_URL = http://localhost:8080/v1
LLM_API_KEY = not-needed
LLM_MODEL = not-needed
# OpenRouter Configuration
LLM_BASE_URL = https://openrouter.ai/api/v1
LLM_API_KEY = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
LLM_MODEL = google/gemini-pro-1.5-exp
# Google AI Studio Configuration
LLM_BASE_URL = https://generativelanguage.googleapis.com/v1beta/openai/
LLM_API_KEY = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
LLM_MODEL = gemini-exp-1121
La configuración incluye:
Esta aplicación utiliza el formato API OpenAI para interacciones de modelos de lenguaje. Puede configurarlo para que funcione con Ollama u otras API compatibles con OpenAI. Aquí se explica cómo configurarlo:
.env
..env
: LLM_BASE_URL=http://localhost:11434/v1
LLM_API_KEY=ollama
LLM_MODEL=llama3.2:1b
llama3.2:1b
con el nombre del modelo que deseas usar en Ollama..env
: LLM_BASE_URL=https://api.openai.com/v1
LLM_API_KEY=your_api_key_here
LLM_MODEL=gpt-3.5-turbo
your_api_key_here
con su clave API real y gpt-3.5-turbo
con el modelo que desea usar.La aplicación utilizará esta configuración para realizar llamadas API al modelo de lenguaje para tareas como reformular consultas y generar respuestas.
Ejecute la aplicación con o sin consulta:
node main.js "Your question or prompt here"
o utilice el script de pregunta para una experiencia más interactiva:
node ask.js
Si no proporciona una consulta, la aplicación le pedirá que ingrese una.
La aplicación:
log.txt
La respuesta generada se mostrará en la consola y se agregará al archivo de registro.
Si ocurre un error durante la ejecución, se registrará en error_log.txt
en el directorio del proyecto.
main.js
: Lógica de la aplicación principal.env
: archivo de configuración (créelo desde .env.example
)log.txt
: registro detallado de cada ejecuciónerror_log.txt
: registro de errores (creado si se producen errores)completion_flag.txt
: creado cuando el proceso se completa exitosamente Esta aplicación utiliza web scraping y contenido generado por IA. Asegúrese de cumplir con los términos de servicio de los sitios web a los que accede y los modelos de IA que utiliza.
Si desea ejecutar SearXNG localmente usando Docker, siga estos pasos:
Extraiga la última imagen de SearXNG Docker:
docker pull searxng/searxng
Cree un directorio para la configuración de SearXNG:
mkdir searxng-config
Cree un archivo settings.yml en el directorio searchxng-config:
touch searxng-config/settings.yml
Edite el archivo settings.yml para asegurarse de que 'json' esté incluido en la lista de 'formatos':
nano searxng-config/settings.yml
Agregue o modifique las siguientes líneas:
search :
formats :
- html
- json
Ejecute el contenedor Docker SearXNG:
docker run -d
-v $(pwd)/searxng-config:/etc/searxng
-p 8787:8080
-e BASE_URL=http://localhost:8787/
-e INSTANCE_NAME=my-searxng
searxng/searxng
Acceda a su instancia local de SearXNG en http://localhost:8787
Actualice su archivo .env para usar la instancia local de SearXNG:
SEARXNG_URL=http://localhost:8787
Ahora tiene una instancia local de SearXNG ejecutándose en el puerto 8787 con la salida JSON habilitada, que puede usar con esta aplicación.
SEARXNG_URL_EXTRA_PARAMETER
: este campo le permite agregar parámetros adicionales a la URL de búsqueda de SearXNG. Se puede utilizar para diversos fines:
key=your_auth_key_here
language=en&time_range=year
&
. Por ejemplo: key=your_auth_key_here&language=en
SEARXNG_FORMAT
: este campo determina el formato de los resultados de búsqueda de SearXNG. Se puede configurar en 'html' o 'json':
Uso de ejemplo en el archivo .env:
SEARXNG_URL_EXTRA_PARAMETER="key=abcdef123456&language=en"
SEARXNG_FORMAT=json
Esto agregaría &key=abcdef123456&language=en
a la URL de búsqueda de SearXNG, y la aplicación esperará y analizará respuestas JSON de SearXNG.
DISABLE_SSL_VALIDATION
: Establezca en 'verdadero' para deshabilitar la validación del certificado SSL (predeterminado: falso, utilícelo con precaución)
LLM_STREAM_RESPONSE
: este campo determina si las respuestas de LLM deben transmitirse en tiempo real o devolverse como una única respuesta:
Uso de ejemplo en el archivo .env:
LLM_STREAM_RESPONSE=true
Esto permitiría la transmisión de respuestas de LLM, proporcionando una experiencia más interactiva.
(ejemplo de servicio de SearXNG en el puerto 8787)
server {
listen 80 ;
listen 443 ssl;
server_name searxng.acme.org;
ssl_certificate C:/some-path/fullchain.pem;
ssl_certificate_key C:/some-path/privkey.pem;
# Define a variable to store the API key
set $api_key "eXamPle__Key!!!" ;
# Use a secure cookie to store the key
set $key_cookie "searxng_key" ;
# Add resolver directive
resolver 127.0.0.1 ;
# Debug logging
error_log logs/error.log debug ;
# Check if the key is valid
set $key_valid 0 ;
if ( $arg_key = $api_key ) {
set $key_valid 1 ;
}
if ( $cookie_searxng_key = $api_key ) {
set $key_valid 1 ;
}
# Allow access to static files without key
location /static/ {
proxy_pass http://127.0.0.1:8787;
proxy_buffering off ;
}
# Redirect all requests without a valid key to a default error page or login page
location = / {
if ( $key_valid = 0) {
return 403 ;
}
proxy_pass http://127.0.0.1:8787;
proxy_buffering off ;
}
location / {
# Debug headers (always add these for debugging)
add_header X-Debug-Key-Valid $key_valid always;
add_header X-Debug-Arg-Key $arg_key always;
add_header X-Debug-Cookie-Key $cookie_searxng_key always;
# If the key is not valid, return 403
if ( $key_valid = 0) {
return 403 ;
}
# Set the cookie if the key is provided in the URL
if ( $arg_key = $api_key ) {
add_header Set-Cookie "${key_cookie}= $arg_key ; HttpOnly; Secure; SameSite=Strict; Path=/;" always;
}
# Proxy headers
proxy_set_header Host $host ;
proxy_set_header X-Real-IP $remote_addr ;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ;
proxy_set_header X-Forwarded-Proto $scheme ;
# Preserve the key parameter during redirects
proxy_redirect ~^(https?://[^/]+)(.*)$ $1$2$is_args$args ;
# Pass the request to the upstream server
proxy_pass http://127.0.0.1:8787;
proxy_buffering off ;
}
}
Este proyecto incluye scripts convenientes para ejecutar la aplicación desde la línea de comando. Estos scripts se encuentran en el directorio ask-scripts
:
ask
: Script universal para sistemas tipo Unix y Windowsask.sh
: script Bash para sistemas tipo Unixask.bat
: secuencia de comandos por lotes para el símbolo del sistema de Windowsask.ps1
: secuencia de comandos de PowerShell para Windows PowerShell Para utilizar estos scripts globalmente, debe agregar el directorio ask-scripts
a la RUTA de su sistema. Aquí hay instrucciones para diferentes sistemas operativos:
ask-scripts
.~/.bashrc
, ~/.zshrc
o ~/.bash_profile
)/path/to/ask-scripts
con la ruta real: export PATH="$PATH:/path/to/ask-scripts"
source ~/.bashrc
(o el archivo apropiado que haya editado) Una vez que el directorio ask-scripts
esté en su RUTA, puede ejecutar la aplicación desde cualquier lugar simplemente escribiendo:
ask
Luego, el script le pedirá que ingrese su pregunta o mensaje.
Este comando utilizará automáticamente el script apropiado para su sistema:
No es necesario proporcionar la pregunta o el mensaje como argumento de línea de comandos. El script le pedirá su opinión de forma interactiva.
Estos scripts proporcionan una manera conveniente de interactuar con la aplicación sin tener que navegar al directorio del proyecto o ejecutar manualmente node main.js
cada vez.
Si desea alojar Ollama detrás de un proxy inverso NGINX, puede utilizar la siguiente configuración como punto de partida. Esta configuración incluye SSL y autenticación de clave API básica.
# -------------------------
# -- ollama.yourdomain.com --
# -------------------------
upstream ollama {
server 127.0.0.1:11434;
}
server {
listen 80 ;
listen 443 ssl;
server_name ollama.yourdomain.com;
ssl_certificate C:/Certbot/live/ollama.yourdomain.com/fullchain.pem;
ssl_certificate_key C:/Certbot/live/ollama.yourdomain.com/privkey.pem;
location / {
# Check if the Authorization header is present and has the correct Bearer token / API Key
set $token "Bearer MY_PRIVATE_API_KEY" ;
if ( $http_authorization != $token ) {
return 401 "Unauthorized" ;
}
# The localhost headers are to simulate the forwarded request as coming from localhost
# so we dont have to set the Ollama origins as *
proxy_set_header Host "127.0.0.1" ;
proxy_set_header X-Real-IP "127.0.0.1" ;
proxy_set_header X-Forwarded-For "127.0.0.1" ;
proxy_set_header X-Forwarded-Proto $scheme ;
proxy_pass http://ollama; # Forward request to the actual web service
}
}
Esta configuración hace lo siguiente:
Recuerde reemplazar MY_PRIVATE_API_KEY
con su clave API real y asegúrese de que las rutas del certificado SSL sean correctas para su sistema.
Cuando utilice esta configuración, actualice su archivo .env
para que apunte a su instancia de Ollama con proxy NGINX:
LLM_BASE_URL=https://ollama.yourdomain.com/v1
LLM_API_KEY=MY_PRIVATE_API_KEY
LLM_MODEL=llama3.2:1b
Esta configuración le permite exponer de forma segura su instancia de Ollama a Internet mientras mantiene el control sobre el acceso a través de la autenticación de clave API.
Si disfrutas este proyecto, considera enviarme un consejo para apoyar mi trabajo.