【大模型从入门到精通34】开源库框架LangChain 利用LangChain构建聊天机器人1
这里写目录标题
- 利用LangChain构建聊天机器人
- 介绍
- 介绍对话型聊天机器人
- 构建环境
- 环境变量和平台设置
- 加载文档和创建向量存储
- 高级检索技术
- 对话上下文和记忆
- 纳入聊天历史
- 会话缓冲内存
- 构建对话检索链
- 环境设置与API密钥配置
- 选择合适的语言模型版本
- Q&A系统设置

利用LangChain构建聊天机器人
介绍
本章深入探讨了使用LangChain构建和优化对话型聊天机器人的方法。LangChain是一款旨在将语言模型与数据检索系统相结合以实现动态问题解答能力的工具。本章面向机器学习工程师、数据科学家、软件开发者以及相关领域的专业人士,提供了一个全面的指南,帮助开发能够处理后续问题并保持情境对话的聊天机器人。
介绍对话型聊天机器人
对话型聊天机器人已经彻底改变了我们与技术互动的方式,通过自然语言对话为我们提供了获取和处理信息的新途径。与传统聊天机器人不同的是,对话型聊天机器人能够理解和记住对话的上下文,使交互更加自然流畅。
构建环境
环境变量和平台设置
在深入聊天机器人开发之前,配置工作环境至关重要。这包括加载必要的环境变量,并确保平台已经正确设置以支持整个开发流程。从一开始就启动平台有助于开发者监控系统的内部运作,便于调试和优化。
加载文档和创建向量存储
第一步涉及到使用LangChain的文档加载器从多种来源加载文档,这些加载器支持超过80种不同的格式。加载文档后,将其分割成可管理的片段。这些片段随后转换为嵌入,并存储在一个向量存储中,以实现语义搜索功能。
高级检索技术
设置好向量存储之后,重点转向检索方法。本节探索各种高级检索算法,以增强聊天机器人准确理解并回应查询的能力。讨论的技术包括自我查询、压缩和语义搜索等,强调其模块化特性以及如何将其整合进聊天机器人框架中。
对话上下文和记忆
纳入聊天历史
对话型聊天机器人的一个重要进步是能够将聊天历史纳入响应生成过程中。这项能力让聊天机器人能够在对话过程中维持上下文,使其能够准确理解并回应后续问题。
会话缓冲内存
实施会话缓冲内存包括维护之前的聊天消息列表,并将这些消息与新问题一起传递给聊天机器人。本节提供逐步指导,包括如何设置内存键以及如何将聊天历史作为消息列表处理。
构建对话检索链
对话检索链代表了聊天机器人功能的核心部分。它集成了语言模型、检索系统和记忆,以在持续的对话上下文中处理和回应用户提问。本节详细介绍构建对话检索链的过程,包括如何引入语言模型、检索器和记忆组件。
环境设置与API密钥配置
首先,正确设置环境并安全处理API密钥对于访问如OpenAI的GPT模型等云基语言模型服务至关重要。
# 导入必要的库以管理和访问环境变量及API
import os
from dotenv import load_dotenv, find_dotenv# 确保Panel GUI库正确导入和初始化,以便于交互式应用
import panel as pn
pn.extension()# 加载.env文件以安全地访问环境变量,包括OpenAI API密钥
_ = load_dotenv(find_dotenv())# 从环境变量中分配OpenAI API密钥以认证API请求
openai.api_key = os.environ['OPENAI_API_KEY']
选择合适的语言模型版本
# 导入datetime库以管理基于日期的逻辑用于模型选择
import datetime# 确定当前日期以决定语言模型版本
current_date = datetime.datetime.now().date()# 选择语言模型版本
language_model_version = "gpt-3.5-turbo"# 显示选定的语言模型版本
print(language_model_version)
Q&A系统设置
# 导入必要的库以处理嵌入和向量存储
from langchain.vectorstores import Chroma
from langchain.embeddings.openai import OpenAIEmbeddings# 设置环境变量以访问LangChain API
# 注意:将'your_directory_path'替换为你打算存储文档嵌入的实际目录路径,
# 并将'your_api_key'替换为你的实际LangChain API密钥以进行身份验证
persist_directory = 'your_directory_path/'
embedding_function = OpenAIEmbeddings()
vector_database = Chroma(persist_directory=persist_directory, embedding_function=embedding_function)# 定义一个问题以查找相关的文档
search_question = "本课程涵盖的关键主题有哪些?"
# 进行相似性搜索以找到与问题最相关的前三份文档
top_documents = vector_database.similarity_search(search_question, k=3)# 确定找到的文档数量
number_of_documents = len(top_documents)
print(f"找到的相关文档数量: {number_of_documents}")# 导入LangChain的Chat模型以生成响应
from langchain.chat_models import ChatOpenAI# 初始化语言模型以进行聊天,设置模型温度为0以获得确定性的响应
language_model = ChatOpenAI(model_name='gpt-3.5-turbo', temperature=0) # 确保替换为你的模型# 生成简单问候响应的例子
greeting_response = language_model.predict("宇宙你好!")
print(greeting_response)# 构建用于结构化问题解答的提示模板
from langchain.prompts import PromptTemplate# 定义一个模板,指示如何使用给定的上下文提供简洁且有帮助的回答
prompt_template = """
使用下列上下文来回答最后的问题。如果你不确定答案,请明确表示而不是猜测。
尝试让你的回答控制在三句话以内以保持清晰和简洁。
结束你的回答时说“谢谢你的提问!”以保持礼貌的语气。上下文: {context}
问题: {question}
有帮助的回答:
"""# 初始化PromptTemplate对象,指定输入变量和定义的模板
qa_prompt_template = PromptTemplate(input_variables=["context", "question"], template=prompt_template)# 运行对话检索和问题解答链
from langchain.chains import RetrievalQA# 定义一个具体的问题以在对话上下文中得到解答
specific_question = "本课程是否需要理解概率?"# 初始化QA链,包括语言模型、向量数据库作为检索器和自定义提示模板
qa_chain = RetrievalQA.from_chain_type(language_model,retriever=vector_database.as_retriever(),return_source_documents=True,chain_type_kwargs={"prompt": qa_prompt_template})# 执行QA链以获取结构化且有帮助的回答
qa_result = qa_chain({"query": specific_question})# 输出QA链的结果回答
print("结果回答:", qa_result["result"])
相关文章:

