logo
3

基于千帆LangChain+Pinecone的知识问答

前言

在前面的文档当中,我介绍了使用千帆sdk+langchain+本地向量数据库chroma实现RAG检索增强的方案。具体可以参考以下两篇文档:
这套方案当中,我们大模型服务用的是公有云ERNIE-Bot大模型服务,而向量数据库则使用的是本地向量数据库Chroma。用户需要本地安装、维护向量数据库。
那么是否也有云化的向量数据库,我们基于云端的大模型服务+云端的向量数据库实现RAG检索增强。答案是有的,本文我们介绍使用千帆sdk+langchain+云端向量数据库Pinecone的方案。

Demo物料

notebook文件点击此处下载:qianfan_pinecone_qa_demo.zip

操作指南

0、安装依赖包

  
  
%pip install -U pinecone-client qianfan tiktoken langchain pymupdf -i https://pypi.tuna.tsinghua.edu.cn/simple/

1、加载环境变量

新建一个env的文件,然后填写如下内容:
  
  
PINECONE_API_KEY="your PINECONE_API_KEY"
QIANFAN_AK="your QIANFAN_AK"
QIANFAN_SK="your QIANFAN_SK"
通过配置文件加载环境变量
  
  
import os
from dotenv import load_dotenv
load_dotenv(dotenv_path = "env",override = True)

2、pinecone初始化

初始化pinecone,并创建pinecone索引(index)
  
  
import pinecone
from tqdm.autonotebook import tqdm
PINECONE_API_KEY = os.getenv("PINECONE_API_KEY")
# PINECONE免费用户的默认ENV都是"gcp-starter"
PINECONE_ENV = "gcp-starter"
pinecone.init(
api_key=PINECONE_API_KEY,
environment=PINECONE_ENV
)
index_name = "qianfan-vdb"
if index_name not in pinecone.list_indexes():
# we create a new index
pinecone.create_index(
name=index_name,
metric='euclidean',
dimension=384, # 千帆Embedding-V1向量模型是384维,所以这里设置成384
)

3、千帆SDK初始化鉴权

  
  
import os
QIANFAN_AK=os.getenv("QIANFAN_AK")
QIANFAN_SK=os.getenv("QIANFAN_SK")
os.environ["QIANFAN_AK"] = QIANFAN_AK
os.environ["QIANFAN_SK"] = QIANFAN_SK

4、文件切片并保存至向量数据库

  
  
from langchain.document_loaders import PyMuPDFLoader
loader = PyMuPDFLoader("./example_data/ai-paper.pdf")
documents = loader.load()

5、切片

初始化vectorstore,使用PyMuPDFLoader加载PDF文件
  
  
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=384, chunk_overlap=0, separators=["\n\n", "\n", " ", "", "。", ","])
docs_spilts = text_splitter.split_documents(documents)
print(f"{len(docs_spilts)} documents block loaded")

6、存储

  
  
from langchain.vectorstores import Pinecone
from langchain.embeddings import QianfanEmbeddingsEndpoint
embeddings = QianfanEmbeddingsEndpoint(model="Embedding-V1")
pinecone_vdb = Pinecone.from_documents(docs_spilts, embeddings, index_name=index_name)

7、加载已有向量数据库

如果向量数据库已存在,并且已有数据,可以通过Pinecone.from_existing_index加载已有向量数据库
  
  
from langchain.vectorstores import Pinecone
from langchain.embeddings import QianfanEmbeddingsEndpoint
index_name = "qianfan-vdb"
embeddings = QianfanEmbeddingsEndpoint(model="Embedding-V1")
Pinecone.from_existing_index(index_name=index_name, embedding=embeddings)

8、新建Retriever

  
  
retriever = pinecone_vdb.as_retriever(search_type="similarity_score_threshold", search_kwargs={'score_threshold': 0.5, "k":3 })

9、查看相似度文档

  
  
# 定义query
query = "ERNIE1.0是什么时候发布的?"
  
  
# 检索与query相似度最高的文档
matched_docs = retriever.get_relevant_documents(query)

10、问答

  
  
# 新建LLM类对象
from langchain.chat_models import QianfanChatEndpoint
llm = QianfanChatEndpoint(model="ERNIE-Bot-4")
  
  
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
CUSTOM_PROMPT = """
现在你是一个阅读理解机器人,你会阅读并深度理解我给你的文本内容并据此回答我所提出的问题。注意,我给出的问题是:{question} 你需要阅读理解的文本是:{context}
"""
qa_chain = RetrievalQA.from_chain_type(llm, retriever=retriever, chain_type_kwargs={"prompt": PromptTemplate.from_template(CUSTOM_PROMPT)}, return_source_documents=True)
  
  
qa_chain({"query": query})
评论
用户头像