本文中,我们会通过一个简单的例子来展示如何使用 langchain
来调用大模型的 chat API(使用 Chat Model)。
这个例子前面也有使用过,但是前面还没有针对里面的内容进行详细的说明。
配置 key 的文档请看 langchain
入门指南(一)- 准备 API KEY
依赖安装
1
   | pip install -U langchain-openai
   | 
 
示例
下面的 ChatOpenAI 表示我们要使用的是
Chat Model,顾名思义,这个模型是用来进行对话的,这也是我们最常用的一种模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   | from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, SystemMessage
  chat = ChatOpenAI(     model="yi-large",     temperature=0.3,     max_tokens=200,     api_key='your key',     base_url="https://api.lingyiwanwu.com/v1" )
  messages = [     SystemMessage(content="你是一名精通了 golang 的专家"),     HumanMessage(content="写一个  golang 的 hello world 程序"), ]
  response = chat.invoke(messages)
  print(response.content)
   | 
 
ChatOpenAI 说明
使用 ChatOpenAI 类,我们可以调用 chat
API。ChatOpenAI 类的构造函数有以下参数:
ChatOpenAI 参数
model:模型名称,例如
yi-large(零一万物),gpt-3.5-turbo(OpenAI
HK)等。 
temperature:用于控制生成文本的多样性,值越大,生成的文本越多样化。 
max_tokens:生成文本的最大长度。(我们的输入和
LLM 的输出都需要消耗 token
数,所以如果只是测试,可以控制一下输出的 token
数量) 
api_key:API 密钥(支持多种,不只是 OpenAI
的)。不填写的话,会从环境变量中读取(对应的环境变量是
OPENAI_API_KEY)。 
base_url:API
的接口地址。不填写的话,会从环境变量中读取(对应的环境变量是
OPENAI_BASE_URL)。 
timeout:超时时间,单位是秒。 
max_retries: 最大重试次数。 
invoke 方法的参数说明
我们可以看到上面的例子传递了一个 messages
参数,这个参数是一个列表,里面包含了 HumanMessage 和
SystemMessage。
在其他地方,我们可能会看到其他形式的参数,它实际上也支持很多种形式,例如:
元组列表
[元组列表]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
   | from langchain_openai import ChatOpenAI
  chat = ChatOpenAI(     model="yi-large",     temperature=0.3,     max_tokens=200,     api_key='your key',     base_url="https://api.lingyiwanwu.com/v1", )
  messages = [     ('system', '你是一名精通了 golang 的专家'),     ('human', '写一个  golang 的 hello world 程序') ]
  response = chat.invoke(messages)
  print(response.content)
   | 
 
BaseMessage 列表
[BaseMessage 列表]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   | from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, SystemMessage
  chat = ChatOpenAI(     model="yi-large",     temperature=0.3,     max_tokens=200,     api_key='your key',     base_url="https://api.lingyiwanwu.com/v1", )
  messages = [     SystemMessage(content="你是一名精通了 golang 的专家"),     HumanMessage(content="写一个  golang 的 hello world 程序"), ]
  response = chat.invoke(messages)
  print(response.content)
   | 
 
字符串
[字符串]1 2 3 4 5 6 7 8 9 10 11 12 13 14
   | from langchain_openai import ChatOpenAI
  chat = ChatOpenAI(     model="yi-large",     temperature=0.3,     max_tokens=200,     api_key='your key',     base_url="https://api.lingyiwanwu.com/v1", )
 
  response = chat.invoke('使用 golang 写一个 hello world 程序')
  print(response.content)
   | 
 
字符串列表
[字符串列表]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
   | from langchain_openai import ChatOpenAI
  chat = ChatOpenAI(     model="yi-large",     temperature=0.3,     max_tokens=200,     api_key='your key',     base_url="https://api.lingyiwanwu.com/v1", )
  messages = [     "你是一名精通了 golang 的专家",     "写一个  golang 的 hello world 程序", ]
  response = chat.invoke(messages)
  print(response.content)
   | 
 
invoke 方法的返回值
上面是直接打印了返回值的 content
属性,实际上返回值中包含了其他一些有用的信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
   | {   "lc": 1,   "type": "constructor",   "id": [     "langchain",     "schema",     "messages",     "AIMessage"   ],   "kwargs": {     "content": "<...省略...>",     "response_metadata": {       "token_usage": {         "completion_tokens": 200,         "prompt_tokens": 35,         "total_tokens": 235       },       "model_name": "yi-large",       "system_fingerprint": null,       "finish_reason": "length",       "logprobs": null     },     "type": "ai",     "id": "run-29131a4f-e792-4c9e-8cf5-490afed94176-0",     "usage_metadata": {       "input_tokens": 35,       "output_tokens": 200,       "total_tokens": 235     },     "tool_calls": [],     "invalid_tool_calls": []   } }
  | 
 
一些字段说明:
completion_tokens/output_tokens
是生成的文本的 token 数量。 
prompt_tokens/input_tokens 是输入的
token 数量。 
total_tokens 是单次请求总的 token
数量。 
在实际的应用中,我们需要注意使用的 token
的数量,防止消耗太多的 token,因为 token
是要花钱来购买的。
如果我们是为其他人提供服务,可能就需要针对不同的用户来统计
token 的使用情况,以便计费。