当前位置: 首页 > 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…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

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

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

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...