LangChain实战课-2.LangChain系统安装和快速入门

188 阅读7分钟

我正在参加「豆包MarsCode AI练中学体验活动」

1.什么是大语言模型

大语言模型(Large Language Model, LLM)是一种基于深度学习的人工智能模型,专注于自然语言处理(Natural Language Processing, NLP)任务。它们通常基于神经网络,尤其是变换器(Transformer)架构,通过对海量文本数据的训练,学习语言的模式、结构和语义关系。这些模型的目标是生成、理解和处理自然语言。

LangChain 是一个全方位的、基于大语言模型这种预测能力的应用开发工具

2.安装LangChain

  • 课程中以及笔记中的langchain都是0.2的版本

pip install langchain==0.2.16

3.OPENAI API

LangChain本质上就是对各种大模型提供的API的套壳,是为了方便我们使用这些API,搭建起来的一些框架、模块和接口。

简单来说,openai这个python第三方库中提供了很多现成的方法,并且是优先提出来的,很多国内大模型为了方便开发者开发也适应了这种规范,一般来说只需要修改代码中的模型(model)和接口(base_url)等信息,就可以在使用openai的基础上进行快速开发。但是缺点是非OPENAI大模型一般不提供这种开发文档,因此需要回到OPENAI界面去先适应这种开发,然后再调用其他的大语言模型。

3.1ChatModel和TextModel

  • Chat Model,聊天模型,用于产生人类和AI之间的对话,代表模型当然是gpt-3.5-turbo(也就是ChatGPT)和GPT-4。当然,OpenAI还提供其它的版本,gpt-3.5-turbo-0613代表ChatGPT在2023年6月13号的一个快照,而gpt-3.5-turbo-16k则代表这个模型可以接收16K长度的Token,而不是通常的4K。(注意了,gpt-3.5-turbo-16k并未开放给我们使用,而且你传输的字节越多,花钱也越多)
  • Text Model,文本模型,在ChatGPT出来之前,大家都使用这种模型的API来调用GPT-3,文本模型的代表作是text-davinci-003(基于GPT3)。而在这个模型家族中,也有专门训练出来做文本嵌入的text-embedding-ada-002,也有专门做相似度比较的模型,如text-similarity-curie-001。目前这个模型已经不在新版本中支持,也就是说Doubao不支持这种模型,因为OPENAI的Completion接口在2023年7月完成最后一次更新并且废弃,因此这个知识点无用。调用TextMolde的代码已经废弃,这里不作展示。

3.2调用Chat模型

  • 如果对于apikey之类的有问题的可以进入我的主页查看第一个笔记。 image.png
import os
from openai import OpenAI #openai 的版本是1.43.0

os.environ["ARK_API_KEY"] = '' #你的ARK API Key
os.environ["BASE_URL"] = 'https://ark.cn-beijing.volces.com/api/v3' #OpenAI 的 API URL
os.environ["LLM_MODELEND"] = 'ep-20241104131149-csxf9' #你的模型ID


client = OpenAI(
     api_key = os.environ.get("ARK_API_KEY"),
    base_url = os.environ.get("BASE_URL"),
)

response = client.chat.completions.create(
    model=os.environ.get("LLM_MODELEND"),
    messages=[
        {"role": "system", "content": "You are a creative AI."},
        {"role": "user", "content": "请给我的花店起个名"},
    ],
    temperature=0.8,
    max_tokens=600,
)

print(response.choices[0].message.content)

image.png

image.png

message:

消息就是传入模型的提示。此处的messages参数是一个列表,包含了多个消息。每个消息都有一个role(可以是system、user或assistant)和content(消息的内容)。系统消息设定了对话的背景(你是一个很棒的智能助手),然后用户消息提出了具体请求(请给我的花店起个名)。模型的任务是基于这些消息来生成回复。

role:

在OpenAI的Chat模型中,system、user和assistant都是消息的角色。每一种角色都有不同的含义和作用。

  • system:系统消息主要用于设定对话的背景或上下文。这可以帮助模型理解它在对话中的角色和任务。例如,你可以通过系统消息来设定一个场景,让模型知道它是在扮演一个医生、律师或者一个知识丰富的AI助手。系统消息通常在对话开始时给出。
  • user:用户消息是从用户或人类角色发出的。它们通常包含了用户想要模型回答或完成的请求。用户消息可以是一个问题、一段话,或者任何其他用户希望模型响应的内容。
  • assistant:助手消息是模型的回复。例如,在你使用API发送多轮对话中新的对话请求时,可以通过助手消息提供先前对话的上下文。然而,请注意在对话的最后一条消息应始终为用户消息,因为模型总是要回应最后这条用户消息。

