“价值2个亿”的AI代码

前两天朋友圈里看到一段号称“价值一亿”的代码:

可以智能应答,很厉害是不是?

源码:

Python 极简版:

while True:
    print(input('').replace('吗','').replace('?','!'))

其实就是几个字符替换!抖了个机灵,也顺便黑了把当下某些言必称 AI 的风气。你别说,当年区块链概念火爆的时候,还真有人代码里放了个“Hello World”就出来诓钱了。风口之下,什么样的妖魔鬼怪都有。

不过真要自己做一个自动应答的机器人,其实也很简单,而且功能还比上面这位更强大。

方法一:ChatterBot 模块

ChatterBot 是一个生成自动应答的第三方库。一个简单的例子:

from chatterbot import ChatBot
# 生成机器人,指定输入输出和训练器
chatbot = ChatBot(
    'CrossinBot',
    input_adapter='chatterbot.input.TerminalAdapter',
    output_adapter='chatterbot.output.TerminalAdapter',
    trainer='chatterbot.trainers.ChatterBotCorpusTrainer'
)
# 以中文语料进行训练
chatbot.train('chatterbot.corpus.chinese')
print('你好,请问需要什么帮助?')
# 循环问答
while True:
    try:
        bot_input = chatbot.get_response(None)
    except (KeyboardInterrupt, EOFError, SystemExit):
        # CTRL-C/CTRL-D 中断退出
        break

效果:

使用 ChatterBot 的好处是问答数据保存在本地,无需联网。缺点则是你需要自己去训练你的机器人,默认语料的效果其实挺差的,一开始聊天差不多就是人工智障……而且通过聊天的过程学习,也存在被用户“教坏”的问题。
官方文档地址:
chatterbot.readthedocs.io

方法二:开放 AI 接口

鉴于方法一的问题,有很多平台提供了智能应答的 API 接口服务。以腾讯 AI 开放平台的“智能闲聊”接口为例:

import requests as rq
import time
import random
import string
import urllib
import hashlib

APPKEY = 'ABDEFGH'  # 换成你的APPKEY

def get_sign(data):
    lst = [i[0] '=' urllib.parse.quote_plus(str(i[1])) for i in data.items()]
    params = '&'.join(sorted(lst))
    s = params   '&app_key='   APPKEY
    h = hashlib.md5(s.encode('utf8'))
    return h.hexdigest().upper()

def chat(question):    
    url_chat = 'https://api.ai.qq.com/fcgi-bin/nlp/nlp_textchat'
    nonce_str = ''.join(random.sample(string.ascii_letters   string.digits, 16))
    data = {
        'app_id': 1234567890,  # 换成你的app_id
        'time_stamp': int(time.time()),
        'nonce_str': nonce_str,
        'session': '10000',
        'question': question,
    }
    data['sign'] = get_sign(data)
    r = rq.post(url_chat, data=data)
    answer = r.json()['data']['answer']
    return answer

print('你好,请问需要什么帮助?')
while True:
    try:
        print(chat(input()))
    except (KeyboardInterrupt, EOFError, SystemExit):
        # CTRL-C/CTRL-D 中断退出
        break

效果:

这个效果显而易见。但接口的前提是要联网,另外平台通常会有请求频率或功能的限制。现在很多平台还都可免费申请使用,部分特性可能需要付费。开放平台的好处是开发者可以不用费事就能得到很好的结果,不过要深度定制就不太方便,另外核心技术和数据也都是平台方的。

如果说前面那段代码可以估值一亿,拿个天使轮投资。那我这两段代码怎么也得值2个亿吧,可以直接A轮了。记得到时把咨询费打赏给我

玩笑归玩笑,但以上三段代码,也的确代表了三种开发方式:

  1. 自己实现
  2. 用第三方框架/库/代码
  3. 用 API 接口服务

在实际开发中,尤其是非核心功能,通常不建议自己从头实现,即“不重复造轮子”。因为很可能已经有成熟的开源项目做得比你好,站在前人的肩膀上可以事半功倍。这也是软件/互联网行业得以蓬勃发展的基石。但在使用开源项目和代码时也要尊重知识产权,注意人家的协议,是否可以商用,很多接口和数据也是有限制的。并不是你能拿到代码、能扒出接口、爬到数据,就可以放到自己的产品中。这方面有不少规矩,不按规矩来,即侵犯了别人的利益,也可能让自己掉坑里。下次可以来细说一下。



════

其他文章及回答:

编程实训 | 如何自学Python | 新手引导 | 精选Python问答 | Python单词表 | 人工智能 | 爬虫 | 我用Python | requests | 计算机视觉

欢迎搜索及关注公众号:Crossin的编程教室

