ChatGPT-API的充值及接入应用

5/8/2023 ChatGPT-APICloudflare-WorkerCode-InterpreterGraphRAGChatGPT-Telegram-Workerschatgpt-on-wechat

# 1. ChatGPT API的开通与使用

# 1.1 开通ChatGPT API

# 1.1.1 申请ChatGPT API密钥

首先需要准备一个ChatGPT账号,如何申请ChatGPT账号详见我的另一篇博客:ChatGPT智能问答AI使用指南 (opens new window)

登录账号,点击Create new secret key按钮即可创建,生成的密钥要保存好且不要泄露。

申请地址:https://platform.openai.com/account/api-keys (opens new window)

申请ChatGPT-API密钥

# 1.1.2 ChatGPT API的计费

账号注册后,官方会免费赠送18美刀的额度(有效期至2023年4月1日),可供我们白嫖。

ChatGPT-API免费额度

下图是ChatGPT-API的计费(这个官方会不断的进行调整),最新的详见:https://openai.com/pricing (opens new window)

ChatGPT-API的计费

# 1.1.3 官方Token数计算工具

一个简单的英文单词是一个token,一个复杂的英文单词可能包含了2~4个token,一个中文是 1~3 个token。

我们可以使用 OpenAI 官方的 Tokenizer 工具来计算 Token 数。https://platform.openai.com/tokenizer (opens new window)

Tokenizer计算Token

# 1.2 ChatGPT API的充值

# 1.2.1 充值流程概述及前提准备

由于ChatGPT不支持国内用户充值,类似于VISA双币信用卡也是不能用的。所以ChatGPT API充值对于国内用户是非常麻烦的,注册门槛说实话有点高,总结起来其实就下面4个步骤:

ChatGPT充值流程

要完成上述4个步骤,你需要提前准备好:

  • 能正常访问ChatGPT的科学上网条件(建议要选美国或者欧洲的代理节点)
  • 注册1个可用的ChatGPT账号
  • 注册1个海外Apple ID(欧易、Depay在国区Apple商店是搜不到的)
  • 注册1个虚拟交易平台,建议选欧易
  • 申请1张虚拟信用卡,建议选Depay

科学上网条件、注册美区Apple ID详见我的另一篇博客:Clash配置转换及全平台科学上网 (opens new window)

注:Depay挺坑的,5.7发了个升级维护公告,直至5.31才恢复充值卡片,虽然现在又可以使用了,但并不可靠。

Depay系统升级维护公告   2023-05-07
1、最近美国银行系统加强了对数字货币的风险管理。因此,Depay体系下的银行账户也受到了
严格的风险管理,银行入账速度受到影响,造成卡账户资金不足引起消费功能中断,我们正在努力跟银行沟通以恢复正常速度。
2、在恢复到正常速度之前,我们将关闭新用户注册和开卡、关闭卡片充值功能;期问消费可能也会因为银行入账速度导致中断;
3、为减轻您的不便,我们将临时降低卡片提现费用和USDT/USD的兑换汇率。您可以在任何时问正常提现USDT。对于由此给您带来的不便,我们深感抱歉。
Depay teams
1
2
3
4
5
6

另注:Depay的虚拟信用卡,也只有部分号段可以在OpenAI绑定成功,有些号段是绑定不了的。OpenAI用不了的话,充值额度可以绑定支付宝供日常消费使用。绑定不成功的话,可以等过一段时间再试试,我一开始也是绑定不上,后来突然可以了。

# 1.2.2 注册欧易账号并购买USDT

因为Depay不接受人民币直接充值,所以我们必须借助交易所平台,来完成人民币—USDT—USD美元的兑换过程。USDT是虚拟货币泰达币,跟USD美元锚定的,背后有大而不倒的金融机构担保,只要USD在它就在,相对比较安全,但是不要去炒币哈。

USDT是什么

打开 欧易官网 (opens new window) 注册账号——海外Apple商店下载欧易——App首页——我要买币——快捷买币——选USDT——购买23USDT左右(大概¥160),支持支付宝、微信或者银行卡购买。

欧易购买USDT

注意事项:

[1] 欧易的注册需要实名认证,交易方式是直接给某个微信或支付宝账号转账,转账后等待一段时间对方会交付USDT虚拟货币,我的是安全到账了。

[2] 欧易的提币交易有手续费(与提币网络有关,USDT-TRC20的手续费为1USDT),而且新注册的账号刚买完的USDT是被冻结状态的(需要等待一段时间才可提现,我这里是要等一周),等待期间换算USD的比例也会波动,以及后续Depay的手续费(标准卡是1USD),因此相对于ChatGPT Plus所需的20美刀,这里就多充值了大约3美刀的虚拟货币。

欧易USDT提币

# 1.2.3 注册Depay并开卡充值USD

Step1:海外Apple商店下载Depay——开信用卡——Depay 分标准卡、高级卡、白金卡和黑金卡,我这里选择了0元的标准卡。

  • 标准卡:开卡 0 USD,月费 2 USD,充值手续费 1.35%(最低 1USD)
  • 高级卡:开卡 10 USD,月费 1 USD,充值手续费 1.2%
  • 白金卡:开卡 50 USD,月费 0 元,充值手续费 1%
  • 黑金卡:需要邀请 20 个人开卡,无开卡费用,月费 0 USD,手续费 0.8%

注意事项:开卡过程需要实名认证,提交完信息后会进行审核,等待大约5-10min后会审核完成(审核失败了话,可多试几次,可能是录制喊数字的视频不清晰)

Step2:打开Depay,找到钱包——USDT——充币——复制你的充值地址,确认屏幕上显示主网是TRC20,充值地址千万不要复制错。

Depay充值USDT

Step3:打开欧易,找到首页——资产——提币——USDT——链上提币——提币地址填Depay钱包里的充值地址,提币网络选TRC20(千万不能选错,否则到不了账)

欧易链上提币

Step4:欧易提现到Depay成功后,点击Depay钱包——实时兑换,将所有的USDT都兑换成USD美元,点击Depay首页的充值,将兑换的美元存入卡中,到此,Depay充值大功告成。

Depay充值信用卡

# 1.2.4 ChatGPT API充值及开通服务

我们已经在上述步骤中拥有了一张属于自己的Depay虚拟信用卡(相当于借记卡,不可透支),并且往里面充了20多美刀,下面开始充值。

登录账号,打开 https://platform.openai.com/account/billing/overview (opens new window),点击“Set up paid account”按钮,填写信息设置付费账户。

ChatGPT设置付费账户

开通过程需要注意以下事项:

  • 科学上网,尽量用美国或者欧洲IP(要使用没被封禁的IP,不能用就换到能用为止)

  • 浏览器开启无痕模式(避免缓存问题)

  • 账单地址用 美国地址生成器 (opens new window) 生成(理论上可以随便填,建议用生成一个免税州的地址信息)

    美国免税州:阿拉斯加州(Alaska)部分区域、特拉华州(Delaware)、蒙大拿州(Montana)、新罕布什尔州(New Hampshire)和俄勒冈州(Oregon)。
    
    1

ChatGPT-API充值成功

# 1.3 Python调用ChatGPT API

# 1.3.1 旧版本调用示例

以下是在2023.2.11使用ChatGPT官方API的示例,最新的请自行查阅最新的官方API文档及相关资料。

官方API文档:https://platform.openai.com/docs/api-reference/introduction (opens new window)

依赖安装:新版本的依赖库已经不兼容如下写法了

$ pip install openai==0.28
1

调用示例:

# -*- coding: utf-8 -*-

import openai

openai.api_key = "your_api_key"
response = openai.Completion.create(
  model="text-davinci-003",
  prompt="解释一下量子力学",
  temperature=0.7,
  max_tokens=2048,
  top_p=1,
  frequency_penalty=0,
  presence_penalty=0
)
print(response)
print(response["choices"][0]["text"])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

GPT3模型调用方式如下,输入主要有7个参数:

  • model:模型名称,text-davinci-003
  • prompt:问题或待补全内容,例如“解释一下量子力学”。
  • temperature:控制结果随机性,0.0表示结果固定,随机性大可以设置为0.9。
  • max_tokens:最大返回字数(包括问题和答案),通常汉字占两个token。假设设置成100,如果prompt问题中有40个汉字,那么返回结果中最多包括10个汉字。
  • top_p:设置为1即可。
  • frequency_penalty:设置为0即可。
  • presence_penalty:设置为0即可。

返回值:

