大模型应用框架-LangChain(一)

简介: LangChain由 Harrison Chase 创建于2022年10月,它是围绕LLMs(大语言模型)建立的一个框架,LLMs使用机器学习算法和海量数据来分析和理解自然语言,GPT3.5、GPT4是LLMs最先进的代表,国内百度的文心一言、阿里的通义千问也属于LLMs。LangChain自身并不开发LLMs,它的核心理念是为各种LLMs实现通用的接口,把LLMs相关的组件“链接”在一起,简化LLMs应用的开发难度,方便开发者快速地开发复杂的LLMs应用。LangChain目前有两个语言的实现:python、nodejs。

LangChain的介绍和入门

💥 什么是LangChain

LangChain由 Harrison Chase 创建于2022年10月,它是围绕LLMs(大语言模型)建立的一个框架,LLMs使用机器学习算法和海量数据来分析和理解自然语言,GPT3.5、GPT4是LLMs最先进的代表,国内百度的文心一言、阿里的通义千问也属于LLMs。LangChain自身并不开发LLMs,它的核心理念是为各种LLMs实现通用的接口,把LLMs相关的组件“链接”在一起,简化LLMs应用的开发难度,方便开发者快速地开发复杂的LLMs应用。

LangChain目前有两个语言的实现:python、nodejs。

我们从两个方面全面介绍LangChain:一个是LangChain组件的基本概念和应用;另一个是LangChain常见的使用场景。

参考官网介绍:https://python.langchain.com/docs/integrations/text_embedding/huggingfacehub

2 LangChain主要组件

一个LangChain的应用是需要多个组件共同实现的,LangChain主要支持6种组件:

  • Models:模型,各种类型的模型和模型集成,比如GPT-4
  • Prompts:提示,包括提示管理、提示优化和提示序列化
  • Memory:记忆,用来保存和模型交互时的上下文状态
  • Indexes:索引,用来结构化文档,以便和模型交互
  • Chains:链,一系列对各种组件的调用
  • Agents:代理,决定模型采取哪些行动,执行并且观察流程,直到完成为止
2.1 Models

现在市面上的模型多如牛毛,各种各样的模型不断出现,LangChain模型组件提供了与各种模型的集成,并为所有模型提供一个精简的统一接口。

LangChain目前支持三种类型的模型:LLMs、Chat Models(聊天模型)、Embeddings Models(嵌入模型).

  • LLMs: 大语言模型接收文本字符作为输入,返回的也是文本字符.

  • 聊天模型: 基于LLMs, 不同的是它接收聊天消(一种特定格式的数据)作为输入,返回的也是聊天消息.

  • 文本嵌入模型: 文本嵌入模型接收文本作为输入, 返回的是浮点数列表.

LangChain支持的三类模型,它们的使用场景不同,输入和输出不同,开发者需要根据项目需要选择相应。

2.1.1 LLMs (大语言模型)

LLMs使用场景最多,常用大模型的下载库:https://huggingface.co/models

接下来我们以「文心一言」模型为例, 使用该类模型的组件:

  • 第一步:安装必备的工具包:langchain和openai
pip install openai==0.28
pip install langchain
pip install qianfan

注意,在使用openai模型之前,必须开通OpenAI API服务,需要获得API Token。

  • 第二步:借助百度智能云–千帆大模型平台:申请API Key 以及Secret Key

      想请见附件手册
    
  • 第三部:代码实现

import os
from langchain.llms import QianfanLLMEndpoint

os.environ['QIANFAN_AK'] = "SPPejIX4r2mEUdjdkVNwxTHc"
os.environ['QIANFAN_SK'] = "hOGdXomPZu8FRL51dkBZrEee4tqaS6PM"

llm = QianfanLLMEndpoint(streaming=True, model="ERNIE-Bot-turbo")
res = llm("帮我讲个笑话吧")
print(res)
##打印结果:
当然可以!这是一个有趣的笑话:

有一天,一只小鸟飞到一栋大房子前,大声喊道:“卖报!卖报!”可是没有人回应。它继续喊道:“嘿,有人在吗?卖报!”这次还是没有人回应。小鸟想了想,于是说:“对不起,打扰了!我只是想知道,这里有人想买天堂吗?”听到这个笑话,我希望你也能开心起来!
2.1.2 Chat Models (聊天模型)

聊天消息包含下面几种类型,使用时需要按照约定传入合适的值:

  • AIMessage: 就是 AI 输出的消息,可以是针对问题的回答.
  • HumanMessage: 人类消息就是用户信息,由人给出的信息发送给LLMs的提示信息,比如“实现一个快速排序方法”.
  • SystemMessage: 可以用于指定模型具体所处的环境和背景,如角色扮演等。你可以在这里给出具体的指示,比如“作为一个代码专家”,或者“返回json格式”.
  • ChatMessage: Chat 消息可以接受任意角色的参数,但是在大多数时间,我们应该使用上面的三种类型.

LangChain支持的常见聊天模型有:

模型描述
ChatOpenAIOpenAI聊天模型
AzureChatOpenAIAzure提供的OpenAI聊天模型
PromptLayerChatOpenAI基于OpenAI的提示模版平台

举例说明:

import  os
from langchain.chat_models import QianfanChatEndpoint
from langchain.chat_models.base import HumanMessage


os.environ['QIANFAN_AK'] = "SPPejIX4r2mEUdjdkVNwxTHc"
os.environ['QIANFAN_SK'] = "hOGdXomPZu8FRL51dkBZrEee4tqaS6PM"


chat = QianfanChatEndpoint(
    streaming=True,model="ERNIE-Bot-turbo"

)
messages = [
        HumanMessage(content="给我写一首唐诗")
]
res = chat(messages)
print(res)
# 打印结果:
'''
content='好的,以下是我为您创作的唐诗:\n\n青山依旧在,几度夕阳红。\n白发渔樵江渚上,惯看秋月春风。\n一壶浊酒喜相逢,古今多少事,都付笑谈中。'
'''
2.1.3 提示模板

在上面的例子中,模型默认是返回纯文本结果的,如果想让模型返回想要的数据格式(比如json格式),可以使用提示模版。

提示模板就是把一些常见的提示整理成模板,用户只需要修改模板中特定的词语,就能快速准确地告诉模型自己的需求。我们看个例子:

import  os
from langchain.chat_models import QianfanChatEndpoint
from langchain.prompts import ChatPromptTemplate

os.environ['QIANFAN_AK'] = "SPPejIX4r2mEUdjdkVNwxTHc"
os.environ['QIANFAN_SK'] = "hOGdXomPZu8FRL51dkBZrEee4tqaS6PM"



# 创建原始模板
template_str = """您是一位专业的鲜花店文案撰写员。\n
对于售价为 {price} 元的 {flower_name} ,您能提供一个吸引人的简短描述吗?
注意: 文字不要超过50个字符 """
# 根据原始模板创建LangChain提示模板
promp_emplate = ChatPromptTemplate.from_template(template_str)
prompt = promp_emplate.format_messages(flower_name=["玫瑰"], price='50')


print('prompt-->', prompt)
# prompt显示:
'''
prompt--> [HumanMessage(content="您是一位专业的鲜花店文案撰写员。\n\n对于售价为 50 元的 ['玫瑰'] ,您能提供一个吸引人的简短描述吗?\n注意: 文字不要超过50个字符\n# ")]
'''

# 实例化模型
chat = QianfanChatEndpoint(
    streaming=True,model="ERNIE-Bot-turbo"

)
# 打印结果
result = chat(prompt)
print(result)
# 结果展示:
'''
content='玫瑰鲜花 售价50元\n纯手工编织花束,顶级玫瑰品种\n散发浓郁香气,温暖人心扉\n白色或粉红色,娇艳欲滴\n让爱情与浪漫伴随你每一天!#'

'''
2.1.4 Embeddings Models(嵌入模型)