以下是一个基于AlphaZero算法的高级五子棋AI代码,使用Python语言编写: ``` import numpy as np from collections import defaultdict class AlphaZero: def __init__(self, board_size=15, n_in_row=5, n_playout=1000, c_puct=5, lbd=0.5): self.board_size = board_size self.n_in_row = n_in_row self.n_playout = n_playout self.c_puct = c_puct self.lbd = lbd self.Qsa = defaultdict(lambda: 0) # Q value of state-action pairs self.Nsa = defaultdict(lambda: 0) # visit count of state-action pairs self.Ns = defaultdict(lambda: 0) # visit count of states self.Ps = {} # prior probability of actions self.Es = {} # end status of states (win / lose / tie) def get_action(self, board, temp=1e-3): for n in range(self.n_playout): board_copy = np.copy(board) self.simulate(board_copy) s = self.get_state(board) Ns = [self.Nsa[(s, a)] for a in self.get_legal_actions(board)] if temp == 0: a = np.argmax(Ns) return self.get_move(a) else: Ns = [n**(1/temp) for n in Ns] Ns /= sum(Ns) a = np.random.choice(len(Ns), p=Ns) return self.get_move(a) def simulate(self, board): actions = self.get_legal_actions(board) if not actions: return -1 s = self.get_state(board) if s not in self.Es: self.Es[s] = self.get_end_status(board) if self.Es[s] != 0: return -self.Es[s] max_u, best_a = -1e9, -1 for a in actions: u = self.get_value(board, a) if u > max_u: max_u = u best_a = a next_board = self.get_next_board(board, best_a) v = self.simulate(next_board) u = -v self.Nsa[(s, best_a)] += 1 self.Ns[s] += 1 self.Qsa[(s, best_a)] += (u - self.Qsa[(s, best_a)]) / self.Nsa[(s, best_a)] return v def get_legal_actions(self, board): return [(i, j) for i in range(self.board_size) for j in range(self.board_size) if board[i][j] == 0] def get_state(self, board): return str(board.reshape(self.board_size**2)) def get_end_status(self, board): for i in range(self.board_size): for j in range(self.board_size): if board[i][j] == 0: continue for di, dj in [(0, 1), (1, 0), (1, 1), (1, -1)]: if self.check_win(board, i, j, di, dj): if board[i][j] == 1: return 1 else: return -1 if len(self.get_legal_actions(board)) == 0: return 0 else: return None def check_win(self, board, i, j, di, dj): for k in range(self.n_in_row - 1): if i + (k+1)*di < 0 or i + (k+1)*di >= self.board_size or j + (k+1)*dj < 0 or j + (k+1)*dj >= self.board_size or board[i+di*(k+1)][j+dj*(k+1)] != board[i][j]: return False return True def get_value(self, board, action): s = self.get_state(board) if s not in self.Ps: self.Ps[s], v = self.policy_value(board) return v if (s, action) in self.Qsa: u = self.Qsa[(s, action)] + self.c_puct * self.Ps[s][self.get_index(action)] return u else: return self.c_puct * self.Ps[s][self.get_index(action)] def policy_value(self, board): state = self.get_state(board) legal_actions = self.get_legal_actions(board) policy = np.zeros(self.board_size**2) for a in legal_actions: policy[self.get_index(a)] = 1 policy /= sum(policy) v = self.lbd * self.get_net_value(board) return policy, v def get_net_value(self, board): pass # 基于深度学习的神经网络估值 def get_next_board(self, board, action): next_board = np.copy(board) next_board[action[0]][action[1]] = 1 return next_board def get_move(self, index): return (index // self.board_size, index % self.board_size) def get_index(self, action): return action[0] * self.board_size + action[1] ``` 这个AlphaZero实现包括以下功能: - `get_action(board, temp=1e-3)`:返回在当前棋盘状态下最优的落子位置 - `simulate(board)`:模拟一次随机搜索过程,并更新Q值和N值 - `get_legal_actions(board)`:返回当前状态下所有合法的落子位置 - `get_state(board)`:返回当前状态的哈希值,用于查找访问次数、Q值、P值等 - `get_end_status(board)`:返回当前状态的胜负情况(1表示先手胜利,-1表示后手胜利,0表示平局,None表示未结束) - `get_value(board, action)`:返回在当前状态下执行指定动作的价值估计 - `policy_value(board)`:返回当前状态的策略分布和价值估计,用于训练神经网络 - `get_net_value(board)`:基于深度学习的神经网络估值,需要自己实现 - `get_next_board(board, action)`:返回在当前状态下执行指定动作后的新状态 - `get_move(index)`:将状态哈希值中的索引转换为棋盘坐标 - `get_index(action)`:将棋盘坐标转换为状态哈希值中的索引
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crossin的编程教室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值