目录
构建向量知识库
加载文档
使用 pypdf 将 PDF 加载到文档数组中,每个文档包含页面内容和带有页码的元数据。
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("Spotmax_intro_cn_2020.pdf")
docs = loader.load()
切割文档
Recursively split by character:该文本分割器是通用文本的推荐分割器。它的参数是字符列表。它会尝试按顺序分割,直到分块足够小。默认列表为["\n\n", "\n", " ", ""] 。这样做的效果是尽量让所有段落(然后是句子,然后是单词)保持在一起,因为一般来说,这些段落似乎是语义相关性最强的文本片段。
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size = 200,
chunk_overlap = 10
)
splits = text_splitter.split_documents(docs)
将数据存入向量数据库
指定向量数据库的存储目录
persist_directory = 'data/'
!rm -rf ./data # 删除已有目录
基于通用文本向量模型(text-embedding-v1),构建Chroma向量数据库
关于阿里通义实验室提供的通用文本向量模型,更详细的内容参加:通用文本向量模型_大模型服务平台百炼-阿里云帮助中心
from langchain.embeddings import DashScopeEmbeddings
from langchain.vectorstores import Chroma
embedding = DashScopeEmbeddings(
model="text-embedding-v1",
dashscope_api_key="your-dashscope-api-key"
)
vectordb = Chroma.from_documents(
documents=splits,
collection_name="spotmax",
embedding=embedding,
persist_directory=persist_directory
)
vectordb.persist()
根据输入文本,在向量数据库中查找最相似的内容,进行向量知识库的单元测试验证
docs = vectordb.similarity_search("如何提高可用性",k=2)
docs[0]
"""
输出结果:
Document(page_content='降低中断带来的服务器容量变化带来的服务能⼒影响,实现服务及数据的提前迁移。 4.MaxGroup将根据现货价格和终⽌率的变化持续优化集群结构。 5.⽀持智能的动态负载均衡,由于集群为多机型混合,不同机型的处理能⼒有差异,智能的动态负载均衡将实现按处理能⼒的负载分配,实现集群资源利⽤的最⼤化。',
metadata={'page': 1, 'source': 'Spotmax_intro_cn_2020.pdf'})
"""
利用向量数据库进行QA
通过上述构建的 Chroma 向量数据库实例,调用 as_retriever 方法,指定 search_type(匹配规则)为 mmr,生成一个 retriever。
注意:search_type 有多个取值:
- similarity:相似性匹配,找到最相似的k个数据块
- mmr:max marginal,找到最相似的k个数据块,同时这k个数据块之间的差别最大
基于通义千问基础大模型,通过 RetrievalQA 类的 from_chain_type 方法,指定 chain_type 为 refine,构建一个 qa。
注意:chain_type 参数指定了用于回答问题的链的类型,有多个取值:
- refine:
- 含义:初始文档传递给语言模型生成初步答案,之后每个后续文档都会与当前答案一起传递给语言模型进行逐步改进和完善。
- 优点:允许逐步改进答案,可以动态调整和丰富最终答案。
- 缺点:多次调用语言模型,可能会增加时间和成本。
- stuff:
- 含义:将检索到的所有文档直接“塞进”一个提示中,让语言模型一次性处理所有内容。
- 优点:实现简单,可以在一个请求中处理所有信息。
- 缺点:如果文档太多,可能会超出语言模型的上下文窗口限制。
- map_reduce:
- 含义:先将每个检索到的文档单独传递给语言模型生成部分答案(map 步骤),然后将这些部分答案合并并再次传递给语言模型生成最终答案(reduce 步骤)。
- 优点:可以处理大量文档,因为每个文档单独处理。
- 缺点:由于需要多次调用语言模型,可能会增加计算时间和成本。
- map_rerank:
- 含义:每个文档单独传递给语言模型生成答案和相关评分,然后根据这些评分重新排序文档或答案。
- 优点:可以确保最佳答案靠前。
- 缺点:涉及评分和排序,可能增加复杂度。
from langchain.chains import RetrievalQA
from langchain_community.llms import Tongyi
llm = Tongyi()
retriever=vectordb.as_retriever(
search_type="mmr", search_kwargs={"k": 3}
#search_type="similarity", search_kwargs={"k": 3}
)
qa = RetrievalQA.from_chain_type(llm=llm, chain_type="refine",
retriever=retriever,
return_source_documents=False,
verbose=True)
测试与验证
根据输入文本,使用调用上述构建 qa 的 invoke 方式,进行测试与验证:
验证案例1:
result = qa.invoke({"query": "什么是SpotMax?"})
print(result["result"])
"""
输出结果:
> Entering new RetrievalQA chain...
> Finished chain.
Refined Answer: SpotMax是Mobvista开发的一款云端成本优化体系,它特别利用了AWS Spot Instance等弹性云计算资源,以实现成本的极致降低。MaxGroup是SpotMax中的一个关键功能,它通过智能地将工作负载分组和管理,确保在Spot实例中断时能无缝地迁移任务,从而在降低成本的同时维持服务的高可用性。SpotMax的全面解决方案还包括其他核心组件,共同助力用户在云环境中实现更高效且经济的运营。
"""
验证案例2:
result = qa.invoke({"query": "SpotMax如何降低成本"})
print(result["result"])
"""
输出结果:
> Entering new RetrievalQA chain...
Number of requested results 20 is greater than number of elements in index 10, updating n_results = 10
> Finished chain.
Refined Answer: SpotMax reduces costs by leveraging the MaxGroup core functionality, which efficiently manages AWS Spot Instances to maximize cost savings while ensuring service reliability. MaxGroup intelligently orchestrates cloud resources, adapting to price fluctuations and instance termination risks. It optimally结构调整the cluster composition based on spot price changes and termination likelihood, maintaining a balance between cost efficiency and stability.
Moreover, SpotMax incorporates dynamic load balancing across a multi-model hybrid cluster, allocating workloads according to the varying processing capabilities of different instance types. This enhances resource utilization and performance. The solution draws on Mobvista's expertise in cost optimization, guaranteeing that SpotMax delivers both financial benefits and high服务质量(QoS) in service delivery.
"""