基于知识库+ChatGPT搭建问答机器人

xinqiu/bot.py

基于embedding和ChatGPT的文档检索原理介绍 - 宝玉

基于垂直行业知识库和ChatGPT搭建行业问答机器人的技术架构

目前建立自己的知识库问答机器人,流行的做法有两种:

  1. 一种是利用文本 embedding 的相似度搜索,构建出context,利用zero/few shot learning的方式让LLM进行Q&A;
  2. 一种是使用私有数据集进行finetune,从而得到理解私有数据的LLM专属模型。

向量相似度搜索 + chatgpt重排序

一种是 m.okjike.com 利用文本embedding 的相似度搜索,构建出context,利用zero/few shot learning的方式让LLM进行Q&A.

image.png

整体流程:

  1. 将垂直行业的领域知识向量化,并存入向量数据库
  2. 用户提问向量化
  3. 查询向量数据库,得到TopN条匹配知识
  4. 构建Prompt,调用OpenAI API实现精排
  5. 返回回答

1、Embeddgings model选择

要将领域知识向量化,需要有Embeddings model,最简单的方案是使用OpenAI的Embeddings API(模型选用的是 text-embedding-ada-002)。更多embedding 模型的内容请参考 what-are-embeddings
由于OpenAI的Embeddings model是通用模型,对垂直行业并不是最适合的,会出现回答不准确的情况。如果数据量较大,需要反复调用Embeddgins API,效率较低、成本较高。

可以考虑自己基于知识库自训练或基于一些现成finetuned的模型,HuggingFace上有很多Embeddings model可供参考使用。

  1. 直接使用现成finetune模型:Chinese-LLaMA-AlpacaChinese-Vicuna
  2. 基于知识库自训练Embedding模型,主要基于 https://github.com/tatsu-lab/stanford_alpaca… 及一系列产物,比如 alpaca.cppalpaca-loraFastChatgpt4all 等。这些都是利用GPT3.5/GPT4作为数据打标师,从而一方面调优Meta的LLaMA,另一方面顺着这样的思路也能进行私有数据的finetune

上述两种做法对比:

  1. 做法一由于没有 fine-tune,所以成本就只有每次问答的成本,但由于大部分时候需要带大量的 prompts,其实隐性的成本是挺高的,我们经常可以看到一个简短的问题会带有上千个字符的 prompts。
  2. 而做法二 fine-tune 模型的训练成本是较高的,但一旦获得专属模型后,后续的聊天中就不再需要做预检索和背景知识的 prompts 了,可以直接进行关于该领域的知识问答。不仅 token 消耗会变小,而且速度也会更快。

2、向量数据库选择

向量数据库在相似文本搜索、个性化推荐、相似图片搜索等都有很好的应用场景。如果你数据不大,存成csv文件,然后加载到内存,借助内存搜索就 OK 了。但如果数据比较多时,就需要借助向量数据库来进行搜索。

开源的向量数据库有qdrant,weaviate,milvus,elasticsearch等,推荐qdrant。

3、LLM框架

LangChain及LlamaIndex (原_GPT Index_) 这样的LLM框架,封装了很多LLM的工具,可以极大程度提升与LLM的集成效率。

LlamaIndex (原GPT Index) 入门门槛更低,入门文档也写得比较详尽。LangChain更为强大灵活,qdrant对LangChain的集成更好。二者的比较可以参考 https://news.ycombinator.com/item?id=34568343

选用Langchain的话,可以按照文档https://python.langchain.com/en/latest/use_cases/question_answering.html…,从文本Embedding->存储VectorDB->Similarity Search->Q&A with Context。

4、调用OpenAI,构建的Prompt模板

为了能够借助 ChatGPT 优化回答内容的整体结构,需要精心构造 prompt上下文。

System:你是一个 XXX 的机器人,请使用下面提供的文本尽可能如实地回答问题,如果答案未包含在下面的文本中,请说“我不知道”

Context:向量数据库搜索结果的 TopN 知识的拼接
Q:用户提问

GPT3.5之后的接口支持指定role,可以将相关系统角色的prompt放在“system”中,CONTEXT 和 USER QUESTION 放到“user”中;

1
2
3
4
5
{"role": "system", "content": "You are a helpful assistant."}
{"role": "user", "content": "Who won the world series in 2020?"}
# assistant用来存储先前的回复。这是为了持续对话,提供会话的上下文。
{"role": "assistant", "content": "The Los Angeles Dodgers."}
{"role": "user", "content": "Where was it played?"}


基于知识库+ChatGPT搭建问答机器人
http://example.com/2023/04/06/2023-04-06-基于知识库+ChatGPT搭建问答机器人/
作者
Ning Shixian
发布于
2023年4月6日
许可协议