Embeddings Models特点:将字符串作为输入,返回一个浮动数的列表。在NLP中,Embedding的作用就是将数据进行文本向量化。

Embeddings Models可以为文本创建向量映射,这样就能在向量空间里去考虑文本,执行诸如语义搜索之类的操作,比如说寻找相似的文本片段。

接下来我们以一个OpenAI文本嵌入模型的例子进行说明:

import  os
from langchain.embeddings import QianfanEmbeddingsEndpoint

os.environ['QIANFAN_AK'] = "SPPejIX4r2mEUdjdkVNwxTHc"
os.environ['QIANFAN_SK'] = "hOGdXomPZu8FRL51dkBZrEee4tqaS6PM"

embed = QianfanEmbeddingsEndpoint()
res1 = embed.embed_query('这是第一个测试文档')
print(res1)
# 打印结果:
'''
[0.039765920490026474, 0.02263435162603855, -0.01889650709927082, ...., 
'''
res2 = embed.embed_documents(['这是第一个测试文档', '这是第二个测试文档'])
print(res2)
# 打印结果:
'''
[[0.03977284952998161, 0.022625437006354332, -0.01892162673175335, ...., 
'''

上述代码中,我们分别使用了两种方法来进行文本的向量表示,他们最大不同在于:embed_query()接收一个字符串的输入,而embed_documents可以接收一组字符串。

LangChain集成的文本嵌入模型有:

  • AzureOpenAI、Baidu Qianfan、Hugging Face Hub、OpenAI、Llama-cpp、SentenceTransformers
2.2 Prompts

Prompt是指当用户输入信息给模型时加入的提示,这个提示的形式可以是zero-shot或者few-shot等方式,目的是让模型理解更为复杂的业务场景以便更好的解决问题。

提示模板:如果你有了一个起作用的提示,你可能想把它作为一个模板用于解决其他问题,LangChain就提供了PromptTemplates组件,它可以帮助你更方便的构建提示。

zero-shot提示方式:

from langchain import PromptTemplate
from langchain.llms import QianfanLLMEndpoint
import  os
os.environ['QIANFAN_AK'] = "SPPejIX4r2mEUdjdkVNwxTHc"
os.environ['QIANFAN_SK'] = "hOGdXomPZu8FRL51dkBZrEee4tqaS6PM"
# 定义模板
template = "我的邻居姓{lastname},他生了个儿子,给他儿子起个名字"

prompt = PromptTemplate(
    input_variables=["lastname"],
    template=template,
)

prompt_text = prompt.format(lastname="王")
print(prompt_text)
# result: 我的邻居姓王,他生了个儿子,给他儿子起个名字

llm = QianfanLLMEndpoint()

result = llm(prompt_text)
print(result)
# 打印结果:
'''
给邻居的儿子起名字是一件非常棒的事情!在考虑名字时,通常会考虑一些基本的因素,比如名字的含义、读音、书写等。以下是一些建议:

如果您想要一个简单的名字,那么可以考虑王煦宇。这个名字寓意着阳光和宽广的宇宙,表示孩子应该像太阳一样温暖、明朗,又如宇宙般宽广包容。

另一个选择是王谦嘉。这个名字意为谦虚、高尚,同时也表示嘉奖和庆祝。如果邻居有特别期望他的儿子将来成为有道德、有修养的人,这个名字可能是一个不错的选择。

当然,这只是一些建议,最终的决定应该基于王先生的个人喜好和期望。请确保名字易于书写和发音,并且与您和邻居的姓氏搭配得当。祝王先生和他的儿子一切顺利!

'''

few-shot提示方式:

