大模型RAG实现智能知识库,仅几十行代码(openai接口+faiss)

检索增强生成 (RAG) 是一种使用来自私有或专有数据源的信息来辅助文本生成的技术。它将检索模型(设计用于搜索大型数据集或知识库)和生成模型(例如大型语言模型 (LLM),此类模型会使用检索到的信息生成可供阅读的文本回复)结合在一起。
RAG的主要使用场景,就是基于自有知识库的大模型。本文通过python来实现最简答的一个rag搜索

实现思路

  1. 对知识库进行分段
  2. 对分段后的内容进行Embedding向量计算,并存入faiss数据库
  3. 对搜索的问题进行Embedding向量计算
  4. 查询近似度topN的段落
  5. 把topN段落和问题一起发给gpt
  6. 得到基于知识库的一个回答

faiss数据库

faiss是一个用于向量搜索的向量数据库,可以基于内存和cpu来运行,python只需要几行代码就能实现数据的存储和搜索,具体的用法或者深入的学习可以自行百度一下

代码实现

话不多说直接上代码,我不会写python,基本都是chatgpt写的,代码丑陋但是能跑。
引入依赖

import faiss
import numpy as np
from openai import OpenAI

定义一个分割函数,用来分割大段落成小段落的,这里随便分的,就5句话分成一段,也可以根据实际需要或者用一些比较好的库去进行分段

def split_string(x: str) -> list:
  punctuation = [',', '.']
  segments = []
  current = []
  count = 0
  for char in x:
    current.append(char)
    if char in punctuation:
      count += 1
      if count == 5:
        segments.append(''.join(current).strip())
        current = []
        count = 0

  if current:
    segments.append(''.join(current).strip())

  return segments

定义一个embedding函数,这里用openai的模型api直接调用

def getEmbeddings(x: str, client: OpenAI):
  response = client.embeddings.create(
    input=x,
    model="text-embedding-3-small"
  )
  return response.data[0].embedding

定义搜索方法,这里就是搜索和问题最相关的topk个段落。这里写成一次性方法,如果是会一直提问,分好的段落就不用重复embedding和插入数据库了

def get_similar_documents(client: OpenAI, query: str, documents: list,
    top_k: int = 5) -> list:
  queryEmbedding = getEmbeddings(query, client)
  queryEmbedding = np.array(queryEmbedding).reshape(1, -1)
  docEmbeddings = np.array([getEmbeddings(i, client) for i in documents])
  index = faiss.IndexFlatL2(docEmbeddings.shape[1])
  index.add(docEmbeddings)
  distances, indices = index.search(queryEmbedding, top_k)
  doc = []
  for i in indices[0]:
    doc.append(documents[i])
  return doc

下面是主程序

client = OpenAI(api_key="sk-xxxxx",base_url="https://xxx.xxx.xxx")
prompt = "你是一个智能问答机器人,以下是你的知识库内容:"
doc_text = ["xxxxxxxxxxxxxxxxxxxxx","xxxxxxxxxxxxxxxxxx","xxxxxxxxxxxxxxxxx"]
query = input("输入你想问的问题")          
doc = get_similar_documents(client,query, doc_text,10)
response = client.chat.completions.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "system", "content": prompt +('\n'.join(doc))},
    {"role": "user", "content": query}
  ]
)
print(response.choices[0].message.content)    

至此,你就实现了一个基于私有知识库的大模型智能问答了。里面的提示词都是随便写的,如果正式使用的话,话术肯定是需要调整一下,然后数据最好是持久化多次重复使用。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
模型+RAG(Retrieval-Augmented Generation)是一种结合了检索和生成的方法,用于实现数据采集。具体步骤如下: 1. 数据收集:首先需要收集大量的原始数据,可以是文本、图像、音频等形式的数据。这些数据可以从互联网、数据库、文档等多个渠道获取。 2. 数据预处理:对收集到的原始数据进预处理,包括数据清洗、去重、标注等操作。这一步骤旨在提高数据的质量和准确性,为后续的模型训练做准备。 3. 模型训练:使用大模型训练,可以选择使用预训练的语言模型(如GPT)或自定义的模型。在训练过程中,可以采用生成式对抗网络(GAN)等方法来增强模型的生成能力。 4. 检索模块构建:为了提高生成结果的准确性和相关性,需要构建一个检索模块。该模块可以使用传统的信息检索技术,如倒排索引、向量检索等,也可以使用深度学习方法,如BERT、Dense Retrieval等。 5. 数据采集:利用构建好的检索模块,对用户提出的问题或需求进检索,获取与之相关的数据。可以根据检索结果的相关性进排序,选择最相关的数据进生成。 6. 数据生成:基于检索到的数据,使用大模型生成。可以采用生成式模型,根据检索到的数据进文本、图像等内容的生成。生成的结果可以根据需求进进一步的处理和优化。 7. 结果评估:对生成的结果进评估,可以使用人工评估或自动评估的方式。评估指标可以包括生成结果的准确性、流畅性、相关性等。 8. 迭代优化:根据评估结果,对模型和检索模块进优化和调整。可以通过增加训练数据、调整模型参数、改进检索算法等方式来提升系统的性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值