基于 langchain 和 通义千问大模型 的向量知识库构建和应用

目录

构建向量知识库

加载文档

切割文档

将数据存入向量数据库

利用向量数据库进行QA

测试与验证


构建向量知识库

加载文档

使用 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.
"""

### 关于 LangChain 通义的介绍 LangChain 是一种用于构建基于大型语言模型应用程序框架,而通义则是阿里云推出的一个强大的预训练多模态模型。通过集成这两个技术栈,可以创建复杂且高效的自然语言处理应用程序。 #### 接入方式与功能特性 为了使开发者能够更便捷地使用通义的能力,LangChain 提供了一个专门设计好的接口——`StuffDocumentsChain`[^1]。此链允许用户将多个文档作为输入传递给通义,并获取经过处理后的响应结果。这使得开发人员可以在不改变原有业务逻辑的情况下快速引入先进的AI算法支持。 除了上述提到的功能外,在实际项目中还可以借助其他组件来增强系统的整体性能: - **Flux**:这是来自阿里云的服务平台之一,它可以帮助开发者轻松调用各种API资源并将其应用于自己的产品之中[^2]。 - **Chroma向量存储库**:当涉及到自定义知识库时,可以通过该模块实现数据的有效管理检索操作[^3]。 此外,对于希望获得更加流畅用户体验的应用场景来说,LangChain 支持采用流式输出的方式呈现最终的结果。 ```python from langchain.chains import StuffDocumentsChain from langchain.prompts import PromptTemplate from langchain.llms import Qwen llm = Qwen() prompt_template = "请根据以下内容回答题:\n{context}\n\n题是:{question}" PROMPT = PromptTemplate(template=prompt_template, input_variables=["context", "question"]) stuff_chain = StuffDocumentsChain(llm=llm, prompt=PROMPT) result = stuff_chain.run({"input_documents": docs, "question": question}) print(result) ``` 这段代码展示了如何设置 `StuffDocumentsChain` 来准备上下文环境以及执行查询请求的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值