{
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "logprobs": null,
      "text": "量子力学是物理学的一个分支,它研究粒子在微观尺度上的行为。量子力学描述物质的基本粒子,如电子,质子,中子和原子的行为,以及它们之间的相互作用。它采用经典力学的概念,如力,动能和动量,但也提出了新的概念,如量子状态,波函数和量子干涉。量子力学通过解决方程来描述粒子的性质,其中包括波动方程,Schrödinger方程,Heisenberg不确定性原理和Pauli禁止定律。"
    }
  ],
  "created": 1676122039,
  "id": "cmpl-6ikCNyZzoOPscevgIBZ0RaPHONdzz",
  "model": "text-davinci-003",
  "object": "text_completion",
  "usage": {
    "completion_tokens": 338,
    "prompt_tokens": 15,
    "total_tokens": 353
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

注意事项:

[1] ChatGPT API允许的最大token数量为4097,即max_tokens最大设置为4097减去prompt问题的token数量。

[2] 输入参数可以增加stream,即是否采用控制流的方式输出。如果steam取值为True时,那么返回结果是一个Python generator,需要通过迭代获取结果,读取结果的结束字段为“<|im_end|>”。

# -*- coding: utf-8 -*-

import openai

openai.api_key = "your_api_key"
response = openai.Completion.create(
  model="text-davinci-003",
  prompt="解释一下量子力学",
  temperature=0.7,
  max_tokens=2048,
  stream=True,
  top_p=1,
  frequency_penalty=0,
  presence_penalty=0
)

print(response)
res = ''
for r in response:
    res += r["choices"][0]["text"]
res = res.replace('<|im_end|>', '')
print(res)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

返回值:

<generator object EngineAPIResource.create.<locals>.<genexpr> at 0x122ff6a50>

量子力学是研究物质的微观结构的物理学理论。它用来描述物质的基本粒子,即原子、分子、离子等,及其组成物质的相互作用,以及物质在微观尺度上的性质。量子力学的思想是由普朗克和爱因斯坦在20世纪初提出的,它被认为是20世纪物理学的里程碑。量子力学的思想主要是由量子概念引出,即物质不是连续的物体,而是由粒子构成的。量子力学将物理系统的属性描述为“波函数”,即粒子的状态可以用量子概率的方式表示。量子力学的研究已经在原子物理、分子物理、物质的结构和性质、粒子物理、原子核物理等领域取得了显著成果。
1
2
3

[3] Temperature越高,句子生成的越多样化,反之句子生成越固定。

ChatGPT的Temperature参数

# 1.3.2 新版本调用示例

单线程调用

# -*- coding: utf-8 -*-

import requests


def request_openai_api(api_key, api_url, model_name, prompt, max_tokens):
    """
    按照 OpenAI 官方方式调用 API,可以使用代理API地址。
    :param api_key: API 密钥。
    :param api_url: API URL。
    :param model_name: 模型名称。
    :param prompt: 提供给模型的提示。
    :param max_tokens: 生成的最大令牌数。
    :return: 模型的响应。
    """
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }

    messages = [
        {
            "role": "user",
            "content": prompt
        }
    ]

    data = {
        "messages": messages,
        "max_tokens": max_tokens,
        "model": model_name
    }

    response = requests.post(api_url, headers=headers, json=data)
    response_json = response.json()
    print(response_json)


if __name__ == '__main__':
    api_url = 'https://api.openai.com/v1/chat/completions'
    api_key = 'your_api_key'
    model_name = 'gpt-3.5-turbo-1106'
    prompt_text = "请问您能提供一些编程建议吗?"
    max_tokens = 1000
    request_openai_api(api_key, api_url, model_name, prompt_text, max_tokens)
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
34
35
36
37
38
39
40
41
42
43
44
45

多线程调用:

# -*- coding: utf-8 -*-

import threading
import requests


def request_openai_api(api_key, api_url, model_name, prompt, max_tokens):
    """
    按照 OpenAI 官方方式调用 API,可以使用代理API地址。
    :param api_key: API 密钥。
    :param api_url: API URL。
    :param model_name: 模型名称。
    :param prompt: 提供给模型的提示。
    :param max_tokens: 生成的最大令牌数。
    :return: 模型的响应。
    """
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }

    messages = [
        {
            "role": "user",
            "content": prompt
        }
    ]

    data = {
        "messages": messages,
        "max_tokens": max_tokens,
        "model": model_name
    }

    response = requests.post(api_url, headers=headers, json=data)
    response_json = response.json()
    print(response_json)


def threaded_request(api_key, api_url, model_name, prompt, max_tokens, num_threads, total_requests):
    """
    创建并启动多线程以达到指定的数据总量。
    """
    rounds = (total_requests + num_threads - 1) // num_threads  # 计算需要的轮数
    for _ in range(rounds):
        threads = []
        for _ in range(num_threads):
            if total_requests <= 0:
                break  # 如果已经达到请求总量,停止创建新线程
            thread = threading.Thread(target=request_openai_api, args=(api_key, api_url, model_name, prompt, max_tokens))
            thread.start()
            threads.append(thread)
            total_requests -= 1

        for thread in threads:
            thread.join()


if __name__ == '__main__':
    api_url = 'https://api.openai.com/v1/chat/completions'
    api_key = 'your_api_key'
    model_name = 'gpt-3.5-turbo-1106'
    prompt_text = "请问您能提供一些编程建议吗?"
    max_tokens = 1000
    num_threads = 5
    total_requests = 15  # 指定要执行的请求总数
    threaded_request(api_key, api_url, model_name, prompt_text, max_tokens, num_threads, total_requests)
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

# 2. 国内使用OpenAI API的方式

# 2.1 Cloudflare Worker 代理请求 OpenAI API

# 2.1.1 如何配置

OpenAI API 在国内访问非常慢,经常超时,因此可以使用 Cloudflare Worker 将其代理成自己的国内可直连域名,这样就可以直接调用了,速度大大加快。

代理请求到 OpenAI API,配置部署步骤如下:

  • 注册并登录到 Cloudflare 账户
  • 创建一个新的 Cloudflare Worker
  • 将 cloudflare-worker.js 复制并粘贴到 Cloudflare Worker 编辑器中
  • 保存并部署 Cloudflare Worker
  • 在 Worker 详情页 -> Trigger -> Custom Domains 中为这个 Worker 添加一个自定义域名

注意:需要配置一个自己的国内可直连域名,因为直接使用 Cloudflare 的域名,依然无法访问。

cloudflare-worker.js

addEventListener("fetch", (event) => {
  event.respondWith(handleRequest(event.request));
});

async function handleRequest(request) {
  const url = new URL(request.url);
  const fetchAPI = request.url.replace(url.host, 'api.openai.com');
  
  // 部分代理工具,请求由浏览器发起,跨域请求时会先发送一个 preflight 进行检查,也就是 OPTIONS 请求
  // 需要响应该请求,否则后续的 POST 会失败
  const corsHeaders = {
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Methods': 'OPTIONS',
    'Access-Control-Allow-Headers': '*',
  };
  if (request.method === 'OPTIONS') return new Response(null, { headers: corsHeaders });

  let body;
  if (request.method === 'POST') body = await request.json();

  const authKey = request.headers.get('Authorization');
  if (!authKey) return new Response("Not allowed", { status: 403 });
  
  const payload = {
    method: request.method,
    headers: {
      "Content-Type": "application/json",
      Authorization: authKey,
    },
    body: typeof body === 'object' ? JSON.stringify(body) : '{}',
  };
  // 在 Cloudflare 中,HEAD 和 GET 请求带 body 会报错
  if (['HEAD', 'GET'].includes(request.method)) delete payload.body;

  // 入参中如果包含了 stream=true,则表现形式为流式输出
  const response = await fetch(fetchAPI, payload);
  if (body && body.stream !== true) {
    const results = await response.json();
    return new Response(JSON.stringify(results), {
      status: response.status,
      headers: {
        "Content-Type": "application/json",
      },
    });
  } else {
    return new Response(response.body, {
      status: response.status,
      statusText: response.statusText,
      headers: response.headers,
    });
  }
}
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

Cloudflare Worker 免费版限额日调用10w次,对于普通用户是够用了。

Cloudflare-Worker免费版日调用限额

# 2.1.2 如何使用

配置成功之后,我们可以在代码开头加上 OPENAI_API_BASE 的配置,使其调用我们的域名。

import os
os.environ["OPENAI_API_BASE"] = "https://openai.your.domain/v1"
1
2

# 2.2 国内的付费第三方ChatGPT API

如果不会折腾上面这些,也可以直接使用国内的付费第三方ChatGPT API,它的用法与官方ChatGPT API一致,换个域名就能用,费用比较低,国内可以直连。不过这种厂商都是用的黑卡搞的,随时存在跑路风险,不要充值太多。

# 2.2.1 OpenAI-SB

OpenAI-SB 是一个 OpenAI API 反代服务,它可以让用户直接调用 OpenAI 的人工智能 API,而无需自行申请 OpenAI API 的额度。在用户调用 API 时,OpenAI-SB 会将请求转发至自己的账号池中,然后再通过 OpenAI 的官方 API 接口将请求发送至 OpenAI 的服务器进行处理。

OpenAI-SB 的账号池包含多个 OpenAI API 账号,每个账号都具有一定的 API 请求配额。当一个账号的 API 请求配额用完时,OpenAI-SB 会自动切换到另一个账号,以确保 API 的可靠性和稳定性。同时,OpenAI-SB 还具有高并发处理能力,可以在用户高并发请求时,保持 API 响应速度和稳定性。

