Это приложение Node.js выполняет генерацию дополненной сети с использованием различных поставщиков LLM и результатов веб-поиска из SearXNG.
Клонируем репозиторий:
git clone https://github.com/jparkerweb/web-augmented-generation.git
cd web-augmented-generation
Установите зависимости:
npm ci
Скопируйте файл .env.example
в .env
:
cp .env.example .env
Отредактируйте файл .env
и при необходимости обновите значения:
# #####################
# # 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
Альтернативные конфигурации поставщиков 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
Конфигурация включает в себя:
Это приложение использует формат OpenAI API для взаимодействия с языковой моделью. Вы можете настроить его для работы с Ollama или другими API-интерфейсами, совместимыми с OpenAI. Вот как это настроить:
.env
..env
: LLM_BASE_URL=http://localhost:11434/v1
LLM_API_KEY=ollama
LLM_MODEL=llama3.2:1b
llama3.2:1b
на имя модели, которую вы хотите использовать в 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
своим фактическим ключом API и gpt-3.5-turbo
моделью, которую вы хотите использовать.Приложение будет использовать эти настройки для выполнения вызовов API к языковой модели для таких задач, как перефразирование запросов и генерация ответов.
Запустите приложение с запросом или без него:
node main.js "Your question or prompt here"
или используйте скрипт Ask для более интерактивного взаимодействия:
node ask.js
Если вы не предоставите запрос, приложение предложит вам его ввести.
Приложение будет:
log.txt
Сгенерированный ответ будет отображен в консоли и добавлен в файл журнала.
Если во время выполнения возникает ошибка, она будет записана в error_log.txt
в каталоге проекта.
main.js
: основная логика приложения..env
: файл конфигурации (создайте его из .env.example
).log.txt
: Подробный журнал каждого запуска.error_log.txt
: журнал ошибок (создается в случае возникновения ошибок)completion_flag.txt
: создается при успешном завершении процесса. Это приложение использует парсинг веб-страниц и контент, созданный искусственным интеллектом. Убедитесь, что вы соблюдаете условия обслуживания веб-сайтов, которые вы посещаете, и моделей искусственного интеллекта, которые вы используете.
Если вы хотите запустить SearXNG локально с помощью Docker, выполните следующие действия:
Загрузите последний образ Docker SearXNG:
docker pull searxng/searxng
Создайте каталог для конфигурации SearXNG:
mkdir searxng-config
Создайте файл settings.yml в каталоге searxng-config:
touch searxng-config/settings.yml
Отредактируйте файл settings.yml, чтобы убедиться, что «json» включен в список «форматов»:
nano searxng-config/settings.yml
Добавьте или измените следующие строки:
search :
formats :
- html
- json
Запустите 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
Получите доступ к своему локальному экземпляру SearXNG по адресу http://localhost:8787
Обновите файл .env, чтобы использовать локальный экземпляр SearXNG:
SEARXNG_URL=http://localhost:8787
Теперь у вас есть локальный экземпляр SearXNG, работающий на порту 8787 с включенным выводом JSON, который вы можете использовать с этим приложением.
SEARXNG_URL_EXTRA_PARAMETER
: это поле позволяет добавлять дополнительные параметры к URL-адресу поиска SearXNG. Его можно использовать для различных целей:
key=your_auth_key_here
language=en&time_range=year
&
. Например: key=your_auth_key_here&language=en
SEARXNG_FORMAT
: это поле определяет формат результатов поиска SearXNG. Для него может быть установлено значение «html» или «json»:
Пример использования в файле .env:
SEARXNG_URL_EXTRA_PARAMETER="key=abcdef123456&language=en"
SEARXNG_FORMAT=json
Это добавит &key=abcdef123456&language=en
к URL-адресу поиска SearXNG, и приложение будет ожидать и анализировать ответы JSON от SearXNG.
DISABLE_SSL_VALIDATION
: установите значение «true», чтобы отключить проверку сертификата SSL (по умолчанию: false, используйте с осторожностью).
LLM_STREAM_RESPONSE
: это поле определяет, должны ли ответы LLM передаваться в потоковом режиме в режиме реального времени или возвращаться как один ответ:
Пример использования в файле .env:
LLM_STREAM_RESPONSE=true
Это позволит осуществлять потоковую передачу ответов LLM, обеспечивая более интерактивный опыт.
(пример обслуживания SearXNG на порту 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 ;
}
}
В этот проект включены удобные скрипты для запуска приложения из командной строки. Эти скрипты расположены в каталоге ask-scripts
:
ask
: Универсальный скрипт для Unix-подобных систем и Windowsask.sh
: сценарий Bash для Unix-подобных систем.ask.bat
: пакетный сценарий для командной строки Windows.ask.ps1
: сценарий PowerShell для Windows PowerShell. Чтобы использовать эти сценарии глобально, вам необходимо добавить каталог ask-scripts
в PATH вашей системы. Вот инструкции для разных операционных систем:
ask-scripts
~/.bashrc
, ~/.zshrc
или ~/.bash_profile
)./path/to/ask-scripts
фактическим путем: export PATH="$PATH:/path/to/ask-scripts"
source ~/.bashrc
(или соответствующий файл, который вы отредактировали). Как только каталог ask-scripts
окажется в вашем PATH, вы сможете запустить приложение из любого места, просто набрав:
ask
Затем сценарий предложит вам ввести вопрос или подсказку.
Эта команда автоматически использует соответствующий сценарий для вашей системы:
Вам не нужно указывать вопрос или подсказку в качестве аргумента командной строки. Скрипт в интерактивном режиме запросит ваши данные.
Эти сценарии предоставляют удобный способ взаимодействия с приложением без необходимости каждый раз переходить в каталог проекта или вручную запускать node main.js
Если вы хотите разместить Ollama за обратным прокси-сервером NGINX, вы можете использовать следующую конфигурацию в качестве отправной точки. Эта настройка включает SSL и базовую аутентификацию по ключу API.
# -------------------------
# -- 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
}
}
Эта конфигурация делает следующее:
Не забудьте заменить MY_PRIVATE_API_KEY
своим фактическим ключом API и убедитесь, что пути сертификата SSL верны для вашей системы.
При использовании этой конфигурации обновите файл .env
, чтобы он указывал на ваш экземпляр Ollama, проксируемый NGINX:
LLM_BASE_URL=https://ollama.yourdomain.com/v1
LLM_API_KEY=MY_PRIVATE_API_KEY
LLM_MODEL=llama3.2:1b
Эта настройка позволяет вам безопасно предоставить доступ к вашему экземпляру Ollama в Интернете, сохраняя при этом контроль над доступом посредством аутентификации по ключу API.
Если вам понравился этот проект, пожалуйста, подумайте о том, чтобы отправить мне чаевые, чтобы поддержать мою работу?