RAG与Agent: OpenAI库

2 阅读3分钟

一、OpenAI库的作用

openai库是我们在本地调用大模型时的桥梁,openai库集成了很多大模型的api,通过大模型服务厂商提供给我们的api key,我们就可以通过openai库来调用大模型。我理解为openai库是一个服务员,open ai库中的api接口是餐口,api key是饭票,大模型厂商是厨师,模型是饭,我们通过服务员点餐附上饭票,服务员将饭票通过出餐口递给厨师,厨师给我们饭。

二、OpenAI库的使用

1.Openai下载:打开anconda prompt ->conda activate agent(你创建的环境名字)激活环境->pip install openai下载库

2.Openai的使用流程:

i:创建客户端对象(OpenAI类对象)

ii:和模型对话,提供system, assistant, user三个角色

system:设定模型的行为和规则 

assiatant:设定模型的回答,由用户设定

user:用户的提问

iii:返回处理结果

3.Openai示例代码与注释以通义千问qwen-3.6plus为例:

PS:如果没有配置API KEY需要在client=OpenAI()中添加api key 的值

 #通过 OpenAI(basu_url)创建一个客户端对象,将请求发送到阿里云 DashScope 的兼容 OpenAI 格式的端点。

client = OpenAI()

#使用client.chat_completions.create发起一次聊天补全请求,模型为qwen3.6-plus,消息包含 system、assistant、user 三个角色。

response = client.chat.completions.create ()

#打印模型返回的回复内容

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

#print(response.choices[0].message.content)各参数含义

4.Openai库的流式输出

大模型的输出分为两种流式与非流式,流式输出是大模型边想边说,响应较快,用户体验感会更好;非流式输出则是大模型先想好再说,用户等待时间长,用户体验感较差,上述示例代码print(response.choices[0].message.content)就是非流式输出,具体区别如下图。

图源:黑马程序员RAG与Agent实战项目

流式输出的实现,设定结果输出为stream模式(流式输出),在client.chat_completions.create()调用模型设定参数stream=True,for循环response对象,在循环内输出内容,示例代码如下:

for chunk in response:

  • 当 stream=True时,client.chat_completions.create() 返回的不是一个完整的响应对象,而是一个可迭代的流式对象。
  • 模型会分批返回数据,每批数据就是一个chunk(数据块)。
  • 循环遍历这些chunk,每次处理一个块。

content = chunk.choices[0].delta.content:

  • chunk的结构与非流式响应的结构类似,但主要区别在于:

    • 非流式:response.choices[0].message.content
    • 流式:chunk.choices[0].delta.content
  • delta表示“增量内容”,即当前这一块中新生成的部分(而不是完整消息)。

  • 因为模型是一点一点生成文本的,每个chunk只包含一小段新增的文本(可能是一个字、一个词或几个字符)。

  • 对于第一个chunk,delta 里可能还包含role,但通常我们只关心content。   

if content is not None:

  • 某些chunk中delta.content可能为None(比如最后一个chunk可能只包含结束标记finish_reason,没有实际内容)。
  • 只有content不为None时才打印,避免输出None字符串或空白。

print(content, end=" ", flush = True):

  • printt(content...):打印当前块新增的文本。
  • end=" ":不换行,这样多个块的内容会拼接在同一行,实现连贯的输出效果。
  • flush=True:立即刷新输出缓冲区,让内容实时显示在终端上(而不是等缓冲区满了或程序结束才显示)。

三、Openai附带历史记录调用模型

这一部分的实现较为简单直接在调用模型 时向messages中传入历史消息即可,这样做可以让大模型根据上下文更好回答用户问题,messages参数的要求是list类型,每个元素是一个字典(包含role和content等字段)具体实例代码如下: