赞
踩
视频地址:https://www.bilibili.com/video/BV1QA4m1F7t4/
文档地址:https://github.com/InternLM/Tutorial/blob/camp2/huixiangdou/readme.md
正文内容包含:RAG 基础介绍、茴香豆产品简介、以及茴香豆RAG知识库实战。
主要涉及原理、架构、与微调的对比、向量数据库、评估测试等
Q:什么是RAG技术?
GPT-3.5:RAG技术是一种用于生成自然语言文本的技术,它结合了Retriever、Attentive Reader和Generative model三种模块的方法。这三个模块分别负责不同的任务:
1. Retriever(检索器):这个模块负责从大量的文本数据中检索相关信息。它可以根据输入的问题或主题,在预先准备好的文本数据集中找到相关的文本片段或信息。
2. Attentive Reader(注意力读者):这个模块负责理解检索到的文本内容。它通过注意力机制(attention mechanism)来聚焦于关键信息,以便更好地理解文本内容。
3. Generative model(生成模型):这个模块负责生成最终的自然语言文本。它基于检索到的信息和理解的内容,生成符合要求的文本输出,可以是回答问题、解释概念或完成其他任务。
RAG技术的优势在于结合了检索和生成的优点,可以更准确地生成复杂的自然语言文本,并且在处理开放领域的问答和对话任务时表现出色。
模型具有延后性,训练的时候没有语料,知识是过时的,会生成幻觉(胡说八道,就像考试时题目不会写,但是也写满了),解决问题的方法有重新搜集语料进行微调,但是工程量大,而RAG技术就能快速的增强模型的性能,提供准确的回答、降低成本、实现外部记忆,解决知识密集型任务的挑战(如:QA问答)。
RAG(Retrieval Augmented Generation),检索增强生成技术,在通过利用外部知识库来增强大预言模型的性能
R:Retrieval
A:Augmented
G:Generation
顾名思义,该技术涉及检索(与用户相关的信息片段)、生成(回答),应用于问答系统、文本生成、信息检索、图片描述。
个人看法:在实际应用中似乎不区分问答系统、文本生成、信息检索,一般会混在一块用。问答系统在你输入数据后,进行数据的检索获取向量,然后提取知识的片段,将这个片段的知识加入到query中,进行问答,该过程会生成文本。逻辑上感觉没毛病,如果硬说不一样可能是,可能问答系统的输入是
波音747的参数是多少?
,而文本查找的输入query的输入是波音747的参数
,但是问答系统用这种提问方式也是可行的。
上面这张图很清晰的表达出RAG技术中需要的模块,以及各个模块之间的联系。
上面这张图所传达出的流程涉及三个大的步骤:
{原始的问题}\n基于以下信息回答问题:\n{chunk1}\n{chunk2}\n{chunk3}
)答案的信息来源于数据库,更新数据库就可以保持模型的时效性。
架构
三种范式:
图来源于《Retrieval-Augmented-Generation for Large Language Models: A Surver》
优化方法
嵌入式优化(质量优化)
I. 结合稀疏编码器和密集检索器
II. 多任务
索引优化(质量优化)
查询优化(查询优化,让查询的任务更清晰的角度出发)RAG范式2
上下文管理(减少检索信息,提高效率)RAG范式2
迭代检索(检索优化):根据初始查询和迄今为止生成的文本进行重复搜索。
递归检索(检索优化):迭代细化搜索查询、**链式推理(Chain-of-Thought)**指导检索过程,并范式检索结果,细化过程。
自适应检索(检索优化):Flare\self-RAG,使用LLMs主动决定检索的最佳时机和内容。
微调:检索微调、生成微调、双重微调
对比
储存外部数据库
数学知识:(by GPT-3.5)
1、点乘:(投影)
点乘相似度的值的大小说明了两个向量之间的相关性和相似程度。
两个向量的点乘(内积)可以用以下的公式来表示:
如果有两个向量 a = [ a 1 , a 2 , … , a n ] \mathbf{a} = [a_1, a_2, \ldots, a_n] a=[a1,a2,…,an] 和 b = [ b 1 , b 2 , … , b n ] \mathbf{b} = [b_1, b_2, \ldots, b_n] b=[b1,b2,…,bn],它们的点乘可以表示为: a ⋅ b = a 1 ⋅ b 1 + a 2 ⋅ b 2 + … + a n ⋅ b n \mathbf{a} \cdot \mathbf{b} = a_1 \cdot b_1 + a_2 \cdot b_2 + \ldots + a_n \cdot b_n a⋅b=a1⋅b1+a2⋅b2+…+an⋅bn 另外,两个向量的点乘还可以表示为它们的模长(长度)乘积与它们夹角的余弦值的乘积: a ⋅ b = ∣ a ∣ ⋅ ∣ b ∣ ⋅ cos ( θ ) \mathbf{a} \cdot \mathbf{b} = |\mathbf{a}| \cdot |\mathbf{b}| \cdot \cos(\theta) a⋅b=∣a∣⋅∣b∣⋅cos(θ),在这里 ∣ a ∣ |\mathbf{a}| ∣a∣ 和 ∣ b ∣ |\mathbf{b}| ∣b∣ 分别表示向量 a \mathbf{a} a 和 b \mathbf{b} b 的模长(长度), θ \theta θ 表示两个向量之间的夹角。
具体来说:
因此,点乘相似度的值可以用来判断两个向量在同一方向上的相似程度,或者在相反方向上的相似程度,以及它们是否正交或不相关。
2、 余弦相似度:
余弦相似度的值表示了两个向量在向量空间中的方向上的相似程度。
计算两个向量的余弦相似度(cosine similarity)可以通过它们的点积(dot product)公式来完成。余弦相似度公式如下所示:
Similarity
=
cos
(
θ
)
=
a
⋅
b
∣
a
∣
⋅
∣
b
∣
\text{Similarity} = \cos(\theta) = \frac{\mathbf{a} \cdot \mathbf{b}}{|\mathbf{a}| \cdot |\mathbf{b}|}
Similarity=cos(θ)=∣a∣⋅∣b∣a⋅b
其中,
a
\mathbf{a}
a 和
b
\mathbf{b}
b 是两个向量,
⋅
\cdot
⋅ 表示点积,
∣
a
∣
| \mathbf{a} |
∣a∣ 和
∣
b
∣
| \mathbf{b} |
∣b∣ 分别表示向量
a
\mathbf{a}
a 和
b
\mathbf{b}
b 的模长(长度),
θ
\theta
θ 表示两个向量之间的夹角。
具体来说:
当余弦相似度为1时,表示两个向量的方向完全相同,它们指向相同的方向。
当余弦相似度为0时,表示两个向量是正交的,它们的方向是互相垂直的。
当余弦相似度为-1时,表示两个向量的方向完全相反,它们指向相反的方向。
因此,余弦相似度的取值范围在[-1, 1]之间,值越接近1表示两个向量的方向越相似,值越接近-1表示两个向量的方向越相反,而值接近0则表示两个向量的方向基本上是正交的或者完全不相关。
介绍、特点、架构、构建的步骤
关键点:自动化问答支持为即时通讯的群聊场景提供问答服务(那就有点像电脑管家的加速球,要的时候点一下就能用?而在聊天软件对话场景,如微信、issue问题回复、钉钉群聊里面的机器人、模型得不断对本地上传的数据进行分类,识别问题,如果是问题再通过RAG技术进行检索生成)、检索增强应用。
商用和本地部署很重要
数据、前后端的结合,模型支持书生浦语、千问等
豆哥怎么干活的?
上图中,左边有三个工作流:预处理-拒答-应答
右边,根据预处理得到的问询,在向量库中计算得分,选择是否继续问答。(主要是为了适用于不用的应用场景,但是会不会很多问题直接都拒答了,为什么要判断是话痨还是专家,在实际应用中需要的返回的值)
拒答流程识别是不是问题, 如下图,由于不是问题,拒绝回答,知识提供子完成介绍:
支持:本地、网络和知识图谱(基本能解决项目中的问题)
30% x A100
Cuda11.7-conda
镜像studio-conda -o internlm-base -t InternLM2_Huixiangdou # 等效于创建环境 激活环境 安装torch
conda activate InternLM2_Huixiangdou
Embedding模型:bce-embedding-base_v1:
重排模型:bce-reranker-base_v1:
LLM模型:internlm2-chat-7b:
# 本地下载
# 打开HuggingFace
页面有git初始化话下载指令
# 服务器操作
# 创建模型文件夹
cd /root && mkdir models
# 复制BCE模型——软连接
ln -s /root/share/new_models/maidalun1020/bce-embedding-base_v1 /root/models/bce-embedding-base_v1
ln -s /root/share/new_models/maidalun1020/bce-reranker-base_v1 /root/models/bce-reranker-base_v1
# 复制大模型参数(下面的模型,根据作业进度和任务进行**选择一个**就行)
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-7b /root/models/internlm2-chat-7b
环境:requirements.txt
protobuf==4.25.3 accelerate==0.28.0 aiohttp==3.9.3 auto-gptq==0.7.1 bcembedding==0.1.3 beautifulsoup4==4.8.2 einops==0.7.0 faiss-gpu==1.7.2 langchain==0.1.14 loguru==0.7.2 lxml_html_clean==0.1.0 openai==1.16.1 openpyxl==3.1.2 pandas==2.2.1 pydantic==2.6.4 pymupdf==1.24.1 python-docx==1.1.0 pytoml==0.1.21 readability-lxml==0.8.1 redis==5.0.3 requests==2.31.0 scikit-learn==1.4.1.post1 sentence_transformers==2.2.2 textract==1.6.5 tiktoken==0.6.0 transformers==4.39.3 transformers_stream_generator==0.0.5 unstructured==0.11.2 # 安装 python 依赖 # pip install -r requirements.txt
下载茴香豆:
cd /root
# 下载 repo
git clone https://github.com/internlm/huixiangdou && cd huixiangdou
git checkout 447c6f7e68a1657fce1c4f7c740ea1700bde0440
(1) 命令行输入下面的命令,修改用于向量数据库和词嵌入的模型
sed -i '6s#.*#embedding_model_path = "/root/models/bce-embedding-base_v1"#' /root/huixiangdou/config.ini
(2) 用于检索的重排序模型
sed -i '7s#.*#reranker_model_path = "/root/models/bce-reranker-base_v1"#' /root/huixiangdou/config.ini
(3) 和本次选用的大模型
sed -i '29s#.*#local_llm_path = "/root/models/internlm2-chat-7b"#' /root/huixiangdou/config.ini
sed -i '6s#.*#embedding_model_path = "/root/models/bce-embedding-base_v1"#' /root/huixiangdou/config.ini
的含义:这条命令是使用
sed
命令在/root/huixiangdou/config.ini
文件中的第6行进行替换操作。具体来说,命令的含义如下:
-i
选项表示直接对文件进行修改,而不是输出到标准输出。6s#.*#embedding_model_path = "/root/models/bce-embedding-base_v1"#
是sed
命令的操作部分。在这里,6s
表示对第6行进行替换操作,#
是分隔符,.*
表示匹配该行的任意字符,embedding_model_path = "/root/models/bce-embedding-base_v1"
是要替换成的内容。因此,该命令的作用是将
/root/huixiangdou/config.ini
文件中的第6行内容替换为embedding_model_path = "/root/models/bce-embedding-base_v1"
。
(1)下载语料——文档
cd /root/huixiangdou && mkdir repodir
git clone https://github.com/internlm/huixiangdou --depth=1 repodir/huixiangdou
(2) 提取知识库特征,创建向量数据库。
使用LangChain 对数据库向量化(默认嵌入和重排序模型调用的网易 BCE 双语模型),茴香豆建立接受和拒答两个向量数据库来源分别是:
huixiangdou/resource/good_questions.json
中huixiangdou/resource/bad_questions.json
中(3)增加茴香豆相关的问题
添加到good_question.json
文件中
(4)测试列表构建
cd /root/huixiangdou
echo '[
"huixiangdou 是什么?",
"你好,介绍下自己"
]' > ./test_queries.json
(5)创建向量数据库
# 创建向量数据库存储目录
cd /root/huixiangdou && mkdir workdir
# 分别向量化知识语料、接受问题和拒绝问题中后保存到 workdir
python3 -m huixiangdou.service.feature_store --sample ./test_queries.json
检索过程中,茴香豆会将输入问题与两个列表中的问题在向量空间进行相似性比较,判断该问题是否应该回答,避免群聊过程中的问答泛滥。确定的回答的问题会利用基础模型提取关键词,在知识库中检索 top K
相似的chunk
,综合问题和检索到的 chunk
生成答案。
# 填入问题
sed -i '74s/.*/ queries = ["huixiangdou 是什么?", "茴香豆怎么部署到微信群", "今天天气怎么样?"]/' /root/huixiangdou/huixiangdou/main.py
# 运行茴香豆
cd /root/huixiangdou/
python3 -m huixiangdou.main --standalone
在自己的服务器部署茴香豆 Web 版——创建自己领域的知识问答助手
视频参考:https://www.bilibili.com/video/BV1S2421N7mn
github参考:https://github.com/InternLM/HuixiangDou/tree/main/web
- 启动web服务版本 主要是fastapi+radis相关。这个radis涉及知识盲区。
InternLM Studio
上部署茴香豆技术助手根据教程文档搭建
茴香豆技术助手
,针对问题"茴香豆怎么部署到微信群?"进行提问
创建开发机 ——> vs codessh连结开发机
注意:
开发机配置cuda11.7的版本、使用30%的资源配置。
vscode ssh远程链接:点击vscode左下角的远程链接(安装remote-ssh插件),将开发机的ssh粘贴即可。
创建虚拟环境,并激活。创建后一定要激活环境!!!
studio-conda -o internlm-base -t InternLM2_Huixiangdou # 等效于conda 创建环境 激活环境 安装torch
conda activate InternLM2_Huixiangdou
我在本地创建的虚拟环境会报错,有些库版本不一致,我用的linux,2.2.2的torch,11.8的cuda。
本地没装成功,故在开发机上进行操作。
当时本地创建的名字叫
huixiangdou
,结果在开发机操作的时候没有这个环境,检查发现环境的名字是InternLM2_Huixiangdou
,其实可以自定义简单点的名字,不要无脑直接复制代码。
安装依赖
pip install protobuf==4.25.3 accelerate==0.28.0 aiohttp==3.9.3 auto-gptq==0.7.1 bcembedding==0.1.3 beautifulsoup4==4.8.2 einops==0.7.0 faiss-gpu==1.7.2 langchain==0.1.14 loguru==0.7.2 lxml_html_clean==0.1.0 openai==1.16.1 openpyxl==3.1.2 pandas==2.2.1 pydantic==2.6.4 pymupdf==1.24.1 python-docx==1.1.0 pytoml==0.1.21 readability-lxml==0.8.1 redis==5.0.3 requests==2.31.0 scikit-learn==1.4.1.post1 sentence_transformers==2.2.2 textract==1.6.5 tiktoken==0.6.0 transformers==4.39.3 transformers_stream_generator==0.0.5 unstructured==0.11.2
或使用requirements.txt
克隆代码文件
# cd /root
# 下载 repo
git clone https://github.com/internlm/huixiangdou && cd huixiangdou
git checkout 447c6f7e68a1657fce1c4f7c740ea1700bde0440
模型的软链接:三个模型bce-embedding
bce-reranker
internlm2-chat-7b
# 创建模型文件夹
# cd /root && mkdir models # 之前的课程已经创建了models文件夹了
# 复制BCE模型——软连接
ln -s /root/share/new_models/maidalun1020/bce-embedding-base_v1 /root/models/bce-embedding-base_v1
ln -s /root/share/new_models/maidalun1020/bce-reranker-base_v1 /root/models/bce-reranker-base_v1
# 复制大模型参数(下面的模型,根据作业进度和任务进行**选择一个**就行)
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-7b /root/models/internlm2-chat-7b
模型下载的三种方式:
方法1:默认自己下载。存放在.cache文件中。
方法2:使用modelscope脚本下载。napshot_download()
(在模型库首页 · 魔搭社区 (modelscope.cn)查找模型的地址)
import os
from modelscope.hub.snapshot_download import snapshot_download
# 创建保存模型目录
os.system("mkdir /root/models")
save_dir="/root/models"
snapshot_download("Shanghai_AI_Laboratory/internlm2-chat-7b", cache_dir=save_dir, )
方法3:huggingface
# (1)snapshot_download import os from huggingface_hub import snapshot_download model = "internlm/internlm2-chat-7b" # HF模型位置 cache_dir = "./" # 存放位置 file_name = "config.json" # 过滤文件"*.json" from huggingface_hub import snapshot_download snapshot_download(repo_id=model, allow_patterns=file_name, cache_dir=cache_dir) print("完成") # (2) hf_hub_download from huggingface_hub import hf_hub_download hf_hub_download(repo_id="internlm/internlm2-chat-7b", cache_dir = "./model" , filename="config.json") print("下载完成!") # (3)huggingface_cli import os # 下载模型 os.system('huggingface-cli download --resume-download internlm/internlm2-chat-7b --local-dir your_path') """ resume-download:断点续下 local-dir:本地存储路径。 """
更换代码中的模型位开发机中的路径:向量数据库和词嵌入的模型
、重排序模型
、LLM
。
sed -i '6s#.*#embedding_model_path = "/root/models/bce-embedding-base_v1"#' /root/huixiangdou/config.ini
sed -i '7s#.*#reranker_model_path = "/root/models/bce-reranker-base_v1"#' /root/huixiangdou/config.ini
sed -i '29s#.*#local_llm_path = "/root/models/internlm2-chat-7b"#' /root/huixiangdou/config.ini
questions语料的创建测试
touch /root/huixiangdou/resource/good_questions.json # 粘贴以下内容 [ "mmpose中怎么调用mmyolo接口", "mmpose实现姿态估计后怎么实现行为识别", "mmpose执行提取关键点命令不是分为两步吗,一步是目标检测,另一步是关键点提取,我现在目标检测这部分的代码是demo/topdown_demo_with_mmdet.py demo/mmdetection_cfg/faster_rcnn_r50_fpn_coco.py checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth 现在我想把这个mmdet的checkpoints换位yolo的,那么应该怎么操作", "在mmdetection中,如何同时加载两个数据集,两个dataloader", "如何将mmdetection2.28.2的retinanet配置文件改为单尺度的呢?", "1.MMPose_Tutorial.ipynb、inferencer_demo.py、image_demo.py、bottomup_demo.py、body3d_pose_lifter_demo.py这几个文件和topdown_demo_with_mmdet.py的区别是什么,\n2.我如果要使用mmdet是不是就只能使用topdown_demo_with_mmdet.py文件,", "mmpose 测试 map 一直是 0 怎么办?", "如何使用mmpose检测人体关键点?", "我使用的数据集是labelme标注的,我想知道mmpose的数据集都是什么样式的,全都是单目标的数据集标注,还是里边也有多目标然后进行标注", "如何生成openmmpose的c++推理脚本", "mmpose", "mmpose的目标检测阶段调用的模型,一定要是demo文件夹下的文件吗,有没有其他路径下的文件", "mmpose可以实现行为识别吗,如果要实现的话应该怎么做", "我在mmyolo的v0.6.0 (15/8/2023)更新日志里看到了他新增了支持基于 MMPose 的 YOLOX-Pose,我现在是不是只需要在mmpose/project/yolox-Pose内做出一些设置就可以,换掉demo/mmdetection_cfg/faster_rcnn_r50_fpn_coco.py 改用mmyolo来进行目标检测了", "mac m1从源码安装的mmpose是x86_64的", "想请教一下mmpose有没有提供可以读取外接摄像头,做3d姿态并达到实时的项目呀?", "huixiangdou 是什么?", "使用科研仪器需要注意什么?", "huixiangdou 是什么?", "茴香豆 是什么?", "茴香豆 能部署到微信吗?", "茴香豆 怎么应用到飞书", "茴香豆 能部署到微信群吗?", "茴香豆 怎么应用到飞书群", "huixiangdou 能部署到微信吗?", "huixiangdou 怎么应用到飞书", "huixiangdou 能部署到微信群吗?", "huixiangdou 怎么应用到飞书群", "huixiangdou", "茴香豆", "茴香豆 有哪些应用场景", "huixiangdou 有什么用", "huixiangdou 的优势有哪些?", "茴香豆 已经应用的场景", "huixiangdou 已经应用的场景", "huixiangdou 怎么安装", "茴香豆 怎么安装", "茴香豆 最新版本是什么", "茴香豆 支持哪些大模型", "茴香豆 支持哪些通讯软件", "config.ini 文件怎么配置", "remote_llm_model 可以填哪些模型?" ]
# 测试问询列表
cd /root/huixiangdou
echo '[
"huixiangdou 是什么?",
"你好,介绍下自己"
]' > ./test_queries.json
# 先下载语料——文件,放置于repodir
cd /root/huixiangdou && mkdir repodir
git clone https://github.com/internlm/huixiangdou --depth=1 repodir/huixiangdou
# 创建向量数据库存储目录
cd /root/huixiangdou && mkdir workdir
# 对repodir下的文件进行向量化——向量化知识语料、接受问题和拒绝问题中后保存到 workdir
# 也可以自定义相关的路径,详情见:huixiangdou.service.feature_store.py文件
python3 -m huixiangdou.service.feature_store --sample ./test_queries.json
一定要创建语料库,语料库的源文件放置在repodir里面。如果忘记创建这儿就会报错——文件不存在。workdir里面也都是空的/
# 填入问题
sed -i '74s/.*/ queries = ["huixiangdou 是什么?", "茴香豆怎么部署到微信群", "今天天气怎么样?"]/' /root/huixiangdou/huixiangdou/main.py
# 运行茴香豆
cd /root/huixiangdou/
python3 -m huixiangdou.main --standalone
# 填入问题
sed -i '74s/.*/ queries = ["huixiangdou 是什么?", "茴香豆怎么部署到微信群", "今天天气怎么样?"]/' /root/huixiangdou/huixiangdou/main.py
# 运行茴香豆
cd /root/huixiangdou/
python3 -m huixiangdou.main --standalone
步骤:调用lark_send_only
函数,在query中填入问题,query是List
的格式,这个函数的助手来源于worker class。过程如下:
运行single_judge进行打分——其提示模板调用的是SCORING_QUESTION_TEMPLTE
。
然后调用主题判断模板——TOPIC_TEMPLATE="告诉我这句话的主题,直接说主题不要解释:{}"
。
根据主题查文件,判断查到的内容和问题的关联度。
最后调用这个模板回答问题GENERATE_TEMPLATE='材料:“{}”\n 问题:“{}” \n 请仔细阅读参考材料回答问题。'
打分、判断主题、材料的关联度
茴香豆怎么部署到微信群
:1、安装依赖
# 依赖
pip install gradio==4.25.0 redis==5.0.3 flask==3.0.2 lark_oapi==1.2.4
2、启动服务
bash cd /root/huixiangdou python3 -m tests.test_query_gradio --work_dir /root/huixiangdou/workdir
3、映射到本地
bash ssh -CNg -L 7860:127.0.0.1:7860 root@ssh.intern-ai.org.cn -p <你的端口号>
4、更换语料:重新向量化文件
cd huixiangdou
python3 -m huixiangdou.service.feature_store --repo_dir " " --work_dir " "
python3 -m tests.test_query_gradio --work_dir <新向量数据库路径>
源码输出是text格式的,修改为markdown格式的
import argparse import json import time from multiprocessing import Process, Value import gradio as gr import pytoml from loguru import logger from huixiangdou.frontend import Lark from huixiangdou.service import ErrorCode, Worker, llm_serve def parse_args(): """Parse args.""" parser = argparse.ArgumentParser(description='Worker.') parser.add_argument('--work_dir', type=str, default='workdir', help='Working directory.') parser.add_argument( '--config_path', default='config.ini', type=str, help='Worker configuration path. Default value is config.ini') parser.add_argument('--standalone', action='store_true', default=True, help='Auto deploy required Hybrid LLM Service.') args = parser.parse_args() return args args = parse_args() def get_reply(query): assistant = Worker(work_dir=args.work_dir, config_path=args.config_path) code, reply, references = assistant.generate(query=query, history=[], groupname='') ret = dict() # ret['text'] = str(reply) # ret['code'] = int(code) # ret['references'] = references # return json.dumps(ret, indent=2, ensure_ascii=False) ret = f"""# text \n\n{str(reply)}\n\n# code \n\n{int(code)}\n\n# references \n\n{references}""" ret.format(reply=reply, code=code, references=references) return ret # start service if args.standalone is True: # hybrid llm serve server_ready = Value('i', 0) server_process = Process(target=llm_serve, args=(args.config_path, server_ready)) server_process.start() while True: if server_ready.value == 0: logger.info('waiting for server to be ready..') time.sleep(3) elif server_ready.value == 1: break else: logger.error('start local LLM server failed, quit.') raise Exception('local LLM path') logger.info('Hybrid LLM Server start.') with gr.Blocks() as demo: with gr.Row(): input_question = gr.Textbox(label='输入你的提问') with gr.Column(): # result = gr.Textbox(label='生成结果') result = gr.Markdown(label='生成结果') run_button = gr.Button() run_button.click(fn=get_reply, inputs=input_question, outputs=result) demo.launch(share=False, server_name='0.0.0.0', server_port=7860) # , debug=True)
测试结果如下图所示:
35s才得到结果。
这个回复比较快,可能是没过模型,直接判断为bad question
这就离谱了!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。