在使用Chat模型生成内容后,返回的响应,也就是response会包含一个或多个choices,每个choices都包含一个message。每个message也都包含一个role和content。role可以是system、user或assistant,表示该消息的发送者,content则包含了消息的实际内容。

response对象

{
 'id': 'chatcmpl-2nZI6v1cW9E3Jg4w2Xtoql0M3XHfH',
 'object': 'chat.completion',
 'created': 1677649420,
 'model': 'gpt-4',
 'usage': {'prompt_tokens': 56, 'completion_tokens': 31, 'total_tokens': 87},
 'choices': [
   {
    'message': {
      'role': 'assistant',
      'content': '你的花店可以叫做"花香四溢"。'
     },
    'finish_reason': 'stop',
    'index': 0
   }
  ]
}

image.png

3.3通过LangChain调用Text模型

import os
from langchain_openai import ChatOpenAI

os.environ["ARK_API_KEY"] = '' #你的ARK API Key
os.environ["BASE_URL"] = 'https://ark.cn-beijing.volces.com/api/v3' #OpenAI 的 API URL
os.environ["LLM_MODELEND"] = 'ep-20241104131149-csxf9' #你的模型ID


llm = ChatOpenAI(
    model=os.environ.get("LLM_MODELEND"),
    base_url=os.environ.get("BASE_URL"),
    api_key=os.environ.get("ARK_API_KEY"),
    temperature=0.8,
    max_tokens=600,
)
response = llm.predict("请给我的花店起个名")
print(response)

这只是一个对OpenAI API的简单封装:先导入LangChain的OpenAI类,创建一个LLM(大语言模型)对象,指定使用的模型和一些生成参数。使用创建的LLM对象和消息列表调用OpenAI类的__call__方法,进行文本生成。生成的结果被存储在response变量中。没有什么需要特别解释之处。

3.4通过LangChain调用Chat模型



import os

os.environ["ARK_API_KEY"] = '' #你的ARK API Key
os.environ["BASE_URL"] = 'https://ark.cn-beijing.volces.com/api/v3' #OpenAI 的 API URL
os.environ["LLM_MODELEND"] = 'ep-20241104131149-csxf9' #你的模型ID

from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage

chat = ChatOpenAI(
    model=os.environ.get("LLM_MODELEND"), 
    api_key=os.environ.get("ARK_API_KEY"),
    base_url=os.environ.get("BASE_URL"),
    temperature=0.8, max_tokens=600
)

messages = [
    SystemMessage(content="你是一个很棒的智能助手"),
    HumanMessage(content="请给我的花店起个名"),
]
response = chat(messages)
print(response)

这段代码也不难理解,主要是通过导入LangChain的ChatOpenAI类,创建一个Chat模型对象,指定使用的模型和一些生成参数。然后从LangChain的schema模块中导入LangChain的SystemMessage和HumanMessage类,创建一个消息列表。消息列表中包含了一个系统消息和一个人类消息。你已经知道系统消息通常用来设置一些上下文或者指导AI的行为,人类消息则是要求AI回应的内容。之后,使用创建的chat对象和消息列表调用ChatOpenAI类的__call__方法,进行文本生成。生成的结果被存储在response变量中。

无论是langchain.llms中的OpenAI(Text模型),还是langchain.chat_models中的ChatOpenAI中的ChatOpenAI(Chat模型),其返回的结果response变量的结构,都比直接调用OpenAI API来得简单一些。这是因为,LangChain已经对大语言模型的output进行了解析,只保留了响应中最重要的文字部分。

3.5思考题2--试一试HuggingFace中其他模型

  • 注意HuggingFace需要翻墙,AI练中学的环境中无法访问,因此建议在github的codespace中执行代码
  • 申请token:(实际测试下write权限也是可以拉项目,因此也可以使用writetoken方便读写)

image.png

import os
os.environ['HUGGINGFACEHUB_API_TOKEN'] = 'YOUR_HUGGING_FACE_TOKEN'

from langchain_community.llms import HuggingFaceHub
llm = HuggingFaceHub(repo_id="bigscience/bloom-1b7")
res = llm.predict("请给我的花店起个名")
print(res)

image.png

4.参考链接

  1. LangChain官方文档
  2. OpenAI API 官方文档
  3. HuggingFace 官方网站