解读langchain与详细步骤

langchain框架目前以python或javascript包的形式提供,具体来说是TypeScript。

假如你想从你自己的数据、你自己的文件中具体了解一些情况,它可以是一本书,一个pdf文件,一个包含专有信息的数据库。Langchain允许你将GPT-4这样的大型语言模型与你自己的数据源连接起来。

把你像让你的语言模型参考的文件,先切成小块,再把这些小块存储再一个矢量数据库中。这些块被存储为嵌入,意味着它们是文本的矢量表示。

用户提出了一个初始问题,然后这个问题被发送到语言模型,该问题的向量表示被用来在向量数据库(叫矢量数据库也可以)中做相似性搜索(Similarity Search )

现在,语言模型同时拥有初始问题和来自矢量数据库的相关信息(Question+Relevant Info),因此能够提供一个答案或采取一个行动(action)。

LangChain有助于建立遵循这样一个管道的应用程序,而这些应用都是有数据意识的,我们可以在一个矢量存储中引用我们自己的数据,而且它们是代理性的。

其实可以将大语言模型连接到现有的公司数据,如客户数据、营销数据等。

因此,LangChain的主要价值主张可以分为三个主要概念

我们有LLM包装器,允许我们连接到大语言模型,如GPT-4或HuggingFace的模型。提示模板(prompt)使我们不必对文本进行硬编码,而文本是LLM的输入。然后我们有了索引(index),允许我们为LLm提供相关信息。

该链允许我们将多个组件组合在一起,以解决一个特定的任务,并建立一个完整的LLM应用程序。

最后我们还有允许LLM与外部API互动的代理。

详细步骤

我们要做的第一件事是,我们用管道安装三个库。

Pinecone是我们要使用的矢量商店

新建后缀为.env的环境文件,内容为pinecone(矢量存储)和openai的KPI密钥和pinecone的环境。

from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv())# 输出为True则为成功
  1. find_dotenv()函数用于查找环境变量文件。它会在当前工作目录及其父目录中查找名为.env的文件,然后返回找到的第一个文件的路径。.env文件通常包含了各种环境变量的定义。
  2. load_dotenv()函数用于加载环境变量文件中的变量到当前环境中,以供Python程序使用。

ok,接着咱一步步来,在同一个py文件里


from langchain.schema import (AIMessage,HumanMessage,SystemMessage
)
from langchain.chat_models import ChatOpenAIchat = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.3)
messages = [SystemMessage(content="You are an expert data scientist"),HumanMessage(content="Write a Python script that trains a neural network on simulated data")
]response = chat(messages)
print(response.content, end="\n")

为了通过LangChain与聊天模型互动,导入一个由三部分组成的schema。一个人工智能信息,一个人类信息和一个系统信息。

系统信息是在使用模型时用来配置系统的。人类信息是用户信息。

要使用聊天模型,要将系统信息和人类信息结合在一个列表list中,然后将其作为聊天模型的输入。这里我们使用GPT3.5 Turbo

输出结果为:

