更新了一些细节

This commit is contained in:
Wenjie Zhang 2024-11-14 20:07:49 +08:00
parent 7e23545ea6
commit 40f5b3dc1f
13 changed files with 111 additions and 178 deletions

View File

@ -14,7 +14,14 @@
## 快速上手
在启动之前,提供 API 服务商的 API_KEY并放置在 `src/.env` 文件中,参考 `src/.env.template`。默认使用的是智谱AI。需要配置 `ZHIPUAI_API_KEY=<ZHIPUAI_API_KEY>`
在启动之前,提供 API 服务商的 API_KEY并放置在 `src/.env` 文件中。默认使用的是智谱AI。因此务必需要配置 `ZHIPUAI_API_KEY=<ZHIPUAI_API_KEY>`。其余模型的配置可以参考 [src/config/models.yaml](src/config/models.yaml) 中的 env。
```
ZHIPUAI_API_KEY=270ea********8bfa97.e3XOMd****Q1Sk
OPENAI_API_KEY=sk-*********[可选]
```
本项目的基础对话服务可以在不含显卡的设备上运行,大模型使用在线服务商的接口。但是如果想要完整的知识库对话体验,则需要 8G 以上的显存。因为需要本地运行 embedding 模型和 rerank 模型。
**提醒**:下面的脚本会启动开发版本,源代码的修改会自动更新(含前端和后端)。如果生产环境部署,请使用 ` docker/docker-compose.yml` 启动。
@ -23,6 +30,9 @@
docker-compose -f docker/docker-compose.dev.yml up --build
```
**也可以加上 `-d` 参数,后台运行。*
下面的这些容器都会启动:
```bash
@ -36,6 +46,8 @@ docker-compose -f docker/docker-compose.dev.yml up --build
✔ Container web-dev Started
```
然后打开 `[http://localhost:5173/](http://localhost:5173/)` 就可以看到结果了。
**预览**
![DEMO.GIF](./images/demo.gif)
@ -52,7 +64,7 @@ docker-compose -f docker/docker-compose.dev.yml down
docker logs <CONTAINER_NAME> # 例如docker logs api-dev
```
如果需要使用到本地模型,比如向量模型或者重排序模型,则需要将环境变量中设置的 `MODEL_ROOT_DIR` 做映射,比如本地模型都是存放在 `/hdd/models` 里面,则需要在 `docker-compose.yml``docker-compose.dev.yml` 中添加:
如果需要使用到本地模型(不推荐手动指定),比如向量模型或者重排序模型,则需要将环境变量中设置的 `MODEL_ROOT_DIR` 做映射,比如本地模型都是存放在 `/hdd/models` 里面,则需要在 `docker-compose.yml``docker-compose.dev.yml` 中添加:
```yml
services:
@ -74,6 +86,72 @@ services:
docker-compose -f docker/docker-compose.yml up --build
```
## 模型支持
### 1. 对话模型支持
模型仅支持通过API调用的模型如果是需要运行本地模型则建议使用 vllm 转成 API 服务之后使用。使用前请在 `.env` 配置 APIKEY 后使用,配置项目参考:[src/config/models.yaml](src/config/models.yaml)
|模型供应商|默认模型|配置项目|
|:-|:-|:-|
|`openai` | `gpt-4o` | `OPENAI_API_KEY` |
|`qianfan`(百度)|`ernie_speed`|`QIANFAN_ACCESS_KEY`, `QIANFAN_SECRET_KEY`|
|`zhipu`(default)|`glm-4`|`ZHIPUAI_API_KEY`|
|`dashscope`(阿里) | `qwen-max-latest` | `DASHSCOPE_API_KEY`|
|`deepseek`|`deepseek-chat`|`DEEPSEEK_API_KEY`|
|`siliconflow` | `meta-llama/Meta-Llama-3.1-8B-Instruct` | `SILICONFLOW_API_KEY`|
同样支持以 OpenAI 的兼容模型运行模型,可以直接在 Web 设置里面添加。比如使用 vllm 和 Ollama 运行本地模型时。
### 2. 向量模型支持
建议直接使用智谱 AI 的 embedding-3这样不需要做任何修改且资费不贵。
> [!Warning]
> 需要注意,由于知识库和图数据库的构建都依赖于向量模型,如果中途更改向量模型,回导致知识库不可用。此外,知识图谱的向量索引的建立默认使用 embedding-3 构建,因此检索的时候必须使用 embedding-3现阶段还不支持修改
|模型名称(`config.embed_model`)|默认路径/模型|需要配置项目(`config.model_local_paths`|
|:-|:-|:-|
|`bge-large-zh-v1.5`|`BAAI/bge-large-zh-v1.5`|`bge-large-zh-v1.5`*可选:修改为本地路径)|
|`zhipu`|`embedding-2`, `embedding-3`|`ZHIPUAI_API_KEY` (`.env`)|
### 3. 重排序模型支持
目前仅支持 `BAAI/bge-reranker-v2-m3`
### 4. 本地模型支持
对于**语言模型**,并不支持直接运行本地语言模型,请使用 vllm 或者 ollama 转成 API 服务之后使用。
对于**向量模型**和**重排序模型**,可以不做修改会自动下载模型,如果下载过程中出现问题,请参考 [HF-Mirror](https://hf-mirror.com/) 配置相关内容。如果想要使用本地已经下载好的模型(不建议),可以在 `saves/config/config.yaml` 配置相关内容。同时注意要在 docker 中做映射,参考 README 中的 `docker/docker-compose.yml`
例如:
```yaml
model_local_paths:
bge-large-zh-v1.5: /models/bge-large-zh-v1.5
```
## 知识库支持
本项目支持多种格式的知识库目前支持的格式有pdf、txt、md。文件上传后会首先转换为纯文本然后使用向量模型将文本转换为向量然后存储到向量数据库中。这个过程可能会花费不少时间。
## 知识图谱支持
> [!NOTE]
> 现阶段项目所使用的 OneKE 自动创建知识图谱的效果并不是很好,暂时移除了,建议在项目外创建知识图谱**
本项目支持 Neo4j 作为知识图谱的存储。需要将图谱整理成 jsonl 的格式,每一行都是 {"h": "北京", "t": "中国", "r": "首都"} 这样的格式,然后在网页的图谱管理里面添加这个文件。
项目启动后会自动启动 neo4j 服务,可以直接使用 [http://localhost:7474/](http://localhost:7474/) 去访问和管理图数据库,初始默认的账户密码是 `neo4j``0123456789`。可以在 `docker/docker-compose.yml``docker\docker-compose.dev.yml` 中修改(注:`api.environment` 和 `graph.environment` 都需要修改)。
目前项目中暂不支持同时查询多个知识图谱,短期内也没有计划支持。不过倒是可以通过配置不同的 `NEO4J_URI` 服务来切换知识图谱。如果已经有了基于 neo4j 的知识图谱,可以将 `docker-compose.yml` 中的 `graph` 配置项删除,并将 `api.environment` 中的 `NEO4J_URI` 配置项修改为 neo4j 的服务地址。
## 更新日志
- 2024.10.12 后端修改为 [FastAPI](https://github.com/fastapi),并添加了 [Milvus-Standalone](https://github.com/milvus-io) 的独立部署。

View File

@ -1,5 +1,5 @@
# 开发阶段
FROM node:latest AS development
FROM node:22.10.0 AS development
WORKDIR /app
# 复制 package.json 和 package-lock.json如果存在
@ -17,7 +17,7 @@ EXPOSE 5173
# 启动开发服务器的命令在 docker-compose 文件中定义
# 生产阶段
FROM node:latest AS build-stage
FROM node:22.10.0 AS build-stage
WORKDIR /app
COPY ./web/package*.json ./

View File

@ -1,10 +1,18 @@
import os
import json
import yaml
from pathlib import Path
from src.utils.logging_config import setup_logger
logger = setup_logger("Config")
with open(Path("src/config/models.yaml"), "r") as f:
_models = yaml.safe_load(f)
MODEL_NAMES = _models["MODEL_NAMES"]
EMBED_MODEL_INFO = _models["EMBED_MODEL_INFO"]
RERANKER_LIST = _models["RERANKER_LIST"]
class SimpleConfig(dict):
@ -95,10 +103,17 @@ class Config(SimpleConfig):
logger.warning(f"Model name {self.model_name} not in custom models, using default model name")
self.model_name = self.custom_models[0]["custom_id"]
conds = {}
self.model_provider_status = {}
for provider in self.model_names:
conds = [bool(os.getenv(_k)) for _k in self.model_names[provider]["env"]]
self.model_provider_status[provider] = all(conds)
conds[provider] = self.model_names[provider]["env"]
conds_bool = [bool(os.getenv(_k)) for _k in conds[provider]]
self.model_provider_status[provider] = all(conds_bool)
self.valuable_model_provider = [k for k, v in self.model_provider_status.items() if v]
assert len(self.valuable_model_provider) > 0, f"No model provider available, please check your `.env` file. API_KEY_LIST: {conds}"
def load(self):
"""根据传入的文件覆盖掉默认配置"""
@ -147,120 +162,3 @@ class Config(SimpleConfig):
json.dump(self, f, indent=4)
logger.info(f"Config file {self.filename} saved")
MODEL_NAMES = {
"openai": {
"name": "OpenAI",
"url": "https://platform.openai.com/docs/models",
"default": "gpt-3.5-turbo",
"env": ["OPENAI_API_KEY"],
"models": [
"gpt-4",
"gpt-4o",
"gpt-4o-mini",
"gpt-3.5-turbo"
]
},
# https://platform.deepseek.com/api-docs/zh-cn/pricing
"deepseek": {
"name": "DeepSeek",
"url": "https://platform.deepseek.com/api-docs/zh-cn/pricing",
"default": "deepseek-chat",
"env": ["DEEPSEEK_API_KEY"],
"models": [
"deepseek-chat",
]
},
# https://open.bigmodel.cn/dev/api glm-4-plus、glm-4-0520、glm-4 、glm-4-air、glm-4-airx、glm-4-long 、 glm-4-flashx 、 glm-4-flash
"zhipu": {
"name": "智谱AI (Zhipu)",
"url": "https://open.bigmodel.cn/dev/api",
"default": "glm-4-flash",
"env": ["ZHIPUAI_API_KEY"],
"models": [
"glm-4",
"glm-4-plus",
"glm-4-air",
"glm-4-airx",
"glm-4-long",
"glm-4-flashx",
"glm-4-flash",
]
},
# {'ERNIE-4.0-8K-0104', 'ERNIE-Lite-8K-0308', 'ERNIE-Speed-128K', 'ERNIE-3.5-128K预览版', 'Yi-34B-Chat', 'ERNIE-4.0-8K-Preview-0518', 'ERNIE-Bot-4', 'ERNIE-3.5-128K', 'ChatGLM2-6B-32K', 'ERNIE-3.5-8K', 'EB-turbo-AppBuilder', 'ERNIE-Lite-AppBuilder-8K', 'ERNIE-4.0-8K-0329', 'AquilaChat-7B', 'Gemma-7B-it', 'Qianfan-Chinese-Llama-2-70B', 'Mixtral-8x7B-Instruct', 'Gemma-7B-It', 'ERNIE Speed-AppBuilder', 'ERNIE-Function-8K', 'ERNIE-4.0-8K-preview', 'ERNIE-Bot', 'Qianfan-BLOOMZ-7B-compressed', 'ERNIE-4.0-8K', 'BLOOMZ-7B', 'ERNIE-Character-8K', 'ERNIE-3.5-8K-0205', 'ERNIE-4.0-8K-0613', 'Llama-2-70B-Chat', 'ERNIE-Character-Fiction-8K', 'ERNIE-4.0-8K-Preview', 'ERNIE-3.5-8K-Preview', 'ERNIE-Speed', 'ERNIE-Tiny-8K', 'ERNIE-4.0-Turbo-8K-Preview', 'Meta-Llama-3-8B', 'ERNIE-4.0-8K-Latest', 'ERNIE 3.5', 'XuanYuan-70B-Chat-4bit', 'Llama-2-13B-Chat', 'ERNIE-Bot-turbo', 'ERNIE-3.5-8K-0613', 'ERNIE-Lite-AppBuilder-8K-0614', 'ERNIE-4.0-preview', 'Llama-2-7B-Chat', 'Qianfan-Chinese-Llama-2-13B', 'ERNIE-Bot-turbo-AI', 'Meta-Llama-3-70B', 'ERNIE-Functions-8K', 'ERNIE-Lite-8K-0922原ERNIE-Bot-turbo-0922', 'ERNIE Speed', 'ERNIE-3.5-preview', 'Qianfan-Chinese-Llama-2-7B', 'ERNIE-Speed-8K', 'ERNIE-Lite-8K-0922', 'ChatLaw', 'ERNIE-3.5-8K-0329', 'ERNIE-4.0-Turbo-8K', 'ERNIE-3.5-8K-preview', 'ERNIE-Lite-8K'}
"qianfan": {
"name": "百度千帆 (QianFan)",
"url": "https://open.bigmodel.cn/dev/api",
"default": "ERNIE-Speed",
"env": ["QIANFAN_ACCESS_KEY", "QIANFAN_SECRET_KEY"],
"models": [
"ERNIE-Speed",
"ERNIE-Speed-8K",
"ERNIE-Speed-128K",
"ERNIE-Tiny-8K",
"ERNIE-Lite-8K",
"ERNIE-4.0-8K-Latest",
]
},
# https://bailian.console.aliyun.com/?switchAgent=10226727&productCode=p_efm#/model-market
"dashscope": {
"name": "阿里百炼 (DashScope)",
"url": "https://bailian.console.aliyun.com/?switchAgent=10226727&productCode=p_efm#/model-market",
"default": "qwen2.5-72b-instruct",
"env": ["DASHSCOPE_API_KEY"],
"models": [
"qwen-max-latest",
"qwen-plus-latest",
"qwen-long-latest",
"qwen-turbo-latest",
"qwen2.5-72b-instruct",
"qwen2.5-32b-instruct",
"qwen2.5-14b-instruct",
"qwen2.5-7b-instruct",
"qwen2.5-3b-instruct",
"qwen2.5-1.5b-instruct",
"qwen2.5-0.5b-instruct",
]
},
# https://cloud.siliconflow.cn/models
"siliconflow": {
"name": "SiliconFlow",
"url": "https://cloud.siliconflow.cn/models",
"default": "meta-llama/Meta-Llama-3.1-8B-Instruct",
"env": ["SILICONFLOW_API_KEY"],
"models": [
"meta-llama/Meta-Llama-3.1-8B-Instruct",
"meta-llama/Meta-Llama-3.1-70B-Instruct",
"meta-llama/Meta-Llama-3.1-405B-Instruct",
]
},
}
EMBED_MODEL_INFO = {
"bge-large-zh-v1.5": SimpleConfig({
"name": "bge-large-zh-v1.5",
"default_path": "BAAI/bge-large-zh-v1.5",
"dimension": 1024,
"query_instruction": "为这个句子生成表示以用于检索相关文章:",
}),
"zhipu-embedding-2": SimpleConfig({
"name": "zhipu-embedding-2",
"default_path": "embedding-2",
"dimension": 1024,
}),
"zhipu-embedding-3": SimpleConfig({
"name": "zhipu-embedding-3",
"default_path": "embedding-3",
"dimension": 2048,
}),
}
RERANKER_LIST = {
"bge-reranker-v2-m3": "BAAI/bge-reranker-v2-m3",
}

View File

@ -51,6 +51,7 @@ class DataBaseManager:
def _save_databases(self):
"""将数据库的信息保存到本地的文件里面"""
self._update_database()
os.makedirs(os.path.dirname(self.database_path), exist_ok=True)
with open(self.database_path, "w+") as f:
json.dump({
"databases": [db.to_dict() for db in self.data["databases"]],

View File

@ -1,47 +0,0 @@
## 模型说明
### 1. 对话模型支持
模型仅支持通过API调用的模型如果是需要运行本地模型则建议使用 vllm 转成 API 服务之后使用。使用前请配置 APIKEY 后使用,配置项目参考:[.env.template](../.env.template)
|模型供应商(`config.model_provider`)|默认模型(`config.model_name`)|配置项目(`.env`)|
|:-|:-|:-|
|`openai` | `gpt-4o` | `OPENAI_API_KEY` |
|`qianfan`(百度)|`ernie_speed`|`QIANFAN_ACCESS_KEY`, `QIANFAN_SECRET_KEY`|
|`zhipu`(default)|`glm-4`|`ZHIPUAI_API_KEY`|
|`dashscope`(阿里) | `qwen-max-latest` | `DASHSCOPE_API_KEY`|
|`deepseek`|`deepseek-chat`|`DEEPSEEK_API_KEY`|
|`siliconflow` | `meta-llama/Meta-Llama-3.1-8B-Instruct` | `SILICONFLOW_API_KEY`|
同样支持以 OpenAI 的兼容模型运行模型,可以直接在设置里面添加。比如使用 vllm 和 Ollama 运行本地模型时。
### 2. 向量模型支持
建议直接使用智谱 AI 的 embedding-3这样不需要做任何修改且资费不贵。
> [!Warning]
> 需要注意,由于知识库和图数据库的构建都依赖于向量模型,如果中途更改向量模型,回导致知识库不可用。此外,知识图谱的向量索引的建立默认使用 embedding-3 构建,因此检索的时候必须使用 embedding-3现阶段还不支持修改
|模型名称(`config.embed_model`)|默认路径/模型|需要配置项目(`config.model_local_paths`|
|:-|:-|:-|
|`bge-large-zh-v1.5`|`BAAI/bge-large-zh-v1.5`|`bge-large-zh-v1.5`*可选:修改为本地路径)|
|`zhipu`|`embedding-2`, `embedding-3`|`ZHIPUAI_API_KEY` (`.env`)|
### 3. 重排序模型支持
目前仅支持 `BAAI/bge-reranker-v2-m3`
### 4. 本地模型支持
对于**语言模型**,并不支持直接运行本地语言模型,请使用 vllm 或者 ollama 转成 API 服务之后使用。
对于**向量模型**和**重排序模型**,可以不做修改会自动下载模型,如果下载过程中出现问题,请参考 [HF-Mirror](https://hf-mirror.com/) 配置相关内容。如果想要使用本地已经下载好的模型(不建议),可以在 `saves/config/config.yaml` 配置相关内容。同时注意要在 docker 中做映射,参考 README 中的 `docker/docker-compose.yml`
例如:
```yaml
model_local_paths:
bge-large-zh-v1.5: /models/bge-large-zh-v1.5
```

BIN
web/public/avatar.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

View File

@ -78,9 +78,9 @@ console.log(route)
</a-drawer>
</div>
<div class="header" :class="{ 'top-bar': layoutSettings.useTopBar }">
<div class="logo">
<div class="logo circle">
<router-link to="/">
<img src="/jnu.png">
<img src="/avatar.jpg">
<span class="logo-text">语析</span>
</router-link>
</div>
@ -182,7 +182,7 @@ div.header, #app-router-view {
img {
width: 100%;
height: 100%;
border-radius: 50%;
border-radius: 4px; // 50% for circle
}
.logo-text {

View File

@ -2,7 +2,7 @@
<div class="database-container layout-container" v-if="configStore.config.enable_knowledge_base">
<HeaderComponent
title="文档知识库"
description="知识型数据库,主要是非结构化的文本组成,使用向量检索使用。"
description="知识型数据库,主要是非结构化的文本组成,使用向量检索使用。如果出现问题,可以检查 saves/data/database.json 查看配置。"
>
<template #actions>
<a-button type="primary" @click="newDatabase.open=true">新建数据库</a-button>

View File

@ -1,6 +1,6 @@
<template>
<div class="welcome">
<header class="glass-header">江南大学人工智能与计算机学院</header>
<header class="glass-header">江南语析</header>
<h1>{{ title }}</h1>
<p>大模型驱动的知识库管理工具</p>
<button class="home-btn" @click="goToChat">开始对话</button>
@ -13,7 +13,7 @@
import { reactive, ref } from 'vue'
import { useRouter } from 'vue-router'
const title = ref('📢 Athena ✨')
const title = ref('📢 Yuxi-Know ✨')
const router = useRouter()
const goToChat = () => {

View File

@ -64,13 +64,13 @@
@change="handleChange('enable_knowledge_graph', !configStore.config.enable_knowledge_graph)"
/>
</div>
<div class="card">
<!-- <div class="card">
<span class="label">{{ items?.enable_search_engine.des }}</span>
<a-switch
:checked="configStore.config.enable_search_engine"
@change="handleChange('enable_search_engine', !configStore.config.enable_search_engine)"
/>
</div>
</div> -->
<div class="card">
<span class="label">{{ items?.enable_reranker.des }}</span>
<a-switch
@ -169,6 +169,9 @@
</div>
</div>
</div>
<div class="setting" v-if="state.section =='path'">
<p>暂无配置</p>
</div>
</div>
</div>
</template>