OpenAI-SB 的官网地址:https://openai-sb.com (opens new window),定价如下:

openai-sb第三方API定价

# 2.2.2 GPTAPI.US

GPTAPI.US这家是使用 one-api 开源项目进行搭建的,官方文档写的非常详细,而且提供Docker镜像,有兴趣的也可以自己搭建。

one-api接入各种渠道API

项目地址:https://github.com/songquanpeng/one-api (opens new window)

one-api项目截图

GPTAPI.US 的官网地址:https://www.gptapi.us (opens new window),定价如下:

GPTAPI.US第三方API定价

# 2.3 使用ChatGPT-Next-Web提供的代理

# 2.3.1 搭建ChatGPT-Next-Web

一键免费部署你的私人 ChatGPT 网页应用,支持 Web / PWA / Linux / Win / MacOS等平台。除此之外,还提供代理接口供国内访问。

我这里直接使用了官方的docker镜像进行一键部署。

$ docker pull yidadaa/chatgpt-next-web
$ docker run -d -p 3000:3000 --name chatgpt-next-web \
   -e OPENAI_API_KEY=your_api_key \
   -e CODE=your_password \
   yidadaa/chatgpt-next-web
1
2
3
4
5

常用参数说明如下,完整参数详见:环境变量-官方文档 (opens new window)

  • OPENAI_API_KEY(必填项):OpanAI 密钥,在 OpanAI 账户页面申请的 API_KEY。
  • CODE(可选):访问密码,可选,可使用逗号隔开多个密码。(警告:如果不填写此项,则任何人都可以直接使用你部署后的网站,可能会导致你的 token 被急速消耗完毕,建议填写此选项)
  • BASE_URL(可选):OpenAI接口代理URL,如果你手动配置了 OpanAI 接口代理,填写此选项。(如遇到SSL证书问题,将BASE_URL的协议设置为 http)

ChatGPT-Next-Web

# 2.3.2 ChatGPT-Next-Web的代理API

ChatGPT-Next-Web如果不设置密码的话,可以提供代理API供国内进行调用(不过这个的调用格式就与OpenAI官方不一致了),以下是调用示例:

# -*- coding: utf-8 -*-

import requests
import json
import time


class CustomGPT:

    def __init__(self, url, model, stream=False):
        self.url = url
        self.model = model
        self.stream = stream

    def _call(self, prompt):
        """
        使用 requests 发送 POST 请求到代理的 ChatGPT-API。
        """
        data = {
            "model": self.model,
            "messages": [{"role": "user", "content": prompt}],
            "stream": self.stream
        }
        headers = {
            'Content-Type': 'application/json',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'
        }
        req_count = 0
        while req_count < 5:
            try:
                response = requests.post(self.url, json=data, stream=False, headers=headers, verify=False)
                if response.status_code == 200:
                    r_content = response.content.decode(response.apparent_encoding)
                    r_content = json.loads(r_content)
                    text = r_content['choices'][0]['message']['content']
                    return text
                else:
                    print(f"请求失败,状态码: {response.status_code}, 重试次数: {req_count+1}, 请求内容: {prompt}")
                    time.sleep(2)
                    req_count += 1
            except Exception as e:
                print(f"请求异常, 重试次数: {req_count + 1}, 请求内容: {prompt}; 错误信息: {e}")
                time.sleep(2)
                req_count += 1
        return "请求错误或超出重试次数"


if __name__ == '__main__':
    custom_gpt = CustomGPT(url='http://127.0.0.1:3000/api/openai/v1/chat/completions', model='gpt-3.5-turbo')
    result = custom_gpt._call("解释一下量子计算")
    print(result)
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

# 2.4 免费白嫖ChatGPT API

# 2.4.1 使用FreeGPT35获取免费API

2024.4.1,OpenAI宣布无需注册即可使用ChatGPT网页版服务了,但目前只能使用ChatGPT 3.5。FreeGPT35项目就是利用免登录ChatGPT Web去提供免费无限制的GPT-3.5-Turbo API服务。

$ mkdir freegpt35 && cd freegpt35
$ wget -O compose.yaml https://raw.githubusercontent.com/missuo/FreeGPT35/main/compose.yaml
$ docker compose up -d
1
2
3

可以使用以下命令进行测试,不一定要传Authorization,当然也可以传任意字符串。

$ curl http://127.0.0.1:3040/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer any_string_you_like" \
  -d '{
    "model": "gpt-3.5-turbo",
    "messages": [
      {
        "role": "user",
        "content": "解释一下量子计算"
      }
    ],
    "stream": false
    }'
1
2
3
4
5
6
7
8
9
10
11
12
13

注:如果无法正常使用该项目,很可能是 IP 已触发 Cloudflare 的屏蔽,或已被禁止,请尝试自行更改IP或切换服务器。

使用FreeGPT35获取免费API

# 2.4.2 Copliot免费使用GPT-4

2023年12月底,微软的Copliot出iOS客户端了,在美区Apple Store下载(国区未上架),不需要登录,即可免费使用GPT-4,不过使用该应用时需要开代理(建议全局代理,我一开始使用规则分流告知不支持地区)。另外,安卓也有该客户端,也能免费使用GPT-4。

Copliot免费使用GPT-4

另注:底层是调用了 OpenAI API,所以如果你有 Github Copilot 账号的话,可以白嫖GPT-4 API了,需要填写 Github Copilot Token。

通过Copliot白嫖GPT-4的API

# 3. 使用ChatGPT API搭建服务

# 3.1 搭建Web服务及本地应用

# 3.1.1 ChatGPT搭建成Web服务

用 Express 和 Vue3 搭建的 ChatGPT 演示网页。

为了图省事,我这里直接使用了官方的docker镜像进行一键部署。愿意折腾的,可以自己去构建镜像,还有很多参数可以配置,这里我就不介绍了。

$ docker run --name chatgpt-web -d -p 3002:3002 --env OPENAI_API_KEY=your_api_key chenzhaoyu94/chatgpt-web
1

chatgpt-web

# 3.1.2 ChatGPT桌面版应用程序

项目简介:ChatGPT 桌面应用程序(支持 Mac、Windows 和 Linux),使用 OpenAI API 密钥的方式进行访问。

项目地址:https://github.com/lencx/nofwl (opens new window)

M系芯片MacOS安装ARM版软件包,打开时会遇到“ChatGPT”已损坏,无法打开。你应该把它移到垃圾箱”的报错,执行以下命令即可解决。

$ xattr -cr /Applications/NoFWL.app
1

NoFWL桌面程序

# 3.2 搭建学术及工程服务

# 3.2.1 中科院学术版ChatGPT

简目简介:科研工作专用ChatGPT拓展,特别优化学术Paper润色体验,支持自定义快捷按钮,支持markdown表格显示,Tex公式双显示,代码显示功能完善,新增本地Python工程剖析功能/自我剖析功能。

项目地址:https://github.com/binary-husky/chatgpt_academic (opens new window)

功能 描述
一键润色 支持一键润色、一键查找论文语法错误
一键中英互译 一键中英互译
一键代码解释 可以正确显示代码、解释代码
自定义快捷键 支持自定义快捷键
配置代理服务器 支持配置代理服务器
模块化设计 支持自定义高阶的实验性功能
自我程序剖析 [实验性功能] 一键读懂本项目的源代码
程序剖析 [实验性功能] 一键可以剖析其他Python/C++项目
读论文 [实验性功能] 一键解读latex论文全文并生成摘要
批量注释生成 [实验性功能] 一键批量生成函数注释
chat分析报告生成 [实验性功能] 运行后自动生成总结汇报
公式显示 可以同时显示公式的tex形式和渲染形式
图片显示 可以在markdown中显示图片
支持GPT输出的markdown表格 可以输出支持GPT的markdown表格
…… ……

我这里采用docker的方式对服务进行部署。

Step1:拉取代码构建镜像

$ git clone https://github.com/binary-husky/chatgpt_academic.git
$ cd chatgpt_academic
$ docker build -t gpt-academic .
1
2
3

Step2:修改配置文件及主程序源码

  • 修改config.py配置文件:修改API_KEY参数即可(因为我的服务器是境外的,所以不需要设置代理)

  • 修改main.py主程序文件:官方源码的是随机选取Web端口,这里把它设置成固定的端口(例如5000)。

    # 如果WEB_PORT是-1, 则随机选取WEB端口
    # PORT = find_free_port() if WEB_PORT <= 0 else WEB_PORT
    PORT = 5000
    
    1
    2
    3

Step3:创建容器并挂载配置文件。

$ docker run -itd --name chatgpt_academic -p 5000:5000 -v /root/chatgpt_academic/config.py:/gpt/config.py  -v /root/chatgpt_academic/main.py:/gpt/main.py gpt-academic:latest
$ docker logs -f chatgpt_academic --tail 100
1
2

