LangChain 介绍及相关组件使用总结

一、langChain

LangChain 是一个由语言模型LLMs驱动的应用程序框架,它允许用户围绕大型语言模型快速构建应用程序和管道。 可以直接与 OpenAIChatGPT 模型以及 Hugging Face 集成。通过 langChain 可快速构建聊天机器人、生成式问答(GQA)、本文摘要等应用场景。

LangChain本身并不开发LLMs,它的核心理念是为各种LLMs提供通用的接口,降低开发者的学习成本,方便开发者快速地开发复杂的LLMs应用。LangChain目前有pythonnodejs 两种版本实现,python 支持的能力较多,下面的功能演示都是基于 Python 进行的。

LangChain 中主要支持的组件如下所述:

  • Models:各种类型的模型和模型集成,比如OpenAIChatGPT
  • Prompts:提示管理、提示优化和提示序列化,通过提示微调模型的语义理解。
  • Memory:用来保存和模型交互时的上下文状态。
  • Indexes:用来结构化文档,以便和模型交互。
  • Chains:一系列对各种组件的调用。
  • Agents:决定模型采取哪些行动,执行并且观察流程,直到完成为止。

例如:使用原生的方式调用 OpenAI 如下:

pip install openai -i https://pypi.tuna.tsinghua.edu.cn/simple
import openai
import osopenai.api_key = os.environ["OPENAI_API_KEY"]
messages = [{"role": "user", "content": "介绍下 ChatGPT "}]
response = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=messages,temperature=0,
)print("LLM 返回:", response.choices[0].message["content"])

在这里插入图片描述

现在使用 LangChain 的话就可以使用下面方式:

pip install langchain[all] -i https://pypi.tuna.tsinghua.edu.cn/simple
from langchain.llms import OpenAI
import osopenai_api_key=os.environ["OPENAI_API_KEY"]
llm = OpenAI(model_name="gpt-3.5-turbo", openai_api_key=openai_api_key)
my_text = "介绍下 ChatGPT "
print(llm(my_text))

在这里插入图片描述

下面是基于 LangChain 构建聊天功能:

