当前位置: 首页 > news >正文

【LangChain概念】了解语言链️:第2部分

一、说明

        在LangChain的帮助下创建LLM应用程序可以帮助我们轻松地链接所有内容。LangChain 是一个创新的框架,它正在彻底改变我们开发由语言模型驱动的应用程序的方式。通过结合先进的原则,LangChain正在重新定义通过传统API可以实现的极限。

        在上一篇博客中,我们详细讨论了 LangChain 中存在的模块,对其进行了修改。

        实际实施 LangChain 以构建自定义数据机器人涉及合并内存、提示模板和链,以及创建基于 Web 的应用程序。

钦迈·巴勒劳

·

二、让我们从导入开始

        导入 LangChain 和 OpenAI for LLM 部分。如果您没有任何这些,请安装它。

#    IMPORTS
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains import ConversationalRetrievalChain
from langchain.vectorstores import ElasticVectorSearch, Pinecone, Weaviate, FAISS
from PyPDF2 import PdfReader
from langchain import OpenAI, VectorDBQA
from langchain.vectorstores import Chroma
from langchain.prompts import PromptTemplate
from langchain.chains import ConversationChainfrom langchain.document_loaders import TextLoader
# from langchain import ConversationalRetrievalChain
from langchain.chains.question_answering import load_qa_chain
from langchain import LLMChain
# from langchain import retrievers
import langchain
from langchain.chains.conversation.memory import ConversationBufferMemory

        py2PDF 用于阅读和处理 PDF。此外,还有不同类型的记忆,它们具有特定的功能要执行。我正在写这个系列的下一个博客,专门讨论记忆,所以我将在那里详细说明所有内容。ConversationBufferMemory, ConversationBufferWindowMemory

三、让我们设置环境。

        我想你知道如何获得OpenAI API密钥。但以防万一,

  1. 转到 OpenAI API 页面,
  2. 单击创建新的密钥
  3. 这将是您的 API 密钥。粘贴到下面
import os
os.environ["OPENAI_API_KEY"] = "sk-YOUR API KEY"

        使用哪种模型?达芬奇、巴贝奇、居里还是艾达?基于 GPT 3?基于 GPT 3.5 还是基于 GPT 4?关于模型有很多问题,所有模型都适用于不同的任务。很少有便宜的,很少有更准确的。我们还将在本系列的第 4 篇博客中详细介绍所有模型。

        为简单起见,我们将使用最便宜的型号“gpt-3.5-turbo”。温度是一个参数,它让我们了解答案的随机性。温度值越大,我们得到的随机答案就越多。

llm = ChatOpenAI(temperature=0,model_name="gpt-3.5-turbo")

        您可以在此处添加自己的数据。您可以添加任何格式,如PDF,文本,文档,CSV。根据您的数据格式,您可以注释/取消注释以下代码。

# Custom data
from langchain.document_loaders import DirectoryLoader
pdf_loader = PdfReader(r'Your PDF location')# excel_loader = DirectoryLoader('./Reports/', glob="**/*.txt")
# word_loader = DirectoryLoader('./Reports/', glob="**/*.docx")

        我们不能一次添加所有数据。我们将数据拆分为块并发送它以创建数据的嵌入。如果你不知道什么是嵌入,那么

        嵌入以数值向量或数组的形式捕获模型操作和生成的令牌的本质和上下文信息。这些嵌入派生自模型的参数或权重,用于编码和解码输入和输出文本。

这就是创建嵌入的方式。我从CODEBASIC截取了这些截图,这是一个学习LLM的好渠道,[来源:这里]

简单来说,

嵌入LLM是一种将文本表示为数字向量的方法。这允许语言模型理解单词和短语的含义,并执行文本分类、摘要和翻译等任务。通俗地说,嵌入是一种将单词转换为数字的方式。这是通过在大型文本语料库上训练机器学习模型来完成的。该模型学习将每个单词与唯一的数字向量相关联。这个向量表示单词的含义,以及它与其他单词的关系。

来源:官方语言链博客

让我们做与上图中表示完全相同的事情。

#Preprocessing of fileraw_text = ''
for i, page in enumerate(pdf_loader.pages):text = page.extract_text()if text:raw_text += text# print(raw_text[:100])text_splitter = CharacterTextSplitter(        separator = "\n",chunk_size = 1000,chunk_overlap  = 200,length_function = len,
)
texts = text_splitter.split_text(raw_text)

        实际上,当用户启动查询时,将在向量存储中进行搜索,并检索最合适的索引并将其传递给LLM。然后,LLM 对索引中找到的内容进行改革,以向用户提供格式化的响应。
我建议进一步深入研究向量存储和嵌入的概念,以增强您的理解。

embeddings = OpenAIEmbeddings()
# vectorstore = Chroma.from_documents(documents, embeddings)
vectorstore = FAISS.from_texts(texts, embeddings)

        嵌入直接存储在向量数据库中。有许多矢量数据库为我们工作,如松果、FAISS等。让我们在这里使用FAISS。