【大模型从入门到精通34】开源库框架LangChain 利用LangChain构建聊天机器人1
这里写目录标题 利用LangChain构建聊天机器人介绍介绍对话型聊天机器人构建环境环境变量和平台设置 加载文档和创建向量存储高级检索技术对话上下文和记忆纳入聊天历史会话缓冲内存 构建对话检索链环境设置与API密钥配置选择合适的语言模型版本Q&A系统设置 利用LangChain构…...

魔法糖果工厂
LYA 是一家魔法糖果工厂的新任管理员。工厂生产的魔法糖果有七种颜色,分别用字母 a、b、c、d、e、f、g 表示。这些糖果被排列在一条传送带上,准备进行包装。为了提高效率,工厂引进了一台智能包装机器人。这个机器人可以按照预设的指令序列来包…...

NVM安装管理node.js版本(简单易懂)
一、前言 1.1 简介 NVM(Node Version Manager)是 node.js 的版本管理器,用 shell 脚本切换机器中不同版本的 nodejs。 Nodejs为什么需要多个版本? 有经验的开发者可能遇到过,某个依赖包明确nodejs是某个版本&#…...

第1章-04-Chrome及Chrome Driver安装及测试
🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师&am…...

【Linux】SSH 隧道转发场景搭建
ssh建立隧道转发 A设备:没有公网IP地址的本地设备,如本地内网服务器(需要能通公网) B设备:有公网IP地址的服务器,可以是云服务器 C设备:终端设备,想通过公网服务器B访问到设备A 要…...

