RAG

Source:多种类型的数据源:视频、图片、文本、代码、文档等。

Load:将多源异构数据统一加载为文档对象。

Transform:对文档进行转换和处理,比如将文本切分为小块。

Embed:将文本编码为向量。

Store:将向量化后的数据存储起来。

Retrieve:从文本库中检索相关的文本段落。

调用模型

将api_key和base_url写在变量中

# pip install langchain langchain-openai
from openai import OpenAI

client = OpenAI(
    base_url="https://openrouter.ai/api/v1",  # 平台提供的 URL
    api_key="sk-...",  # 平台提供的 API-Key
)

completion = client.chat.completions.create(
    model="openai/gpt-oss-20b:free",  # 模型名称
    messages=[{"role": "user", "content": "将'你好'翻译成意大利语"}],  # 用户输入
)
print(completion.choices[0].message.content)

管理api_key和base_url

1.将api_key和base_url写到环境变量中,读取环境变量来获取api_key和base_url

点击编辑配置

点击环境变量

添加环境变量

添加api_key和base_url

在代码中通过 os.getenv() 读取

import os
from openai import OpenAI

client = OpenAI(
    base_url=os.getenv("base_url"),
    api_key=os.getenv("api_key"),
)

completion = client.chat.completions.create(
    model="openai/gpt-oss-20b:free",
    messages=[{"role": "user", "content": "你好"}],
)
print(completion.choices[0].message.content)

2.通过配置文件来配置,在代码中加载配置文件(推荐)

创建 .env 文件(项目根目录)

OPENAI_API_KEY="sk-…"
OPENAI_BASE_URL=" https://openrouter.ai/api/v1"
方式一:显式读取 .env 中的环境变量
# pip install python-dotenv
import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()  # 默认加载 .env

client = OpenAI(
    base_url=os.getenv("OPENAI_BASE_URL"),  # 平台提供的 URL
    api_key=os.getenv("OPENAI_API_KEY"),  # 平台提供的 API Key
)

completion = client.chat.completions.create(
    model="openai/gpt-oss-20b:free", 
    messages=[{"role": "user", "content": "将'你好'翻译成意大利语"}],
)
print(completion.choices[0].message.content)
方式二:依靠 OpenAI 的默认行为读取 .env 环境变量(推荐)

OpenAI 在创建时,会自动到环境变量中找 OPENAI_API_KEY 以及OPENAI_BASE_URL。如果在 .env 中配置的名字和上面的两个名字一样,无需再次赋值,只通过 dotenv.load_dotenv() 加载环境配置信息即可。

# pip install python-dotenv
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()  # 默认加载 .env

client = OpenAI()

completion = client.chat.completions.create(
    model="openai/gpt-oss-20b:free", 
    messages=[{"role": "user", "content": "将'你好'翻译成意大利语"}],
)

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

LangChain API调用模型

输入:接受文本 PromptValue 或消息列表 List[BaseMessage],每条消息需指定角色(如 SystemMessage、HumanMessage、AIMessage)

输出:返回带角色的消息对象(BaseMessage 子类),通常是 AIMessage

import os
from langchain.chat_models import init_chat_model
from langchain.messages import SystemMessage, HumanMessage, AIMessage

# 模型初始化相关参数
llm = init_chat_model(
    model="openai/gpt-oss-20b:free",
    model_provider="openai",
    base_url="https://openrouter.ai/api/v1",
    api_key=os.getenv("OPENROUTER_API_KEY"),
)

# 提示词消息列表
messages = [
    SystemMessage(content="你是一个诗人"),
    HumanMessage(content="写一首关于春天的诗"),
]
resp = llm.invoke(messages)
print(type(resp))  # <class 'langchain_core.messages.ai.AIMessage'>
print(resp.content)

模型初始化相关参数

初始化一个模型最简单的方法就是使用 init_chat_model,并设置必要的参数

参数

说明

model

模型名称或标识符

base_url

发送请求的 API 端点的 URL。常由模型的提供商提供

api_key

与模型提供商进行身份验证所需的 API 密钥

temperature

控制模型输出的随机性。数字越高,回答越有创意;数字越低,回答越确定

timeout

在取消请求之前,等待模型响应的最大时间(以秒为单位)

max_tokens

限制响应中的总tokens 数量,控制输出长度

max_retries

请求失败时系统尝试重新发送请求的最大次数

对话模型的Message

对话模型的输入可以是文本提示、消息提示或是字典格式。

(1)文本提示

文本提示是字符串,适用于不需要保留对话历史的直接生成任务。

resp = llm.invoke("你好")

(2)消息提示

将消息对象列表输入模型,方便管理对话历史,包含系统指令以及处理多模态数据。

messages = [
    SystemMessage("你是个诗人"),
    HumanMessage("写首关于春天的诗"),
]
resp = llm.invoke(messages)

(3)字典格式

也可以按照 OpenAI 聊天补全格式创建字典列表组成消息。一条消息通常包含 role(角色)、content(内容)、metadata(元数据)。

messages = [
    {"role": "system", "content": "你是个诗人"}, # 系统
    {"role": "user", "content": "写首关于春天的诗"}, # 角色
]
resp = llm.invoke(messages)

(4)消息类型

消息类型

描述

SystemMessage