prompt_template = """Use the following pieces of context to answer the question at the end. If you don't know the answer, just say GTGTGTGTGTGTGTGTGTG, don't try to make up an answer.
{context}
Question: {question}
Helpful Answer:"""
QA_PROMPT = PromptTemplate(template=prompt_template, input_variables=['context',"question"]
)

        您可以使用自己的提示来优化查询和答案。写完提示后,让我们将其链接到最终的链。

        让我们调用最后一个链,它将包括我们之前链接的所有内容。我们在这里使用ConversationalRetrievalChain。这有助于我们像人类一样与机器人进行对话。它会记住以前的聊天对话。

qa = ConversationalRetrievalChain.from_llm(ChatOpenAI(temperature=0.8), vectorstore.as_retriever(),qa_prompt=QA_PROMPT)

        我们将使用简单的Gradio来创建Web应用程序。您可以使用流光或任何前端技术。此外,还有许多免费的部署选项可用,例如在拥抱脸或本地主机上部署,我们可以稍后再做。

# Front end web app
import gradio as gr
with gr.Blocks() as demo:gr.Markdown("## Grounding DINO ChatBot")chatbot = gr.Chatbot()msg = gr.Textbox()clear = gr.Button("Clear")chat_history = []
  def user(user_message, history)print("Type of use msg:",type(user_message))# Get response from QA chainresponse = qa({"question": user_message, "chat_history": history})# Append user message and response to chat historyhistory.append((user_message, response["answer"]))print(history)return gr.update(value=""), historymsg.submit(user, [msg, chatbot], [msg, chatbot], queue=False)clear.click(lambda: None, None, chatbot, queue=False)############################################if __name__ == "__main__":demo.launch(debug=True)

        此代码将启动指向 Web 应用的本地链接,你直接提出问题并查看响应。同样在 IDE 中,您将看到正在维护的聊天记录。

LangChain 的快照 [图片来源:作者]

今天就够了。这是一个简单的介绍,用于链接不同的模块并使用它们来启动最终链。您可以通过扭曲不同的模块和代码来做很多事情。我想说,玩耍是研究的最高形式!!

在下一篇博客中,我将介绍 LangChain 中的记忆和模型。如何选择模型,记忆如何做出贡献,以及更多......因此,请继续关注,如果有任何建议或问题,请与我联系。

四、如果您发现这篇文章有见地

        事实证明,“慷慨使你成为一个更快乐的人”;因此,如果您喜欢这篇文章,请为它鼓掌。如果您觉得这篇文章很有见地,请在LinkedIn和媒体上关注我。您也可以订阅以在我发布文章时收到通知。让我们创建一个社区!感谢您的支持!

相关文章:

【LangChain概念】了解语言链️:第2部分

一、说明 在LangChain的帮助下创建LLM应用程序可以帮助我们轻松地链接所有内容。LangChain 是一个创新的框架,它正在彻底改变我们开发由语言模型驱动的应用程序的方式。通过结合先进的原则,LangChain正在重新定义通过传统API可以实现的极限。 在上一篇博…...

步入React前厅 - Css In React

目录 扩展学习资料 行内样式 引入样式表 CSS Module /src/components/common.module.css /src/components/listitem.module.css css管理进阶 Css管理工具 练习 扩展学习资料 资料名称 链接 css module CSS Modules 用法教程 - 阮一峰的网络日志 在React中使…...

OpenCV(三)——图像分割(二)

目录 4.边缘检测 4.1 图像梯度的概念 4.2 模板卷积和梯度图的概念 4.3 梯度算子...

28.Netty源码之缓存一致性协议

Mpsc Queue 基础知识 Mpsc 的全称是 Multi Producer Single Consumer,多生产者单消费者。Mpsc Queue 可以保证多个生产者同时访问队列是线程安全的,而且同一时刻只允许一个消费者从队列中读取数据。 Netty Reactor 线程中任务队列 taskQueue 必须满足多个…...

造个轮子-任务调度执行小框架-任务清单执行恢复实现

文章目录 前言恢复执行流程失败任务执行重启执行中任务恢复执行修复组件整合组件整合容器启动类总结前言 okey,通过前面的两篇文章,关于这个任务执行这一块,我想应该是明白了。但是这里的话,还是不够的。我们希望对于任务还可以做到执行失败的重试执行,关于这个意外宕机的…...

若依部署前后端

