之前对一件事很好奇,为什么去年训练的大模型可以回答今天的新闻内容。答案是使用了知识扩展系统。基本原理是把参考答案和问题一同提给大模型,给他充分的参考信息做回复编辑。
本文教你完成离线版本的智能问答系统搭建。
最近在疯狂找下家,本人精通图形渲染和ai,求捞啊!
基本架构图
讲一下基本运行流程:
- 人工准备数据
- 转为嵌入向量
- 存入数据库并生成索引
用户提问流程: - 用户输入问题
- 在索引数据库中查询匹配度较高的文本片段
- 如果存在就取出作为参考语料的一部分传入大模型
- 如果不存在就搜索在线引擎数据,取排名前N个文章作为参考
- 大模型输出结果
- 用户评价准确度并做语料参考记录
本文没有把所有环节都贴出来,仅实现了扩展参考信息的智能回复能力, 最近在忙着找工作没时间,细节和缺失环节慢慢补全,有问题请直接留言。
一 环境部署
技术栈采用ollama index + llama3.1 + flask
首先下载项目文件,安装关键组件
1.1 LLama3.1 大模型部署
首先需要部署llama3.1大模型,让我们具备基础的互动问答能力,详细步骤可以查看下面这篇文章。请完成部署并确保大模型可以无障碍运行。
添加链接描述
1.2 LLamaIndex部署
部署RAG框架。新建一个requirement.txt填写下列内容,并使用pip install -r requirement.txt来安装
自己安装会有很多版本兼容问题,尽量用我这个安装
hpack==4.0.0
html2text==2024.2.26
htmldate==1.8.1
httpcore==1.0.5
httpx==0.27.0
huggingface-hub==0.23.2
humanfriendly==10.0
hyperframe==6.0.1
llama-cloud==0.0.15
llama-hub==0.0.79.post1
llama-index==0.11.0
llama-index-agent-openai==0.3.0
llama-index-cli==0.3.0
llama-index-core==0.11.0.post1
llama-index-embeddings-fastembed==0.2.0
llama-index-embeddings-openai==0.2.2
llama-index-indices-managed-llama-cloud==0.3.0
llama-index-legacy==0.9.48.post3
llama-index-llms-huggingface==0.3.1
llama-index-llms-ollama==0.3.0
llama-index-llms-openai==0.2.0
llama-index-multi-modal-llms-openai==0.2.0
llama-index-program-openai==0.2.0
llama-index-question-gen-openai==0.2.0
llama-index-readers-file==0.2.0
llama-index-readers-llama-parse==0.2.0
llama-index-readers-web==0.2.0
llama-index-vector-stores-qdrant==0.3.0
llama-parse==0.5.0
ollama==0.3.2
onnx==1.16.2
onnxruntime==1.19.0
pep8==1.7.1
pillow==10.4.0
ply==3.11
portalocker==2.8.2
proglog==0.1.10
protobuf==5.27.3
pyaml==23.12.0
pyasn1-modules==0.2.8
pycocotools==2.0.7
pydantic==2.8.2
pydantic_core==2.20.1
pypdf==4.3.1
termcolor==2.4.0
terminaltables==3.1.10
text-generation==0.7.0
tiktoken==0.7.0
tinysegmenter==0.3
tld==0.13
tokenizers==0.19.1
torch==2.4.0
torchvision==0.19.0
transformers==4.44.2
trafilatura==1.12.1
docx2txt
1.3 部署ES向量数据(这步可以先跳过)
向量数据库用于存储索引index,帮助我们异步保存数据,ES数据库的部署和初阶使用可以看下面这篇文章,完成部署并启动数据库
https://blog.csdn.net/lengyoumo/article/details/141860801
二 功能实现
2.1 先实现一个可以加载网络文章的问答系统
新建个脚本 main.py 。把下面这一坨塞进去
from llama_index.embeddings.fastembed import FastEmbedEmbedding
from llama_index.core import Settings
from llama_index.llms.ollama import Ollama
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from llama_index.llms.huggingface import HuggingFaceLLM
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.readers.web import TrafilaturaWebReader
from llama_index.readers.file import docs
from llama_index.core.node_parser import SimpleFileNodeParser
from llama_index.readers.file import FlatReader
from pathlib import Path
# 加载本地模型 “ll3.1_cn” 是我们在ollama大模型部署时设置的大模型别名
llm = Ollama(model="ll3.1_cn", request_timeout=360.0)
Settings.llm = llm
Settings.chunk_size = 512
# 加载内嵌模型 此处的目的是将文字向量化,不同语言不同精度需要不同的模型,本文仅用bge-small-en-v1.5举例
model = AutoModel.from_pretrained("BAAI/bge-small-zh-v1.5")
#下载分词器
#tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-small-zh-v1.5")
# 设置网络文档数据
webs_addrs = [
"https://baijiahao.baidu.com/s?id=1808603340810616842&wfr=spider&for=pc", # 已婚员工与恋人办公室接吻被举报开除
"https://baijiahao.baidu.com/s?id=1808607421636901154&wfr=spider&for=pc",