from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage, AIMessage
import osopenai_api_key=os.environ["OPENAI_API_KEY"]
chat = ChatOpenAI(temperature=1, openai_api_key=openai_api_key)
res =  chat([# 系统语言SystemMessage(content="你是一个智能导游,根据用户描述的地方,回答该地放的特色"),# 人类语言HumanMessage(content="江苏南京")]
)
print(res)

在这里插入图片描述

从上面的案例可以感受出 LangChain 的简易性,更详细的介绍可以参考下面官方文档:

https://python.langchain.com/docs/get_started/quickstart

中文文档地址:

https://www.langchain.com.cn/

下面对常用的 LangChain 组件进行使用介绍:

二、Prompts 提示管理

使用文本提示的方式,微调模型的语义理解,给出更加准确的信息。

2.1 PromptTemplate 提示模板

PromptTemplate 可以生成文本模版,通过变量参数的形式拼接成完整的语句。

from langchain.llms import OpenAI
from langchain import PromptTemplate
import osopenai_api_key = os.environ["OPENAI_API_KEY"]# 使用 openAi 模型
llm = OpenAI(model_name="gpt-3.5-turbo", openai_api_key=openai_api_key)# 模版格式
template = "我像吃{value}。我应该怎么做出来?"
# 构建模版
prompt = PromptTemplate(input_variables=["value"],template=template,
)
# 模版生成内容
final_prompt = prompt.format(value='鱼香肉丝')print("输入内容::", final_prompt)
print("LLM输出:", llm(final_prompt))

在这里插入图片描述

2.2 FewShotPromptTemplate 选择器示例

将提示的示例内容同样拼接到语句中,让模型去理解语义含义进而给出结果。

from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
from langchain.llms import OpenAI
import os## prompt  选择器示例
openai_api_key = os.environ["OPENAI_API_KEY"]llm = OpenAI(model_name="gpt-3.5-turbo", openai_api_key=openai_api_key)example_prompt = PromptTemplate(input_variables=["input", "output"],template="示例输入:{input}, 示例输出:{output}",
)# 这是可供选择的示例列表
examples = [{"input": "飞行员", "output": "飞机"},{"input": "驾驶员", "output": "汽车"},{"input": "厨师", "output": "厨房"},{"input": "空姐", "output": "飞机"},
]# 根据语义选择与您的输入相似的示例
example_selector = SemanticSimilarityExampleSelector.from_examples(examples,# 生成用于测量语义相似性的嵌入的嵌入类。OpenAIEmbeddings(openai_api_key=openai_api_key),# 存储词向量FAISS,# 生成的示例数k=4
)
# 选择器示例 prompt
similar_prompt = FewShotPromptTemplate(example_selector=example_selector,example_prompt=example_prompt,# 加到提示顶部和底部的提示项prefix="根据下面示例,写出输出",suffix="输入:{value},输出:",# 输入变量input_variables=["value"],
)value = "学生"
# 模版生成内容
final_prompt = similar_prompt.format(value=value)print("输入内容::", final_prompt)
print("LLM输出:", llm(final_prompt))

在这里插入图片描述

2.3 ChatPromptTemplate 聊天提示模版

以聊天消息作为输入生成完整提示模版。

from langchain.schema import HumanMessage
from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
# 我们将使用聊天模型,默认为 gpt-3.5-turbo
from langchain.chat_models import ChatOpenAI
# 解析输出并取回结构化数据
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
import osopenai_api_key = os.environ["OPENAI_API_KEY"]
chat_model = ChatOpenAI(temperature=0, model_name='gpt-3.5-turbo', openai_api_key=openai_api_key)prompt = ChatPromptTemplate(messages=[HumanMessagePromptTemplate.from_template("根据用户内容,提取出公司名称和地域名, 用用户内容: {user_prompt}")],input_variables=["user_prompt"]
)user_prompt = "阿里巴巴公司在江苏南京有分公司吗"
fruit_query = prompt.format_prompt(user_prompt=user_prompt)
print('输入内容:', fruit_query.messages[0].content)fruit_output = chat_model(fruit_query.to_messages())
print('LLM 输出:', fruit_output)

在这里插入图片描述

2.4 StructuredOutputParser 输出解析器

要使 LLM 模型返回我们需要的格式,可以直接告诉 LLM 你想要的结果格式,也可以通过 解析器来制定:

PromptTemplate + StructuredOutputParser

from langchain.output_parsers import StructuredOutputParser, ResponseSchema
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate, PromptTemplate
from langchain.llms import OpenAI
import osopenai_api_key = os.environ["OPENAI_API_KEY"]llm = OpenAI(model_name="text-davinci-003", openai_api_key=openai_api_key)
# 定义结构
response_schemas = [ResponseSchema(name="company", description="提取的公司名"),ResponseSchema(name="area", description="提取的地域名")
]
# 解析输出结构
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
format_instructions = output_parser.get_format_instructions()
print('格式化的提示模板', format_instructions)template = """
根据用户内容,提取出公司名称和地域名
{format_instructions}
% 用户输入:
{value}
"""
prompt = PromptTemplate(input_variables=["value"],partial_variables={"format_instructions": format_instructions},template=template
)
final_prompt = prompt.format(value="阿里巴巴公司在江苏南京有分公司吗")print("输入内容::", final_prompt)
print("LLM输出:", llm(final_prompt))

在这里插入图片描述

PromptTemplate + ChatPromptTemplate

from langchain.schema import HumanMessage
from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
# 我们将使用聊天模型,默认为 gpt-3.5-turbo
from langchain.chat_models import ChatOpenAI
# 解析输出并取回结构化数据
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
import osopenai_api_key = os.environ["OPENAI_API_KEY"]
chat_model = ChatOpenAI(temperature=0, model_name='gpt-3.5-turbo', openai_api_key=openai_api_key)response_schemas = [ResponseSchema(name="company", description="提取的公司名"),ResponseSchema(name="area", description="提取的地域名")
]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
format_instructions = output_parser.get_format_instructions()
print(format_instructions)prompt = ChatPromptTemplate(messages=[HumanMessagePromptTemplate.from_template("根据用户内容,提取出公司名称和地域名 {format_instructions}, 用户输入: {value}")],input_variables=["value"],partial_variables={"format_instructions": format_instructions}
)fruit_query = prompt.format_prompt(value="阿里巴巴公司在江苏南京有分公司吗")
print (fruit_query.messages[0].content)fruit_output = chat_model(fruit_query.to_messages())
output = output_parser.parse(fruit_output.content)
print (output)

在这里插入图片描述

三、文件载入 和 Embeddings 文本向量化

例如有如下文本文件:

`LangChain` 是一个开发由语言模型`LLMs`驱动的应用程序的框架,它允许用户围绕大型语言模型快速构建应用程序和管道。 可以直接与 `OpenAI` 的 `GPT` 模型以及 `Hugging Face` 集成。通过 `langChain` 可快速构建聊天机器人、生成式问答(`GQA`)、本文摘要等应用场景。`LangChain`本身并不开发`LLMs`,它的核心理念是为各种`LLMs`提供通用的接口,降低开发者的学习成本,方便开发者快速地开发复杂的`LLMs`应用。`LangChain`目前有两个`python` 和 `nodejs` 两种版本实现,`python`  支持的能力较多,下面都基于 `Python` 演示其部分功能。`LangChain` 中主要支持的组件有如下:- `Models`:各种类型的模型和模型集成,比如`OpenAI` 的 `ChatGPT`。
- `Prompts`:提示管理、提示优化和提示序列化,通过提示微调模型的语义理解。
- `Memory`:用来保存和模型交互时的上下文状态。
- `Indexes`:用来结构化文档,以便和模型交互。
- `Chains`:一系列对各种组件的调用。
- `Agents`:决定模型采取哪些行动,执行并且观察流程,直到完成为止。

3.1 文件加载与分割

自己进行文件的加载,然后对字符串进行分割:

from langchain.text_splitter import RecursiveCharacterTextSplitterwith open('data/test.txt', 'r', encoding="utf-8") as f:value = f.read()# 文本分割器
text_splitter = RecursiveCharacterTextSplitter(chunk_size=300,chunk_overlap=100,
)
# 创建文档
texts = text_splitter.create_documents([value])
print("文档数:", len(texts))# 拆分后的文档
for doc in texts:print(doc)

在这里插入图片描述

使用文本加载器,加载文本:

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import TextLoader# 使用文本加载器
loader = TextLoader('data/test.txt', encoding="utf-8")
documents = loader.load()# 文本分割器
text_splitter = RecursiveCharacterTextSplitter(chunk_size=300,chunk_overlap=100,
)
# 分割文档
texts = text_splitter.split_documents(documents)
print("文档数:", len(texts))# 拆分后的文档
for doc in texts:print(doc)

3.2 Embeddings 文本向量化

文本向量化,可以计算出文本的相似性:

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.document_loaders import TextLoader
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
import osopenai_api_key=os.environ["OPENAI_API_KEY"]
# 使用文本加载器
loader = TextLoader('data/test.txt', encoding="utf-8")
documents = loader.load()# 文本分割器
text_splitter = RecursiveCharacterTextSplitter(chunk_size=300,chunk_overlap=100,
)
# 分割文档
texts = text_splitter.split_documents(documents)
print("文档数:", len(texts))
# 拆分后的文档
for doc in texts:print(doc)
# 准备嵌入引擎
embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
# 向量化
# 会对 OpenAI 进行 API 调用
db = FAISS.from_documents(texts, embeddings)
# 初始化检索器
retriever = db.as_retriever()
# 根据语义获取最相近的文档
docs = retriever.get_relevant_documents("介绍下什么是 langchain ?")
print('结果:', docs)

在这里插入图片描述

四、memory 多轮对话

对于聊天应用中,记录聊天的记录给到模型可以回答出更加准确的回答,最前面第一点介绍的案例只有一个简单的问答,如果是多轮对话就可以修改为如下格式:

from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage, AIMessage
import osopenai_api_key=os.environ["OPENAI_API_KEY"]
chat = ChatOpenAI(temperature=0.7, openai_api_key=openai_api_key)
## 多轮对话
res = chat([SystemMessage(content="你是一个很好的 AI 机器人,可以帮助用户在一个简短的句子中找出去哪里旅行"),HumanMessage(content="我喜欢海滩,我应该去哪里?"),AIMessage(content="你应该去广东深圳"),HumanMessage(content="当我在那里时我还应该做什么?")]
)
print('多轮对话', res)

在这里插入图片描述

还可以基于 Memory 组件中的 ChatMessageHistory

from langchain.memory import ChatMessageHistory
from langchain.chat_models import ChatOpenAI
import osopenai_api_key=os.environ["OPENAI_API_KEY"]
chat = ChatOpenAI(temperature=0, openai_api_key=openai_api_key)# 声明历史
history = ChatMessageHistory()
history.add_user_message("你是一个很好的 AI 机器人,可以帮助用户在一个简短的句子中找出去哪里旅行")
history.add_user_message("我喜欢海滩,我应该去哪里?")
# 添加AI语言
history.add_ai_message("你应该去广东深圳")
# 添加人类语言
history.add_user_message("当我在那里时我还应该做什么?")print('history信息:', history.messages)
# 调用模型
ai_response = chat(history.messages)
print('结果', ai_response)# 继续添加 AI 语言
history.add_ai_message(ai_response.content)
print('history信息:', history.messages)# 继续添加人类语言
history.add_user_message("推荐下美食和购物场所")
ai_response = chat(history.messages)
print('结果', ai_response)

在这里插入图片描述

五、chain 顺序链

5.1 简单顺序链

可以使用 LLM 的输出作为另一个 LLM 的输入。有利于任务的分解:

from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.chains import SimpleSequentialChain
import osopenai_api_key = os.environ["OPENAI_API_KEY"]
llm = OpenAI(temperature=1, openai_api_key=openai_api_key)# 第一个链模版内容
template1 = "根据用户的输入的描述推荐一个适合的地区,用户输入: {value}"
prompt_template1 = PromptTemplate(input_variables=["value"], template=template1)
# 构建第一个链
chain1 = LLMChain(llm=llm, prompt=prompt_template1)# 第二个链模版内容
template2 = "根据用户的输入的地区推荐该地区的美食,用户输入: {value}"
prompt_template2 = PromptTemplate(input_variables=["value"], template=template2)
# 构建第二个链
chain2 = LLMChain(llm=llm, prompt=prompt_template2)# 将链组装起来
overall_chain = SimpleSequentialChain(chains=[chain1, chain2], verbose=True)# 运行链
review = overall_chain.run("我想在中国看大海")
print('结果:', review)

在这里插入图片描述

5.2 总结链

有时候对于大量的文本内容进行摘要总结,可能无法一次性加载进来,此时可借助总结链进行总结:

from langchain.chains.summarize import load_summarize_chain
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.llms import OpenAI
import osopenai_api_key = os.environ["OPENAI_API_KEY"]loader = TextLoader('data/test.txt',encoding="utf-8")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=700, chunk_overlap=50)
texts = text_splitter.split_documents(documents)llm = OpenAI(temperature=1, openai_api_key=openai_api_key)
chain = load_summarize_chain(llm, chain_type="map_reduce", verbose=True)
review = chain.run(texts)
print('结果:',review)