部署成功后可以在控制台种看到如下日志:

chatgpt_academic部署成功

Chrome浏览器打开http://ip:5000地址,即可查看服务。

ChatGPT学术优化

# 3.2.2 使用ChatGPT转换代码

项目描述:使用 ChatGPT 将代码从一种语言翻译成另一种语言。

项目地址:https://github.com/mckaywrigley/ai-code-translator (opens new window)(另附:官方体验地址 (opens new window)

ai-code-translator

# 3.3 接入第三方应用及功能增强

# 3.3.1 将ChatGPT通过快捷指令接入Siri

可以通过快捷指令的方式将ChatGPT接入Siri。

# 3.3.2 使用ChatGPT的检索扩展插件

插件描述:可以在 Google 搜索结果的旁边显示 ChatGPT 回答的结果,需要使用自己的ChatGPT API。

项目地址:https://github.com/wong2/chat-gpt-google-extension (opens new window)

Chrome插件商店地址:https://chrome.google.com/webstore/detail/chatgpt-for-google/jgjaeacdkonaoafenlfkkkmbaopkbilf (opens new window)

chat-gpt-google-extension

# 3.3.3 将ChatGPT接入划词翻译插件

基于 ChatGPT API 的划词翻译浏览器插件和跨平台桌面端应用。它的使用也非常简单,下载插件 / 应用之后,填入你的 OpenAI API Key 就能使用。

特性:1)支持 55 种语言的相互翻译、润色和总结功能。2)支持实时翻译、润色和总结,以最快的速度响应用户。3)支持自定义翻译文本。4)支持一键复制。5)全平台(Windows + macOS + Linux)支持。

openai-translator效果图

# 4. 使用ChatGPT API辅助工作

# 4.1 使用ChatGPT翻译文档

# 4.1.1 ChatGPT-for-Translation简介

使用ChatGPT完成文件翻译。该工具接受一个文本文件(.pdf, .txt, .md, .html.rtf)或者一个包含文本的文件夹。它将生成一个直接翻译和一个双语文本文件,对于 PDF 解析做了优化。

# 4.1.2 ChatGPT-for-Translation使用实例

[1] 准备运行环境

实验环境:Macbook Pro 2021,M1 pro芯片,16G内存,macOS Ventura13.2.1系统,Python3.9环境

$ git clone https://github.com/Raychanan/ChatGPT-for-Translation.git
$ cd ./ChatGPT-for-Translation/
$ pip3 install -r requirements.txt
$ pip3 install tenacity
1
2
3
4

[2] 翻译PDF文档

项目使用:建议使用 gpt-3.5-turbo 模型进行翻译,经济实惠,我翻译了个200页的英文文献,耗时12分钟,花费0.23美刀。

$ python3 ChatGPT-translate.py --input_path=./your_path/your_doc.pdf --openai_key=your_openai_key
1

