事情是这样的,我们公司不是有个读书小组嘛,但是今年大家都忙于工作,忽视了读书这件事,所以我就想着搞个群机器人,让它明天定时向群里推荐一本书,用来唤起大家对读书的兴趣。但在调试的过程中就发现gpt4o老喜欢推荐同样的几本书,这可就勾起我的好奇心了,是不是gpt4o就只知道推荐那几本,正好周末有空,我就斥巨资调用gpt4o的接口让它给我推荐书,调用1000次+,发现gpt4o最喜欢的书是…… 具体让我们来看下推荐结果的简单分析。
TOP20
首先我们直接看下Top20推荐书及其所占推荐比例:
排名前三的分别是《百年孤独》《人类简史:从动物到上帝》《杀死一直知更鸟》,前三的推荐比例接近一半,尤其是第一的《百年孤独》,在一千多次推荐中直接占有了超过25%的推荐比例,说明gpt4o是非常喜欢《百年孤独》这本书。
从上图中也可以看到,推荐比例前20的书都是一些很知名的书,我自己的话仅有其中6本没有看过,说来惭愧排名第一的《百年孤独》我自己收藏了一本纸质版,但一直都没看进去过,之前晚上传把里面任务的名字换成乡村爱情里角色的名字有利于阅读,不知道是真是假。 扯远了,gpt4o推荐排前二十书还是很推荐阅读的。
TOP50
这里我也顺便将推荐排名前50的书及推荐次数列在下面,当然在总的1608次推荐里,gpt4o一共推荐出了200多本书,看剩下没列出的推荐次数都是1-2次,而且有些书根本就不存在(应该是大模型幻觉),所以我这里就不再列出。
书名 | 推荐次数 |
---|---|
百年孤独 | 431 |
人类简史:从动物到上帝 | 244 |
杀死一只知更鸟 | 99 |
枪炮、病菌与钢铁:人类社会的命运 | 93 |
三体 | 87 |
思考,快与慢 | 78 |
一九八四 | 76 |
追风筝的人 | 52 |
小王子 | 37 |
了不起的盖茨比 | 34 |
苏菲的世界 | 29 |
高效能人士的七个习惯 | 27 |
战争与和平 | 26 |
基地 | 26 |
挪威的森林 | 20 |
原子习惯 | 14 |
如何赢得朋友与影响他人 | 11 |
从优秀到卓越 | 11 |
影响力 | 9 |
被讨厌的勇气 | 9 |
沙丘 | 8 |
霍乱时期的爱情 | 8 |
活着 | 8 |
银河系漫游指南 | 7 |
从零到一 | 7 |
成为 | 7 |
2001:太空漫游 | 7 |
自控力 | 6 |
当下的力量 | 6 |
当呼吸化为空气 | 6 |
习惯的力量 | 5 |
悉达多 | 5 |
老人与海 | 5 |
心流:最优体验心理学 | 4 |
无人生还 | 4 |
史蒂夫·乔布斯传 | 4 |
少有人走的路 | 4 |
从0到1 | 4 |
自私的基因 | 3 |
自卑与超越 | 3 |
学会提问 | 3 |
心态:成功的心理学 | 3 |
深度工作 | 3 |
穷爸爸富爸爸 | 3 |
局外人 | 3 |
活出生命的意义 | 3 |
海伯利安 | 3 |
创新者的窘境 | 3 |
消失的爱人 | 2 |
堂吉诃德 | 2 |
统计方法
这里公开下我的统计代码,如果大家有兴趣可以复现下,或者研究下其他LLM模型推荐的数据,这里主体用langChain实现,用到了gpt4o来推荐书,然后用了deepseek用来洗数据统计(主要是便宜),最后两个模型总共花了20多块钱(RMB)。
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser,JsonOutputParser
from langchain_core.runnables import RunnablePassthrough
from collections import Counter
import json
from collections import Counter
from concurrent.futures import ThreadPoolExecutor, as_completed
gpt4o = ChatOpenAI(model="gpt-4o", max_tokens=1024, temperature=1) # 这里temperature设置为1,增加返回结果的随机性
recommend_prompt = ChatPromptTemplate.from_messages(
[
("human", "请给我推荐一本你认为比较好的书"),
]
)
recommend_chain = recommend_prompt | gpt4o | StrOutputParser()
deepseek = ChatOpenAI(model="deepseek-chat",base_url = "https://api.deepseek.com", api_key = 'sk-xxxxxxxxxxxxx', max_tokens=1024, temperature=0)
book_name_prompt = ChatPromptTemplate.from_template(
'请从下面这段文字中提取出其中的书名,用jsonArray的形式返回,比如["百年孤独","学会提问"],其他任何内容都不要返回。 \n\n {content}'
)
# 用deepseek将gpt4的推荐结果中的书名提取出来
composed_chain = {"content":recommend_chain} | book_name_prompt | deepseek | JsonOutputParser()
frequency_counter = Counter()
def invoke_with_catch():
try:
res = composed_chain.invoke({})
return res
except Exception as e:
print(f"Exception occurred: {e}")
return []
def main():
# 这里用线程池提升统计速度
with ThreadPoolExecutor(max_workers=10) as executor:
futures = [executor.submit(invoke_with_catch) for _ in range(1000)]
for future in as_completed(futures):
res = future.result()
if res is not None:
print(res)
frequency_counter.update(res)
if __name__ == "__main__":
main()