【大模型从入门到精通35】开源库框架LangChain 利用LangChain构建聊天机器人2

news2024/11/13 11:35:29

这里写目录标题

      • 利用LangChain构建具备记忆功能的对话检索链
        • 设置对话历史记忆
        • 构建对话检索链
        • 处理问题并生成答案
      • 创建基于文档的问答聊天机器人
        • 初始设置和导入
        • 文档加载和处理

在这里插入图片描述

利用LangChain构建具备记忆功能的对话检索链

设置对话历史记忆

为了使问答系统能够记住对话的上下文,我们利用ConversationBufferMemory类。该类特别设计用于存储交互的历史记录,允许系统引用之前的交流,并针对后续问题提供上下文相关的回答。

# 从langchain.memory模块导入ConversationBufferMemory类
from langchain.memory import ConversationBufferMemory

# 初始化ConversationBufferMemory,设置一个键来存储聊天历史,并配置它返回对话中交换的所有消息
conversation_history_memory = ConversationBufferMemory(
    memory_key="conversation_history",
    return_messages=True
)
构建对话检索链

设置好记忆组件后,下一步涉及构建对话检索链。这一组件是问答系统的核心,它结合了语言模型、文档检索功能和对话记忆,以处理问题并在对话上下文中生成答案。

# 从langchain.chains模块导入ConversationalRetrievalChain类
from langchain.chains import ConversationalRetrievalChain

# 假设'vector_database'是一个用于文档检索的已初始化向量存储实例
# 将向量数据库转换为与ConversationalRetrievalChain兼容的检索器格式
document_retriever = vector_database.as_retriever()

# 初始化ConversationalRetrievalChain,包含语言模型实例、文档检索器和对话历史记忆组件
question_answering_chain = ConversationalRetrievalChain.from_llm(
    language_model=language_model_instance,
    retriever=document_retriever,
    memory=conversation_history_memory
)
处理问题并生成答案

一旦对话检索链建立起来,系统就可以处理传入的问题,并利用存储的对话历史来生成恰当的答案。

# 定义一个与对话主题相关的问题
initial_question = "概率是不是本课程的基础话题?"
# 通过对话检索链处理问题
initial_result = question_answering_chain({"question": initial_question})
# 从结果中提取并打印答案
print("答案:", initial_result['answer'])

# 继续提出另一个问题,基于初始问题的上下文
follow_up_question = "为什么这些话题被认为是先修课程?"
# 通过对话检索链处理后续问题,利用对话历史来提供上下文
follow_up_result = question_answering_chain({"question": follow_up_question})
# 从结果中提取并打印后续答案
print("答案:", follow_up_result['answer'])

创建基于文档的问答聊天机器人

初始设置和导入

在深入聊天机器人创建过程之前,关键是要导入LangChain中的必要类和模块。这些组件便于文档加载、文本分割、嵌入生成和对话链创建。

# 从LangChain导入类,用于嵌入生成、文本分割、内存内搜索、文档加载、对话链和记忆处理
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import DocArrayInMemorySearch
from langchain.document_loaders import TextLoader, PyPDFLoader
from langchain.chains import ConversationalRetrievalChain
from langchain.chat_models import ChatOpenAI
文档加载和处理

创建聊天机器人的第一步是从文档加载和处理开始,这涉及读取文档,将其分割成易于处理和检索的小块,然后为每个小块生成嵌入。

def load_documents_and_prepare_database(file_path, chain_type, top_k_results):
    """
    从指定文件加载文档,将其分割成易于处理的小块,
    为每个小块生成嵌入,并准备向量数据库用于检索。

    参数:
    - file_path: 文档文件的路径(PDF、文本等)。
    - chain_type: 指定要使用的对话链类型。
    - top_k_results: 搜索中检索的顶部结果数。

    返回:
    - 准备好回答问题的对话检索链实例。
    """
    # 根据文件类型使用适当的加载器加载文档
    document_loader = PyPDFLoader(file_path)
    documents = document_loader.load()

    # 将文档分割成小块以便更轻松地处理和检索
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=150)
    document_chunks = text_splitter.split_documents(documents)

    # 为每个文档小块生成嵌入
    embeddings_generator = OpenAIEmbeddings()
    vector_database = DocArrayInMemorySearch.from_documents(document_chunks, embeddings_generator)

    # 为对话链准备文档检索器
    document_retriever = vector_database.as_retriever(search_type="similarity", search_kwargs={"k": top_k_results})

    # 使用指定参数初始化对话检索链
    chatbot_chain = ConversationalRetrievalChain.from_llm(
        llm=ChatOpenAI(model_name='gpt-3.5-turbo', temperature=0),
        chain_type=chain_type,
        retriever=document_retriever,
        return_source_documents=True,
        return_generated_question=True,
    )

    return chatbot_chain

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2064152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络-2-tcpip协议

1.说说 TCP/IP 四层模型? TCP/IP(Transmission Control Protocol/Internet Protocol)模型是一种用于描述互联网通信的协议层次结构。它分为四个主要层次,每个层次都定义了不同的协议来实现特定的功能。下面是TCP/IP模型各层的常用…

PCIE-flit mode retry

