LangChain学习笔记之启程篇 | 豆包MarsCode AI刷题

523 阅读10分钟

大语言模型

大语言模型在如今很多人都多少听过,其实,大语言模型就是一种人工智能模型,通常使用深度学习技术,比如神经网络。可以将大语言模型想象为一个巨大的预测机器,其训练过程主要基于”猜词“。【也许还能说成大预言模型呢】

而 LangChian 就是一个全方面的、基于大语言模型这种预测能力的应用开发工具。本质上来说就是对各种大模型提供的API的套壳,是为了方便我们使用这些API,搭建起来的一些框架、模块和接口。

安装LangChian

安装包langchianpip install langchian

除了安装LangChian架构本体,LangChian的使用还需要与各种模型、数据存储库集成,如OpenAI的API接口、开源大模型库HuggingFace Hub、向量数据库等。所以还需要根据需要安装这些库。接下来在需要用到某些库时会给出安装命令。

OpenAI API

OpenAI的模型有很多,具有代表性的两类就是Chat Model和Text Model。

Chat Model

聊天模型,用于产生人类和AI之间的对话,代表模型有GPT-4o和GPT-4。其他版本如gpt-3.5-turbo-0613代表ChatGPT在2023年6月13号的一个快照,而gpt-3.5-turbo-16k则代表这个模型可以接收16K长度的Token,而不是通常的4K。(传输的字节越多,花钱越多)

功能:接收对话输入(input,也叫prompt),返回回答文本(output,也叫response)

调用 Chat 模型

准备

首先注册API Key【若学习初步不想花钱可先用火山引擎】,然后安装openai库:pip install openai;然后导入你的 OpenAI API Key:

  1. 直接指定api_key:

     import openai
     openai.api_key = '你的Open API Key'
    
  2. 定义环境变量:

    OpenAI库就会查看名为OPENAI_API_KEY的环境变量,因此可以设定名为OPENAI_API_KEY的值(暂时定义,只作用与当前进程):

     import os
     os.environ["OPENAI_API_KEY"] = '你的Open API Key'
    
  3. 先定义系统环境变量,再获取:

    建议这种,因为这样可以防止意外分享代码导致的api_key泄漏。【上面的两种方式都会暴露】

    • Windows 定义环境变量:win+i打开设置—>系统信息—>高级系统设置—>环境变量—>在系统变量中新建环境变量,变量名为:OPENAI_API_KEY,值为你的api_key。【不能使用set命令,set命令只是暂时定义,与第二种类似】
    • Linux :export OPENAI_API_KEY='你的Open API Key'

    获取环境变量:使用os库中的environ的get方法【OpenAI库就会自动查看名为OPENAI_API_KEY的环境变量,因此不需要你获取】

     api_key=os.environ.get("OPENAI_API_KEY")    
    

    或者,你也可以考虑把环境变量保存在.env文件中,使用python-dotenv库从文件中读取它,这样也可以降低API密钥暴露在代码中的风险。

使用

先导入OpenAI库,并创建一个Client。然后调用chat下的 completions 方法,其中参数的模型指定为Chat模型,返回结果。最后打印输出大模型返回的回复的结果。

 from openai import OpenAI
 # 创建client
 client = OpenAI()
 ​
 # 指定chat模型
 response = client.chat.completions.create(
     model="gpt-4",
     messages=[
         {"role": "system", "content": "You are a creative AI."},
         {"role": "user", "content": "请给我的花店起个名"},
     ],
     temperature=0.8,
     max_tokens=60
 )
 ​
 ​
 # 打印返回的回复结果
 print(response['choices'][0]['message']['content'])
Chat参数说明

在chat模型中,有两个专属于chat模型的概念:message(消息)和role(角色)

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

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

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

其他参数可参考:参数说明

响应对象

当调用OpenAI的completion.create方法时,它会返回一个响应对象,该对象包含了模型生成的输出和其他一些信息。这个响应对象是一个字典结构,包含了多个字段。一个典型的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
    }
   ]
 }

各字段含义为:

img 一般来说,我们需要的结果就是choices,它是一个列表【因为可以要求模型生产多个可能的输出】,每一个choice又是一个字典,包含以下字段:

  • message:返回的结果,是一个字典,其中content为所回答的内容。
  • finish_reason:模型停止生成的原因,可能的值包括 stop(遇到了停止标记)、length(达到了最大长度)或 temperature(根据设定的温度参数决定停止)。

Text Model

文本模型,在ChatGPT出来之前,大家都使用这种模型的API来调用GPT-3,文本模型的代表作是text-davinci-003(基于GPT3)。而在这个模型家族中,也有专门训练出来做文本嵌入的text-embedding-ada-002,也有专门做相似度比较的模型,如text-similarity-curie-001。

功能:接收对话输入(input,也叫prompt),返回回答文本(output,也叫response)

调用 Text 模型

准备
  1. 准备阶段与Chat模型一致。
使用