前后端部署-服务器linux中安装数据库Mysql8
一、登录Xshell7 && 开放Mysql 3306端口, Redis 6379 端口 二、手动部署MySQL数据库 1.运行以下命令,更新YUM源。 sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm 2.运行以下命令,安装My…...

如何使用jd-gui对springboot源码进行分析
背景: 最近在学习springboot的过滤器和拦截器,想了解一下过滤器和拦截器是怎么匹配URL的,在网上搜了半天都搜不到针对源码的,网上大部分内容都是说怎么配置过滤器和拦截器,怎么使用,并没有对源码进行分析的…...

原来ChatGPT是这么评价《黑神话:悟空》的啊?
《黑神话:悟空》一经上线便迅速吸引了全球的目光,成为了今日微博热搜榜上的焦点话题。作为中国首款现象级的中国3A大作,它的发布无疑引发了广泛的关注与讨论。 《黑神话:悟空》,这款3A国产游戏大作,由国内游…...

C语言第17篇
1.在C语言中,全局变量的存储类别是_________. A) static B) extern C) void D) register 提示:extern adj.外来的 register n.登记表,v.登记 提示与本题无关 2.在一个C源程序文件中,要定义一个只允许本源文件中所有函数使用的全局变…...

Springboot+vue实现webScoket
需求 因为在做的项目中,有多个网站登录同一个用户,故想在某一个页面登录或者退出的时候,对其他页面进行相同的操作 跨域,跨页面,跨项目,跨标签页,https 因为一开始不像麻烦后端,所以…...

CSS知识点详解:display+float
display:浮动 1.block:使元素呈现为块级元素,可设置宽高 display: block; 特点:使元素呈现为块级元素,即该元素会以新行开始,占据整行的宽度,即使其宽度未满。 例子: 2.inline&a…...

ant design pro v6 如何做好角色管理
先上图: 整个角色管理是如何做的吗? 首先你要处理后端,要先把角色存到用户那。 这是用户管理部分的内容: 可以看到一个用户是有多个角色的。 看到没有,存的是数组 数组的是一个 role 对象 role 对象是这样…...

C++ 设计模式(3. 抽象工厂模式)
抽象工厂模式也是一种创建型设计模式,提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类【引用自大话设计模式第15章】基本结构 抽象工厂模式包含多个抽象产品接口,多个具体产品类,一个抽象工厂接口和多个具体…...

【PHP入门教程】PHPStudy环境搭建+HelloWorld运行
文章目录 PHP 的历史PHP 的用途PHP 的特点和优势PHP 环境搭建环境准备安装window 安装CentOS / Ubuntu / Debian 安装 第一个Hello World使用Apache服务运行命令行运行代码 PHP 的历史 PHP(Hypertext Preprocessor)超文本预处理器是一种开源的通用脚本语…...

补 0 输出。
题目描述 输入一个整数,请在整数前面补 00 补足 88 位后输出。 输入描述 输入一行包含一个整数 nn。 输出描述 输出补00后的整数。 输入输出样例 示例1 输入 2021输出 00002021示例2 输入 202110输出 00202110 import os import sys# 请在此输入您的代码 si…...

因为嫌吵,在自己家也用上了远程控制电脑
加班嘛,赶稿嘛,参加工作的人都懂那种无形的压力和烦躁。 因为家里空间有限,我平常都是直接在客厅用台式电脑加急改写方案,但今天晚上家里来了几位叔,他们边吃饭边聊着秦始皇的话题,都70多分钟了,…...

vue---echarts环形图
1、完整代码直接可以cv <template><div id"main1"></div> </template><script> import * as echarts from echarts; // import { mapState } from vuex; // import { Alarm_Device } from ../utils/api.js; export default {name: P…...

