Cette application Node.js effectue une génération Web augmentée à l'aide de divers fournisseurs LLM et des résultats de recherche Web de SearXNG.
Clonez le dépôt :
git clone https://github.com/jparkerweb/web-augmented-generation.git
cd web-augmented-generation
Installer les dépendances :
npm ci
Copiez le fichier .env.example
dans .env
:
cp .env.example .env
Modifiez le fichier .env
et mettez à jour les valeurs si nécessaire :
# #####################
# # 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
Configurations alternatives du fournisseur 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 configuration comprend :
Cette application utilise le format API OpenAI pour les interactions de modèle de langage. Vous pouvez le configurer pour qu'il fonctionne avec Ollama ou d'autres API compatibles OpenAI. Voici comment le configurer :
.env
..env
: LLM_BASE_URL=http://localhost:11434/v1
LLM_API_KEY=ollama
LLM_MODEL=llama3.2:1b
llama3.2:1b
par le nom du modèle que vous souhaitez utiliser dans 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
par votre clé API réelle et gpt-3.5-turbo
par le modèle que vous souhaitez utiliser.L'application utilisera ces paramètres pour effectuer des appels d'API au modèle de langage pour des tâches telles que la reformulation des requêtes et la génération de réponses.
Exécutez l'application avec ou sans requête :
node main.js "Your question or prompt here"
ou utilisez le script Ask pour une expérience plus interactive :
node ask.js
Si vous ne fournissez pas de requête, l'application vous demandera d'en saisir une.
La demande :
log.txt
La réponse générée sera affichée dans la console et ajoutée au fichier journal.
Si une erreur se produit lors de l'exécution, elle sera enregistrée dans error_log.txt
dans le répertoire du projet.
main.js
: logique d'application principale.env
: fichier de configuration (créez-le à partir de .env.example
)log.txt
: Journal détaillé de chaque exécutionerror_log.txt
: Journal des erreurs (créé si des erreurs se produisent)completion_flag.txt
: Créé lorsque le processus se termine avec succès Cette application utilise le web scraping et le contenu généré par l'IA. Assurez-vous de respecter les conditions d'utilisation des sites Web auxquels vous accédez et les modèles d'IA que vous utilisez.
Si vous souhaitez exécuter SearXNG localement à l'aide de Docker, suivez ces étapes :
Extrayez la dernière image SearXNG Docker :
docker pull searxng/searxng
Créez un répertoire pour la configuration de SearXNG :
mkdir searxng-config
Créez un fichier settings.yml dans le répertoire searxng-config :
touch searxng-config/settings.yml
Modifiez le fichier settings.yml pour vous assurer que « json » est inclus dans la liste « formats » :
nano searxng-config/settings.yml
Ajoutez ou modifiez les lignes suivantes :
search :
formats :
- html
- json
Exécutez le conteneur SearXNG Docker :
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
Accédez à votre instance SearXNG locale sur http://localhost:8787
Mettez à jour votre fichier .env pour utiliser l'instance SearXNG locale :
SEARXNG_URL=http://localhost:8787
Vous disposez désormais d'une instance SearXNG locale exécutée sur le port 8787 avec la sortie JSON activée, que vous pouvez utiliser avec cette application.
SEARXNG_URL_EXTRA_PARAMETER
: Ce champ vous permet d'ajouter des paramètres supplémentaires à l'URL de recherche SearXNG. Il peut être utilisé à diverses fins :
key=your_auth_key_here
language=en&time_range=year
&
. Par exemple : key=your_auth_key_here&language=en
SEARXNG_FORMAT
: Ce champ détermine le format des résultats de recherche SearXNG. Il peut être défini sur « html » ou « json » :
Exemple d'utilisation dans le fichier .env :
SEARXNG_URL_EXTRA_PARAMETER="key=abcdef123456&language=en"
SEARXNG_FORMAT=json
Cela ajouterait &key=abcdef123456&language=en
à l'URL de recherche SearXNG, et l'application attendrait et analyserait les réponses JSON de SearXNG.
DISABLE_SSL_VALIDATION
: défini sur 'true' pour désactiver la validation du certificat SSL (par défaut : false, à utiliser avec prudence)
LLM_STREAM_RESPONSE
: ce champ détermine si les réponses LLM doivent être diffusées en temps réel ou renvoyées sous forme de réponse unique :
Exemple d'utilisation dans le fichier .env :
LLM_STREAM_RESPONSE=true
Cela permettrait la diffusion en continu des réponses LLM, offrant ainsi une expérience plus interactive.
(exemple servant SearXNG sur le port 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 ;
}
}
Ce projet comprend des scripts pratiques pour exécuter l'application à partir de la ligne de commande. Ces scripts se trouvent dans le répertoire ask-scripts
:
ask
: Script universel pour les systèmes de type Unix et Windowsask.sh
: script Bash pour les systèmes de type Unixask.bat
: Script batch pour l'invite de commande Windowsask.ps1
: script PowerShell pour Windows PowerShell Pour utiliser ces scripts globalement, vous devez ajouter le répertoire ask-scripts
au PATH de votre système. Voici les instructions pour différents systèmes d'exploitation :
ask-scripts
~/.bashrc
, ~/.zshrc
ou ~/.bash_profile
)/path/to/ask-scripts
par le chemin réel : export PATH="$PATH:/path/to/ask-scripts"
source ~/.bashrc
(ou le fichier approprié que vous avez modifié) Une fois le répertoire ask-scripts
dans votre PATH, vous pouvez exécuter l'application de n'importe où en tapant simplement :
ask
Le script vous demandera ensuite de saisir votre question ou votre invite.
Cette commande utilisera automatiquement le script approprié pour votre système :
Vous n'avez pas besoin de fournir la question ou l'invite comme argument de ligne de commande. Le script vous demandera de manière interactive votre contribution.
Ces scripts offrent un moyen pratique d'interagir avec l'application sans avoir à accéder au répertoire du projet ou à exécuter manuellement node main.js
à chaque fois.
Si vous souhaitez héberger Ollama derrière un proxy inverse NGINX, vous pouvez utiliser la configuration suivante comme point de départ. Cette configuration inclut SSL et l'authentification par clé API de base.
# -------------------------
# -- 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
}
}
Cette configuration effectue les opérations suivantes :
N'oubliez pas de remplacer MY_PRIVATE_API_KEY
par votre clé API réelle et assurez-vous que les chemins du certificat SSL sont corrects pour votre système.
Lorsque vous utilisez cette configuration, mettez à jour votre fichier .env
pour qu'il pointe vers votre instance Ollama proxy NGINX :
LLM_BASE_URL=https://ollama.yourdomain.com/v1
LLM_API_KEY=MY_PRIVATE_API_KEY
LLM_MODEL=llama3.2:1b
Cette configuration vous permet d'exposer en toute sécurité votre instance Ollama à Internet tout en conservant le contrôle de l'accès via l'authentification par clé API.
Si vous appréciez ce projet, pensez à m'envoyer un pourboire pour soutenir mon travail ?