yokon's blog

Claude|媲美ChatGPT,如何免费接入到个人服务

2023.05.08

前段时间 Claude 很火,在网上被说成是 ChatGPT 的最强对手,是 ChatGPT 的替代品。本文我将介绍下 Claude 是什么,以及如何免费使用 Claude。

当然本篇文章肯定不会只说这些无聊的内容,最后我会实践下如何免费接入我们的 web 服务。注意,这里接入是在没有申请到 api 的情况下做的。

Claude

我们让 Claude 自我介绍下:

Claude 是一款开源的中文聊天机器人。它由 Anthropic 开发,用于自然对话和问答。Claude 具有以下主要功能:

  1. 自然语言理解能力。claude 可以理解人类的自然语言,并作出相应的响应。
  2. 知识图谱。claude 内置了大量常识知识,这些知识来源于维基百科和其他开放数据源。
  3. 智能问答。claude 可以自动回答关于常识知识的问题。如果它没有找到准确的答案,它会说“我不知道”。
  4. 可扩展的知识。claude 的知识是动态扩展的,会随着时间的推移而不断丰富。
  5. 中文支持。claude 可以理解和生成中文文本,这是它区别于其他机器人的一个重要特点。
  6. 个性管理。claude 有不同的语言风格和个性,用户可以选择不同的语言风格和个性。
  7. 安全考虑。claude 在回答问题和生成响应时会考虑安全和道德因素。它不会生成任何有害、欺诈、危险或非法的内容。

综上,claude 是一个功能强大而且安全可靠的中文智能聊天机器人。它可以应用于各种场景,如智能客服、线上助手等。

post48_1.png

Claude in Slack

Slack 是一款流行的团队协作和通讯软件。

Claude 官方给我定义了很方便的 Slack 应用 Claude-in-Slack,我们直接把它添加到 Slack 中即可使用。添加的操作也很简单:

  1. 先注册 Slack
  2. Claude 官网,点击 Add to Slack
  3. 在跳转的页面点击 添加到 Slack
  4. 在 Slack 中选择 Claude 应用,进入聊天窗口开始使用

Slack API

当然这些内容在搜索引擎上能检索出一大堆,那我写这篇文章干啥呢,就为了水一篇吗? 当然不是,标题是如何接入到个人服务,这里说的当然不是仅仅通过 slack 使用。

虽然 Claude 开放了 API 的申请,我的 ChatGPT 4.0 API 都通过了,Claude API 还是没有下文。但是我想接入到我的服务中,只是通过 slack 来使用的话,显然不满足我的需求。

难道没有 API 权限就无法使用了吗?

我在查询了各大论坛,直到看到一个网友说:

post48_2.png


Slack 为我们提供了各个语言的 SDK,我们以 python-slack-sdk 来作为演示示例。代码会提供在 GitHub,觉得有用的大伙给个 Star 吧。

Slack Token

为了使用 Slack 的 SDK,我们需要新建一个 Slack APP

post48_3.png

输入 app 名称并选择自己的 workspace。 post48_4.png 创建后点击我们的 APP,然后点击左侧栏的 OAuth & Permissions。下拉找到 Scopes,为我们的 User Token 添加 Scope。 post48_5.png

这里 Slack 下面也说了,可以根据使用到的 API 来选择 scope。具体 API 对应的 scope 大家可以自行通过 Slack API methods 了解。本次演示我只用到了如下 API:

  1. conversations.open:打开会话。依赖 scopes:
    • channels:write
  2. chat.postMessage:频道内发送消息。依赖 scopes:
    • chat:write
    • im:write
  3. conversations.history:获取对话的消息和事件历史记录。依赖 scopes:
    • channels:history
    • im:history

我们把依赖的三个 scopes,依次添加到 User Token Scopes 中。

然后我们把 APP 安装到我们的 workspace 中: post48_6.png 安装后,这里会生成我们需要的 User OAuth Token,我们复制这个 Token,后面需要用。