默认值是使用gpt-3.5-turbo模型,翻译成简体中文,支持的参数如下:

    arguments = [
        ("--input_path", {"type": str,
         "help": "input file or folder to translate"}),
        ("--openai_key", {"type": str,
         "default": "", "help": "OpenAI API key"}),
        ("--model", {"type": str, "default": "gpt-3.5-turbo",
         "help": "Model to use for translation, e.g., 'gpt-3.5-turbo' or 'gpt-4'"}),
        ("--num_threads", {"type": int, "default": 10,
         "help": "number of threads to use for translation"}),
        ("--target_language", {"type": str, "default": "Simplified Chinese",
         "help": "target language to translate to"}),
        ("--only_process_this_file_extension",
         {"type": str, "default": "", "help": "only process files with this extension"}),
        ("--use_azure", {"action": "store_true", "default": False,
         "help": "Use Azure OpenAI service instead of OpenAI platform."}),
        ("--azure_endpoint",
         {"type": str, "default": "", "help": "Endpoint URL of Azure OpenAI service. Only require when use AOAI."}),
        ("--azure_deployment_name",
         {"type": str, "default": "", "help": "Deployment of Azure OpenAI service. Only require when use AOAI."}),
    ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

翻译效果:会生成5个文档,分别是txt格式的原文提取、纯中文译文、双语对照译文,以及docx格式的纯中文译文、双语对照译文。

ChatGPT-for-Translation翻译效果

# 4.2 privateGPT私有化文档问答

# 4.2.1 privateGPT简介

项目简介:privateGPT 是基于 GPT4All-J 的私有化部署文档问答平台,无需联网,能 100% 保证用户的隐私不泄露。它提供了一个 API,用户可以使用自己的文档进行交互式问答和生成文本。此外,平台支持自定义训练数据和模型参数,以满足个性化需求。

# 4.2.2 privateGPT使用实例

[1] 准备运行环境

实验环境:Macbook Pro 2021,M1 pro芯片,16G内存,macOS Ventura13.2.1系统,Python3.10环境

必须使用Python 3.10或更高版本,早期版本的 Python 无法编译(亲测 Python 3.9 跑不起来)

$ pip3 install -r requirements.txt
1

example.env模板文件重命名为.env,修改后的内容如下:

PERSIST_DIRECTORY=db
MODEL_TYPE=GPT4All
MODEL_PATH=models/ggml-gpt4all-j-v1.3-groovy.bin
EMBEDDINGS_MODEL_NAME=GanymedeNil/text2vec-large-chinese
MODEL_N_CTX=1000
MODEL_N_BATCH=8
TARGET_SOURCE_CHUNKS=4
1
2
3
4
5
6
7

注意事项:

  • 这里只修改了 EMBEDDINGS_MODEL_NAME 参数,默认是 all-MiniLM-L6-v2,但发现它存在中文乱码问题,以下是我亲测的4个模型:

    // 由于 langchain 加载 SentenceTransformers 嵌入的方式,第一次运行脚本时将需要互联网连接来下载嵌入模型本身。
    
    all-MiniLM-L6-v2                      // 效果一般、中文乱码
    DMetaSoul/sbert-chinese-general-v2    // 效果很差、中文不乱码
    distiluse-base-multilingual-cased-v1  // 效果很差、中文乱码
    GanymedeNil/text2vec-large-chinese    // 效果一般、中文不乱码
    
    1
    2
    3
    4
    5
    6
  • .env 参数含义:

    MODEL_TYPE: supports LlamaCpp or GPT4All
    PERSIST_DIRECTORY: is the folder you want your vectorstore in
    MODEL_PATH: Path to your GPT4All or LlamaCpp supported LLM
    MODEL_N_CTX: Maximum token limit for the LLM model
    MODEL_N_BATCH: Number of tokens in the prompt that are fed into the model at a time. Optimal value differs a lot depending on the model (8 works well for GPT4All, and 1024 is better for LlamaCpp)
    EMBEDDINGS_MODEL_NAME: SentenceTransformers embeddings model name (see https://www.sbert.net/docs/pretrained_models.html)
    TARGET_SOURCE_CHUNKS: The amount of chunks (sources) that will be used to answer a question
    
    1
    2
    3
    4
    5
    6
    7

下载 LLM 模型并将其放置在 models 目录里:

[2] 建立数据索引

将文件放入source_documents目录中,支持的格式有:.csv、.docx、.doc、.enex、.eml、.epub、.html、.md、.msg、.odt、.pdf、.pptx、.ppt、.txt。

运行以下命令来提取所有数据,首次执行时会自动联网下载 EMBEDDINGS_MODEL_NAME 处所填写的模型。

$ python3 ingest.py
1

建立完数据索引后,输出应如下所示:

Creating new vectorstore
Loading documents from source_documents
Loading new documents: 100%|██████████████████████| 1/1 [00:01<00:00,  1.73s/it]
Loaded 1 new documents from source_documents
Split into 90 chunks of text (max. 500 tokens each)
Creating embeddings. May take some minutes...
Using embedded DuckDB with persistence: data will be stored in: db
Ingestion complete! You can now run privateGPT.py to query your documents
1
2
3
4
5
6
7
8

它将创建一个包含本地矢量存储的db文件夹,建立时间具体取决于文档的大小。如果想从空数据库开始,请删除该db文件夹。

[3] 基于文档提出问题

要提出问题,请运行如下命令:

$ python3 privateGPT.py
1

注:如果没有上一步建立数据索引,会报如下错误

NoIndexException: Index not found, please create an instance before querying
1

执行成功后,脚本会交互式的等待问题输入。

> Enter a query:
1

等待一段时间之后,privateGPT会给出回复,实际执行效果如下:

基于privateGPT进行本地文档问答的效果

# 4.3 GraphRAG知识图谱检索增强生成

# 4.3.1 GraphRAG基本介绍

[1] 传统RAG弊端

现如今,RAG 是一种使用真实世界信息改进 LLM 输出的技术,是大多数 LLM 工具的重要组成部分。一般而言,传统 RAG 通常依赖于向量相似性搜索,但它面临几个局限性,例如:

  • 难以连接不同的信息:当答案需要将分散在多个文档中并通过微妙关系链接的见解编织在一起时,传统 RAG 很难有效地将这些点连接起来。
  • 有限的整体理解:分析大型数据集的总体主题或准确总结复杂文档需要更深入地理解语义关系,而传统 RAG 方法通常缺乏这一点。

[2] GraphRAG简介

微软开源的 GraphRAG 是一种基于图的检索增强生成方法。通过 LLM 构建知识图谱结合图机器学习,GraphRAG 极大增强 LLM 在处理私有数据时的性能,同时具备连点成线的跨大型数据集的复杂语义问题推理能力。

GraphRAG模式

传统 RAG 在私有数据,如企业的专有研究、商业文档表现非常差,而 GraphRAG 则基于前置的知识图谱、社区分层和语义总结以及图机器学习技术可以大幅度提供此类场景的性能。微软说他们在大量数据集上进行了测试,在全面性、多样性、赋权性方面,结果显示 GraphRAG 都优于传统 RAG(70~80% 获胜率)。

[3] GraphRAG架构

GraphRAG 的优势在于其结构化、分层的方法。

GraphRAG管线

Step1:索引阶段

索引阶段为 GraphRAG 的知识驱动分析奠定了基础。

  • 文本分块:输入数据可以是文档集合或单个大型文档,被划分为较小的可管理单元(称为文本单元)。这些单元为后续分析提供了一个细粒度的框架。
  • 知识图谱提取:使用 LLM 分析每个文本单元,细致地提取实体(例如,人员、组织、位置)、它们之间的关系(例如,“工作地点”、“位于”)以及与它们相关的重要声明。此过程将非结构化文本转换为结构化知识图谱,其中节点表示实体,边表示关系。
  • 社区检测:GraphRAG 随后将强大的社区检测技术 Leiden 算法应用于提取的知识图谱。该算法识别密切相关实体的集群,形成分层社区结构。可视化此结构可将社区显示为节点集群,每个节点的大小反映其重要性(程度),颜色表示社区成员身份。
  • 社区摘要:为了便于全面了解数据集,GraphRAG 为每个已识别的社区生成摘要。此过程从层次结构的底部开始,总结社区内的各个实体和关系,然后逐步向上移动,为更高级别的社区创建摘要。这会产生数据的多层次、相互关联的表示。

Step2:查询阶段

有了知识图谱和社区摘要,GraphRAG 就可以以非凡的深度和准确性回答用户查询。

  • 全局搜索:对于需要广泛了解数据集的查询,例如“讨论的主要主题是什么?”,GraphRAG 会利用生成的社区摘要。这使得系统能够综合整个数据集的信息并提供全面的答案。
  • 本地搜索:当查询集中在特定实体上时,GraphRAG 会利用知识图谱的网络结构。它有效地探索相关实体的邻域,从直接连接的实体和相关声明中收集相关信息,最终提供精确且具有上下文感知的答案。

Step3:提示调整

为了进一步提高准确性并使 GraphRAG 适应特定数据集,提示调整至关重要。这涉及在索引和查询阶段改进 LLM 使用的提示。事实上,通过提供特定领域的示例并调整提示的措辞,用户可以指导 LLM 提取更多相关信息并生成更准确、更有见地的响应。

[4] GraphRAG优势

GraphRAG 相比传统 RAG 具有多项优势:

  • 增强的全面性:通过利用社区摘要,GraphRAG 能够为广泛的查询提供更全面的答案,从而获取数据的整体视图。
  • 提高准确性和相关性:知识图谱使 GraphRAG 能够以更高的准确性和相关性回答需要综合来自多个来源的信息的复杂问题。
  • 有效探索复杂关系:浏览知识图谱的能力允许更细致、更有效地探索数据中的复杂关系。

这些优势使 GraphRAG 适用于广泛的应用:

  • 科学发现:分析研究论文、确定研究差距并揭示不同研究领域之间的隐藏联系。
  • 商业智能:从市场报告、客户评论和内部文件中提取见解,以支持战略决策。
  • 情报分析:将大量情报报告数据集中的点连接起来,以识别潜在威胁并了解复杂情况。
  • 教育与学习:为学生提供强大的工具来探索复杂的主题,理解概念之间的联系,并有效地获取总结的信息。

# 4.3.2 GraphRAG使用实例

[1] 准备实验环境

实验环境:Macbook Pro 2021,M1 pro芯片,16G内存,macOS Ventura14.5系统

Step1:创建运行环境

官方要求版本:Python 3.10-3.12,这里使用 Conda 创建了个 Python 3.11 环境进行实验。

$ conda create -n conda_graphrag_env python=3.11
$ conda activate conda_graphrag_env
1
2

Step2:安装项目依赖

直接安装 graphrag 依赖,安装的东西挺多的,这个需要等待一段时间。

$ pip3 install graphrag
1

注:我在安装过程遇到了一些依赖问题,这里手动安装以下依赖即可安装成功。

$ pip3 install "environs>=11.0.0,<12.0.0"
$ pip3 install msal-extensions
1
2

[2] 构建检索索引

Step1:准备测试数据

执行如下命令下载一段测试文件,放到 ragtest 测试项目里。

$ mkdir -p ./ragtest/input
$ curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt > ./ragtest/input/book.txt
1
2

Step2:初始化项目

切换到 ragtest 目录里,执行如下初始化命令

$ cd ragtest
$ python3 -m graphrag.index --init
1
2

然后它会自动初始化项目,目录结构如下:

.
├── input
│   └── book.txt
├── output
│   └── 20240707-101446
│       └── reports
├── prompts
│   ├── claim_extraction.txt
│   ├── community_report.txt
│   ├── entity_extraction.txt
│   └── summarize_descriptions.txt
├── .env
└── settings.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13

Step3:修改配置信息

之后修改 .env 和 settings.yaml 里的配置,主要是改动 api_base、api_key、model,我改动的地方已经加了中文注释。

注:GraphRAG 会调用非常多次大模型API,需要考虑成本,建议使用较为便宜的模型。除此之外,有的大模型厂商(如DeepSeek)没有Embedding模型。

.env

GRAPHRAG_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1

settings.yaml

encoding_model: cl100k_base
skip_workflows: []
llm:
  api_key: ${GRAPHRAG_API_KEY}
  type: openai_chat # or azure_openai_chat
  model: gpt-3.5-turbo # 进行了修改,默认值为gpt-4-turbo-preview
  model_supports_json: true # recommended if this is available for your model.
  # max_tokens: 4000
  # request_timeout: 180.0
  api_base: https://xxx.xxx.xxx/v1  # 取消注释并进行了修改,默认值https://<instance>.openai.azure.com
  # api_version: 2024-02-15-preview
  # organization: <organization_id>
  # deployment_name: <azure_model_deployment_name>
  # tokens_per_minute: 150_000 # set a leaky bucket throttle
  # requests_per_minute: 10_000 # set a leaky bucket throttle
  # max_retries: 10
  # max_retry_wait: 10.0
  # sleep_on_rate_limit_recommendation: true # whether to sleep when azure suggests wait-times
  # concurrent_requests: 25 # the number of parallel inflight requests that may be made

parallelization:
  stagger: 0.3
  # num_threads: 50 # the number of threads to use for parallel processing

async_mode: threaded # or asyncio

embeddings:
  ## parallelization: override the global parallelization settings for embeddings
  async_mode: threaded # or asyncio
  llm:
    api_key: ${GRAPHRAG_API_KEY}
    type: openai_embedding # or azure_openai_embedding
    model: text-embedding-3-small
    api_base: https://xxx.xxx.xxx/v1  # 取消注释并进行了修改,默认值https://<instance>.openai.azure.com
    # api_version: 2024-02-15-preview
    # organization: <organization_id>
    # deployment_name: <azure_model_deployment_name>
    # tokens_per_minute: 150_000 # set a leaky bucket throttle
    # requests_per_minute: 10_000 # set a leaky bucket throttle
    # max_retries: 10
    # max_retry_wait: 10.0
    # sleep_on_rate_limit_recommendation: true # whether to sleep when azure suggests wait-times
    # concurrent_requests: 25 # the number of parallel inflight requests that may be made
    # batch_size: 16 # the number of documents to send in a single request
    # batch_max_tokens: 8191 # the maximum number of tokens to send in a single request
    # target: required # or optional

chunks:
  size: 300
  overlap: 100
  group_by_columns: [id] # by default, we don't allow chunks to cross documents

input:
  type: file # or blob
  file_type: text # or csv
  base_dir: "input"
  file_encoding: utf-8
  file_pattern: ".*\\.txt$"

cache:
  type: file # or blob
  base_dir: "cache"
  # connection_string: <azure_blob_storage_connection_string>
  # container_name: <azure_blob_storage_container_name>

storage:
  type: file # or blob
  base_dir: "output/${timestamp}/artifacts"
  # connection_string: <azure_blob_storage_connection_string>
  # container_name: <azure_blob_storage_container_name>

reporting:
  type: file # or console, blob
  base_dir: "output/${timestamp}/reports"
  # connection_string: <azure_blob_storage_connection_string>
  # container_name: <azure_blob_storage_container_name>

entity_extraction:
  ## llm: override the global llm settings for this task
  ## parallelization: override the global parallelization settings for this task
  ## async_mode: override the global async_mode settings for this task
  prompt: "prompts/entity_extraction.txt"
  entity_types: [organization,person,geo,event]
  max_gleanings: 0

summarize_descriptions:
  ## llm: override the global llm settings for this task
  ## parallelization: override the global parallelization settings for this task
  ## async_mode: override the global async_mode settings for this task
  prompt: "prompts/summarize_descriptions.txt"
  max_length: 500

claim_extraction:
  ## llm: override the global llm settings for this task
  ## parallelization: override the global parallelization settings for this task
  ## async_mode: override the global async_mode settings for this task
  # enabled: true
  prompt: "prompts/claim_extraction.txt"
  description: "Any claims or facts that could be relevant to information discovery."
  max_gleanings: 0

community_report:
  ## llm: override the global llm settings for this task
  ## parallelization: override the global parallelization settings for this task
  ## async_mode: override the global async_mode settings for this task
  prompt: "prompts/community_report.txt"
  max_length: 2000
  max_input_length: 8000

cluster_graph:
  max_cluster_size: 10

embed_graph:
  enabled: false # if true, will generate node2vec embeddings for nodes
  # num_walks: 10
  # walk_length: 40
  # window_size: 2
  # iterations: 3
  # random_seed: 597832

umap:
  enabled: false # if true, will generate UMAP embeddings for nodes

snapshots:
  graphml: false
  raw_entities: false
  top_level_nodes: false

local_search:
  # text_unit_prop: 0.5
  # community_prop: 0.1
  # conversation_history_max_turns: 5
  # top_k_mapped_entities: 10
  # top_k_relationships: 10
  # max_tokens: 12000

global_search:
  # max_tokens: 12000
  # data_max_tokens: 12000
  # map_max_tokens: 1000
  # reduce_max_tokens: 2000
  # concurrency: 32
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142

Step4:构建索引文件

修改完配置文件之后,执行如下命令构建索引,需要等待较长时间。

$ python3 -m graphrag.index
1

注:如果开始执行时就报错 ValueError: No text files found in input,可能是因为目录结构不对,因此找不到文件。如果出现其它的报错,可以通过具体log文件./ragtest/output/20240707-101446/reports/indexing-engine.log 来定位问题,基本上就是配置文件哪里写的不对。

索引构建成功如下图所示:

GraphRAG构建索引

[3] 运行查询引擎

1)全局搜索

Baseline RAG 在处理需要跨数据集聚合信息以组成答案的查询时表现糟糕,像“数据中的前5大主题是什么?”这样的查询表现非常差,因为 Baseline RAG 依赖于对数据集内语义相似文本内容的向量搜索,在查询中没有任何东西可以引导它找到正确的信息。

然而,借助GraphRAG,就能够回答这种问题,因为LLM生成的知识图谱的结构告诉我们关于整个数据集的结构(以及主题)。这使得私有数据集能被组织成具有意义的语义群类,这些群类都是预先概括的。使用全局搜索方法,LLM使用这些群组来在回应用户查询时概述这些主题。

GraphRAG全局搜索

以下是使用全局搜索提出高级问题的示例。

$ python3 -m graphrag.query \
--root ./ \
--method global \
"What are the top themes in this story?"
1
2
3
4

运行结果:

GraphRAG全局搜索官方示例

2)本地搜索

