Awesome
InfiniWebSearch
基于Megrez-3B-Instruct搭建的demo, 接入网络搜索工具增强模型的问答能力.
Read this in English
<div align="center"> <img src="assets/websearch_demo.gif" width="75%" alt="Example GIF"> </div>特性
- 意图识别: LLM自动决定搜索工具调用时机
- 上下文理解: 根据多轮对话生成合理搜索关键词
- 模型回答包含引用: 回答内容可查明出处
- 即插即用: 通过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下载chrome和chromedriver并解压到本地.
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_URL
为 http://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/ 即可使用
说明
- 我们提供了
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中按需修改. - 已经开始首轮对话后,点击websearch toggle切换状态会在后端清空对话历史, 但前端显示依然保留对话历史.
- 如果搜索服务出现异常(例如: 网页加载超时或服务器异常), 工具调用的observation会返回预定义好的信息(例如: "搜索页面加载超时, 请重试").你可以在websearch.py和search_service.py中自定义边界条件的后处理逻辑.
- 使用Serper时(search_service.py), 我们设置"hl"参数为"zh-CN"来尽可能得到中文搜索结果. 如果搜索结果英文网页太多, 可能导致模型用英文回答.
- 如果网页搜索成功了, 但是模型表示搜索结果中没有包含回答问题的相关信息, 可以检查控制台打印的各网页的摘要信息. 如果摘要信息显示"无相关内容", 代表原网页没有与问题相关的信息, 或者模型提取与问题相关信息失败.
协议
- 本开源仓库的代码则遵循 Apache 2.0 协议.