from langchain import PromptTemplate, FewShotPromptTemplate
from langchain.llms import QianfanLLMEndpoint
import  os
os.environ['QIANFAN_AK'] = "SPPejIX4r2mEUdjdkVNwxTHc"
os.environ['QIANFAN_SK'] = "hOGdXomPZu8FRL51dkBZrEee4tqaS6PM"

examples = [
    {"word": "开心", "antonym": "难过"},
    {"word": "高", "antonym": "矮"},
]

example_template = """
单词: {word}
反义词: {antonym}\n
"""

example_prompt = PromptTemplate(
    input_variables=["word", "antonym"],
    template=example_template,
)

few_shot_prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    prefix="给出每个单词的反义词",
    suffix="单词: {input}\n反义词:",
    input_variables=["input"],
    example_separator="\n",
)

prompt_text = few_shot_prompt.format(input="粗")
print(prompt_text)
print('*'*80)
# 给出每个单词的反义词
# 单词: 开心
# 反义词: 难过

# 单词: 高
# 反义词: 矮

# 单词: 粗
# 反义词:

# 调用OpenAI
llm = QianfanLLMEndpoint(temperature=0.9)
print(llm(prompt_text))

# 细
2.3 Chains(链)

在LangChain中,Chains描述了将LLM与其他组件结合起来完成一个应用程序的过程.

针对上一小节的提示模版例子,zero-shot里面,我们可以用链来连接提示模版组件和模型,进而可以实现代码的更改:

from langchain import PromptTemplate
from langchain.llms import QianfanLLMEndpoint
from langchain.chains import LLMChain
import  os
os.environ['QIANFAN_AK'] = "SPPejIX4r2mEUdjdkVNwxTHc"
os.environ['QIANFAN_SK'] = "hOGdXomPZu8FRL51dkBZrEee4tqaS6PM"
# 定义模板
template = "我的邻居姓{lastname},他生了个儿子,给他儿子起个名字"

prompt = PromptTemplate(
    input_variables=["lastname"],
    template=template,
)
llm = QianfanLLMEndpoint()

chain = LLMChain(llm = llm,
                  prompt = prompt)
# 执行链
print(chain.run("王"))
# 打印结果
'''
给邻居家的新生儿起名字是一件非常重要的事情,需要考虑到很多因素,包括家庭传统、父母的偏好、名字的含义等等。在这个情况下,王先生和太太可能会想要一个既传统又具有现代感的名字。

基于这些考虑,以下是一些适合男孩的名字:

1. 王梓轩(Zi Xuan):这个名字既有传统的含义(梓是树木的意思,轩是高远的意思),又具有现代感。
2. 王宇翔(Yu Xiang):这个名字既包含了宇宙的含义(宇是宇宙的意思,翔是飞翔的意思),又有希望他儿子能像鸟儿一样自由飞翔的寓意。
3. 王宇轩(Yu Xuan):这个名字也有同样的含义,而且也有一种稳重和宽广的感觉。
4. 王博远(Bo Yuan):这个名字的含义是博学而远志,既体现了父母的期望,又有一种清新明快的感觉。

请注意,在选择名字时,还需要考虑名字在社区中的受欢迎程度,以确保这个名字不会引起任何问题或误解。此外,如果王先生和太太有任何特定的偏好或期望,他们也应该在这个过程中发挥重要作用。

以上就是我为王先生的儿子提出的一些名字建议,希望能帮助到你们。
'''

如果你想将第一个模型输出的结果,直接作为第二个模型的输入,还可以使用LangChain的SimpleSequentialChain, 代码如下:

from langchain import PromptTemplate
from langchain.llms import QianfanLLMEndpoint
from langchain.chains import LLMChain, SimpleSequentialChain
import  os
os.environ['QIANFAN_AK'] = "SPPejIX4r2mEUdjdkVNwxTHc"
os.environ['QIANFAN_SK'] = "hOGdXomPZu8FRL51dkBZrEee4tqaS6PM"

