申请会员ID:jonah0x90【申请通过】
1、申请ID :jonah0x902、个人邮箱:jonah0x90@gmail.com
3、实在不知道讲些什么,那就简单讲一下目前条件下的AI白皮书
***
说句大白话,现在目前市场上的所谓人工智能其实差不多都可以理解为人工智障233,
https://i.imgur.com/9pdnnz6.png
各大厂商的人工智能在对话领域
看过钢铁侠的朋友们可能都希望有一个“贾维斯”来帮助自己搭理日常和工作,但是就目前的条件制约和未来的发展趋势来看,真正实现落地离我们还是非常遥远。
提前人工智能,目前最乐意接受的方式就是通过对话来实现目地,而不是出现一个屏幕,戳戳这里,点点哪里。
对话交互方式是人类的自然语言。坦白来讲是一个黑箱。它不像现在GUI产品那样,所见即所得界面即是功能,大家都可以一目了然。
人类发出对话语言(input)和收到AI的回答(output),这中间的处理过程作为用户来讲是无法感知的。所以这个黑箱里面都是开发者自由发挥的天地。
虽然可能各大厂商的黑箱内容均不同,但是万变不离其宗,目前来讲处理核心就是听人话(语音识别)+说人话(会话管理)
2015年突然火起来的机器深度学习和自然语言处理,让听人话技术门槛大大降低。
NLU的普及让很多开发者都掌握了:意图识别+实体提取 杀手锏级别的技能。这意味这什么?下面举个简单的例子。
*本例使用到的服务*
- LUIS[传送门](https://luis.ai)
>预定出租车
>我要打车
>我现在想去xxx
>现在有空车吗
>等等等
“自然的表达”有无穷多组合,不同的人有不同的表达方法。但是这些表达都是传递“乘出租车”这个意图,即便是不同的人都可以很准确的理解这些表达是指“乘出租车”这件事。
但是理解这么多不同的表达对机器来说显然不是那么容易。机器的专长是处理结构化的数据,例如关键字。这就要求了想要听懂终端用户表达的什么意图,必须在表达中准确的包含关键字信息。但是这也有很大的弊端在里面。比如我之前告诉机器“我想打车”,现在想要取消预定“我不想打车了”,机器仍会理解为你想要打车(关键字打车)。
NLU的出现为机器处理意图方面带来了飞跃的提升。通过训练可以让机器从多重表达语法中精准识别到用户的意图。
https://i.imgur.com/DuvcnjG.png
这样一来,看上去就是机器能听懂人话了。
https://i.imgur.com/V2waFnI.png
我们在出租车预定这个意图中添加了很多语料,然后通过训练,让机器更精准的理解意图。
https://i.imgur.com/2am9a3z.png
同时我们还建立了的实体。实体是做什么用的呢?看下图你便一目了然。
https://i.imgur.com/722S4on.png
自然语句被识别为“出租车.预定”意图。很nice,机器还在句子当中自动提取出来“一个小时以后”和“浦东机场”,这些分别指的是出发时间和目的地这两个概念(即实体)
现在既然知道了你的意图,机器要决定该说什么话。而这个回答内容就是百家争鸣了。
目前主流的做法是由所谓的“对话管理”或者“会话管理”系统来做出决定。
这些所谓的系统核心就是**“Slot filling”**(填槽),大白话来说就是填表。
就跟你去银行办一张银行卡一样,柜台小姐姐会先让你填写一张表。当你全部填写好了,她才会给你办理业务。
目前AI的**多轮对话**,也就是**上下文情景**管理,其实就是一个填表的过程。这个表格是针对某个场景下精心准备的。
看似自然的上下文对话,其实都是经过用心推敲后的完美展示。如果你的思维比较跳跃的话,所谓的上下文多轮对话就是个笑话。
https://i.imgur.com/XsETZSz.png
*网上搜的一张图,侵权删。*
我们就那这个图来简单说一下:(U->user A->ai)
U:看看明天的机票
A:(识别到明确的意图“订机票”,根据设计的表格,我现在还有2个空白需要用户填写)你想要去哪?
----第一轮会话结束----
U:我要去上海
A:(识别到目的地实体“上海”,完成填表动作,现在出发地需要用户填写。这里一般都是通过LBS来获取,不然会显的机器很傻。然后根据表格来执行查询,并反馈结果给用户)以下是明天可以搭乘的航班列表。
----第二轮会话结束----
当然你也可以在这个表格上扩展更多例如航司的喜好,价格优惠的偏好之类的。
一般来讲表格的内容丰满度决定来对话的轮次,需要注意的是过于冗长的表格会让用户感到厌恶。一般多轮会话都会控制在2~4轮之内。
很多市面上的产品都宣称自己多轮对话可以支持到xx轮多么多么厉害之类的等等等等。相比现在大家都清楚了吧,轮数的产生是由填表的次数决定轮。单单以轮次的衡量产品水平完全是无稽之谈。
在达到目地并且不影响体验的前提下,对话的轮次越少越好。
https://i.imgur.com/x6n39OO.png
之前的Google I/O发布了Duplex(谷歌智能助理)的录音demo,场景就是描述助理代替用户打电话去订餐厅,和店员沟通,帮助用户预定位子。其实一样是填表233。
如果你给智能助手最初定义是执行用户的某项操作,那用户就会更直接的说出他的想法,而不是发散的随便问问,而他也会就执行任务本身的功能给予好评,而偏偏产品经理要把它说成像人一样思考,人们寄予很高的期望,所以这也就是人工智障的说法来源。
哲学是科学的前瞻,哲学的认知伦和语义伦两大阶段是深刻理解和思考AI的基础,不了解这些哲人前瞻性的形而上学思考,很难催生出实在的AI科学,哲学最早的本体论阶段,催生了今天的主要科学。
所以今天的AI很像一个幼儿,还为期过早,很稚嫩完全没有思考力。人类两大认知方法,归纳总结和逻辑演绎,深度学习本质上只是一个归纳总结法,宇宙进化了几十亿年才有了人类理性推理的系统,我们却寄希望于一个基于硅基的才不到100年的技术就要实现落地的想法是非常不现实的。 抱歉,未能达到申请要求,申请不通过,可以关注论坛官方微信(吾爱破解论坛),等待开放注册通知。
ps:来些技术内容申请? Hmily 发表于 2019-12-5 13:03
抱歉,未能达到申请要求,申请不通过,可以关注论坛官方微信(吾爱破解论坛),等待开放注册通知。
ps: ...
论坛大大说要来一些技术方面的东西。
```Csharp
private async Task<bool> ShowKnowledgeBaseResultsAsync(
IDialogContext context,
LuisResult result,
BotMetric telemetryEvent,
bool needsMandatoryKeywords = true,
bool showFallbackResults = true,
bool notDisplayResults = false)
{
// check config if Bing is disabled, don't use it
showFallbackResults = showFallbackResults && this.AllowFallback;
var handled = false;
// azure index results - KB results and action link results
var search = Conversation.Container.Resolve<IKnowledgeBaseSearch>();
var knowledgeBaseResults = await search.GetLuisSearchAsync(result, telemetryEvent, needsMandatoryKeywords).ConfigureAwait(false);
if (knowledgeBaseResults.Records != null && knowledgeBaseResults.Records.Any())
{
List<KnowledgeBaseQuestionId> kbAnswers = new List<KnowledgeBaseQuestionId>();
foreach (var answer in knowledgeBaseResults.Records)
{
kbAnswers.Add(new KnowledgeBaseQuestionId(answer.QuestionId, answer.Score));
}
if (notDisplayResults)
{
var message = PackageChannelDataToMessage(context
, result
, knowledgeBaseResults.Records.First().Question
, configuration.LuisOptions.MinConfidence
, true
, kbAnswers);
await context.PostAsync(message).ConfigureAwait(false);
}
else
{
string subtitle;
var title = GetCardTitleDetails(result, out subtitle);
var displaySearchResult = new DisplaySearchResult(Telemetry);
var customChannelData = PackageCustomChannelData(result, kbAnswers, true, configuration.LuisOptions.MinConfidence);
await displaySearchResult
.DisplayKnowledgeBaseResultAsync(context, customChannelData, knowledgeBaseResults, title, subtitle)
.ConfigureAwait(false);
}
this.SendFeedbackForKbResult(context, result, knowledgeBaseResults.Records);
handled = true;
}
//else if (showFallbackResults)
//{
// // could be Bing or Too much KB
// var needBingResult = knowledgeBaseResults.Records != null || !knowledgeBaseResults.Records.Any(); // no results in KB
// if (needBingResult)
// {
// CustomChannelData customChannelData = new CustomChannelData
// {
// Luis = result,
// KBAnswers = null
// };
// var query = result.AlteredQuery ?? result.Query;
// handled = await this.ShowFallbackResultsAsync(context, customChannelData, query, telemetryEvent).ConfigureAwait(false);
// }
// else
// {
// telemetryEvent.Mark(
// TelemetryMetrics.BingResults,
// "END: Reverting to user as found too many answers in KB");
// }
// // Went to fallback, so handle missing KB
// await HandleMissingKnowledgeBase(telemetryEvent);
//}
return handled;
}
private async Task AskToRephraseAsync(IDialogContext context, LuisResult result, BotTelemetryEvent telemetryEvent)
{
var message = PackageChannelDataToMessage(context, result
, $"不好意思我不理解 **'{result.Query}'**. 您可以换一种说法么?"
, configuration.LuisOptions.MinConfidence);
await context.PostAsync(message).ConfigureAwait(false);
//await HandleMissingKnowledgeBase(telemetryEvent);
}
private static List<IntentRecommendation> GetSimilarIntents(LuisResult result, double luisMinConfidence = 0.5)
{
var similarIntentScore = result.TopScoringIntent.Score * 0.7;
return result.Intents.Where(x =>
(x.Score >= similarIntentScore
&& x.Score.Value >= luisMinConfidence)
|| x.Intent.Equals(result.TopScoringIntent.Intent, StringComparison.InvariantCultureIgnoreCase)).ToList();
}
```
*因为保密协议的缘故,详细的技术实现无法写太多。。。*
>既然申请ID就贴一些符合主题的之前手边的小工具吧。
**前公司制度规范每个工作日需要在公司论坛完成日常任务,与薪酬挂钩不得不重视。。。**
简单分析一下登录地址:
```
member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1";
```
观察了一下,传统的**form表单**提交。
用代码来实现模拟登录然后完成发帖回复任务量。
用Postman初步尝试了一下。。返回:**您当前的访问请求当中含有非法字符,已经被系统拒绝**
检查了一下少了2个参数
```
quickforward=yes&handlekey=ls
```
再次提交还是一样的错误,什么鬼?再次检查发现对**referer**地址进行了验证。好吧,带上**referer**
这次提示信息变了,**请输入验证码**。
基于Discuz的验证码登录的话,通过观察与尝试发现在html隐藏了3个hidden属性的**hash验证值**。
看一下返回页面的html代码,一个叫**loginhash**,另外一个叫**seccode_** ,最后一个叫**formhash**
通过正则拿出来
```Csharp
private string GetLoginHash(string html)
{
Match match = new Regex(";loginhash=(?'hash'.*?)\"", RegexOptions.None).Match(html);
return match.Groups["hash"].Value.ToString();
}
private string GetSeccodeHash(string html)
{
if (html.Contains("seccode"))
{
//\"seccode_(?'hash'.*?)\"
Match match = new Regex("\"seccode_(?'hash'.*?)\"", RegexOptions.None).Match(html);
return match.Groups["hash"].Value.ToString();
}
else
{
return null;
}
}
private string GetFormhash(string html)
{
Match match_FormHash = new Regex("<input type=\"hidden\" name=\"formhash\" value=\"(?<key>.*?)\" />", RegexOptions.None).Match(html);
return match_FormHash.Groups["key"].Value.ToString();
}
```
拿到**secondhash**后直接去请求获得验证码图片。
```Csharp
var url = $"misc.php?mod=seccode&action=update&idhash={SeccodeHash}&inajax=1&ajaxtarget=seccode_{SeccodeHash}"
```
这里又对**referer**进行了验证,验证未通过返回**Access denied**
拿到验证码图片后就简单了,公司论坛的图形验证码很简单基本没有什么干扰直接调用一个三方的识别API就搞定了。
最后提交的时候要把**Loginhash**带进去
```
var url = $"member.php?mod=logging&action=login&loginsubmit=yes&handlekey=login&loginhash={loginhash}&inajax=1"
```
验证码的结果和之前拿到的hash验证值放到form里面。
```
var params = "formhash={formhash}&referer=http%3A%2F%2Fwww.abc.com%2Fbbs%2Fforum.php&auth={auth}&seccodehash={seccodehash}&seccodemodid=member%3A%3Alogging&seccodeverify={verifycode}&loginsubmit=true"
```
这里面只有一个坑就是因为ID实名,编码格式是**GB2132而非UTF8**。
btw如果账号启用了安全提问验证登录,需要在form里面把问题编号和答案一起post过去。
登录成功以后拿到Cookie就可以根据tid在某些板块随机阅读帖子,发布新帖子或者回复内容以便完成考核任务自动化。。。
如果回帖的页面中包含了**hidden seccode_** 就意味着回复内容需要填写验证码。
URL中包含了fid&tid
```
var url =$"forum.php?mod=post&action=reply&fid={fid}&tid={tid}&extra=&replysubmit=yes&infloat=yes&handlekey=fastpost&inajax=1"
```
Form中除去了日常的**seccodehash**和**seccodeverify**以及**formhash**就多了一个
```
seccodemodid
```
这个值一般是固定的在html用正则抓出去即可。
组合完成后直接post提交即可。
如果返回的html中正则匹配到了
```
succeedhandle_fastpost
```
代表服务器已经完成执行动作succeed
基本上没有什么困难点。只要细心观察留意与服务器的正常交互报文,用代码实现模拟下来没什么问题。
因为是4年前的代码了。所以没有贴图内容辅以佐证,只能在github上看着源代码回想简单讲一下。
传送门:(https://github.com/Jonah0x90/Discuzpost-for-zlsoftbbs) I D:jonah0x90
邮箱:jonah0x90@gmail.com
申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。 Hmily 发表于 2019-12-10 10:27
I D:jonah0x90
邮箱:
前来报道。感谢大大
页:
[1]