先导入OpenAI库,并创建一个Client。然后调用 completions 方法,其中参数的模型指定为TEXT模型,返回结果。最后打印输出大模型返回的文字。

 from openai import OpenAI
 # 创建client
 client = OpenAI()
 ​
 # 指定TEXT模型
 response = client.completions.create(
     model="gpt-3.5-turbo-instruct", # TEXT 模型
     temperature=0.5,
     max_tokens=100,
     prompt="请给我的花店起个名"
 )
 ​
 # 打印返回的文字结果
 print(response.choices[0].text.strip())
Text参数说明

在使用OpenAI的文本生成模型时,你可以通过一些参数来控制输出的内容和样式。

img

响应对象

当调用OpenAI的completion.create方法时,它会返回一个响应对象,该对象包含了模型生成的输出和其他一些信息。这个响应对象是一个字典结构,包含了多个字段。在使用Text模型(如text-davinci-003)的情况下,响应对象的主要字段包括:

img我们要的结果一般是choices,它是一个列表【因为可以要求模型生产多个可能的输出】,而每一个choices又是一个字典,包含以下字段:

  • text:模型生成的文本。
  • finish_reason:模型停止生成的原因,可能的值包括 stop(遇到了停止标记)、length(达到了最大长度)或 temperature(根据设定的温度参数决定停止)。

Chat模型 vs Text模型

应该根据具体的应用场景选择具体的模型:

相较于Text模型,Chat模型的设计更适合处理对话或者多轮次交互的情况。

Chat模型设计的优点

  1. 对话历史的管理:通过使用Chat模型,你可以更方便地管理对话的历史,并在需要时向模型提供这些历史信息。
  2. 角色模拟:通过system角色,你可以设定对话的背景,给模型提供额外的指导信息,从而更好地控制输出的结果。当然在Text模型中,你在提示中也可以为AI设定角色,作为输入的一部分。

Text模型设计的优点

对于简单的单轮文本生成任务,使用Text模型可能会更简单、更直接。

通过LangChain调用Text和Chat模型

上面的调用过程是直接OpenAI API,但应用不只是需要这个模型,LangChain可以将多个模型“链接”起来,比如“图片转文字解释模型”—>“根据图片信息处理图片的OpenAI API”—>“文字转语音模型”等就可以用LangChain进行“链接”起来。

现在只是给出一个大致的调用过程,后面会详细解释。

调用Chat模型

 import os
 os.environ["OPENAI_API_KEY"] = '你的Open API Key'
 from langchain_openai.chat_models import ChatOpenAI
 ​
 chat = ChatOpenAI(
     model="gpt-4",
     temperature=0.8,
     max_tokens=60
 )
 ​
 from langchain.schema import (
     HumanMessage,
     SystemMessage
 )
 messages = [
     SystemMessage(content="你是一个很棒的智能助手"),
     HumanMessage(content="请给我的花店起个名")
 ]
 response = chat.invoke(messages)  
 print(response)

调用Text模型

 import os
 from  langchain_openai import OpenAI
 ​
 os.environ["OPENAI_API_KEY"] = '你的Open API Key'
 llm = OpenAI(
     model="gpt-3.5-turbo-instruct",
     temperature=0.8,
     max_tokens=60,
 )
 ​
 response = llm.invoke("请给我的花店起个名") # pridict已经遗弃,invoke和ainvoke替代
 print(response)

火山引擎

首先创建账号,然后通过火山方舟管理控制台 (volcengine.com)创建api_key;然后再模型推理的在线推理中创建推理接入点,模型推荐选Doubao-pro-32k,然后在创建的接入点的操作中选择API调用,选择第三方SDK调用实例。就可以根据实例代码得到base_url和model endpoint id了。

image-20241104142243476 image-20241104142259221可以看出与直接调用OpenAI API是差不多的,只是创建client时需要指定base_url【openai也可以,使用API代理服务提高访问稳定性】和api_key【openai自动找环境变量中的OPENAI_API_KEY】。

LangChian调用豆包

首先下载包:langchain-openai,可以使用命令:pip install langchain-openai。在环境变量中记得定义ARK_API_KEY、BASE_URL、LLM_MODELEND,分别对应api_key、base_url和model。

 import os
 from langchain_openai import ChatOpenAI
 from langchain.schema import HumanMessage, SystemMessage
 ​
 chat = ChatOpenAI(
     api_key = os.environ.get("ARK_API_KEY"),
     base_url = os.environ.get("BASE_URL"),
     model = os.environ.get("LLM_MODELEND"),
     temperature = 0.8,
     max_tokens = 600,
 )
 ​
 messages = [
     SystemMessage(content="你是一个很棒的智能助手"),
     HumanMessage(content="1+1=?"),
 ]
 ​
 # 非流式输出
 response = chat.invoke(messages)
 print(response.content.strip())
 ​
 # 流式输出
 for chunk in chat.stream(messages):
     print(chunk.content,end="")

PyCharm中设定环境变量

当你在PyCharm中运行程序时,程序无法使用定义的环境变量(可能是不自动刷新或者程序作为PyCharm的子程序,PyCharm在运行过程中不会去获取系统变量...),但使用命令启动程序就可以获取到定义的环境变量;这时可以在PyCharm定义环境变量:设置—> 工具 —> 终端 —> 项目下的环境变量,然后定义环境变量即可。

image-20241103210113993