Sure! Here's an example of a Python script that trains a neural network on simulated data using the Keras library:```python
import numpy as np
from keras.models import Sequential
from keras.layers import Dense# Generate simulated data
np.random.seed(0)
X = np.random.rand(100, 2)
y = np.random.randint(2, size=100)# Define the neural network model
model = Sequential()
model.add(Dense(10, input_dim=2, activation='relu'))
model.add(Dense(1, activation='sigmoid'))# Compile the model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])# Train the model
model.fit(X, y, epochs=10, batch_size=10)# Evaluate the model
loss, accuracy = model.evaluate(X, y)
print(f"Loss: {loss}, Accuracy: {accuracy}")
```In this script, we first generate simulated data using `np.random.rand()` and `np.random.randint()`. The input data `X` is a 2-dimensional array of random numbers between 0 and 1, and the target labels `y` are binary values (0 or 1).We then define a neural network model using the `Sequential` class from Keras. The model consists of two dense layers, with 10 neurons in the first layer and 1 neuron in the output layer. The activation function for the first layer is ReLU, and the output layer uses a sigmoid activation function.Next, we compile the model using the binary cross-entropy loss function and the Adam optimizer. We also specify that we want to track the accuracy metric during training.We then train the model using the `fit()` method, passing in the input data `X` and target labels `y`. We set the number of epochs to 10 and the batch size to 10.After training, we evaluate the model using the `evaluate()` method, passing in the same input data `X` and target labels `y`. The method returns the loss and accuracy of the model on the provided data, which we print to the console.

Prompts模板

# 采取一段文本,将用户的输入注入到该文本中,然后用用户的输入格式化提示,并将其反馈给语言模型
from langchain import PromptTemplate
template = """
You are an expert data scientist with an expertise in building deep learning models.
Explain the concept of {concept} in a couple of lines
"""prompt = PromptTemplate(input_variables=["concept"],template=template,
)llm(prompt.format(concept="autoencoder"))

输出结果为:

'\nAutoencoders are a type of neural network used for unsupervised learning. They are used to learn efficient representations of input data by learning to compress and reconstruct the input data. They consist of an encoder which compresses the input data into a latent representation, and a decoder which reconstructs the input data from the latent representation.'

链Chains

一个链需要一个语言模型和一个Prompts模板,并将它们组合成一个界面,接受用户的输入,并从语言模型中输出一个答案。类似于复合函数,内部函数是Prompts模板,外部函数是语言模型。

from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt)# 只明确输入变量跑chain
print(chain.run("autoencoder"))

输出结果为:

An autoencoder is a type of artificial neural network used to learn a low-dimensional representation of data (called an "encoding") from the input data. It is a type of unsupervised learning technique that can be used to perform dimensionality reduction, feature extraction, and anomaly detection.

【顺序链】

# 建立一个顺序链,即一个链返回一个输出,然后第二个链将第一个链的输出作为输入
from langchain.chains import SimpleSequentialChain
second_prompt = PromptTemplate(input_variables=["ml_concept"],template="Turn the concept description of {ml_concept} and explain it to me like I'm five in 500 words",
)
chain_two = LLMChain(llm=llm, prompt=second_prompt)overall_chain = SimpleSequentialChain(chains=[chain, chain_two], verbose=True)# 只明确第一个chain的输入变量跑chain
explanation = overall_chain.run("autoencoder")
print(explanation)

输出结果为:

嵌入和矢量存储Embeddings and VectorStores

现在我们要把上述explanation文本拆成几块,然后储存到Pinecone的一个矢量存储中:

刚好Langchain有一个文本拆分工具可以做到这点

from langchain.text_splitter import RecursiveCharacterTextSplittertext_splitter = RecursiveCharacterTextSplitter(chunk_size=100,chunk_overlap=0,
)
texts = text_splitter.create_documents([explanation])
print(texts)#print(texts[0].page_content)

输出结果为:

[Document(page_content='Autoencoders are a type of artificial intelligence, sometimes called “neural networks”. They are', metadata={}),Document(page_content='like computers that can learn.', metadata={}),Document(page_content='An autoencoder has two parts: an encoder and a decoder. The encoder takes in data (like a picture or', metadata={}),Document(page_content='a sentence) and compresses it. It makes the data much smaller and simpler. The decoder takes the', metadata={}),Document(page_content='data and recreates it back to its original form.', metadata={}),Document(page_content='For example, let’s say you have a picture of a cat. The encoder would take this picture and make it', metadata={}),Document(page_content='much smaller and simpler. Then the decoder would take this small and simple version and recreate the', metadata={}),Document(page_content='original picture of the cat.', metadata={}),Document(page_content='Autoencoders can be used for many things. They can be used to learn interesting features from data,', metadata={}),Document(page_content='reduce the size of data, and find errors in data.', metadata={}),Document(page_content='For example, if you give an autoencoder a picture of a cat, it can learn what a cat looks like and', metadata={}),Document(page_content='it can quickly recognize a cat in a different picture. It can also reduce the size of the picture,', metadata={}),Document(page_content='making it easier to store and faster to share. Finally, it can find errors in pictures, like if the', metadata={})]

然后接下来要做的就是把它编程一个嵌入,这知识这个文本的一个矢量表示。而且我们可以使用OpenAI的嵌入模型Ada。

有了Openai的模型,我们就可以对刚刚从文档的各块中提取的原始文本调用嵌入查询

from langchain.embeddings import OpenAIEmbeddingsembeddings = OpenAIEmbeddings(model_name="ada")
query_result = embeddings.embed_query(texts[0].page_content)
print(query_result)

输出结果为一个embedding向量。把文件的各块内容拿出来,在Pinecone中存储向量表示:

接下来,我们将导入Pinecone Python客户端,我们将从Langchain矢量商店导入Pinecone。

我们使用钥匙和环境文件中的环境启动Pinecone客户端。

我们采取嵌入模型,采取一个索引名称,我们把这些嵌入块加载到Pinecone。而一旦我们将矢量存储在Pinecone中,我们就可以对存储的数据提出问题。

然后我们就可以在Pinecone中进行相似性搜索,以获得答案或提取所有相关的块状物

import os
import pinecone
from langchain.vectorstores import Pinecone
from tqdm.autonotebook import tqdm# 初始化Pinecone
pinecone.init(api_key=os.getenv("PINECONE_API_KEY"),environment=os.getenv("PINECONE_ENV")
)# 若index不存在,则先新建index,再用from_documents进行存储;若index已存在,则用from_existing_index进行存储
index_name = "langchain-quickstart"
if index_name not in pinecone.list_indexes():pinecone.create_index(name=index_name,metric="cosine",dimension=1024)search = Pinecone.from_documents(texts, embeddings, index_name=index_name)
else:search = Pinecone.from_existing_index(index_name, embeddings)query = "What is magical at autoencoder?"
result = search.similarity_search(query)
result

我们前往pinecone就可以看到索引在这里

检查索引信息,我们在向量库中共有13个向量

Agents(代理执行者)

简单说吧,就是大语言模型做不到的事情,让别的模型做,比如代码生成,图像生成等。

from langchain.agents.agent_toolkits import create_python_agent
from langchain.tools.python.tool import PythonREPLTool
from langchain.python import PythonREPL
from langchain.llms.openai import OpenAIagent_executor = create_python_agent(llm=OpenAI(temperature=0, max_tokens=1000),tool=PythonREPLTool(),verbose=True
)agent_executor.run("Find the roots (zeros) if the quadratic function 3 * x**2 + 2*x -1")

输出结果为:

> Entering new AgentExecutor chain...I need to solve a quadratic equation
Action: Python REPL
Action Input: import numpy as np
Observation: 
Thought: I can use the numpy function to solve the equation
Action: Python REPL
Action Input: np.roots([3,2,-1])
Observation: 
Thought: I now know the final answer
Final Answer: (-1.0, 0.3333333333333333)> Finished chain.

代码示例:

# 导入LLM包装器
from langchain import OpenAI, ConversationChain
from langchain.agents import initialize_agent
from langchain.agents import load_tools
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplatellm = OpenAI(model_name="text-davinci-003", temperature=0.9) // 这些都是OpenAI的参数
text = "What would be a good company name for a company that makes colorful socks?"
print(llm(text)) 
// 以上就是打印调用OpenAI接口的返回值,相当于接口的封装,实现的代码可以看看github.com/hwchase17/langchain/llms/openai.py的OpenAIChat

代码运行结果:

Cozy Colours Socks.

Prompt Templates:管理LLMs的Prompts,就像我们需要管理变量或者模板一样。

prompt = PromptTemplate(input_variables=["product"],template="What is a good name for a company that makes {product}?",
)
// 以上是两个参数,一个输入变量,一个模板字符串,实现的代码可以看看github.com/hwchase17/langchain/prompts
// PromptTemplate实际是基于StringPromptTemplate,可以支持字符串类型的模板,也可以支持文件类型的模板

代码运行结果:

What is a good name for a company that makes colorful socks?

Chains:将LLMs和prompts结合起来,前面提到提供了OpenAI的封装和你需要问的字符串模板,就可以执行获得返回了。

from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt) // 通过LLM的llm变量,Prompt Templates的prompt生成LLMChain
chain.run("colorful socks") // 实际这里就变成了实际问题:What is a good name for a company that makes colorful socks?

Agents:基于用户输入动态地调用chains,LangChain可以将问题拆分为几个步骤,然后每个步骤可以根据提供个Agents做相关的事情。

# 导入一些tools,比如llm-math
# llm-math是langchain里面的能做数学计算的模块
tools = load_tools(["llm-math"], llm=llm)
# 初始化tools,models 和使用的agent
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)
text = "12 raised to the 3 power and result raised to 2 power?"
print("input text: ", text)
agent.run(text)

代码运行结果(拆分为两部分):

> Entering new AgentExecutor chain...I need to use the calculator for this
Action: Calculator
Action Input: 12^3
Observation: Answer: 1728
Thought: I need to then raise the previous result to the second power
Action: Calculator
Action Input: 1728^2
Observation: Answer: 2985984Thought: I now know the final answer
Final Answer: 2985984
> Finished chain.

Memory:就是提供对话的上下文存储,可以使用Langchain的ConversationChain,在LLM交互中记录交互的历史状态,并基于历史状态修正模型预测。

# ConversationChain用法
llm = OpenAI(temperature=0)
# 将verbose设置为True,以便我们可以看到提示
conversation = ConversationChain(llm=llm, verbose=True)
print("input text: conversation")
conversation.predict(input="Hi there!")
conversation.predict(input="I'm doing well! Just having a conversation with an AI.")

通过多轮运行以后,就会出现:

Prompt after formatting:
The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.Current conversation:Human: Hi there!
AI:  Hi there! It's nice to meet you. How can I help you today?
Human: I'm doing well! Just having a conversation with an AI.
AI:  That's great! It's always nice to have a conversation with someone new. What would you like to talk about?

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

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

相关文章

C语言比较三个数按照从大到小排列

今天让我们来看看如何比较三个数的大小并且排列它们吧,相信大家都有自己的思路,今天我来和大家分享一下我在做这道题时的感悟。 第一种方法 首先根据题目要求,我们需要先比较三个数,之后对它们进行从大到小的一个输出,…

如何在CentOS7部署Wiki.js知识库并实现分享好友公网远程使用【内网穿透】

文章目录 1. 安装Docker2. 获取Wiki.js镜像3. 本地服务器打开Wiki.js并添加知识库内容4. 实现公网访问Wiki.js5. 固定Wiki.js公网地址 不管是在企业中还是在自己的个人知识整理上,我们都需要通过某种方式来有条理的组织相应的知识架构,那么一个好的知识整…

基于PHP的新闻管理系统(用户发布版)

有需要请加文章底部Q哦 可远程调试 基于PHP的新闻管理系统(用户发布版) 一 介绍 此新闻管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。本新闻管理系统采用用户发布新闻,管理员审核后展示模式。 技术栈&am…

Vue element-plus 导航栏 [el-menu]

导航栏 [el-menu] Menu 菜单 | Element Plus el-menu有很多属性和子标签,为网站提供导航功能的菜单。 常用标签: 它里面有两个子标签。el-menu-item,它其实就是el-menu每一个里面的item,item就是真实匹配到路由的每个栏目&#…

如何给图片添加水印?

如何给图片添加水印?在现代职场中,图片的使用已经成为了日常工作的一部分,而给图片添加水印也逐渐成为了一种常见的需求。无论是在设计、广告、营销还是其他领域,给工作中的图片加水印都有其重要性和实用性。工作中给图片加水印的…

C# 排序的多种实现方式(经典)

一、 对数组进行排序 最常见的排序是对一个数组排序,比如: int[] aArray new int[8] { 18, 17, 21, 23, 11, 31, 27, 38 }; 1、利用冒泡排序进行排序: (即每个值都和它后面的数值比较,每次拿出最小值) s…

linux设置Nacos自启动

前提:已经安装好nacos应用 可参考:Nacos单机版安装-CSDN博客 1. 创建nacos.service 1.1 在 /lib/systemd/system 目录底下,新建nacos.service文件 [Unit] Descriptionnacos Afternetwork.target[Service]Typeforking# 单机启动方式&#…

Qt实现无边框圆角窗口

我们在使用QDialog的时候许多场景下都不需要默认的标题栏,这时候我们需要设置他的标志位。 this->setWindowFlags(Qt::FramelessWindowHint);由于现代的窗口风格,我们一般会设置窗口为圆角边框的样式,我们可以使用qss的方式来进行设置。 …

STM32——超声测距HC_SR04记录

一、HC_SR04简述 HC-SR04超声波测距模块可提供 2cm-400cm的非接触式距离感测功能,测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路。 基本工作原理: (1)采用IO 口TRIG 触发测距,给最少10us 的高电平信呈。 (2)模块…

自定义 Unity Scene 的界面工具

介绍 文档中会进行SceneView的自定义扩展,实现显示常驻GUI和添加自定义叠加层(Custom Overlay)。 最近项目开发用回了原生的Unity UI相关内容。对于之前常用的FairyGUI来说,原生的UGUI对于UI同学来讲有些不太方便。再加上这次会…

自定义口令加入群聊怎么弄?用词令关键词直达口令加入微信群延长群二维码7天有效方法

微信口令加入群聊有二种方式 一、微信面对面建群 微信面对面建群的方式适合现实中的朋友之间相互认识且想要建立群聊的场景。微信面对面建群口令加入群聊的有效距离是在几十米范围内,因此只能是附近几十米范围内的人,正确输入微信面对面建群口令后才可…

台球王子,Android小游戏开发

使用 Android Studio 开发了一款休闲游戏 —— 《台球王子》 关键词:台球 A. 项目描述 台球作为一项优雅、策略性强的运动,在众多游戏类型中却相对较少。因此,开发《台球王子》小游戏,可以让更多玩家能够轻松享受到台球的乐趣。…

Python问题列表

文章目录 1、使用pip安装的模块都存放到哪里了?2、安装fitz包报错,如何解决?3、python代码运行时,控制台输出乱码如何解决。4、vscode中第三方库不自动补齐 1、使用pip安装的模块都存放到哪里了? 答: pip是…

易图讯智慧感知应急指挥三维电子沙盘系统设计

易图讯(www.3dgis.top)智慧感知应急指挥三维电子沙盘系统充分融合了物联网与人工智能识别分析技术,实现了从输入到输出的高效智能响应。在物联网方面,系统通过各类传感器和设备,实时采集环境、设备状态等关键数据&…

Adobe ColdFusion 任意文件读取漏洞复现(CVE-2024-20767)

0x01 产品简介 Adobe ColdFusion是美国奥多比(Adobe)公司的一套快速应用程序开发平台。该平台包括集成开发环境和脚本语言,将可扩展、改变游戏规则且可靠的产品的愿景变为现实。 0x02 漏洞概述 由于 Adobe ColdFusion 的访问控制不当,未经身份认证的远程攻击者可以构造恶…

享道出行:容器弹性技术驱动下的智慧出行稳定性实践

作者:郑嘉扬、何杉 前言 享道出行是一家专注于出行服务的专业品牌,是上汽集团实现汽车产业“新四化”(即“电动化、智能网联化、共享化、国际化”)的重要组成部分。作为上汽集团移动出行战略品牌,享道出行充分利用全…

【C++】list介绍

个人主页 : zxctscl 如有转载请先通知 文章目录 1. list介绍2. list的构造3. ist iterator的使用4. capacity5. element access6. modifiers7. 迭代器失效8. Operations8.1 reverse8.2 sort8.3 unique8.4 splice 1. list介绍 list是可以在常数范围内在任意位置进行插…

JumpServer 堡垒主机

JumpServer 堡垒机帮助企业以更安全的方式管控和登陆各种类型的资产 SSH:Linux/Unix/网络设备等Windows:Web方式连接/原生RDP连接数据库:MySQL、Oracle、SQLServer、PostgreSQL等Kubernetes:连接到K8s集群中的PodsWeb站点&#x…

微信小程序wx.navigateTo无法跳转到Component组件问题解决。(共享元素动画必备)

关于Component构造器官方是有文档说明的,然后官方文档内部也给出了组件是可以通过像pages一样跳转的。但是官方文档缺少了必要的说明,会引起wx.navigateTo无法跳转到组件问题! 以下是官方文档截图: 解决方式: 组件创建…

吴恩达2022机器学习专项课程(一) 4.2 梯度下降实践

问题预览/关键词 本节内容梯度下降更新w的公式梯度下降更新b的公式的含义α的含义为什么要控制梯度下降的幅度?导数项的含义为什么要控制梯度下降的方向?梯度下降何时结束?梯度下降算法收敛的含义正确更新梯度下降的顺序错误更新梯度下降的顺…