书生浦语第二期实战营——第三课_RAG智能助理


【相关链接】

视频地址:https://www.bilibili.com/video/BV1QA4m1F7t4/

文档地址:https://github.com/InternLM/Tutorial/blob/camp2/huixiangdou/readme.md

正文内容包含:RAG 基础介绍、茴香豆产品简介、以及茴香豆RAG知识库实战。

1 课程笔记

1.1 RAG 基础介绍

主要涉及原理、架构、与微调的对比、向量数据库、评估测试等

Q:什么是RAG技术?

GPT-3.5:RAG技术是一种用于生成自然语言文本的技术,它结合了Retriever、Attentive Reader和Generative model三种模块的方法。这三个模块分别负责不同的任务:

1. Retriever(检索器):这个模块负责从大量的文本数据中检索相关信息。它可以根据输入的问题或主题,在预先准备好的文本数据集中找到相关的文本片段或信息。

2. Attentive Reader(注意力读者):这个模块负责理解检索到的文本内容。它通过注意力机制(attention mechanism)来聚焦于关键信息,以便更好地理解文本内容。

3. Generative model(生成模型):这个模块负责生成最终的自然语言文本。它基于检索到的信息和理解的内容,生成符合要求的文本输出,可以是回答问题、解释概念或完成其他任务。

RAG技术的优势在于结合了检索和生成的优点,可以更准确地生成复杂的自然语言文本,并且在处理开放领域的问答和对话任务时表现出色。

(1)背景

    模型具有延后性,训练的时候没有语料,知识是过时的,会生成幻觉(胡说八道,就像考试时题目不会写,但是也写满了),解决问题的方法有重新搜集语料进行微调,但是工程量大,而RAG技术就能快速的增强模型的性能,提供准确的回答、降低成本、实现外部记忆,解决知识密集型任务的挑战(如:QA问答)。

(2)原理

    RAG(Retrieval Augmented Generation),检索增强生成技术,在通过利用外部知识库来增强大预言模型的性能

R:Retrieval

A:Augmented

G:Generation

顾名思义,该技术涉及检索(与用户相关的信息片段)、生成(回答),应用于问答系统、文本生成、信息检索、图片描述。

个人看法:在实际应用中似乎不区分问答系统、文本生成、信息检索,一般会混在一块用。问答系统在你输入数据后,进行数据的检索获取向量,然后提取知识的片段,将这个片段的知识加入到query中,进行问答,该过程会生成文本。逻辑上感觉没毛病,如果硬说不一样可能是,可能问答系统的输入是波音747的参数是多少?,而文本查找的输入query的输入是波音747的参数,但是问答系统用这种提问方式也是可行的。

在这里插入图片描述
在这里插入图片描述

工作原理图

    上面这张图很清晰的表达出RAG技术中需要的模块,以及各个模块之间的联系。

(3)流程

在这里插入图片描述

