上一篇:(三)链式工作流构建——打造智能对话的强大引擎
在前三个阶段,我们已经搭建了一个基础的智能对话,并深入探讨了输入输出处理和链式工作流构建的细节。今天,我们将进入智能对话系统的高级阶段——数据检索与增强生成。这一阶段的目标是通过数据检索和增强生成技术,让对话系统能够基于外部数据进行回答,从而更加智能和高效。(建议从第一篇食用)
一、文档加载与处理:为系统提供知识基础
文档加载是智能对话系统获取知识的第一步。通过加载各种类型的文档,我们可以为系统提供丰富的知识基础。
导入相关包
from langchain_community.chat_models import ChatZhipuAI
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.embeddings import ZhipuAIEmbeddings
from langchain_core.vectorstores import InMemoryVectorStore
from langchain_core.documents import Document
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
网页文档加载
web_loader = WebBaseLoader(["https://baike.baidu.com/item/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/9180"])
web_docs = web_loader.load()
通过网页文档加载,我们可以从互联网上获取实时信息,让系统始终保持知识的更新。
该代码段在下面没有用到,所以展示如何加载网页内容作用
PDF文档加载
pdf_loader = PyPDFLoader("DL.pdf")
pdf_docs = pdf_loader.load()
print(pdf_docs)
PDF文档加载功能允许我们从本地或网络上的PDF文件中提取文本,为系统提供更多专业领域的知识。
查看加载的文档内容:
文本文件加载
text_loader = TextLoader("ML.txt", encoding="utf-8")
text_docs = text_loader.load()
print(text_docs)
文本文件加载是最基础的文档加载方式,适用于处理纯文本文件。
查看加载的文档内容:
二、文档分割:优化数据处理效率
文档分割是将长文本分割成适合处理的小块的过程。通过优化分割策略,我们可以显著提高系统的处理效率。
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, # 块大小(字符数)chunk_overlap=50, # 块间重叠separators=["\n\n", "。", "!", "?", ";"], # 中文分句符号length_function=len # 使用字符数统计
)
chunks = text_splitter.split_documents(pdf_docs + text_docs)
print(chunks)
这段代码展示了如何针对中文文本进行优化分割。通过设置合适的块大小和重叠度,我们可以确保每个块既包含足够的信息,又不会过于冗长。
分割后的内容:(分割成一个个Document)
三、向量化与存储:让文本数据可检索
向量化是将文本数据转换为向量表示的过程,这是实现高效检索的关键步骤。
向量化模型
embeddings = ZhipuAIEmbeddings(model="embedding-3",
)
print(embeddings)
通过指定向量化模型,我们可以将文本数据转换为高维向量,从而实现语义级别的相似度计算。
查看向量化模型信息:
向量存储
vector_store = InMemoryVectorStore(embedding=embeddings)
vector_store.add_documents(documents=chunks)
向量存储允许我们将向量化后的文档存储起来,以便后续的检索和查询。
四、基础检索:让系统基于数据回答问题
基础检索是智能对话系统的核心功能之一,它允许系统基于存储的数据回答用户的问题。
定义提示模板
template = """基于以下上下文回答问题:
{context}
问题:{input}"""
prompt = ChatPromptTemplate.from_template(template)
通过定义提示模板,我们可以指导模型如何基于上下文回答问题。
构建文档处理链
document_chain = create_stuff_documents_chain(chat, prompt)
文档处理链负责将检索到的文档传递给模型进行处理。
构建完整RAG链
retriever = vector_store.as_retriever(search_kwargs={"k": 3}) # 返回前3相关结果
rag_chain = create_retrieval_chain(retriever, document_chain)
RAG(Retrieval-Augmented Generation)链结合了检索和生成技术,让系统能够基于外部数据进行回答。
执行查询
response = rag_chain.invoke({"input": "ML与DL的区别与联系"})
print(response["answer"])
通过执行查询,我们可以看到系统如何基于存储的数据回答复杂的问题。
结果如下:
机器学习(ML)与深度学习(DL)之间的区别与联系如下:**区别:**1. **定义和范围:**- 机器学习是一个更广泛的概念,指的是让计算机通过数据和算法自动学习和改进性能的技术。- 深度学习是机器学习的一个子领域,它特别关注使用多层神经网络来处理和表示数据。2. **模型复杂度:**- 机器学习可以使用各种类型的模型,包括简单的线性模型、决策树、支持向量机等。- 深度学习通常使用更复杂的模型,如卷积神经网络(CNN)、循环神经网络(RNN)和生成对抗网络(GAN)等。3. **特征提取:**- 传统的机器学习模型通常需要手动设计特征,而深度学习可以自动从原始数据中提取特征。4. **数据需求:**- 机器学习模型可能需要大量数据,但不需要像深度学习那样大量的数据来训练。5. **计算资源:**- 深度学习模型通常需要更多的计算资源,尤其是GPU,因为它们需要大量的并行计算来训练。**联系:**1. **技术关系:**- 深度学习是机器学习的一个子集,因此深度学习模型是机器学习模型的一种。2. **应用领域:**- 深度学习在图像识别、语音识别、自然语言处理等领域取得了显著成果,这些领域也是机器学习的主要应用领域。3. **目标:**- 两者都旨在使计算机能够从数据中学习,并自动改进性能。4. **发展历程:**- 深度学习是机器学习发展的一个重要阶段,它在某些领域取得了突破性的进展。总结来说,深度学习是机器学习的一种特定实现方式,它通过使用复杂的神经网络模型来提高机器学习在特定任务上的性能。尽管它们之间存在区别,但深度学习与机器学习在目标和应用上有着紧密的联系。
总结
数据检索与增强生成是智能对话系统的核心能力,它不仅决定了系统的知识广度,还影响着系统的回答质量。通过文档加载、文档分割、向量化与存储、基础检索等技术,我们可以让对话系统变得更加智能和高效。
未来,我们可以进一步探索以下方向:
- 更复杂的检索策略:结合多模态数据,实现跨领域的知识检索。
- 实时数据更新:通过动态加载和更新数据,让系统始终保持知识的时效性。
- 个性化推荐:根据用户的历史交互记录,提供个性化的回答和建议。
祝我们学习愉快 😊
下一篇:(五)智能体与工具协同——打造智能对话的超级助手