一、搭建你的超级助手

​ 大模型的崛起正在各个领域掀起革命性的风潮,无论是自然语言处理、计算机视觉,还是医疗和金融领域,都无所不在。然而,对于众多开发者来说,要把这些开源模型招呼过来,让它们跑起来,那可真是一项艰巨的任务。为什么呢?因为这些大模型,它们的胃口可大了,需要大量的硬件资源才能满足。大部分情况下,你得有一台装配着高性能GPU的服务器才行,这可不是小数目的投资。

​ 但是,有了 OpenRouter,事情就变得有趣了。OpenRouter为你提供了一些开源模型,你可以通过API免费使用,不用再担心那些让人头疼的部署问题。OpenRouter主要关注的是7B规模的大模型,比如谷歌的 gemma-7b,Mistral AI 的 mistral-7b-instruct。所以,你可以放心大胆地使用它,让它帮你省下那一大笔部署大模型的费用或者购买其他API的钱

二、OpenRouter 使用指南

​ 在我们开始搭建之前,让我们先来认识一下这个名叫 OpenRouter 的新朋友。OpenRouter,你可以把它看作是一个大模型的超市,它聚合了各种各样的大模型,而且最好的是,在国内你不需要任何科学工具就能访问。通过 OpenRouter,你可以调用超过100种优秀的大模型,其中包括了一些大家耳熟能详的模型,比如 OpenAI 的 ChatGPT 系列(当然,包括我们的GPT4V),Anthropic 的 Claude 系列,谷歌的 PaLM 和 Gemini 系列等等。而且,如果你想换个模型试试看,只需要修改模型的名字就行了,不用改动你的调用代码逻辑。

​ 当然,OpenRouter 在用户体验方面也做了许多考虑。它允许使用 QQ 邮箱进行登录和注册,这在一定程度上为国内用户提供了极大的便利。此外,OpenRouter 还免费提供了一系列7B规模的模型,如 nous-capybara-7b、mistral-7b-instruct、mythomist-7b、toppy-m-7b、cinematika-7b、gemma-7b-it 等,这无疑为用户提供了丰富的选择和使用空间。

image-dlar.png

image-ogco.png

还有很多模型就不一一展示了

具体的模型价格或者模型规格可以查看:Docs | OpenRouter

​ 因此,如果你没有 GPU 服务器,却又想利用开源模型搭建自己的大模型助手,那么 OpenRouter 就是你的理想选择。但在使用之前,请注意,你需要先注册一个账号并生成 Api key。只有这样,你才能解锁 OpenRouter 的强大功能,让这些优秀的大模型为你所用。

image-4epj.png

​ OpenRouter 的交互方式主要是通过 HTTP 协议,这意味着你可以使用任何支持 HTTP 的编程语言或框架来与其进行交互,包括但不限于 Python、Java、JavaScript、C# 等。这为开发者提供了极大的灵活性。

​ 另外,OpenRouter 也支持通过 OpenAI 的 client.chat.completions.create 方法进行调用。这是一个非常方便的特性,特别是对于已经在使用 OpenAI 平台的开发者来说,因为他们可以在不更改现有代码的情况下,直接将 OpenRouter 集成到他们的系统中。

官方给出的实例(这边已经帮大家写上了详细的注释):

1.与 OpenAI's API一起使用

# 导入 OpenAI 库
from openai import OpenAI

# 导入 os 库的 getenv 函数,用于获取环境变量
from os import getenv

# 创建一个 OpenAI 客户端。base_url 设置为 OpenRouter 的 API 地址,api_key 从环境变量 OPENROUTER_API_KEY 中获取
client = OpenAI(
  base_url="https://openrouter.ai/api/v1",
  api_key=getenv("OPENROUTER_API_KEY"),
)