六、问答

通过本地知识库微调模型,回答出更加准确的信息。

from langchain import OpenAI
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
import osopenai_api_key = os.environ["OPENAI_API_KEY"]
llm = OpenAI(temperature=0, openai_api_key=openai_api_key)loader = TextLoader('./data/test.txt',encoding="utf-8")
doc = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=400)
docs = text_splitter.split_documents(doc)
# 嵌入引擎
embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
# 词向量
docsearch = FAISS.from_documents(docs, embeddings)
# 创建检索引擎
qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=docsearch.as_retriever())res = qa.run("介绍下什么是 langchain ")print(res)

在这里插入图片描述

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

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

相关文章

第一代AIGC硬件悄然爆发

文 | 智能相对论 作者 | 叶远风 看起来,这可能是一副正常的黑框眼镜,你戴上去彬彬有礼、斯斯文文; 实际上,它里边还装了一个“小伙伴”,你随时可以与它交流,谈天说地或者提出各种问题接受它的帮助&#x…

chatgpt赋能python:小黑框:Python程序员必备利器

小黑框:Python程序员必备利器 如果您是一名Python程序员,小黑框(Terminal)一定不陌生。小黑框是一种基于文本的用户界面,通常用于执行命令行任务,编写或调试代码等。Python程序员可以通过小黑框完成许多任…