本地搜索将知识图谱中的结构化数据与输入文档中的非结构化数据相结合,以便在查询时使用相关实体信息增强 LLM 上下文。它非常适合回答需要了解输入文档中提到的特定实体的问题。

GraphRAG本地搜索

以下是使用本地搜索询问有关特定角色的更具体问题的示例。

$ python3 -m graphrag.query \
--root ./ \
--method local \
"Who is Scrooge, and what are his main relationships?"
1
2
3
4

运行结果:

GraphRAG本地搜索官方示例

# 4.4 ScrapeGraphAI智能采集数据

# 4.4.1 ScrapeGraphAI简介

ScrapeGraphAI 是一个网络爬虫 Python 库,使用大模型通过自然语言来采集数据。

# 4.4.2 ScrapeGraphAI使用实例

依赖安装:

$ pip3 install scrapegraphai
$ playwright install
1
2

测试程序:

# -*- coding: utf-8 -*-

from scrapegraphai.graphs import SmartScraperGraph

graph_config = {
   "llm": {
      "api_key": "sk-xxx",
      "model": "gpt-3.5-turbo",
   },
}
smart_scraper_graph = SmartScraperGraph(
   prompt="获取每个博客的标题、时间、作者",
   source="https://www.eula.club/",
   config=graph_config
)

result = smart_scraper_graph.run()
print(result)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

采集效果:采集单个简单页面的效果还可以,但需要翻页、点进去采集的情况,大模型理解不了。估计还是要分步骤一点点去弄,比如先让它获取到每个的链接,再把每个链接给它让它循环去走,但大模型无法做到固定格式的稳定输出,目前难以实际投入应用。

# 4.5 根据网页截图生成静态页面代码

# 4.5.1 screenshot-to-code简介

一个开源的 Web 应用,用户上传一张网页截图,它会通过 OpenAI API,给出该网页的 HTML/Tailwind/JS 代码实现。

screenshot-to-code

# 4.5.2 安装项目依赖并启动项目

[1] 拉取代码并安装pipx及poetry环境

从项目的Github仓库拉取项目代码。

$ git clone https://github.com/abi/screenshot-to-code.git
1

pipx:类似于 macOS 上的 brew,pipx 依赖 pip 和 venv,它只能在 python 3.6+ 的 Python 版本中才能使用。

poetry:如果想使用pyproject.toml,并通过pyproject.toml进行依赖包管理,目前pip还不支持,所以poetry是首选。

$ brew install pipx
$ pipx --version
$ pipx install poetry
$ pipx ensurepath   // 自动更新环境变量
$ poetry --version  // 需要重新打开终端
1
2
3
4
5

poetry环境

[2] 前后端安装依赖并启动

后端安装依赖并启动:

$ cd backend
$ echo "OPENAI_API_KEY=sk-your-key" > .env
$ poetry install
$ poetry shell
$ poetry run uvicorn main:app --reload --port 7000
1
2
3
4
5

前端安装依赖并启动:

$ cd frontend
$ yarn
$ yarn dev
1
2
3

# 4.5.3 使用项目生成前端代码

使用Chrome浏览器打开 http://localhost:5173 (opens new window) 地址,上传一张网页截图,它就会自动生成前端代码,但不完全一样,稍微复杂点儿的页面就缺胳膊少腿的,可以根据生成效果继续让它迭代调整。

screenshot-to-code生成的页面效果

在Code处可以查看代码,也可以将它下载下来。

screenshot-to-code生成的代码

总体评价:生成的效果还凑合,不过不是完全一致的,少了很多东西,现在只能出雏形,感觉这个东西适合懂点儿前端技术的产品经理或者UI设计快速抄原型用。

# 5. 代码解释器的开源实现

尽管 OpenAI 的 Code interpreter 非常强大,但它也有一些特定的限制。OpenAI的解决方案是托管的,它在受控的远程环境中运行,限制了开发人员对本地设置的控制。这导致了一些明显的限制,比如无法访问互联网、有限的预安装软件包、最大上传大小为100MB以及运行时间限制为120秒。而且,当环境终止时,任何生成的文件或链接都会丢失,对于长时间运行的任务可能会带来不便。

# 5.1 gpt-code-ui

# 5.1.1 项目简介

gpt-code-ui 是 OpenAI 的 ChatGPT 代码解释器的开源实现。其功能特性有:上传文件、文件下载、上下文感知(可以参考之前的消息)、生成代码、运行代码(Python内核)、模型切换(GPT-3.5和GPT-4)

项目地址:https://github.com/ricklamers/gpt-code-ui (opens new window)

# 5.1.2 实现原理

实现原理:它的架构并不算复杂,用Flask运行Web服务,代码运行部分借助Jupyter kernel process,通过Kernel manager在Flask和Jupyter之间通信。UI部分是React做的,用户输入后,将输入转换成Prompt,借助OpenAI对任务分解并生成Python代码在Jupyter中执行。

gpt-code-ui实现原理

# 5.1.3 项目部署

项目运行:我是在Debian11服务器上跑的,Python版本3.9.2。

$ pip3 install gpt-code-ui
$ gptcode
1
2

项目启动后,访问 http://ip:8080/ 地址,点击 Set OpenAl key 按钮,填写上API-KEY,这里我使用的模型是GPT-3.5。

# 5.1.4 使用示例

这里依旧让它生成一个二维码,执行后它告诉我少依赖。

gpt-code-ui使用效果-1

