用openai 和 langchain 调用模型 || LangChain系统安装和快速入门

96 阅读5分钟

模型类型

Chat模型(聊天模型)

用于产生人类和AI之间的对话,专为对话和聊天场景设计的,支持更复杂的、多轮对话。

Text模型(文本模型)

通常用于传统的文本生成任务,比如补全句子、大纲生成、翻译等。

这两种模型的机制都是接收对话输入(input,也叫prompt),返回回答文本(output,也叫response)。但是,它们的调用方式和要求的输入格式是有区别的

  • Text 模型一般用于独立的文本生成任务,无需额外上下文。
  • Chat 模型设计用于多轮对话,能够处理对话上下文,更适合交互式应用。

openai方法

本文模型调用的api_keybase_url均默认已通过os.environ设置为系统变量

text模型

使用OpenAI()中的client.completions.create()进行调用 其中必要传递的参数有modelprompt 详情可见官方的API文档

from openai import OpenAI
import os

client = OpenAI()
response = client.completions.create(
    model = "gpt-3.5-turbo-instruct",
    prompt = "回答一下1+1等于几,再详细说一下具体的推理过程",
    max_tokens= 50,
    temperature=0.7
)
print(response)
#Completion(id='cmpl-ASdLAO5x5ij4cUvgDkX1XyidKWoz6', choices=[CompletionChoice(finish_reason='length', index=0, logprobs=None, text='\n\n1+1等于2。\n具体的推理过程如下:\n首先,我们可以将1+1拆分为两个数字相加,即1+1=1+1。\n然后,我们')], created=1731387772, model='gpt-3.5-turbo-instruct', object='text_completion', system_fingerprint=None, usage=CompletionUsage(completion_tokens=50, prompt_tokens=27, total_tokens=77, completion_tokens_details=None, prompt_tokens_details=None))


print(response.choices[0].text)
#答:1+1等于2。
#推理过程:首先,我们可以从数学定义出发,1可以表示为一个单位,即一个数量或者一个物体。那么1+1

response的内容

{
  "id": "cmpl-uqkvlQyYK7bGYrRHQ0eXlWi7",
  "object": "text_completion",
  "created": 1589478378,
  "model": "gpt-3.5-turbo-instruct",
  "system_fingerprint": "fp_44709d6fcb",
  "choices": [
    {
      "text": "\n\nThis is indeed a test",
      "index": 0,
      "logprobs": null,
      "finish_reason": "length"
    }
  ],
  "usage": {
    "prompt_tokens": 5,
    "completion_tokens": 7,
    "total_tokens": 12
  }
}

chat模型

使用OpenAI()中的client.chat.completions.create()

import os
from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model = os.environ.get("LLM_MODELEND"),
    messages=[
        {"role":"assistant", "content":"你是一个创意的AI"},
        {"role":"user","content":"请给我的花店起个名"}
    ],
    temperature=0.8,
    max_tokens=600
)

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

response的内容

{
  "id": "chatcmpl-123",
  "object": "chat.completion",
  "created": 1677652288,
  "model": "gpt-4o-mini",
  "system_fingerprint": "fp_44709d6fcb",
  "choices": [{
    "index": 0,
    "message": {
      "role": "assistant",
      "content": "\n\nHello there, how may I assist you today?",
    },
    "logprobs": null,
    "finish_reason": "stop"
  }],
  "usage": {
    "prompt_tokens": 9,
    "completion_tokens": 12,
    "total_tokens": 21,
    "completion_tokens_details": {
      "reasoning_tokens": 0,
      "accepted_prediction_tokens": 0,
      "rejected_prediction_tokens": 0
    }
  }
}

langchain方法

Text模型

因为langchain迭代升级,目前有两种比较常用的调用方法 另外从print可以看出,langchain的方法,返回结果时自动对返回的结果进行处理,只保存了基本的输出

from langchain.llms import OpenAI #旧的方法
from langchain_openai import OpenAI #新的方法
llm = OpenAI(
    model = "gpt-3.5-turbo-instruct",
    temperature=0.7,
    max_tokens=50
)
response = llm.predict("回答一下1+1等于几,再详细说一下具体的推理过程")
response = llm("回答一下1+1等于几,再详细说一下具体的推理过程")
response = llm.invoke("回答一下1+1等于几,再详细说一下具体的推理过程")
#.invoke是最新的方法,其他方法目前仍然兼容,但是会在报warning

print(response)
#1+1等于2,因为1是指一个数,当我们再加上1的时候,就相当于把这个数再增加1,所以最终结果就是2

chat模型

import os
from langchain_core import messages
from langchain_openai import ChatOpenAI

chat = ChatOpenAI(model=os.environ.get("LLM_MODELEND"), temperature=0.8, max_tokens=600)
messages = [
    ("system","你是一个很棒的智能助手"),
    ("user","请给我的花店起个名")
]
#langchain中也有对应的message包,对message中的角色进行设定
from langchain.schema import HumanMessage, SystemMessage
messages = [
    SystemMessage(content="你是一个很棒的智能助手"),
    HumanMessage(content="请给我的花店起个名"),
]
response = chat(messages)
print(response)
#content='以下是一些适合花店的名字,供你参考:\n\n1. **缤纷花语**:寓意花店内的花卉种类丰富,色彩缤纷,充满了各种美好的花语。\n2. **花漾时光**:强调花店能为顾客带来如花朵般绚烂的美好时光。\n3. **香榭丽舍**:给人一种浪漫、优雅的感觉,暗示花店内的花卉品质高雅。\n4. **花之梦**:表示花店是一个实现人们对花卉美好梦想的地方。\n5. **花精灵**:体现花卉的灵动与美丽,仿佛花店内有一群可爱的花精灵。\n6. **花海拾贝**:寓意在花的海洋中寻找珍贵的宝贝,即美丽的花卉。\n7. **花语轩**:突出花店是一个专门解读花语、传递情感的地方。\n8. **繁花部落**:表示花店内有众多的花卉,如同一个繁华的部落。\n9. **心花怒放**:形容人们看到美丽花卉时心情愉悦、兴奋的状态。\n10. **花坊故事**:暗示花店有许多与花卉相关的故事,充满了浪漫与温馨。\n11. **秘密花园**:给人一种神秘、独特的感觉,吸引顾客前来探索。\n12. **玫瑰庄园**:如果花店以玫瑰为主,可以考虑这个名字,突出玫瑰的高贵与浪漫。\n13. **花之驿站**:表示花店是一个可以让人们停留、欣赏花卉的地方。\n14. **花样年华**:寓意花卉能为人们的生活增添花样与美好。\n15. **花意人生**:强调花卉在人们生活中的重要意义,能带来美好的人生体验。' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 369, 'prompt_tokens': 26, 'total_tokens': 395, 'completion_tokens_details': None, 'prompt_tokens_details': None}, 'model_name': 'Doubao-pro-32k', 'system_fingerprint': '', 'finish_reason': 'stop', 'logprobs': None} id='run-0a10f2a6-cda1-4341-bc78-e24db75acd19-0' usage_metadata={'input_tokens': 26, 'output_tokens': 369, 'total_tokens': 395, 'input_token_details': {}, 'output_token_details': {}}