游戏开发中防外挂的那些事儿

对于一个要上线的游戏,防外挂是必须的,历史上因为外挂而造成大量玩家流失的游戏数不胜数。随着游戏研发技术的发展,对外挂的预防业内其实做的已经越来越好了。下面总结一下防外挂的基础知识,以及我们的移动模块为防外挂做了哪些工…

游戏反外挂技术原理讲解

永远在路上 没有破解不了的反外挂系统,反外挂是一个对抗过程,需要不断升级。我们反外挂小组会采取对抗方式提升防御,也会研究竞品来获取灵感。反外挂也是非常有意思的,可以学到很多很多底层知识。 善战者无赫赫之功 反外挂&#x…

各网游的外挂是如何做出来的?

每一个致力于学习黑客技术的人,最后都分为三种人。 第一种:入侵,各种入侵,玩的就是入侵的快感,或者恶作剧的喜感,或者那种有特殊“窥视”癖好的人……别误会,小编我是喜欢“恶作剧,…

干货!什么是游戏外挂,外挂的种类及实现原理

外挂,原指一切用来破坏游戏程序正常游戏数据和逻辑的工具或破解版。比如可以修改游戏内存数据的修改器,又比如可以修改网络数据包的抓包工具。这类外挂或多或少会影响游戏的内存数据、文件数据、网络数据,甚至代码逻辑。 但随着外挂市场的发…

游戏外挂怎么做?

