3
基于千帆LangChain+Pinecone的知识问答
大模型开发/技术交流
- 大模型推理
- LLM
2023.12.114744看过
前言
在前面的文档当中,我介绍了使用千帆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 osfrom dotenv import load_dotenvload_dotenv(dotenv_path = "env",override = True)
2、pinecone初始化
初始化pinecone,并创建pinecone索引(index)
import pineconefrom tqdm.autonotebook import tqdmPINECONE_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 indexpinecone.create_index(name=index_name,metric='euclidean',dimension=384, # 千帆Embedding-V1向量模型是384维,所以这里设置成384)
3、千帆SDK初始化鉴权
import osQIANFAN_AK=os.getenv("QIANFAN_AK")QIANFAN_SK=os.getenv("QIANFAN_SK")os.environ["QIANFAN_AK"] = QIANFAN_AKos.environ["QIANFAN_SK"] = QIANFAN_SK
4、文件切片并保存至向量数据库
from langchain.document_loaders import PyMuPDFLoaderloader = PyMuPDFLoader("./example_data/ai-paper.pdf")documents = loader.load()
5、切片
初始化vectorstore,使用PyMuPDFLoader加载PDF文件
from langchain.text_splitter import RecursiveCharacterTextSplittertext_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 Pineconefrom langchain.embeddings import QianfanEmbeddingsEndpointembeddings = 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 Pineconefrom langchain.embeddings import QianfanEmbeddingsEndpointindex_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、查看相似度文档
# 定义queryquery = "ERNIE1.0是什么时候发布的?"
# 检索与query相似度最高的文档matched_docs = retriever.get_relevant_documents(query)
10、问答
# 新建LLM类对象from langchain.chat_models import QianfanChatEndpointllm = QianfanChatEndpoint(model="ERNIE-Bot-4")
from langchain.chains import RetrievalQAfrom langchain.prompts import PromptTemplateCUSTOM_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})
评论