Diese Node.js-Anwendung führt eine web-erweiterte Generierung mithilfe verschiedener LLM-Anbieter und Websuchergebnissen von SearXNG durch.
Klonen Sie das Repository:
git clone https://github.com/jparkerweb/web-augmented-generation.git
cd web-augmented-generation
Abhängigkeiten installieren:
npm ci
Kopieren Sie die Datei .env.example
nach .env
:
cp .env.example .env
Bearbeiten Sie die .env
Datei und aktualisieren Sie die Werte nach Bedarf:
# #####################
# # 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
Alternative LLM-Anbieterkonfigurationen:
# 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
Die Konfiguration umfasst:
Diese Anwendung verwendet das OpenAI-API-Format für Sprachmodellinteraktionen. Sie können es so konfigurieren, dass es mit Ollama oder anderen OpenAI-kompatiblen APIs funktioniert. So richten Sie es ein:
.env
Datei angegebenen URL ausgeführt wird..env
Datei fest: LLM_BASE_URL=http://localhost:11434/v1
LLM_API_KEY=ollama
LLM_MODEL=llama3.2:1b
llama3.2:1b
durch den Namen des Modells, das Sie in Ollama verwenden möchten..env
Datei fest: 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
durch Ihren tatsächlichen API-Schlüssel und gpt-3.5-turbo
durch das Modell, das Sie verwenden möchten.Die Anwendung verwendet diese Einstellungen, um API-Aufrufe an das Sprachmodell für Aufgaben wie das Umformulieren von Abfragen und das Generieren von Antworten durchzuführen.
Führen Sie die Anwendung mit oder ohne Abfrage aus:
node main.js "Your question or prompt here"
oder verwenden Sie das Ask-Skript für ein interaktiveres Erlebnis:
node ask.js
Wenn Sie keine Abfrage angeben, werden Sie von der Anwendung aufgefordert, eine Abfrage einzugeben.
Der Antrag wird:
log.txt
Die generierte Antwort wird in der Konsole angezeigt und an die Protokolldatei angehängt.
Wenn während der Ausführung ein Fehler auftritt, wird dieser in error_log.txt
im Projektverzeichnis protokolliert.
main.js
: Hauptanwendungslogik.env
: Konfigurationsdatei (erstellen Sie diese aus .env.example
)log.txt
: Detailliertes Protokoll jedes Laufserror_log.txt
: Fehlerprotokoll (wird erstellt, wenn Fehler auftreten)completion_flag.txt
: Wird erstellt, wenn der Prozess erfolgreich abgeschlossen wurde Diese Anwendung nutzt Web Scraping und KI-generierte Inhalte. Stellen Sie sicher, dass Sie die Nutzungsbedingungen der Websites, auf die Sie zugreifen, und der von Ihnen verwendeten KI-Modelle einhalten.
Wenn Sie SearXNG lokal mit Docker ausführen möchten, gehen Sie folgendermaßen vor:
Rufen Sie das neueste SearXNG Docker-Image ab:
docker pull searxng/searxng
Erstellen Sie ein Verzeichnis für die SearXNG-Konfiguration:
mkdir searxng-config
Erstellen Sie eine Datei „settings.yml“ im Verzeichnis „searxng-config“:
touch searxng-config/settings.yml
Bearbeiten Sie die Datei „settings.yml“, um sicherzustellen, dass „json“ in der Liste „Formate“ enthalten ist:
nano searxng-config/settings.yml
Fügen Sie die folgenden Zeilen hinzu oder ändern Sie sie:
search :
formats :
- html
- json
Führen Sie den SearXNG Docker-Container aus:
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
Greifen Sie unter http://localhost:8787
auf Ihre lokale SearXNG-Instanz zu
Aktualisieren Sie Ihre .env-Datei, um die lokale SearXNG-Instanz zu verwenden:
SEARXNG_URL=http://localhost:8787
Jetzt verfügen Sie über eine lokale SearXNG-Instanz, die auf Port 8787 mit aktivierter JSON-Ausgabe ausgeführt wird und die Sie mit dieser Anwendung verwenden können.
SEARXNG_URL_EXTRA_PARAMETER
: In diesem Feld können Sie zusätzliche Parameter zur SearXNG-Such-URL hinzufügen. Es kann für verschiedene Zwecke verwendet werden:
key=your_auth_key_here
language=en&time_range=year
&
kombinieren. Beispiel: key=your_auth_key_here&language=en
SEARXNG_FORMAT
: Dieses Feld bestimmt das Format der SearXNG-Suchergebnisse. Es kann entweder auf „html“ oder „json“ eingestellt werden:
Beispielverwendung in einer .env-Datei:
SEARXNG_URL_EXTRA_PARAMETER="key=abcdef123456&language=en"
SEARXNG_FORMAT=json
Dadurch wird &key=abcdef123456&language=en
an die SearXNG-Such-URL angehängt und die Anwendung erwartet und analysiert JSON-Antworten von SearXNG.
DISABLE_SSL_VALIDATION
: Auf „true“ setzen, um die SSL-Zertifikatsvalidierung zu deaktivieren (Standard: false, mit Vorsicht verwenden)
LLM_STREAM_RESPONSE
: Dieses Feld bestimmt, ob die LLM-Antworten in Echtzeit gestreamt oder als einzelne Antwort zurückgegeben werden sollen:
Beispielverwendung in einer .env-Datei:
LLM_STREAM_RESPONSE=true
Dies würde das Streamen von LLM-Antworten ermöglichen und ein interaktiveres Erlebnis bieten.
(Beispiel für die Bereitstellung von SearXNG auf 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 ;
}
}
Dieses Projekt enthält praktische Skripte zum Ausführen der Anwendung über die Befehlszeile. Diese Skripte befinden sich im ask-scripts
Verzeichnis:
ask
: Universelles Skript für Unix-ähnliche Systeme und Windowsask.sh
: Bash-Skript für Unix-ähnliche Systemeask.bat
: Batch-Skript für die Windows-Eingabeaufforderungask.ps1
: PowerShell-Skript für Windows PowerShell Um diese Skripte global zu verwenden, müssen Sie das Verzeichnis ask-scripts
zum PATH Ihres Systems hinzufügen. Hier finden Sie Anleitungen für verschiedene Betriebssysteme:
ask-scripts
Verzeichnis hinzu~/.bashrc
, ~/.zshrc
oder ~/.bash_profile
)./path/to/ask-scripts
durch den tatsächlichen Pfad: export PATH="$PATH:/path/to/ask-scripts"
source ~/.bashrc
(oder die entsprechende Datei, die Sie bearbeitet haben) aus. Sobald sich das ask-scripts
Verzeichnis in Ihrem PATH befindet, können Sie die Anwendung von überall aus ausführen, indem Sie einfach Folgendes eingeben:
ask
Das Skript fordert Sie dann auf, Ihre Frage oder Eingabeaufforderung einzugeben.
Dieser Befehl verwendet automatisch das entsprechende Skript für Ihr System:
Sie müssen die Frage oder Eingabeaufforderung nicht als Befehlszeilenargument angeben. Das Skript fragt Sie interaktiv nach Ihrer Eingabe.
Diese Skripte bieten eine bequeme Möglichkeit, mit der Anwendung zu interagieren, ohne jedes Mal zum Projektverzeichnis navigieren oder node main.js
manuell ausführen zu müssen.
Wenn Sie Ollama hinter einem NGINX-Reverse-Proxy hosten möchten, können Sie die folgende Konfiguration als Ausgangspunkt verwenden. Dieses Setup umfasst SSL und eine grundlegende API-Schlüsselauthentifizierung.
# -------------------------
# -- 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
}
}
Diese Konfiguration bewirkt Folgendes:
Denken Sie daran, MY_PRIVATE_API_KEY
durch Ihren tatsächlichen API-Schlüssel zu ersetzen und sicherzustellen, dass die SSL-Zertifikatspfade für Ihr System korrekt sind.
Wenn Sie diese Konfiguration verwenden, aktualisieren Sie Ihre .env
Datei so, dass sie auf Ihre NGINX-Proxy-Ollama-Instanz verweist:
LLM_BASE_URL=https://ollama.yourdomain.com/v1
LLM_API_KEY=MY_PRIVATE_API_KEY
LLM_MODEL=llama3.2:1b
Mit diesem Setup können Sie Ihre Ollama-Instanz sicher dem Internet zugänglich machen und gleichzeitig die Kontrolle über den Zugriff durch API-Schlüsselauthentifizierung behalten.
Wenn Ihnen dieses Projekt gefällt, denken Sie bitte darüber nach, mir einen Tipp zu schicken, um meine Arbeit zu unterstützen?