文章目录 1.什么是游戏外挂2.外挂的分类及实现原理2.1 辅助类外挂2.2 专用插件类外挂2.3 通用工具2.4 内存修改器2.5 变速器2.6 按键精灵2.7 模拟器2.8 破解版 转载自:Anti-Cheat Expert 游戏安全专家 干货!什么是游戏外挂,外挂的种类及实现原…

哈夫曼树 例题

假设某棵二叉树有N个叶结点。给定这些叶结点的权值,求所有可能的二叉树中带权路径长度(WPL)的最小值。 注: 结点的带权路径长度(WPL):结点的权值乘以该结点的深度(假设根节点的深度…

svn更新/提交代码提示错误 , 进行清理下“破除写锁操作“

1.如果svn提交或者更新代码有--进行清理下"破除写锁操作"--此提示,一般情况下右键,然后选择进行确定就可以 2.如果还不行的话,在项目下的 .svn 文件夹里面新建文件夹,命名为tmp,然后重新更新,提交,就会发现问题解决了

2022年深圳杯数学建模A题代码思路-- 破除“尖叫效应”与“回声室效应”,走出“信息茧房”

问题重述: 在全新的信息传播格局下,如何破除“尖叫效应”与“回声室效应”,走出“信息茧房”,是当前迫切需要解决的现实问题,即如何从信息传输的顶层设计、推荐算法的公平性和广大网络用户的责任担当等方面&#xff0…

钉钉最新点赞破除限制方法(

我不是标题党! 首先,放图片((( 时间这里是录视频的时间,2021-8-27,不是标题党! 上方法! 主要原理:利用抓包抓到的点赞api端口,实现持续点击或…

亚马逊云科技 Build On -Serverless低代码平台初体验-快速完成vue前端订单小程序

文章目录 一、我所认识的低代码平台二、Serverless的使用场景三、拖拉跩实现build on 的Serverless1. 使用图像界面创作方法2. 拖拉跩模块实现搭建3. 实时测试流程是否正确4. 最终的设计和流程图 四、创建端到端的基于vue的前端图形化界面六、总结与活动链接 一、我所认识的低代…

一小段Python代码,破解加密zip文件的密码

Python 有一个内置模块 zipfile 可以解压 zip 压缩包。先来测试一波:创建一个测试文件,压缩,设置解压密码为123。 import zipfile# 创建文件句柄 file zipfile.ZipFile("测试.zip", r) # 提取压缩文件中的内容,注意密码…

开源治理工具选一个

随着开源技术在云计算、大数据、AI领域的不断运用,不断破除技术壁垒,让企业快速建立自身的应用,在开源软件基础一,自主研发部分代码,便可以推出企业自身品牌的产品,开源技术的应用极大的推动了云计算、大数…

机器人微控制器编程(CoCube)-破除定势

从课程到生活; 从书本到理想; 从程序到生态; 从个体到集群; 从特殊到一般; 从传统到现代; 从技术到科学; 从理论到工程; 从基础到高阶。 …… 课程归根结底,是为学生服务…

复制浏览器html代码吗,网页文字不能直接复制?只需简单几招即可轻松破除限制,想学吗?...

原标题:网页文字不能直接复制?只需简单几招即可轻松破除限制,想学吗? 想必大家在网上都遇到这样的问题,网页文字受到限制无法直接复制,这该如何是好呢? 既不想登录注册又想直接复制走内容&#…

LR低代码快速开发平台 高效调整企业组织架构

组织架构以及围绕组织架构的设计、实施和变革,是企业管理永恒的话题,它上承公司的业务战略和运营模式,下接业务流程和信息系统建设,重要性不言而喻。数字化变革浪潮之下,商业模式的颠覆、价值链的重塑都需要由相匹配的…

自己动手写编译器:通过语法编译构建语法树并实现中间代码生成

上一节我们手动构造了语法树,然后调用各个节点实现中间代码生成。语法树的构建由语法解析完成,本节我们要完成语法解析逻辑,在语法解析过程中构造语法树,然后再像上一节那样实现中间代码生成。 这里我们再次回顾一下左递归&#…

安卓原神QQ机器人搭建教程

1,下载安装Termux 下载地址:https://f-droid.org/packages/com.termux/ 滑到下面点击这个 2,打开Termux,安装Ubuntu 安装模拟权限git,python,执行下面命令 pkg install proot git python -y 3&#xff…

如何在windows电脑上完成原神签到、祈愿抽卡分析等功能

一款开源的游戏辅助工具——原神助手。支持原神签到、祈愿抽卡分析、查看便签状态和游戏详细数据等。 开发者自述也是偶然间接触到《原神》,于是一发不可收拾,爱上这款游戏了。 在游戏中,如果要查看角色信息等内容,就必须需要登…