打包项目 前端打包 npm run build:prod将代码上传到指定目录 配置nginx转发 server{listen 8090;server_name localhost;location / {root /home/cc_library/dist;index index.html index.htm;# 配置 history模式,刷新页面会404,,因为服…...

2009年上半年 软件设计师 下午试卷

博主介绍:✌全网粉丝3W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…...

SpringBoot使用自定义事件监听器的demo

记录一下SpringBoot自定义事件监听器的使用方法 案例源码:SpringBoot使用自定义事件监听器的demo 使用的SpringBoot2.0.x版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><…...

arcgis定义投影与投影

1、定义 地理坐标系&#xff08;GCS&#xff09;&#xff1a;利用地球表面的经纬度表示的坐标系统。一般单位为度。投影坐标系&#xff08;PCS&#xff09;&#xff1a;利用数学换算将三维地球表面上的经纬度坐标转换到二维平面上的坐标系统。一般单位为米。可以认为&#xff…...

Flink多流处理之Broadcast(广播变量)

写过Spark批处理的应该都知道,有一个广播变量broadcast这样的一个算子,可以优化我们计算的过程,有效的提高效率;同样在Flink中也有broadcast,简单来说和Spark中的类似,但是有所区别,首先Spark中的broadcast是静态的数据,而Flink中的broadcast是动态的,也就是源源不断的数据流.在…...

LVS/DR+Keepalived负载均衡实战(一)

引言 负载均衡这个概念对于一个IT老鸟来说再也熟悉不过了&#xff0c;当听到此概念的第一反应是想到举世闻名的nginx&#xff0c;但殊不知还有一个大名鼎鼎的负载均衡方案可能被忽略了&#xff0c;因为对于一般系统来说&#xff0c;很多应用场合中采用nginx基本已经满足需求&a…...

测试DWPose的onnx +Unity barracuda

环境&#xff1a; Unity Barracuda 3.0.1 从github直接拉取的barracuda仓库才能装到这个版本Barracuda以后不再升级了&#xff0c;会迁移到Unity AI大计划里的Sentis 我想申请的来着但好像已经不开放了 Unity 2021.3.20模型&#xff1a;dw-ll_ucoco_384.onnx 报了一些错&…...

轻装上阵,不调用jar包,用C#写SM4加密算法【卸载IKVM 】

前言 记得之前写了一个文章&#xff0c;是关于java和c#加密不一致导致需要使用ikvm的方式来进行数据加密&#xff0c;主要是ikvm把打包后的jar包打成dll包&#xff0c;然后Nuget引入ikvm&#xff0c;从而实现算法的统一&#xff0c;这几天闲来无事&#xff0c;网上找了一下加密…...

redis学习笔记(一)

文章目录 一、引言二、redis介绍2.1、定义2.2、Redis的数据类型及主要特性2.3、Redis的应用场景有哪些&#xff1f; 三、redis环境安装3.1、下载和安装 一、引言 在Web应用发展的初期&#xff0c;那时关系型数据库受到了较为广泛的关注和应用&#xff0c;原因是因为那时候Web站…...

最优化问题 - 拉格朗日对偶

primal 原问题 dual 对偶问题 目标函数 约束条件 可行域D 对偶专题 “拉格朗日对偶问题”如何直观理解&#xff1f;“KKT条件” “Slater条件” “凸优化”打包理解——bilibili 王木头 拉格朗日乘子法与对偶问题...

关于ISO27701隐私信息安全管理体系介绍

01 什么是ISO27701 ISO27701是对ISO27001信息安全管理和ISO27002安全控制的隐私扩展&#xff0c;全称《安全技术—扩展ISO27001和ISO27002的隐私信息管理—要求与指南》&#xff0c;是ISO标准委员会以ISO 27001为基准&#xff0c;以ISO27552为蓝本&#xff0c;建立发布的隐私…...

C语言案例 分数列求和-11

题目&#xff1a;有一分数列&#xff1a;2 / 1,3 / 2,5 / 3,8 / 5,13 / 8,21 / 13 …求出这个数列的前20项之和。 程序分析 这是一个典型的分数列数学逻辑题&#xff0c;考究这类题目是需要从已知的条件中找到它们的分布规律 我们把前6荐的分子与分母分别排列出来&#xff0c;…...

Git 入门

一、版本控制 1.1 什么是版本控制 版本控制&#xff08;Revision control&#xff09;是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史&#xff0c;方便查看更改历史记录&#xff0c;备份以便恢复以前的版本的软件工程技术。简单说就是用于管理多人协同开…...

PAT 1010 Radix

个人学习记录&#xff0c;代码难免不尽人意 Given a pair of positive integers, for example, 6 and 110, can this equation 6 110 be true? The answer is yes, if 6 is a decimal number and 110 is a binary number. Now for any pair of positive integers N 1and N 2…...

ruoyi-cloud微服务新建子模块

目录 相关文章1、复制system模块2、在modules下的 pom.xml文件中添加子模块 test3、进入 test模块修改 pom.xml4、修改对应的包名、目录名和启动应用程序为test5、修改bootstrap.yml文件中的端口号和应用名称6、nacos中克隆 system-dev.yml的配置&#xff0c;修改名称为 test-d…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...