继续跟着这个走:
- 小白编译AnyQ-docker&linux[CentOs]——AnyQ系列之一
容器创建时使用的命令是:
docker run -itd --name centos-anyq -p 0.0.0.0:8888:8999 centos:centos7 # 这句话其实有问题,把容器放到后台执行了 docker exec -it centos-anyq /bin/bash # 把容器放回到前台
demo查看
# 获取anyq定制solr,anyq示例配置 cp ../tools/anyq_deps.sh . sh anyq_deps.sh # 这步是下载一个model # 启动solr, 依赖python-json, jdk>=1.8 cp ../tools/solr -rp solr_script sh solr_script/anyq_solr.sh solr_script/sample_docs # 如果没有java 这句会报错 可以按照上面的安装再走一次 java -version > java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0_171-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode) #运行 ./run_server # 退出记得 ctrl+Z 不要直接关掉,不然端口会被占用
如果重新进入docker 记得切换到build目录
cd /home/AnyQ-master/build/ # 如果端口不幸被占用 查看容器内的端口 netstat -tnlp | grep 8999 # yum install net-tools > tcp 0 0 0.0.0.0:8999 0.0.0.0:* LISTEN 111723/./run_server > lsof -i:8999 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME run_serve 111723 root 3u IPv4 23682314 0t0 TCP *:bctp (LISTEN) run_serve 111723 root 9u IPv4 30077501 0t0 TCP a14447576c14:bctp->192.168.30.159:11545 (ESTABLISHED)
运行之后,访问自己的服务器ip:8888就可以看到:
或者可以 服务器ip:8888/anyq?question=使用什么帐号? 。 不过我返回的东西很奇怪。。
似乎编码有些问题。然后反应过来可以在控制台查看啊,浏览器的开发者工具。(但是我不太会,但是我知道人家这个是任务台搞出来的。)
但是后台log信息就很棒咧
或者容器内调用 curl "127.0.0.1:8999/anyq?question=需要使用什么账号登录"。
也可以多尝试尝试其他的例子,比如:
仔细查看输出,可以发现,anyQ的大致步骤
- 以某种方式找到与query相关的FAQ集合中的候选问题,candidate query。从输出的log提示中,可以知道使用的是simnet_paddle_sim.cpp这个文件,可以点击这里了解这个文件
SimNet是百度自然语言处理部于2013年自主研发的语义匹配框架,该框架在百度各产品上广泛应用,主要包括BOW、CNN、RNN、MM-DNN等核心网络结构形式,同时基于该框架也集成了学术界主流的语义匹配模型,如MatchPyramid、MV-LSTM、K-NRM等模型。SimNet使用PaddleFluid和Tensorflow实现,可方便实现模型扩展。使用SimNet构建出的模型可以便捷的加入AnyQ系统中,增强AnyQ系统的语义匹配能力
- 计算这些候选问题的jaccard,使用的是jaccard_sim.cpp这个文件,可以点击这里查看详细情况,其实这个文件挺简单的,就是jaccard相似度,Python里调一行的事情,换成c++加速了。
Jaccard index , 又称为Jaccard相似系数(Jaccard similarity coefficient)用于比较有限样本集之间的相似性与差异性。Jaccard系数值越大,样本相似度越高。
- 将候选结果排序,找出最后选定的那个候选query。主要使用这个rank_strategy.cpp文件,点击这里查看详细情况
- 返回上面选定的query对应的回答,作为最终的回答。主要使用这个 anyq_strategy.cpp,点击这里查看文件详情。
也可以尝试其他的问题,比如:今日日期,但是没有返回值,所以自带的FAQ问答对集合非常有限。可能需要自己添加一些。
从这个数据上猜测这个anyq是不是就是百度AI平台的人工客服,试了一下,应该不是。
找了一下,这个anyq的数据来自solr/sample_docs
所以接下来就是尝试加入自己的数据进行尝试了。
- https://blog.csdn.net/u011818766/article/details/104117469
- https://www.jianshu.com/p/0647b27b9284
- https://blog.csdn.net/weixin_37792714/article/details/103984292
之前保存过镜像了,刚好试一把,
参考
- AnyQ如何配置solr动态读取数据库——AnyQ系列之二
- Solr的基本使用
注意:
- 这里8999端口是 anyq问答的端口
- 如果要查看solr,solr的webapp页面端口是8900
- 所以启动容器的时候,要么写两个接口映射,要么就是不使用默认的bridge模式,直接使用host模式。
- 关于这两个模式,参考:docker的四种网络模式(Bridge、Host、Container、None 网络模式),自定义网络(创建自定义网桥、使两个不同网桥的容器通信、跨主机容器容器通讯等)
- bridge是默认的,要通过特定规则(比如指定端口映射)完成容器和外接的通信
- host是需要--network=host来指定的,host模式下的容器直接使用宿主机的 IP 地址与外界进行通信。
- 这里可以使用多个端口映射的方式:
docker run --name definedName(自定义容器名称) -p 8080:8080(端口映射 本机端口: docker端口 ) -p 8081:8081 -p .... -d imagesName(镜像名称)
实际使用以下代码:
# -p -p ip:hostPort:containerPort # -p 8888:8999 这里多个端口映射 其中 solr端口 本机和容器端口号用了一样的 docker run -itd --name anyq-faq -p 0.0.0.0:8886:8999 -p 0.0.0.0:8900:8900 anyq/base # 如果不小心创建失败,提示容器名称被占用 可以 docker stop anyq-self # 暂停容器 docker rm anyq-self # 删除容器 # 如果是端口名称被占用 要么换一个端口 要么找到占用端口的那个容器 删了 docker exec -it anyq-self /bin/bash
这里注意,虽然基于的这个镜像是之前配好的容器保存的,但是java还是没有配置在系统路径中,所以每次重新开一个容器,都要重新配置一次java的系统路径
java -version > bash: java: command not found cd /home ##6.配置java环境 export PATH=`pwd`/jdk1.8.0_171/bin:$PATH > java -version java version "1.8.0_171" Java(TM) SE Runtime Environment (build 1.8.0_171-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode) # 这步可以不执行 cd AnyQ-master/build/ sh anyq_deps.sh # 这步是下载一个model # 这步需要执行,启动solr脚本,不然会报错 # AnyQ RAW: curl_easy_perform Failed[Couldn't connect to server]; sh solr_script/anyq_solr.sh solr_script/sample_docs # 然后运行服务 ./run_server
然后就可以像之前一样正常启动,看看效果了。浏览器里输入:192.168.20.137:8886/anyq?question=使用什么账号?
至此,保存为镜像,验证基于此镜像重新弄容器的步骤验证完成。
访问http://ip:8900/solr/这个链接,注意,这里不能只访问http://ip:8900,必须到后面的solr,不然会报错。
然后就会看到solr的这个简易的界面
要稍微了解一下这个solr,可以查看下面的solr简介部分。
ctrl+Z # 暂停当前的 run_server jobs # 看一下这个被终止的run_server服务的后台序号 > [1]+ Stopped ./run_server bg 1 # 放到后台继续运行 然后CLI就暂时空出来可以看其他东西了
找找这个目录,其实就在build目录下
查看一下这个目录,可以看到有以下内容
网上大部分其他关于solr的博客主要都会看一下这个example目录中solr目录,这里先看一下example目录(注意,以下内容皆为solr的示例,而不是anyq的数据)
再看一下solr目录
这就与什么是Solr,它能为我们解决什么问题,怎么用? 文章中示例的图一模一样了。里面出现了collection1这个文件夹
这里有16条文档,刚好和之前anyq测试时看到的那个数据集FAQ数量相同。仔细看一下collection文件夹的内容
其中那个core.properties配置文件里只有一行字:name=collection1。另外,data文件夹的结构如下,查看后,以下文件打开全都是乱码字符,找不到可以使用的内容。
conf配置文件夹中的conf/managed-schema.xml文件就是对数据库的模式描述,主键,还有样本的属性等等。
- 参考:Solr【一】:初识Solr,其中有solr连接mysql的讲解。
与之类似的还有一个 conf/schema.xml.bak文件。 - 参考:Solr的基本使用
- 该配置文件是Solr数据表配置文件,它定义了加入索引的数据的数据类型的。主要包括FieldTypes、Fields和其他的一些缺省设置。
- field:进行索引,需要创建document,document中包括 了很多的field(域)。
- field属性:是否索引、是否存储、是否分词 ,是否多值multiValued
- multiValued:该Field如果要存储多个值时设置为true,solr允许一个Field存储多个值,比如存储一个用户的好友id(多个),商品的图片(多个,大图和小图),通过使用solr查询要看出返回给客户端是数组:
- Fieldtype:在solr中对每个Field都有一个Type类型。
- 在Solr中进行索引、搜索时需要用哪些field需要提前在schema.xml文件中定义!!!!
另外,可以看一下这个和collections同级的solr.xml配置文件
${host:} ${jetty.port:8983} ${hostContext:solr} ${zkClientTimeout:30000} ${genericCoreNodeNames:true} ${socketTimeout:0} ${connTimeout:0}
solr简介
- 什么是Solr,它能为我们解决什么问题,怎么用? :这里也有solr配置中文分词的教程
- Solr百度百科
简单来说:Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。
Solr是一个可扩展的,可部署,搜索/存储引擎,优化搜索大量以文本为中心的数据。
和数据库的区别:
- solr本身也可以看成数据库,(no sql类型),但它比数据库搜索速度更快,所以在项目中我们一般把搜搜的部分交给solr,就像我们在京东首页所看到的商品信息,并不是来自数据库,而是来源于sorl的索引库
- 数据库本身不能实现分词效果,而只能使用模糊查询,但是模糊查询非常低效,查询速度比较慢,由于在实际生活中,一般搜索是用的比较多的,这样数据库压力自然就很大,所以我们就让供专业的solr来做搜索功能
一条一条加进去
- AnyQ如何配置solr动态读取数据库——AnyQ系列之二
- Solr的基本使用
- AnyQ solr一键启动
- https://github.com/baidu/AnyQ/blob/master/tools/solr/sample_docs
留个坑,暂时先不尝试了,去看看这个anyq的整体框架和功能支持。
无意义的尝试
********无意义的尝试 可以不加privileged这个参数的 ******** ********按照以前的方式创建就没问题 那个博主写的有问题******** docker run -it --name=anyq-self --ipc=host -p 8886:8999 --privileged=true anyq/base /usr/sbin/init > [FAILED] Failed to start LSB: Bring up/down networking. See 'systemctl status network.service' for details. # 使用上句报错了 不加--network=host 就会报错。 > docker run -itd --name=anyq-faq -p 0.0.0.0:8886:8999 --privileged=true --network=host anyq/base /usr/sbin/init WARNING: Published ports are discarded when using host network mode # 但是这里使用--network=host 虽然 docker run -itd --name=anyq-host --privileged=true --network=host anyq-host /usr/sbin/init docker run -itd --name centos-anyq -p 0.0.0.0:8888:8999 centos:centos7
-
使用--privileged=true和/usr/sbin/init参数确保在容器中可以用systemctl命令,关于这个systemctl命令,参考:Systemd 入门教程:命令篇
- 不然会报错:
[FAILED] Failed to start LSB: Bring up/down networking.
See ‘systemctl status network.service’ for details.- 错误解决:stack obverflow:Docker service start failed
- centos:7 container failed to start with /usr/sbin/init after update 12/16/2015 #39
- 而且目前看下来,似乎只有centos这个linux发行版会有这个问题,ubuntu好像没有。
-
关于警告信息:
- 参考: WARNING: Published ports are discarded when using host network mode 解决方法