# 使用客户端创建一个 chat completion。这个请求将会被发送到 OpenRouter,并由 OpenRouter 转发到对应的模型
completion = client.chat.completions.create(
  extra_headers={
    # 可选的 HTTP-Referer 头,如果你希望你的应用出现在 openrouter.ai 的排行榜上,可以设置这个头
    "HTTP-Referer": $YOUR_SITE_URL, 
    # 可选的 X-Title 头,如果你希望你的应用名称显示在 openrouter.ai 的排行榜上,可以设置这个头
    "X-Title": $YOUR_APP_NAME, 
  },
  # 指定要使用的模型,这里使用的是 "openai/gpt-3.5-turbo"
  model="openai/gpt-3.5-turbo",
  # 指定要发送的消息。这里发送的消息是 "Say this is a test"
  messages=[
    {
      "role": "user",
      "content": "Say this is a test",
    },
  ],
)

# 打印模型的输出
print(completion.choices[0].message.content)
# 注意,`$YOUR_SITE_URL` 和 `$YOUR_APP_NAME` 应该替换为你的网站 URL 和应用名称。

2.快速简单使用

# 导入必要的库
import requests
import json

# 发送 POST 请求
response = requests.post(
  # API 的 URL
  url="https://openrouter.ai/api/v1/chat/completions",

  # 请求头,包含 API 密钥和其他可选信息
  headers={
    # API 密钥,用于验证你的身份
    "Authorization": f"Bearer {OPENROUTER_API_KEY}",
    
    # 可选,如果你希望你的应用出现在 openrouter.ai 的排名中,可以包含你的网站 URL
    "HTTP-Referer": f"{YOUR_SITE_URL}",
    
    # 可选,如果你希望你的应用出现在 openrouter.ai 的排名中,可以包含你的应用名称
    "X-Title": f"{YOUR_APP_NAME}",
  },

  # 请求体,包含你要请求的模型和消息
  data=json.dumps({
    # 要请求的模型,可选
    "model": "openai/gpt-3.5-turbo",
    
    # 消息列表,每个消息都是一个对象,包含 "role" 和 "content" 字段
    "messages": [
      # 用户消息,提问 "What is the meaning of life?"
      { "role": "user", "content": "What is the meaning of life?" }
    ]
  })
)

# `requests.post` 返回一个响应对象,你可以使用 `response.json()` 方法来获取响应体

我这边简单写一个实例

# 导入必要的库
import requests
import json

# 设置 API 的 URL 和模型名称
url = "https://openrouter.ai/api/v1/chat/completions"
model = "openchat/openchat-7b:free"

# 设置请求头,包含 API 密钥、Referer 和应用名称
request_headers = {
    "Authorization": "Bearer 你的api_key",
    "HTTP-Referer": "http://localhost:8088",
    "X-Title": "test"
}

# 设置默认的系统提示
default_prompt = "You are an AI assistant that helps people find information."

def llm(user_prompt, system_prompt=default_prompt):
    # 构造消息
    messages = [
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": user_prompt},
    ]

    # 构造请求的 JSON 数据
    request_json = {
        "model": model,
        "messages": messages,
        "max_tokens": 2048
    }

    # 发送请求并获取响应
    response = requests.post(url, json=request_json, headers=request_headers)
    
    # 检查响应状态码
    if response.status_code != 200:
        raise Exception(f"Request failed with status {response.status_code}")

    # 解析响应内容并返回模型的输出
    return json.loads(response.content)['choices'][0]['message']['content']

if __name__ == '__main__':
    # 让用户输入他们的提示
    user_prompt = input("请输入你的问题:")
    print(llm(user_prompt))

流式输出

from openai import OpenAI

model = "openchat/openchat-7b:free"
default_prompt = "You are an AI assistant that helps people find information."
client = OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key="your api key",
)

def llm(user_prompt, system_prompt=default_prompt):
    messages = [
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": user_prompt},
    ]
    completion = client.chat.completions.create(
        extra_headers={
            "HTTP-Referer": "http://localhost:8088",
            "X-Title": "test",
        },
        model=model,
        messages=messages,
        max_tokens = 2048,
        stream=True
    )
    for respose in completion:
        if respose and respose.choices and len(respose.choices) > 0:
            msg = respose.choices[0].delta.content
            print(msg, end='', flush=True)
if __name__ == '__main__':
    user_prompt = input("请输入你的问题:")
    llm(user_prompt)