Categories
日常应用

小试自定义GPT

最近不是在折腾LLM嘛,于是就试了两条路子:用openai的api,以及直接在openai的界面里面创建GPT。

前者没啥特别的,chatgpt的api做的很成熟了,from openai import OpenAI 之后直接在python里面调用几个现成的函数就好了。可选的参数其实也不多,主要就是prompt写的好一点就行。我的要求也不高,试了试基本满足。此外我还用到了微软 azure api,也很方便,两者一结合基本一个app就搓出来了,只是暂时还只能在命令行运行,没写前端ui罢了。

后者就麻烦了。我想着自己写前端ui还挺麻烦的,就想偷个懒直接在GPT里面弄弄看看行不。结果呢,现在这个版本实在是太挫了,只支持最最基本的action,虽然可以调用其他api,但还没研究出来怎么实现用户上传的文件扔到action api call里面。搜了搜他们的论坛也没啥结果,然后心累就到此为止了。

最后贴一下如何在openai 的GPT里面调用azure api。主要是api key那里实在是反用户直觉,我找了好久……一定要选 custom 然后把自定义的名字设为 Ocp-Apim-Subscription-Key 才可以。贴个图。

自定义 action -> authentication -> custom header name

当然azure api的文档做的也很差就是了,经常搜出来的是过时的文档,试一试都是404错误。哎,时间都花在这些琐碎的调试bug上了。

最后的结论是,在现在这个阶段,openai GPT的多模态做的还是太封闭,只适用于比较基础的交互需求,得等到后面允许自定义编程更丰富一些才可以。想做的稍稍复杂一点,写ui是逃不掉的了。web版还可以写个python+js凑和一下(flask这么轻量级的web开发框架真的是效率提升利器),app版xcode看了半天发现也是一等一的复杂……说好的ai改变程序开发呢?叹口气……

Categories
日常应用

用R做过的最无聊的事

有句话怎么说的来着,当你无聊的时候,就去背英语单词吧。

于是乎,曾经特别无聊,直接自己写了个R程序帮自己背单词。基本就是一个伪装在Rstudio里面的gre单词选择器。大致原理就是,死记硬背。每次显示一个单词和对应的四个选项,然后记录一下选没选对。下一次,自动优先没有选对的词,提高其出现的频率。大致就是一个简单的机器学习模型来预测我对于一个单词可能的出错率。

至于为啥要在r里面做这件事...因为我天天上班用r啊,成功地伪装在rstudio的界面里面,就没有人知道我是在摸鱼还是在正经工作了呢。当然,这都是陈年往事了...现在已经不需要背单词了,而且很多单词死记硬背其实没啥效果,最后不会用还是不会用。阅读量上来的词汇才是真的记住了。

不过死记硬背也大概是某个阶段不可避免的吧。不能读一篇文章一直查单词去了。所以这段代码我准备留着,说不定二十年后自己的孩子还能用到呢?谁知道呢对吧。

截图一张留念吧

RStudio里面背GRE单词
Categories
日常应用

微单拍月亮小白教程

虽然超级月亮每年都可能出现一次到两次,但是毕竟一年就那么几天,能拍拍也不错。然而我们一般也不会为了拍月亮而特意准备什么器材——常年拍鸟的有长焦镜头自然好,可是谁没事儿扛着个长枪大炮出门啊....园主反正就一个索尼微单(还是五年前买的),以及一个标配的18-55mm镜头...就这样简陋的装备,也能拍环形山好嘛。

下面是园主的心得。

  • 首先,放弃iphone。
  • 其次,你要有个长焦。(然而园主并没有)
  • 再次,你要有个单反。(园主只有个五年前的微单凑数)

我不知道现在的相机是不是更高级了,反正园主手里的这个微单是没有星空模式,所有自动模式拍的月亮都是一团光圈, 不比iphone好到哪里去....所以,靠手动模式吧!

拍月亮一团光圈的原因不是晚上光线不足没法对焦,而是因为月亮实在是太亮了!按照其他背景风景的亮度根本没法拍月亮。所以,降光线是最重要的。

首先,我们不是拍银河,所以iso降到100或200。

然后大光圈。曝光时间1/2000秒。或者你有三角架的话可以小光圈、延长曝光时间。

最后,最最重要的,对焦无穷远。园主的微单只有一个手动模式可以实现(随便搜了张图)。

screen-shot-2016-11-15-at-1-19-35-pm

嗯、还想要背景?那就高iso长时间同一位置再曝光一次。后期,靠photoshop合二为一吧。

所以最后的成果就是...勉强可以看到环形山。

dsc03139-c2摄于Mission Bay, San Francisco.

Categories
日常应用

《Stardew Valley 星露谷物语》送礼关系网

呃,前段时间入了Stardew Valley(星露谷物语)的坑,然后发现送礼是门很讲究的事情。

然后手痒痒,职业习惯使然,就顺手分析了一下送礼策略。

原始数据:Stardew Valley的官方wiki送礼页面

然后我就是想看一下怎么简单的可以携带一堆礼物然后送给不同村民。

分析办法:把官网wiki的数据抓下来,然后看一下那些东西可以同时送给多个人,又比较容易获得,这样便于有计划的生产和携带。

结果:画了一张图...v开头的是村民,其他都是礼物。前面分析在r,画图的时候还是用了gephi...便于控制。

screen-shot-2016-11-06-at-6-52-54-pm

源代码:

gift = read.csv("stardew valley gift.csv/Sheet 1-Table 1.csv", stringsAsFactors = F)

names(gift)

expand.gift = apply(gift, 1, 
      function (x) {
        gift_list = unlist(strsplit(x[2],"\n "))
        data.frame(v = x[1], g = gift_list)
        }
      )
expand.gift = do.call(rbind, expand.gift)

expand.gift$v = gsub("\n","",expand.gift$v)
expand.gift$g = gsub("[[:space:]]","",expand.gift$g)
expand.gift$v = paste0("v.",expand.gift$v)
names(expand.gift) = c("source","target")
write.csv(expand.gift, file = "expand.gift.csv", row.names = F)
expand.gift = subset(expand.gift, ! g %in% c("Prismatic Shard","Rabbit's Foot"))

expand.gift.mul = merge(expand.gift, expand.gift,
                        by.x = "v",by.y = "v")
expand.gift.mul = subset(expand.gift.mul, g.x!= g.y)

library(igraph)
gift.n = graph_from_edgelist(as.matrix(expand.gift.mul[,2:3]), T)
gift.n = as.undirected(gift.n, mode = "mutual")
V(gift.n)$size <- 1
l <- layout_with_kk(gift.n)
plot(gift.n,layout=l, vertex.label.cex	 = 0.7)

write_graph(gift.n, file = "svgift.gml",format = "gml")

原始数据:

sheet-1-table-1.csv

矢量图形:

svgift.pdf

Categories
日常应用

简单的shell

好像一直没怎么正儿八经的写shell....今天不得不动手写了。反正就是摸着石头过河吧。

for i in {1..20}
do 
    mydate=$(date -v-"${i}d" +"%Y/%m/%d")
    echo "------Now importing:"$mydate"--------"
done

这样就实现了一个简单的for循环。

  • do 和done完成一个循环...
  • date是给日期的,mac和linux貌似语法有点不一样,date -v-1d 这样是往前减一天。后面那个是日期的格式。
  • 然后等号旁边不能有空格,这个和r差别好大。
  • 然后如果command中间要引用变量,需要${}一下,有点像r的paste()然后eval(parse())。
  • 1..20相当于r的1:20,给出一个整数序列。echo就是打印到屏幕上了。

暂时就这些,至少现在用起来是正常的哈哈。