大模型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)    

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

<think>好的,用户想知道如何在本地搭建RAG系统。首先,我需要回忆一下RAG的基本概念。根据引用[2],RAG是检索增强生成,结合检索和生成模型。用户需要具体的步骤,所以得分解搭建流程。 接下来,参考现有的资料。引用[1]提到本地运行所有组件,包括嵌入模型、向量数据库和LLM。可能需要先准备这些组件。然后引用[3]提到从环境安装到案例实现的步骤,比如Python环境、LangChain、Ollama等。 用户可能需要详细的步骤,比如安装依赖、加载文档、处理文本、向量数据库的选择,比如FAISS。然后设置检索和生成部分,用LangChain整合。还要考虑本地运行大模型,如使用Ollama运行LLaMA,这样避免依赖外部API。 还要注意示例代码的正确性,比如用LangChain的文档加载器和文本分割器。可能还需要提到调优和扩展,比如多源数据或缓存机制,这些在引用里都有提到。 需要确保回答结构清晰,分步骤说明,同时推荐相关资源,比如官方文档和视频指南。最后生成相关问题,帮助用户深入理解,比如本地运行的优缺点或调优方法。</think>### 本地RAG系统搭建分步指南 #### 一、核心组件准备 1. **嵌入模型**:本地运行如$text-embedding-3-small$模型,用于文本向量化[^2] 2. **向量数据库**:推荐FAISS(Facebook AI Similarity Search),支持离线运行 3. **大语言模型**:通过Ollama部署本地LLM(如LLaMA 2-7B)[^1] #### 二、环境搭建流程 ```python # 安装基础依赖 pip install langchain faiss-cpu sentence-transformers ollama ``` #### 三、核心代码实现 ```python from langchain.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS # 文档处理 loader = TextLoader("知识库.txt") documents = loader.load() text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) docs = text_splitter.split_documents(documents) # 向量存储 embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2") db = FAISS.from_documents(docs, embeddings) # 检索增强生成 from langchain.chains import RetrievalQA from langchain.llms import Ollama llm = Ollama(model="llama2") qa_chain = RetrievalQA.from_chain_type(llm, retriever=db.as_retriever()) print(qa_chain.run("如何提升模型推理速度?")) ``` #### 四、调优与扩展 1. 多源数据支持:支持PDF/HTML/Markdown格式文档 2. 混合检索策略:结合关键词与语义搜索 3. 缓存机制:对高频问题建立响应缓存[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值