代表一组初始指令,用于引导模型的行为。可以使用系统消息来设定语气、定义模型的角色,并建立响应的指导方针

HumanMessage

表示用户输入

AIMessage

模型生成的响应,包括文本内容、工具调用和元数据

ToolMessage

表示工具调用的输出

调用方法

(1)流式调用和非流式调用

  • 非流式调用:用户提出需求请编写一首诗,系统在静默数秒后突然弹出了完整的诗歌。如同一种“提交请求,等待结果”的流程,实现简单,但体验单调。
  • 流式调用:用户提问,请编写一首诗,当问题刚刚发送,系统就开始一字一句(逐个token)进行回复,更像是“实时对话”,贴近人类交互的习惯。

非流式调用:invoke() 调用

import os
from langchain.chat_models import init_chat_model

llm = init_chat_model(
    model="openai/gpt-oss-20b:free",
    model_provider="openai",
    base_url="https://openrouter.ai/api/v1",
    api_key=os.getenv("OPENROUTER_API_KEY"),
)

messages = [
    {"role": "system", "content": "你是一名数学家"},
    {"role": "user", "content": "请证明黎曼猜想"},
]
resp = llm.invoke(messages)
print(resp.content)

流式调用:stream() 流式输出

import os
from langchain.chat_models import init_chat_model

llm = init_chat_model(
    model="openai/gpt-oss-20b:free",
    model_provider="openai",
    base_url="https://openrouter.ai/api/v1",
    api_key=os.getenv("OPENROUTER_API_KEY"),
)

messages = [
    {"role": "system", "content": "你是一名数学家"},
    {"role": "user", "content": "请证明以下黎曼猜想"},
]
# 使用 stream() 方法流式输出
for chunk in llm.stream(messages):
    # 逐个打印内容块,并刷新缓冲区以即时显示内容
    print(chunk.content, end="", flush=True)

(2)批次调用与非批次调用

批次调用:将一组独立的请求批量发送给模型并行处理。

使用batch() 批量调用

import os
from langchain.chat_models import init_chat_model

llm = init_chat_model(
    model="openai/gpt-oss-20b:free",
    model_provider="openai",
    base_url="https://openrouter.ai/api/v1",
    api_key=os.getenv("OPENROUTER_API_KEY"),
)

messages = [
    [
        {"role": "system", "content": "你是一位诗人"},
        {"role": "user", "content": "写一首关于春天的诗"},
    ],
    [
        {"role": "system", "content": "你是一位诗人"},
        {"role": "user", "content": "写一首关于夏天的诗"},
    ],
    [
        {"role": "system", "content": "你是一位诗人"},
        {"role": "user", "content": "写一首关于秋天的诗"},
    ],
]
resp = llm.batch(messages)  # 批量调用,返回一个消息列表
print(resp)

(3)同步调用和异步调用

  • 同步调用:每个操作依次执行,直到当前操作完成后才开始下一个操作,总的执行时间是各个操作时间的总和。
  • 异步调用:允许程序在等待某些操作完成时继续执行其他任务,而不是阻塞等待。这在处理 I/O 操作(如网络请求、文件读写等)时特别有用,可以显著提高程序的效率和响应性。

同步调用:使用 invoke() 同步调用 

import os
import time
from langchain.chat_models import init_chat_model

llm = init_chat_model(
    model="openai/gpt-oss-20b:free",
    model_provider="openai",
    base_url="https://openrouter.ai/api/v1",
    api_key=os.getenv("OPENROUTER_API_KEY"),
)

messagess = [
    [
        {"role": "system", "content": "你是一位诗人"},
        {"role": "user", "content": "写一首关于春天的诗"},
    ],
    [
        {"role": "system", "content": "你是一位诗人"},
        {"role": "user", "content": "写一首关于夏天的诗"},
    ],
    [
        {"role": "system", "content": "你是一位诗人"},
        {"role": "user", "content": "写一首关于秋天的诗"},
    ],
]

start_time = time.time()

resps = [llm.invoke(messages) for messages in messagess]
print(resps)

end_time = time.time()
print(f"Total time: {end_time - start_time}")
# Total time: 17.789486169815063

异步调用:使用 ainvoke() 异步调用

import os
import time
import asyncio  # 支持异步调用 协程
from langchain.chat_models import init_chat_model

llm = init_chat_model(
    model="openai/gpt-oss-20b:free",
    model_provider="openai",
    base_url="https://openrouter.ai/api/v1",
    api_key=os.getenv("OPENROUTER_API_KEY"),
)

messagess = [
    [
        {"role": "system", "content": "你是一位诗人"},
        {"role": "user", "content": "写一首关于春天的诗"},
    ],
    [
        {"role": "system", "content": "你是一位诗人"},
        {"role": "user", "content": "写一首关于夏天的诗"},
    ],
    [
        {"role": "system", "content": "你是一位诗人"},
        {"role": "user", "content": "写一首关于秋天的诗"},
    ],
]

# 打包所有任务
async def async_invoke():
    tasks = [llm.ainvoke(messages) for messages in messagess]
    return await asyncio.gather(*tasks)

start_time = time.time()

resps = asyncio.run(async_invoke())
print(resps)

end_time = time.time()
print(f"Total time: {end_time - start_time}")
# Total time: 8.280137062072754

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