Aplikasi Node.js ini melakukan pembuatan web-augmented menggunakan berbagai penyedia LLM dan hasil pencarian web dari SearXNG.
Kloning repositori:
git clone https://github.com/jparkerweb/web-augmented-generation.git
cd web-augmented-generation
Instal dependensi:
npm ci
Salin file .env.example
ke .env
:
cp .env.example .env
Edit file .env
dan perbarui nilainya sesuai kebutuhan:
# #####################
# # 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
Konfigurasi Penyedia LLM Alternatif:
# 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
Konfigurasinya meliputi:
Aplikasi ini menggunakan format OpenAI API untuk interaksi model bahasa. Anda dapat mengonfigurasinya agar berfungsi dengan Ollama atau API lain yang kompatibel dengan OpenAI. Berikut cara mengaturnya:
.env
Anda..env
Anda: LLM_BASE_URL=http://localhost:11434/v1
LLM_API_KEY=ollama
LLM_MODEL=llama3.2:1b
llama3.2:1b
dengan nama model yang ingin Anda gunakan di Ollama..env
Anda: 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
dengan kunci API Anda yang sebenarnya, dan gpt-3.5-turbo
dengan model yang ingin Anda gunakan.Aplikasi akan menggunakan pengaturan ini untuk melakukan panggilan API ke model bahasa untuk tugas-tugas seperti menyusun ulang kueri dan menghasilkan respons.
Jalankan aplikasi dengan atau tanpa kueri:
node main.js "Your question or prompt here"
atau gunakan skrip tanya untuk pengalaman yang lebih interaktif:
node ask.js
Jika Anda tidak memberikan kueri, aplikasi akan meminta Anda memasukkannya.
Aplikasi ini akan:
log.txt
Respons yang dihasilkan akan ditampilkan di konsol dan ditambahkan ke file log.
Jika terjadi kesalahan selama eksekusi, kesalahan tersebut akan dicatat ke error_log.txt
di direktori proyek.
main.js
: Logika aplikasi utama.env
: File konfigurasi (buat ini dari .env.example
)log.txt
: Log detail setiap proseserror_log.txt
: Log kesalahan (dibuat jika terjadi kesalahan)completion_flag.txt
: Dibuat ketika proses berhasil diselesaikan Aplikasi ini menggunakan web scraping dan konten yang dihasilkan AI. Pastikan Anda mematuhi persyaratan layanan situs web yang Anda akses dan model AI yang Anda gunakan.
Jika Anda ingin menjalankan SearXNG secara lokal menggunakan Docker, ikuti langkah-langkah berikut:
Tarik gambar Docker SearXNG terbaru:
docker pull searxng/searxng
Buat direktori untuk konfigurasi SearXNG:
mkdir searxng-config
Buat file settings.yml di direktori searxng-config:
touch searxng-config/settings.yml
Edit file settings.yml untuk memastikan bahwa 'json' disertakan dalam daftar 'format':
nano searxng-config/settings.yml
Tambahkan atau ubah baris berikut:
search :
formats :
- html
- json
Jalankan wadah 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
Akses instans SearXNG lokal Anda di http://localhost:8787
Perbarui file .env Anda untuk menggunakan instance SearXNG lokal:
SEARXNG_URL=http://localhost:8787
Sekarang Anda memiliki instance SearXNG lokal yang berjalan pada port 8787 dengan output JSON diaktifkan, yang dapat Anda gunakan dengan aplikasi ini.
SEARXNG_URL_EXTRA_PARAMETER
: Bidang ini memungkinkan Anda menambahkan parameter tambahan ke URL pencarian SearXNG. Dapat digunakan untuk berbagai tujuan:
key=your_auth_key_here
language=en&time_range=year
&
. Misalnya: key=your_auth_key_here&language=en
SEARXNG_FORMAT
: Bidang ini menentukan format hasil pencarian SearXNG. Itu dapat diatur ke 'html' atau 'json':
Contoh penggunaan dalam file .env:
SEARXNG_URL_EXTRA_PARAMETER="key=abcdef123456&language=en"
SEARXNG_FORMAT=json
Ini akan menambahkan &key=abcdef123456&language=en
ke URL pencarian SearXNG, dan aplikasi akan mengharapkan dan mengurai respons JSON dari SearXNG.
DISABLE_SSL_VALIDATION
: Setel ke 'true' untuk menonaktifkan validasi sertifikat SSL (default: false, gunakan dengan hati-hati)
LLM_STREAM_RESPONSE
: Bidang ini menentukan apakah respons LLM harus dialirkan secara real-time atau dikembalikan sebagai respons tunggal:
Contoh penggunaan dalam file .env:
LLM_STREAM_RESPONSE=true
Hal ini akan memungkinkan streaming tanggapan LLM, memberikan pengalaman yang lebih interaktif.
(contoh melayani SearXNG pada 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 ;
}
}
Proyek ini mencakup skrip yang mudah digunakan untuk menjalankan aplikasi dari baris perintah. Skrip ini terletak di direktori ask-scripts
:
ask
: Skrip universal untuk sistem mirip Unix dan Windowsask.sh
: Skrip Bash untuk sistem mirip Unixask.bat
: Skrip batch untuk Command Prompt Windowsask.ps1
: Skrip PowerShell untuk Windows PowerShell Untuk menggunakan skrip ini secara global, Anda perlu menambahkan direktori ask-scripts
ke PATH sistem Anda. Berikut adalah petunjuk untuk sistem operasi yang berbeda:
ask-scripts
Anda~/.bashrc
, ~/.zshrc
, atau ~/.bash_profile
)/path/to/ask-scripts
dengan jalur sebenarnya: export PATH="$PATH:/path/to/ask-scripts"
source ~/.bashrc
(atau file sesuai yang Anda edit) Setelah direktori ask-scripts
ada di PATH Anda, Anda dapat menjalankan aplikasi dari mana saja hanya dengan mengetik:
ask
Script kemudian akan meminta Anda untuk memasukkan pertanyaan atau prompt Anda.
Perintah ini secara otomatis akan menggunakan skrip yang sesuai untuk sistem Anda:
Anda tidak perlu memberikan pertanyaan atau perintah sebagai argumen baris perintah. Script akan secara interaktif meminta masukan Anda.
Skrip ini menyediakan cara mudah untuk berinteraksi dengan aplikasi tanpa harus membuka direktori proyek atau menjalankan node main.js
secara manual setiap saat.
Jika Anda ingin menghosting Ollama di belakang proxy terbalik NGINX, Anda dapat menggunakan konfigurasi berikut sebagai titik awal. Penyiapan ini mencakup SSL dan autentikasi kunci API dasar.
# -------------------------
# -- 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
}
}
Konfigurasi ini melakukan hal berikut:
Ingatlah untuk mengganti MY_PRIVATE_API_KEY
dengan kunci API Anda yang sebenarnya, dan pastikan jalur sertifikat SSL sudah benar untuk sistem Anda.
Saat menggunakan konfigurasi ini, perbarui file .env
Anda agar mengarah ke instance Ollama yang diproksi NGINX:
LLM_BASE_URL=https://ollama.yourdomain.com/v1
LLM_API_KEY=MY_PRIVATE_API_KEY
LLM_MODEL=llama3.2:1b
Penyiapan ini memungkinkan Anda mengekspos instans Ollama Anda ke internet dengan aman sambil mempertahankan kontrol atas akses melalui autentikasi kunci API.
Jika Anda menikmati proyek ini, mohon pertimbangkan untuk mengirimi saya tip untuk mendukung pekerjaan saya?