书生浦语第二期实战营学习笔记(作业)(第三节课)

书生浦语第二期实战营系列—综述加技术报告研读
书生浦语第二期实战营系列—Tutorial1:demo体验
书生浦语第二期实战营系列—Tutorial2:RAG
书生浦语第二期实战营系列—Tutorial3:Xtuner微调
书生浦语第二期实战营系列—Tutorial4:Lmdeploy量化部署
书生浦语第二期实战营系列—Tutorial5:Agent
书生浦语第二期实战营系列—Tutorial6:OpenCompass

1 RAG基础知识

1.1 RAG技术概述

如下图,RAG是检索用户提供的外部知识库,让LLM理解然后生成的一种技术
在这里插入图片描述

1.2 向量数据库

首先看下用户输入的向量数据库是怎么构建的,通过word2vec等成熟技术将上传的文本转化为向量,方便计算机存储和相似度检索
在这里插入图片描述

1.3 RAG工作原理和流程

1.3.1 RAG工作原理

如下图,主要可以概括为以下三个部分:
1.数据库生成
2.用户输入检索
3.整理数据库检索内容和一些特定的Prompt给LLM生成
在这里插入图片描述

1.3.2 RAG工作流程

下面是构建好的RAG使用的流程:用户的输入在向量数据库(知识库)中检索,具体的检索方式就是求相似度:
1.检索到的超过阈值的文本索引出来和prompt提供给LLM,给出回答;
2.未检索到的超过阈值的LLM根据输入和prompt给出回答;
在这里插入图片描述

1.4 RAG常见优化方法

上面RAG使用的流程中可以看到,RAG也面临许多问题,例如:本来知识库有的没检索出来 检索效率低等。下面介绍了一些常见的优化方法:

在这里插入图片描述

1.5 RAG or Fine-Tuning

1.5.1 RAG vs Fine-Tuning

下面列举了一些RAG和Fine-Tuning各自的优势和局限
在这里插入图片描述

1.5.2 RAG 和 Fine-Tuning怎么选

具体是选择RAG还是 Fine-Tuning需要根据我们的实际任务来:
1.需要让LLM具备更多的外部知识库的能力,选择RAG;
2.需要让LLM在执行具体任务是有更强的适应能力,选择 Fine-Tuning;
3.既要1又要2,可以选择RAG和Fine-Tuning;
4.既不那么要1,也不那么要2,可以选择Prompt Engineering;

在这里插入图片描述

1.6 RAG的评估

下面是对做好的RAG的一些评估手段
在这里插入图片描述

2 RAG应用-茴香豆

2.1 茴香豆的简介

在这里插入图片描述

2.2 茴香豆的构建流程

可以看到茴香豆不仅是一个应用,也是一套非常完善的Pipline,它包含了:
1.知识库构建
2.和前端交互
3.和后端交互
在这里插入图片描述

2.3 茴香豆工作流

下面是茴香豆的一个完整的工作流:
1.用户输入,用大模型给出输入的keyword;
2.对用户的输入进行理解并打分,是否拒答;
3.不拒答的,分别可以在外部知识库 网页 甚至知识图谱中进行检索;
4.对检索的结果给到LLM进行组织;
5.对LLM的输出进行安全检查,确保安全合规;
在这里插入图片描述

2.4 线上茴香豆助手试用

2.4.1 创建知识库

点击链接:https://openxlab.org.cn/apps/detail/tpoisonooo/huixiangdou-web
创建并上传个人知识库,这里找了些猫相关的知识,做成文档
在这里插入图片描述
上传个人知识库
请添加图片描述

2.4.2 试用茴香豆 Web 版(基础作业1)

上传好后就可以和豆哥对话,5轮 截图为证
在这里插入图片描述
在这里插入图片描述

2.5 在 InternLM Studio 上部署茴香豆技术助手

2.5.1 安装依赖

激活之前已经安装好的环境,安装一些可能会缺的包

conda activate internlm
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

2.5.2 下载代码

下载茴香豆的源代码,运行后会发现缺少词向量和LLM模型

git clone https://github.com/internlm/huixiangdou && cd huixiangdou
git checkout 447c6f7e68a1657fce1c4f7c740ea1700bde0440

2.5.3 下载词向量包和LLM模型

容器内已经帮我们下载好了,加个软连接吧

# 创建模型文件夹
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

2.5.4 修改配置文件

这里修改了下config.ini的6、7、 29行
在这里插入图片描述

2.5.5 搭建知识库

2.5.5.1 添加语料库

这里采用huixiangdou自己的github文档作为检索语料

cd /root/codes/huixiangdou && mkdir repodir
git clone https://github.com/internlm/huixiangdou --depth=1 repodir/huixiangdou
2.5.5.2 修改接受和拒答列表

茴香豆非常人性化给知识助手添加了接受和拒答的列表,用于表示希望知识助手回答和拒绝闲聊的问题列表
将后面作业用到的【 茴香豆怎么部署到微信群 】写到good_questions.json防止助手拒答
在这里插入图片描述
创建一个测试用的问询列表,测试拒答流程是否起效

cd /root/huixiangdou
echo '[
"huixiangdou 是什么?",
"你好,介绍下自己"
]' > ./test_queries.json
2.5.5.3 创建检索向量数据库
# 创建向量数据库存储目录
cd /root/codes/huixiangdou && mkdir workdir 
# 分别向量化知识语料、接受问题和拒绝问题中后保存到 workdir
python3 -m huixiangdou.service.feature_store --sample ./test_queries.json

2.5.6 运行茴香豆知识助手(基础作业2)