告诉它把那个依赖安装上,成功运行出了结果。

gpt-code-ui使用效果-2

# 5.1.5 总体评价

可以实现代码解释器的基本功能,但没有那么智能,遇到报错还需要人去告诉它怎么做,不像OpenAI的可以全自动实现,实际意义不大。

# 5.2 Open Interpreter

# 5.2.1 项目简介

Open Interpreter是一个开源工具,提供交互式和编程聊天功能,让用户可以通过在终端中运行解释器与其进行对话。开发人员可以编写任务和工作流程脚本,直接传递消息给解释器,以便更精确地控制。用户可以检查和配置系统消息,以满足个人偏好和项目要求的灵活性。

  • Open Interpreter 不仅仅是另一个编码解释器。它是一个专注于复杂任务的强大工具,允许语言模型在您的计算机上运行代码,以完整地编写应用程序、任务等。它是 OpenAI 代码解释器的实现,可以运行 GPT-4 和其他模型,支持 Python、JavaScript、Shell 等语言的代码。
  • Open Interpreter 的独特功能之一是其终端中类似聊天的界面,允许用户以更直观和用户友好的方式与之交互。该解释器不仅可以编写代码,还可以创建和编辑照片、视频、PDF 和其他文件。它可以控制网络浏览器进行网络搜索,并通过网络上的不同区域进行搜索,以实现并提供必要的链接。

项目地址:https://github.com/KillianLucas/open-interpreter (opens new window)

# 5.2.2 核心特点

Open Interpreter 的核心特点包括:

  • 互联网访问自由:在本地运行的 Open Interpreter 可以完全访问互联网,允许免费访问外部API和数据库,提高项目的灵活性。
  • 包和库选择:Open Interpreter允许使用任何包或库,使您能够选择最适合您项目的工具。
  • 无限的运行时间和文件大小:Open Interpreter没有执行时间或文件大小的限制,可以顺利进行大规模数据分析和计算处理。
  • 确保安全性:在执行代码之前,Open Interpreter需要用户确认,以防止执行未经授权的代码,提高安全性。
  • 开源免费:Open Interpreter是一个开源项目,对于初创公司和个人开发人员来说,降低成本是一个重要优势。
  • 支持多种编程语言:Open Interpreter不仅支持Python,还支持JavaScript、Bash等多种编程语言,适用于更广泛的应用程序。

# 5.2.3 竞品对比

与 OpenAI 的 Code Interpreter相比,Open Interpreter 提供了更多可能性,包括互联网访问、预装软件包没有限制、没有最大上传限制。此外,当环境终止时,状态不会被清除,从而允许用户继续使用以前的项目。

项目 Open Interpreter OpenAI Code Interpreter
上网 在本地工作,完全可访问 基于云托管,访问受限
可用软件包 可以使用任何包或库 仅预安装
执行时间和文件大小 无限制 有限的运行时间和文件大小
安全 需要用户确认以防止恶意代码 不同的用户验证流程
收费 免费(开源) $ 20 /月(付费计划)
支持各种编程语言 Python、JavaScript、Bash 等 仅限Python

# 5.2.4 安装配置

首先,安装 open-interpreter 依赖。

$ pip3 install open-interpreter
1

安装完成后,在 Terminal 输入 interpreter -y 就可以启动 Open Interpreter。默认会提示输入 OpenAI API key,配置了该项会使用 GPT-4 执行,否则使用本地 Code-LLama 执行。如果使用 Code-LLama 在本地运行它,模型大小从 3GB 到 30GB 不等。

我这里选择使用效果最佳的 GPT-4 去执行,OpenAI API key 的充值详见我的另一篇博客:ChatGPT智能问答AI使用指南 (opens new window)

$ interpreter -y 
1

Open-Interpreter配置API-KEY

# 5.2.5 使用示例

[1] 求解数学问题

Prompt:对x^2cos(2x)求积分

Open-Interpreter求解数学问题

注:结果不完全对,对它求不定积分,最后的结果里应该还有个 + C

[2] 联网支持

Prompt:请总结一下 https://about.fb.com/news/2023/08/code-llama-ai-for-coding/ 这篇文章,结果用中文输出

Open-Interpreter联网支持

注:处理的中间过程有大量报错,有时会陷入死循环,试了好几次才成功跑出来结果。

# 5.2.6 总体评价

有详细的步骤分解,遇到各种报错都可以自动解决,在使用GPT-4作为LLM时,效果已经于OpenAI官方的代码解释器很接近了。

注意运行时需要有人盯着,发现不对劲及时终止,防止遇到某些报错的时候,它解决不了,一直循环同一个解决方案,钱哗哗的就流走了。

Open-Interpreter循环同一方案解决报错的问题

由于中间过程有时会遇到大量的报错,在使用 GPT-4 作为 LLM 时,API Key 的成本还挺高的,尝试了几个复杂需求就花费了我 5.75 美刀。

测试Open-Interpreter的成本

# 6. 将ChatGPT接入Telegram Bot

# 6.1 申请自己的 Telegram Bot

# 6.1.1 申请 Telegram Bot

找 BotFather 官方机器人申请自己的 Telegram Bot,需要记录下:BotName、TOKEN、CHATID等信息。

  • Step1:在Telegram中添加BotFather这个账号,然后依次发送/start/newbot,按照提示即可创建一个新的机器人。记下来给你生成的token。
  • Step2:搜索刚刚创建的机器人的名字,并给它发送一条消息。(注意:需要先与机器人之间创建会话,机器人才能下发消息,否则机器人无法主动发送消息)
  • Step3:在Telegram中搜索userinfobot,并给它发送一条消息,它会返回给你chatid,将它也记下来。

# 6.1.2 修改 Telegram Bot 头像

还是找 BotFather 官方机器人,先发送/setuserpic,它会让你选择为哪个Bot修改,选择完之后发送头像图片给它即可。

注:头像以图片的形式发送,不要以文件的形式发送(发送时点上那个压缩图片即为图片的形式发送)

# 6.2 接入Telegram Bot的步骤

# 6.2.1 ChatGPT-Telegram-Workers

将ChatGPT接入Telegram Bot的开源项目有很多,以下是我认为比较好的两个:

以下我采用了Cloudflare Workers免服务器部署ChatGPT-Telegram-Workers项目的方式。需要提前准备好:ChatGPT API密钥、Telegram Bot的Token和CHATID

# 6.2.2 部署Workers

Step1:打开 Cloudflare Workers (opens new window) 注册账号

Step2:点击右上角的 Create a Service

新建Workers

Step3:进入新建的workers, 选择Quick Edit, 将 index.js (opens new window) 代码复制到编辑器中,保存

# 6.2.3 配置环境变量

打开 Cloudflare Workers (opens new window) 点击你的Workers,点击右上角的 Setting -> Variables

  • API_KEY:设置成 OpenAI API Key
  • TELEGRAM_AVAILABLE_TOKENS:设置成 Telegram Bot Token
  • WORKERS_DOMAIN:设置成你的Workers域名,例如workers_name.username.workers.dev, 可以在workers详情页的Preview找到
  • CHAT_WHITE_LIST:设置成允许访问的 telegram bot 的chatid,例如123456789,987654321

配置Cloudflare-Workers环境变量

# 6.2.4 绑定KV数据

Step1:在首页——Workers——KV处,点击右上角的 Create a Namespace, 这里名字随便取。

创建Workers-KV

Step2:打开 Cloudflare Workers (opens new window) 点击你的Workers

  • 点击右上角的 Setting -> Variables
  • KV Namespace Bindings 中点击 Edit variables
  • 点击 Add variable
  • 设置名字为DATABASE,并选择刚刚创建的KV数据

# 6.2.5 初始化并开始聊天

初始化:浏览器打开 https://workers_name.username.workers.dev/init 地址,即可自动绑定telegram的webhook和设定所有指令。

开始聊天:打开我们的 telegram bot,输入/new命令,即可开始聊天。

ChatGPT-Telegram-Workers

# 7. 将ChatGPT接入微信

# 7.1 注册微信小号并实名

# 7.1.1 注册微信小号

由于将ChatGPT接入微信存在封号风险,因此建议注册小号去搞,被封了也不心疼。微信现在允许使用同一个手机号注册微信小号了,可通过如下步骤进行注册:

  • 我的——设置——切换账号——添加账号——注册新账号——通过当前微信的手机号辅助注册

注意:已绑定手机号、已开通微信支付、注册时间超过一定时长且当前帐号无安全风险的微信帐号可以辅助注册一个新微信帐号。如果不符合条件,可以找付费接码平台去注册微信小号。

# 7.1.2 微信小号实名

需要将微信小号进行实名认证,才可以将ChatGPT接入微信,可通过如下步骤进行实名认证:

  • 我的——服务——钱包——实名认证(需要绑定银行卡)

注意:如果未进行实名认证,后续扫码登录时,会报错[wechat_channel.py:135] - 'wxsid',无法使用。