克服编程挫折:从Bug的迷宫中寻找出口与面对算法保持冷静的策略
在编程学习的道路上,挫折感无疑是每个学习者都必须面对的挑战之一。它们仿佛是一座座高墙,阻挡我们前进的步伐。然而,正如许多有经验的编程高手所证明的那样,挫折并不是终点,而是成长和进步的催化剂。本文将分享一些有…...

Flink之SQL client使用案例
Flink的执行模式有以下三种: 前提是我们已经开启了yarnsession的进程,在下图中可以看到启动的id也就是后续任务需要通过此id进行认证,以及任务分配的master主机。 这里启动时候会报错一个ERROR:org.apache.flink.shaded.curator.org.apache…...

实际开发中的模块化开发 - 应用到直播间
实际开发中的模块化开发 - 模块管理(以直播间为例)-CSDN博客 引言 在前面的两篇博客中,我们已经介绍了直播模块的简单结构,创建了模块管理器和模块抽象基类,并且通过模块化实现了两个小业务功能模块。接下来…...

EmguCV学习笔记 VB.Net 第5章 图像变换
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访…...

【初阶数据结构】顺序表与链表的比较(附题)
目录 一、顺序表和链表的区别(其他链表存在缺陷,比较意义不大,这里用带头双向循环链表与顺序表进行比较) 1.1插入、扩容与随机访问 二、缓存利用率的比较 2.1前置知识 详解及补充知识(本文仅为比较顺序表及链表&am…...

git-20240822
目录 初始化仓库 Git init Git init project --bare 查看提交的记录 git log --prettyoneline 查看当前git远程库地址 git remote -v 查看详细提交记录 git log 撤出暂存区的文件 git reset HEAD file(.代表全部文件) 提交数据到远程仓库 git config --global push.…...

【时时三省】c语言例题----华为机试题< 数字颠倒>
目录 1,题目 描述 输入描述: 输出描述: 示例1 2,代码...

【前缀和算法】--- 一维和二维前缀和模板
Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 算法Journey 本文开始,博主开始讲解有关前缀和的算法,本篇博客我们先来了解一下有关前缀和的两个模板。 🏠 一维前缀和模板 &…...

有些信息注定会丢失
智能在分析问题、做出决策时,总是希望获取尽可能多的信息,以此更加准确地决策。然而,很遗憾的是,有一些信息注定会丢失,不可能获取完全的信息,而且即使能够获取,智能也不能完全利用。 这一点与…...

c#中Task.Run 和使用 Task 构造函数创建任务的区别
Task.Run 和使用 Task 构造函数创建任务是两种不同的方法,它们在某些方面有显著的区别: 启动方式: Task.Run 是一个静态方法,它立即启动一个任务并在后台执行指定的工作。它通常用于快速启动一个简单的后台任务。使用 Task 构造函数创建任务&…...

使用nginx做代理转发
需求1:通过监听服务器的80端口,将请求转发到另一台服务器的8070端口 打开nginx/nginx.conf文件 server {listen 80;server_name localhost;location /analys {proxy_pass http://10.xx.xx.xx:8070/;} }需求2:通过监听服务器的80端口&am…...

Java前端与后端交互:JSON与XML数据交换 - 掌握现代Web开发的核心技能
引言 随着互联网技术的不断进步,Web应用变得越来越复杂,从前端到后端的每一个环节都需要精心设计以保证良好的用户体验。在这个过程中,数据的传递扮演着至关重要的角色。无论是简单的表单提交还是复杂的API调用,都需要一种可靠的…...

网络攻击原理及过程
网络攻击原理表 攻击者 内容 攻击访问 攻击效果 攻击意图 黑客 挑战 间谍 用户命令 破坏信息 好奇 恐怖主义者 脚本或程序 本地访问 信息泄密 获取情报 公司职员 自治主体 远程访问 窃取服务 经济利益 职业犯罪分子 电磁泄露 拒绝服务 恐怖事…...