# 创建第一条链
template = "我的邻居姓{lastname},他生了个儿子,给他儿子起个名字"

first_prompt = PromptTemplate(
    input_variables=["lastname"],
    template=template,
)
llm = QianfanLLMEndpoint(temperature=0.9)

first_chain = LLMChain(llm = llm, prompt = first_prompt)

# 创建第二条链
second_prompt = PromptTemplate(
    input_variables=["child_name"],
    template="邻居的儿子名字叫{child_name},给他起一个小名",
)

second_chain = LLMChain(llm=llm, prompt=second_prompt)


# 链接两条链
# verbose=True可以显示推理过程
overall_chain = SimpleSequentialChain(chains=[first_chain, second_chain], verbose=True)

print(overall_chain)
# 执行链,只需要传入第一个参数
catchphrase = overall_chain.run("王")
print(catchphrase)
#
'''
当然,给邻居的孩子起小名也是一个很好的方式,可以更加亲近和亲切。考虑到上述名字的含义和音韵,以下是一些小名的建议:

1. 梓轩宝宝:对应“王梓轩”这个名字,可以叫他“宝宝”,表示亲切和喜爱。
2. 宇帆小子:对应“王宇帆”这个名字,可以叫他“小子”,显得活泼可爱。
3. 瑞阳小宝:对应“王瑞阳”这个名字,可以叫他“小宝”,显得亲切温暖。
4. 博文宝贝:对应“王博文”这个名字,可以叫他“宝贝”,表示对他的喜爱和呵护。
5. 浩宇小星:对应“王浩宇”这个名字,可以叫他“小星”,显得充满活力和希望。
'''

如何系统的去学习AI大模型LLM ?

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来

所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~

👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

在这里插入图片描述

四、AI大模型商业化落地方案

img

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。
  • 内容
    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
      - L1.4.1 知识大模型
      - L1.4.2 生产大模型
      - L1.4.3 模型工程方法论
      - L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
  • 内容
    • L2.1 API接口
      - L2.1.1 OpenAI API接口
      - L2.1.2 Python接口接入
      - L2.1.3 BOT工具类框架
      - L2.1.4 代码示例
    • L2.2 Prompt框架
      - L2.2.1 什么是Prompt
      - L2.2.2 Prompt框架应用现状
      - L2.2.3 基于GPTAS的Prompt框架
      - L2.2.4 Prompt框架与Thought
      - L2.2.5 Prompt框架与提示词
    • L2.3 流水线工程
      - L2.3.1 流水线工程的概念
      - L2.3.2 流水线工程的优点
      - L2.3.3 流水线工程的应用
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
  • 内容
    • L3.1 Agent模型框架
      - L3.1.1 Agent模型框架的设计理念
      - L3.1.2 Agent模型框架的核心组件
      - L3.1.3 Agent模型框架的实现细节
    • L3.2 MetaGPT
      - L3.2.1 MetaGPT的基本概念
      - L3.2.2 MetaGPT的工作原理
      - L3.2.3 MetaGPT的应用场景
    • L3.3 ChatGLM
      - L3.3.1 ChatGLM的特点
      - L3.3.2 ChatGLM的开发环境
      - L3.3.3 ChatGLM的使用示例
    • L3.4 LLAMA
      - L3.4.1 LLAMA的特点
      - L3.4.2 LLAMA的开发环境
      - L3.4.3 LLAMA的使用示例
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
  • 内容
    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

学习计划:

  • 阶段1:1-2个月,建立AI大模型的基础知识体系。
  • 阶段2:2-3个月,专注于API应用开发能力的提升。
  • 阶段3:3-4个月,深入实践AI大模型的应用架构和私有化部署。
  • 阶段4:4-5个月,专注于高级模型的应用和部署。
这份完整版的所有 ⚡️ 大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

全套 《LLM大模型入门+进阶学习资源包↓↓↓ 获取~

👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈

  • 30
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值