下一个即将发送的seq num: 下一个即将发送的ack或者nak的seq num: Tx发送exp seq num的个数: Tx发送nak的个数 下一个期望收到的flit的seq num,注意是指下个期望收到的有效的、non-idle、non_duplictae的flit: 收到的flit的真实的seq num(implicit…

控制台小游戏—扫雷

引言: 在前面一篇中,小编介绍了如何将代码分装在多个文件中的操作。在本篇文章中,小编将介绍一个广受欢迎的小游戏,以帮助大家熟悉这个操作。这个小游戏不仅可以让我们熟悉将代码放在多个文件中的操作,还可以加深我们…

PPT时间轴怎么做?用这款AI软件一键快速生成!

当ppt中需要呈现时间顺序、发展历程甚至是沧海桑田的变化时,很多人都会首选ppt时间轴这种视觉化的方式,它简洁直观,让人可以快速领会ppt想表达的意图,达到一图胜千言的目的。 对于不擅长制作ppt时间轴的人,最好的方式…

2024买一个机械硬盘

1997年,博主配了第一个电脑,CPU是6X86, 您可能没有听说过,那时的硬盘只有2GB~4GB,侯杰在深入浅出MFC中说以后要有大颗的硬盘,当时感觉看到这个单位来描述硬盘,感觉挺有意思。1999年,博主在电脑城…

mujoco_py ERROR: GLEW initalization error: Missing GL version

1. 问题描述: 运行mujoco ROS节点的时候,遇到错误如下: from pkg_resources import load_entry_point Creating window glfw ERROR: GLEW initalization error: Missing GL version 2. 解决方法 在./bashrc文件中添加: export L…

Vue状态管理工具:Pinia

基本概念 Pinia 是一个专为 Vue.js 设计的状态管理库,特别是针对 Vue 3 进行了优化,完美支持Vue3的Composition api 以及TypesCcript语法。它提供了一种更加简单、直观且可扩展的方式来组织和访问应用程序的状态。目前Pinia已经取代Vuex成为vue官方文档…

总结:数字图像处理基础知识

数字图像处理中的图像坐标系是理解图像数据结构和图像处理算法的基础。在计算机视觉和图像处理领域,通常有两种主要的坐标系统用于描述图像中的像素位置:笛卡尔坐标系和像素坐标系。下面我将详细介绍这两种坐标系统及其在数字图像处理中的应用。 1. 笛卡…

T/CECS 10035-2019 绿色建材评价 金属复合装饰材料

一、绿色建材 绿色建材是指在全生命周期内减少对天然资源消耗和减轻对生态环境影响,具有节能、减排、安全、便利和可循环的建材产品,获得绿色产品证书的产品在实际招投标以及品牌宣传中具有绝对优势。 二、认证模式 初始工厂检查产品抽样检验获证后监督…

稳压二极管、肖特基二极管、TVS管、静电ESD管的区别

1.稳压二极管 正向导通电压跟普通二级管一样约为0.7v,反向状态下在临界电压之前截止,在达到临界电压的条件下会处于导通的状态,电压也不再升高,所以用在重要元器件上,起到稳压作用。 稳压二极管主要利用其反向击穿时…

LLM概念梳理(二):检索增强RAG

非常感谢RAG(检索增强生成)技术详解:基于垂直领域专有数据的 Chatbots 是如何实现的,这篇文章对 RAG 技术进行了详细的描述。我根据自己的理解,并且按照代码思路重新进行整理。 RAG 技术看似神奇,其本质是…

2024.8.22(Docker)

一、回顾 高并发集群 eleme后端登录模块 1、数据库 1.主从复制(高可用) 2.传统的主从复制 3.gtids事务型的主从复制 4.注意 (1)server_id唯一 (2)8.x版本需要get_ssl_pub_key (3)5.x不需要 (4…

ts枚举类型校验,提示枚举信息

ts 类型验证,提示枚举信息 const eventTypeList [MOUSE_MOVE, // 鼠标移动LEFT_CLICK // 左键单击// MOUSE_OUT, ] as consttype EventTypeList typeof eventTypeList[number]

FST(Finite State Transducer)

有限状态转换器(Finite State Transducer,简称FST)是一种计算模型,它是有限状态自动机(Finite State Automaton,简称FSA)的扩展。FSA是一种理论计算模型,用于表示和处理正则语言&…

苹果iOS / iPadOS 18 beta 7版本发布,或将是最后一个iOS / iPadOS 18beta版本

今日苹果公司向 iPhone 和 iPad 用户推送了 iOS/iPadOS 18 开发者预览版 Beta 7 更新(内部版本号:22A5346a),本次更新距离上次发布 Beta/RC 间隔 8 天。 值得注意的是,本次更新版本号以a结尾,意味着如果不…

国密算法SSL证书:守护网络安全的利器

国密算法SSL证书是基于中国自主研发的密码算法标准生成的安全套接层证书,主要用于保护网站和应用程序的数据传输安全。该证书采用SM2椭圆曲线公钥密码算法、SM3密码哈希函数和SM4对称密钥加密算法,确保数据传输过程中的机密性、完整性和抗攻击性。 国密…

KKView远程Microsoft Remote Desktop

Microsoft Remote Desktop:高效稳定的远程连接解决方案 在当今这个信息化、网络化的时代,远程桌面工具成为了许多用户进行远程办公、学习及技术支持的重要工具。其中,Microsoft Remote Desktop以其高效稳定的连接性能、强大的跨平台支持及出…

学校每年比用的招生简章在线制作平台!

每年招生季节,各大中小学及高校都会面临一个重要的任务:更新和发布招生简章。这不仅是一份简单的招生说明,它更是学校向外界展示自身特色、招生政策和培养目标的重要窗口。随着信息技术的发展,传统的纸质招生简章逐渐演变为在线制…

通过拖拽添加dom和一些属性

将图片通过拖拽添加到指定位置 <template><div class"draggle-box"><imgclass"draggle-source"src"/assets/bg/cat.jpg"dragstart"handleDragStart($event, 图片)"/><divclass"draggle-target"dragove…