修改/root/codes/huixiangdou/huixiangdou/main.py 74 为作业需求的 【 茴香豆怎么部署到微信群 】实际上是【 你好, 茴香豆怎么部署到微信群 】,能给出较好的结果,提问的方式影响挺大的,看来提问得有礼貌。。。
在这里插入图片描述

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

茴香豆回答如下,截图为证
在这里插入图片描述

2.6 将茴香豆部署到微信群(进阶作业A)

2.6.1 创建知识库

这里使用2.4.1相同的知识库

2.6.2 编译茴香豆的安卓app

目前用的微信版本为最新的8.0.48,预编译的apk支持8.0.47,使用预编译的版本,豆哥无动于衷
需要把最新huixiangdou仓库里面的代码,按官方的提示填上8.0.48,重新编译茴香豆的安卓app,安装在安卓设备上
地址:https://github.com/InternLM/HuixiangDou/tree/main/android
请添加图片描述

2.6.3 点击部署到微信,复制回调地址

请添加图片描述

2.6.4 设置的茴香豆app

把2.6.3复制的回调链接拷贝到安卓app里面,按【点我】将茴香豆扫描屏幕的权限打开
请添加图片描述

2.6.5 运行效果

保持茴香豆后台运行,让群聊的小伙伴发问,等了一会,豆哥开始工作了,回答得挺到位,截图为证(这个截图是上图打开调试模式的时候回复的)
在这里插入图片描述

3 langChain搭建RAG

这是之前熟悉的langChain搭建RAG的知识,作为笔记将它记录在此

3.1 langChain环境配置

pip install langchain==0.0.292
pip install gradio==4.4.0
pip install chromadb==0.4.15
pip install sentence-transformers==2.2.2
pip install unstructured==0.10.30
pip install markdown==3.3.7

3.2 资源下载

3.2.1 词向量模型下载

Embedding的时候需要词向量模型

pip install -U huggingface_hub

建立Python文件

import os

# 下载模型
os.system('huggingface-cli download --resume-download sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 --local-dir /root/data/model/sentence-transformer')

--resume-download:断点续下;
--local-dir:本地存储绝对路径

上面有可能会出现,,需要使用HF的镜像

Terminal中输入
export HF_ENDPOINT=https://hf-mirror.com
python down.py

3.2.2 下载 NLTK 相关资源

构建词向量的时候需要数据资源,这里同样使用国内的镜像仓库

git clone https://gitee.com/yzy0612/nltk_data.git  --branch gh-pages
cd nltk_data
mv packages/*  ./
cd tokenizers
unzip punkt.zip
cd ../taggers
unzip averaged_perceptron_tagger.zip

因为后面还会遇到nltk_data数据加载的问题,nltk_data默认的地方找不到数据,可以在其中一个位置做上软连接

ln -s xxx/nltk_data /home/xxx/nltk_data

第一个xxx为上面clone的位置
第二个xxx为当前用户的名字

3.2.3 下载 项目代码

git clone https://github.com/InternLM/tutorial

3.3 构建知识库

这里用InternLM相关的工具开源仓库作为知识库

# clone 上述开源仓库
git clone https://gitee.com/open-compass/opencompass.git
git clone https://gitee.com/InternLM/lmdeploy.git
git clone https://gitee.com/InternLM/xtuner.git
git clone https://gitee.com/InternLM/InternLM-XComposer.git
git clone https://gitee.com/InternLM/lagent.git
git clone https://gitee.com/InternLM/InternLM.git

#代码修改
tutorial/langchain/demo/create_db.py
44行

code_root = xxx
# 目标文件夹
tar_dir = [
    code_root+"/InternLM",
    code_root+"/InternLM-XComposer",
    code_root+"/lagent",
    code_root+"/lmdeploy",
    code_root+"/opencompass",
    code_root+"/xtuner"
]

66行

# 加载开源词向量模型
embeddings = HuggingFaceEmbeddings(model_name="xxx/sentence-transformer")

运行脚本

python tutorial/langchain/demo/create_db.py 

3.4 运行效果

修改代码xxx/tutorial/langchain/demo/run_gradio.py

def load_chain():
    # 加载问答链
    # 定义 Embeddings
    embeddings = HuggingFaceEmbeddings(model_name="xxx/sentence-transformer")

    # 向量数据库持久化路径
    persist_directory = 'xxx/tutorial/langchain/data_base/vector_db/chroma'

    # 加载数据库
    vectordb = Chroma(
        persist_directory=persist_directory,  # 允许我们将persist_directory目录保存到磁盘上
        embedding_function=embeddings
    )

    llm = InternLM_LLM(model_path = "xxx/internlm2-chat-7b/")

    # 你可以修改这里的 prompt template 来试试不同的问答效果
    template = """请使用以下提供的上下文来回答用户的问题。如果无法从上下文中得到答案,请回答你不知道,并总是使用中文回答。
    提供的上下文:
    ···
    {context}
    ···
    用户的问题: {question}
    你给的回答:"""

    QA_CHAIN_PROMPT = PromptTemplate(input_variables=["context","question"],
                                    template=template)

    # 运行 chain
    from langchain.chains import RetrievalQA

    qa_chain = RetrievalQA.from_chain_type(llm,
                                        retriever=vectordb.as_retriever(),
                                        return_source_documents=True,
                                        chain_type_kwargs={"prompt":QA_CHAIN_PROMPT})
    
    return qa_chain
python tutorial/langchain/demo/run_gradio.py

问些知识库里面的东西,效果如下:
请添加图片描述

参考链接:https://github.com/InternLM/Tutorial/blob/camp2/huixiangdou/readme.md
https://github.com/InternLM/Tutorial/blob/main/langchain/readme.md

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值