/InfiniWebSearch

A demo built on Megrez-3B-Instruct, integrating a web search tool to enhance the model's question-and-answer capabilities.

Primary LanguagePythonApache License 2.0Apache-2.0

InfiniWebSearch

基于Megrez-3B-Instruct搭建的demo, 接入网络搜索工具增强模型的问答能力.

Read this in English

Example GIF

特性

  1. 意图识别: LLM自动决定搜索工具调用时机
  2. 上下文理解: 根据多轮对话生成合理搜索关键词
  3. 模型回答包含引用: 回答内容可查明出处
  4. 即插即用: 通过system prompt控制WebSearch功能开启与否

项目简介

本工程包含如下几部分:

  • gradio服务 (gradio_app.py): 定义了整个app的workflow
  • 网络搜索服务 (search_service.py): 搜索网页, 加载网页
  • 模型服务: 聊天问答, 工具调用, 总结网页内容

快速上手

安装

git clone https://github.com/infinigence/InfiniWebSearch
cd InfiniWebSearch
conda create -n infini_websearch python=3.10 -y
conda activate infini_websearch
pip install -r requirements.txt
pip install -e .

运行demo

1. 启动网络搜索服务

以Ubuntu环境为例, 从Google Chrome Labs下载chromechromedriver并解压到本地.

cd infini_websearch/service
wget https://storage.googleapis.com/chrome-for-testing-public/128.0.6613.86/linux64/chrome-linux64.zip
wget https://storage.googleapis.com/chrome-for-testing-public/128.0.6613.86/linux64/chromedriver-linux64.zip
unzip chrome-linux64.zip
unzip chromedriver-linux64.zip

安装依赖

sudo apt-get update
sudo apt-get install -y \
    libatk-bridge2.0-0 \
    libatk1.0-0 \
    libgconf-2-4 \
    libnss3 \
    libxss1 \
    libappindicator1 \
    libindicator7 \
    libasound2 \
    libxcomposite1 \
    libxcursor1 \
    libxdamage1 \
    libxi6 \
    libxtst6 \
    libglib2.0-0 \
    libpango1.0-0 \
    libcups2 \
    libxrandr2 \
    libxrandr-dev \
    libxkbcommon0 \
    libgbm1

Serper注册账户获得SERPER_API_KEY, 并添加到环境变量中. 启动网络搜索服务并指定端口号. 在server.py设置SEARCH_SERVER_URLhttp://localhost:8021/search .

export SERPER_API_KEY=$YOUR_API_KEY
cd infini_websearch/service
python search_service.py --port 8021 --chrome ./chrome-linux64/chrome --chromedriver ./chromedriver-linux64/chromedriver

2. 启动模型服务

使用vllm.entrypoints.openai.api_server启动服务并制定端口号, --served-model-name设置为megrez, --max-seq-len设置为32768. 在server.py设置MODEL_SERVER_URL, 默认为 http://localhost:8011/v1/ . 设置MODEL_NAME为"megrez".

python -m vllm.entrypoints.openai.api_server --served-model-name megrez --model $MODEL_PATH --port 8011 --max-seq-len 32768 --trust_remote_code --gpu-memory-utilization 0.8

3. 启动gradio服务

运行gradio_app.py, 指定模型路径和端口号.

export no_proxy="localhost,127.0.0.1"
python gradio_app.py -m $MODEL_PATH --port 7860

成功启动之后, 访问 http://localhost:7860/ 即可使用

说明

  1. 我们提供了WEBPAGE_SUMMARY_MAX_INPUT_TOKENS, WEBPAGE_SUMMARY_MAX_OUTPUT_TOKENS, SESSION_MAX_INPUT_TOKENS, CHAT_MAX_OUTPUT_TOKENS, AGENT_MAX_OUTPUT_TOKENS来控制模型的输入和输出长度. 使用SESSION_WINDOW_SIZE来保留最近的几轮对话历史.你可以在server.py中按需修改.
  2. 已经开始首轮对话后,点击websearch toggle切换状态会在后端清空对话历史, 但前端显示依然保留对话历史.
  3. 如果搜索服务出现异常(例如: 网页加载超时或服务器异常), 工具调用的observation会返回预定义好的信息(例如: "搜索页面加载超时, 请重试").你可以在websearch.pysearch_service.py中自定义边界条件的后处理逻辑.
  4. 使用Serper时(search_service.py), 我们设置"hl"参数为"zh-CN"来尽可能得到中文搜索结果. 如果搜索结果英文网页太多, 可能导致模型用英文回答.
  5. 如果网页搜索成功了, 但是模型表示搜索结果中没有包含回答问题的相关信息, 可以检查控制台打印的各网页的摘要信息. 如果摘要信息显示"无相关内容", 代表原网页没有与问题相关的信息, 或者模型提取与问题相关信息失败.

协议

  • 本开源仓库的代码则遵循 Apache 2.0 协议.