另注:微信小号实名后,会送一个满10.01-10的微信支付红包,可以用来日常消费也可以充值Apple Store、Q币这种硬通货。

# 7.2 接入微信的步骤

# 7.2.1 chatgpt-on-wechat

基于大模型搭建的微信聊天机器人,同时支持微信、企业微信、公众号、飞书、钉钉接入,可选择GPT3.5/GPT4.0/Claude/文心一言/讯飞星火/通义千问/Gemini/GLM-4/LinkAI,能处理文本、语音和图片,访问操作系统和互联网,支持基于自有知识库进行定制企业智能客服。

支持多种方式进行部署,这里我采用最方便的Docker方式。需要提前准备好:Docker和Docker Compose环境、ChatGPT API密钥、微信小号

# 7.2.2 使用Docker进行部署

首先,需要下载 docker-compose.yml 文件

$ wget https://open-1317903499.cos.ap-guangzhou.myqcloud.com/docker-compose.yml
1

其原始内容如下:

version: '2.0'
services:
  chatgpt-on-wechat:
    image: zhayujie/chatgpt-on-wechat
    container_name: chatgpt-on-wechat
    security_opt:
      - seccomp:unconfined
    environment:
      OPEN_AI_API_KEY: 'YOUR API KEY'
      MODEL: 'gpt-3.5-turbo'
      PROXY: ''
      SINGLE_CHAT_PREFIX: '["bot", "@bot"]'
      SINGLE_CHAT_REPLY_PREFIX: '"[bot] "'
      GROUP_CHAT_PREFIX: '["@bot"]'
      GROUP_NAME_WHITE_LIST: '["ChatGPT测试群", "ChatGPT测试群2"]'
      IMAGE_CREATE_PREFIX: '["画", "看", "找"]'
      CONVERSATION_MAX_TOKENS: 1000
      SPEECH_RECOGNITION: 'False'
      CHARACTER_DESC: '你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。'
      EXPIRES_IN_SECONDS: 3600
      USE_GLOBAL_PLUGIN_CONFIG: 'True'
      USE_LINKAI: 'False'
      LINKAI_API_KEY: ''
      LINKAI_APP_CODE: ''
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

配置说明详见代码的config.json:

{
  "open_ai_api_key": "YOUR API KEY",                          # 填入 OpenAI API KEY
  "model": "gpt-3.5-turbo",                                   # 模型名称
  "proxy": "",                                                # 代理客户端的ip和端口,国内环境开启代理的需要填写该项,如 "127.0.0.1:7890"
  "single_chat_prefix": ["bot", "@bot"],                      # 私聊时文本需要包含该前缀才能触发机器人回复
  "single_chat_reply_prefix": "[bot] ",                       # 私聊时自动回复的前缀,用于区分真人
  "group_chat_prefix": ["@bot"],                              # 群聊时包含该前缀则会触发机器人回复
  "group_name_white_list": ["ChatGPT测试群", "ChatGPT测试群2"], # 开启自动回复的群名称列表
  "group_chat_in_one_session": ["ChatGPT测试群"],              # 支持会话上下文共享的群名称  
  "image_create_prefix": ["画", "看", "找"],                   # 开启图片回复的前缀
  "conversation_max_tokens": 1000,                            # 支持上下文记忆的最多字符数
  "speech_recognition": false,                                # 是否开启语音识别
  "group_speech_recognition": false,                          # 是否开启群组语音识别
  "use_azure_chatgpt": false,                                 # 是否使用Azure ChatGPT service代替openai ChatGPT service
  "azure_deployment_id": "",                                  # 采用Azure ChatGPT时,模型部署名称
  "azure_api_version": "",                                    # 采用Azure ChatGPT时,API版本
  "character_desc": "你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。",  # 人格描述
  "subscribe_msg": "感谢您的关注!\n这里是ChatGPT,可以自由对话。\n支持语音对话。\n支持图片输出,画字开头的消息将按要求创作图片。\n支持角色扮演和文字冒险等丰富插件。\n输入{trigger_prefix}#help 查看详细指令。",      # 订阅消息,公众号和企业微信channel中请填写,当被订阅时会自动回复
  "use_linkai": false,                                        # 是否使用LinkAI接口,默认关闭,开启后可国内访问,使用知识库和MJ
  "linkai_api_key": "",                                       # LinkAI Api Key
  "linkai_app_code": ""                                       # LinkAI 应用code
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

然后根据自己的需要,修改里面的配置:

version: '2.0'
services:
  chatgpt-on-wechat:
    image: zhayujie/chatgpt-on-wechat
    container_name: chatgpt-on-wechat
    security_opt:
      - seccomp:unconfined
    environment:
      OPEN_AI_API_BASE: 'https://api.gptapi.us/v1'
      OPEN_AI_API_KEY: 'sk-xxx'
      MODEL: 'gpt-4-1106-preview'
      PROXY: ''
      SINGLE_CHAT_PREFIX: '["bot"]'
      SINGLE_CHAT_REPLY_PREFIX: '"bot"'
      GROUP_CHAT_PREFIX: '["bot"]'
      GROUP_NAME_WHITE_LIST: '["GPT智能问答群", "GPT智能问答群1", "GPT智能问答群2", "GPT智能问答群3"]'
      IMAGE_CREATE_PREFIX: '["image"]'
      CONVERSATION_MAX_TOKENS: 4000
      SPEECH_RECOGNITION: 'False'
      CHARACTER_DESC: '你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题,并且可以使用多种语言与人交流。'
      EXPIRES_IN_SECONDS: 3600
      USE_GLOBAL_PLUGIN_CONFIG: 'True'
      USE_LINKAI: 'False'
      LINKAI_API_KEY: ''
      LINKAI_APP_CODE: ''
    restart: always
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

注意:可以添加 OPEN_AI_API_BASE 配置项,使其可以使用国产的第三方API地址。另外GROUP_NAME_WHITE_LIST里的群聊名称不能有&这种特殊字符。

然后将其构建成Docker容器,查看日志并扫码登录。

$ docker compose up -d
$ docker logs -f chatgpt-on-wechat
1
2

chatgpt-on-wechat扫码登录

注意:这个微信号不能退出,切换账号也不行,退出后机器人就不好用了,我这里使用了闲置手机登录的微信小号。

# 7.2.3 在微信里开始聊天

可以加这个微信小号私聊,或者将其拉入指定群聊,通过指定的标识位让其进行问题回答,我这里统一设置为bot。

chatgpt-on-wechat使用效果

成功请求到了问题时,可以在后台看到日志。

chatgpt-on-wechat后台日志

# 8. 参考资料

[1] 如何选择充值/提现网络?from 欧易官网 (opens new window)

[2] Depay卡的注册和使用完整指南 from Kerry的学习笔记 (opens new window)

[3] ChatGPT官方API可以抢先体验了 from CSDN (opens new window)

[4] 如何创建ChatGPT API密钥?操作路径和教程 from 云东方 (opens new window)

[5] OpenAI API 速率限制 from OpenAI官网 (opens new window)

[6] 中科院学术专用版 ChatGPT,开源了 from 知乎 (opens new window)

[7] Cloudflare Worker 代理请求 ChatGPT API,支持 Stream 流式输出 from Github (opens new window)

[8] 编写我自己的 ChatGPT 代码解释器 from Rick Lamers' blog (opens new window)

[9] 调研:开源版gpt code interpreter from CSDN (opens new window)

[10] Open Interpreter:OpenAI Code Interpreter的开源实现|本地化|可联网 from 知乎 (opens new window)

[11] cocopilot-gpt: 将GitHub Copilot转为API使用 from CaoYunzhou (opens new window)

[12] 微信正式支持“小号” 全量开放辅助账号注册功能 from 证券时报 (opens new window)

[13] 有功能限制风险,请谨慎使用 from Github issues (opens new window)

[14] 微信实名认证在哪里改? from 搜狐 (opens new window)

[15] KeyError: 'wxsid' from Github issues (opens new window)

[16] privateGPT不支持中文吗 from Github issues (opens new window)

[17] Welcome to GraphRAG from GraphRAG官方文档 (opens new window)

[18] GraphRAG: Unlocking LLM discovery on narrative private data from GraphRAG官方博客 (opens new window)

[19] 微软开源的GraphRAG爆火,Github Star量破万,生成式AI进入知识图谱时代? from 知乎 (opens new window)

[20] GraphRAG:很强,但贵得离谱 from 微信公众号 (opens new window)

[21] GraphRAG:微软发布史上最强的RAG知识库开源方案 from Bilibili (opens new window)

[22] 微软开源GraphRAG的使用教程-使用自定义数据测试GraphRAG from CSDN (opens new window)

[23] GraphRAG: Responsible AI FAQ from Github (opens new window)

[24] 微软近日开源了新一代RAG框架GraphRAG from 53AI (opens new window)

[25] GraphRAG快速指南 from BimAnt (opens new window)

Last Updated: 10/6/2024, 4:30:02 PM