RAG流程图

    上面这张图所传达出的流程涉及三个大的步骤:

  1. 提问——>检索模块
  2. 检索模块:问题向量化——>embedings, 在向量数据库中进行搜索,获得相似性最高的几个片段(chunk)
  3. 问题和检索的结果(相似性最高的几个模块)输入给生成模块(变成提示词——{原始的问题}\n基于以下信息回答问题:\n{chunk1}\n{chunk2}\n{chunk3}

答案的信息来源于数据库,更新数据库就可以保持模型的时效性。

架构
三种范式:
在这里插入图片描述

三种RAG范式结构图

图来源于《Retrieval-Augmented-Generation for Large Language Models: A Surver》

  • Naive RAG
    • 比较基础,只有检索、索引、生成
    • 应用于简单的问答系统、信息检索
  • Advance RAG
    • 对检索前后进行了增强。检索之前,对用户的问题进行路由、扩展、重写等;对检索到的信息进行重排序,总结、融合处理。
    • 应用于摘要生成,内容推荐。
  • Modular RAG
    • 将基础部分和后续优化部分模块化,可以定制。
    • 应用于多模态任务,对话系统。

优化方法
在这里插入图片描述

  1. 嵌入式优化(质量优化)
    I. 结合稀疏编码器和密集检索器
    II. 多任务

  2. 索引优化(质量优化)

    • 细粒度分割数据(chunk)
    • 元数据
  3. 查询优化(查询优化,让查询的任务更清晰的角度出发)RAG范式2

    1. 查询扩展和转换
    2. 多查询
  4. 上下文管理(减少检索信息,提高效率)RAG范式2

    • 重排(rerank)
    • 上下文选择/压缩
  5. 迭代检索(检索优化):根据初始查询和迄今为止生成的文本进行重复搜索。

  6. 递归检索(检索优化):迭代细化搜索查询、**链式推理(Chain-of-Thought)**指导检索过程,并范式检索结果,细化过程。

  7. 自适应检索(检索优化):Flare\self-RAG,使用LLMs主动决定检索的最佳时机和内容。

  8. 微调:检索微调、生成微调、双重微调

在这里插入图片描述
对比

在这里插入图片描述

(4)向量数据库

储存外部数据库

在这里插入图片描述

向量数据库

数学知识:(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 ab=a1b1+a2b2++anbn 另外,两个向量的点乘还可以表示为它们的模长(长度)乘积与它们夹角的余弦值的乘积: a ⋅ b = ∣ a ∣ ⋅ ∣ b ∣ ⋅ cos ⁡ ( θ ) \mathbf{a} \cdot \mathbf{b} = |\mathbf{a}| \cdot |\mathbf{b}| \cdot \cos(\theta) ab=abcos(θ),在这里 ∣ a ∣ |\mathbf{a}| a ∣ b ∣ |\mathbf{b}| b 分别表示向量 a \mathbf{a} a b \mathbf{b} b 的模长(长度), θ \theta θ 表示两个向量之间的夹角。

具体来说:

  • 当点乘相似度为正数时,表示两个向量的方向基本相似,它们在同一方向上的分量较多
  • 当点乘相似度为负数时,表示两个向量的方向基本相反,它们在相反方向上的分量较多。
  • 当点乘相似度为0时,表示两个向量在垂直方向上的分量相等,即它们是正交的,没有共享方向。

因此,点乘相似度的值可以用来判断两个向量在同一方向上的相似程度,或者在相反方向上的相似程度,以及它们是否正交或不相关。

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(θ)=abab
其中, 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则表示两个向量的方向基本上是正交的或者完全不相关。

在这里插入图片描述

1.2 茴香豆产品简介

介绍、特点、架构、构建的步骤

简介

在这里插入图片描述

关键点:自动化问答支持为即时通讯的群聊场景提供问答服务(那就有点像电脑管家的加速球,要的时候点一下就能用?而在聊天软件对话场景,如微信、issue问题回复、钉钉群聊里面的机器人、模型得不断对本地上传的数据进行分类,识别问题,如果是问题再通过RAG技术进行检索生成)、检索增强应用。

商用和本地部署很重要

豆哥的组成

数据、前后端的结合,模型支持书生浦语、千问等

在这里插入图片描述豆哥怎么干活的?
在这里插入图片描述

茴香豆工作流

上图中,左边有三个工作流:预处理-拒答-应答

右边,根据预处理得到的问询,在向量库中计算得分,选择是否继续问答。(主要是为了适用于不用的应用场景,但是会不会很多问题直接都拒答了,为什么要判断是话痨还是专家,在实际应用中需要的返回的值)

拒答流程识别是不是问题, 如下图,由于不是问题,拒绝回答,知识提供子完成介绍:
在这里插入图片描述
在这里插入图片描述
支持:本地、网络和知识图谱(基本能解决项目中的问题)

2 实践

2.1 配置

30% x A100

开发机

  1. 开启开发机器——Cuda11.7-conda 镜像
  2. 命令行的一系列操作:
studio-conda -o internlm-base -t InternLM2_Huixiangdou  # 等效于创建环境 激活环境 安装torch
conda activate InternLM2_Huixiangdou 

模型

  1. 下载基础文件:

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. 处模型地址需要修改,分别是:

(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"

2.2 创建知识库

(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
    • 其中多为技术无关的主题或闲聊
    • 如:“nihui 是谁”, “具体在哪些位置进行修改?”, “你是谁?”, “1+1”

(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 生成答案。

2.3 测试运行

# 填入问题
sed -i '74s/.*/    queries = ["huixiangdou 是什么?", "茴香豆怎么部署到微信群", "今天天气怎么样?"]/' /root/huixiangdou/huixiangdou/main.py

# 运行茴香豆
cd /root/huixiangdou/
python3 -m huixiangdou.main --standalone

3 作业

3.1 基础1——web版本部署

在自己的服务器部署茴香豆 Web 版——创建自己领域的知识问答助手
视频参考:https://www.bilibili.com/video/BV1S2421N7mn
github参考:https://github.com/InternLM/HuixiangDou/tree/main/web

  • 启动web服务版本 主要是fastapi+radis相关。这个radis涉及知识盲区。

3.2 基础2 ——在 InternLM Studio 上部署茴香豆技术助手

根据教程文档搭建 茴香豆技术助手,针对问题"茴香豆怎么部署到微信群?"进行提问

(1)开发端设置

创建开发机 ——> vs codessh连结开发机

注意:

  • 开发机配置cuda11.7的版本、使用30%的资源配置。

  • vscode ssh远程链接:点击vscode左下角的远程链接(安装remote-ssh插件),将开发机的ssh粘贴即可。

在这里插入图片描述

(2) 环境配置

  • 创建虚拟环境,并激活。创建后一定要激活环境!!!

    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
    

(3) 修改配置文件

  • 模型的软链接:三个模型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
    

(4) 构建向量库

# 先下载语料——文件,放置于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里面也都是空的/

(5)运行代码,进行问询:

  # 填入问题
  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。过程如下:

  1. 运行single_judge进行打分——其提示模板调用的是SCORING_QUESTION_TEMPLTE

  2. 然后调用主题判断模板——TOPIC_TEMPLATE="告诉我这句话的主题,直接说主题不要解释:{}"

  3. 根据主题查文件,判断查到的内容和问题的关联度。

  4. 最后调用这个模板回答问题GENERATE_TEMPLATE='材料:“{}”\n 问题:“{}” \n 请仔细阅读参考材料回答问题。'

    打分、判断主题、材料的关联度

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

  • 提问茴香豆怎么部署到微信群
    在这里插入图片描述

(6)gradio服务

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

在这里插入图片描述

在这里插入图片描述

这就离谱了!!!

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值