Claude Bot ID

我们进入我们的 Slack 应用页面,找到我们的 Claude 应用,右击然后选择查看应用详情,复制 Claude 的成员 ID。后面需要用到。

post48_7.png

Slack Claude Server

走完上面的流程后,我们已经拿到了我们需要的两个值。

  1. User Token
  2. Claude Bot ID

下面就开始开发我们的服务了。

打开频道

首先,我们要先通过 API 开启我们的会话。因为我的服务都是 async 的,这里我选择使用 Slack-SDK 的AsyncWebClient客户端类。我们定义 Client 类封装下:

from slack_sdk.web.async_client import AsyncWebClient
from slack_sdk.errors import SlackApiError

CLAUDE_BOT_ID = "xxxxxxx"  # 我们上面获取到的 Claude Bot ID

class SlackClient(AsyncWebClient):

    CHANNEL_ID = None  # 属性:频道ID

我们通过 sdk 提供的conversations_open 来打开频道会话:

async def open_channel(self):
    response = await self.conversations_open(users=CLAUDE_BOT_ID)
    self.CHANNEL_ID = response["channel"]["id"]

发送消息

通过chat_postMessage发送消息:

async def chat(self, text):
    if not self.CHANNEL_ID:
        raise Exception("Channel not found.")

    resp = await self.chat_postMessage(channel=self.CHANNEL_ID, text=text)
    self.LAST_TS = resp["ts"]

这里我们记录下我们消息的时间,用于后面获取回复时作为参数。

获取回复

这里我们循环去获取 Claude 最新的回复消息列表,我们取最后一条结果:

async def get_reply(self):
    for _ in range(150):
        try:
            resp = await self.conversations_history(channel=self.CHANNEL_ID, oldest=self.LAST_TS, limit=2)
            msg = [msg["text"] for msg in resp["messages"] if msg["user"] == CLAUDE_BOT_ID]
            if msg and not msg[-1].endswith("Typing…_"):
                return msg[-1]
        except (SlackApiError, KeyError) as e:
            print(f"Get reply error: {e}")

        await asyncio.sleep(2)

	raise Exception("Get replay timeout")

我设定了 300 秒内,无响应则抛出异常。

测试

async def server():
	client = SlackClient(token=getenv("SLACK_USER_TOKEN"))  # 自己的Token
	await client.open_channel()
	while True:
		prompt = input("You: ")
		await client.chat(prompt)

		reply = await client.get_reply()
		print(f"Claude: {reply}\n--------------------")

asyncio.run(server())

post48_8.png

可以看到我已经成功和 Claude 交流了。这样的话我们的目的就达成了,后面怎么把它接入我们的自己的系统,大家可以自由发挥。

这里我给大家部署了个单进程 api 服务(不会长期开启),大家可以体验下 Claude 的能力。

对话

有多并发可能会消息错乱,只作为 demo 使用。对话完记得调用清除接口清空会话。

curl -X 'POST' \
  'https://claude.yokonsan.com/claude/chat' \
  -H 'accept: application/json' \
  -H 'x-token: 13832bf5-ed7c-4b5c-a30b-e7db48d25b86' \
  -H 'Content-Type: application/json' \
  -d '{
  "prompt": "你好"
}'

清空会话

curl -X 'POST' \
  'https://claude.yokonsan.com/claude/reset' \
  -H 'x-token: 13832bf5-ed7c-4b5c-a30b-e7db48d25b86' \
  -H 'accept: application/json' \
  -d ''

总结

本文介绍了 Claude,以及如何在 Slack 中免费使用 Claude。然后我带大家搭建了自己的个人 Claude 服务,演示如何将 Claude 免费接入自己的系统。

大家可以在 GitHub 我的仓库 claude-in-slack-api查看我的代码,大家觉得有用的话,可以点个 star。

Claude 虽然被吹捧的很高,但对比下还是比 ChatGPT 差很多。大家自行多多体验。