惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
爱范儿
爱范儿
WordPress大学
WordPress大学
博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
Vercel News
Vercel News
aimingoo的专栏
aimingoo的专栏
T
Tailwind CSS Blog
罗磊的独立博客
B
Blog
博客园_首页
A
About on SuperTechFans
有赞技术团队
有赞技术团队
V
V2EX
U
Unit 42
I
InfoQ
IT之家
IT之家
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
博客园 - 叶小钗
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
The Cloudflare Blog
H
Help Net Security

XINDOO

关于内卷,几个值得深想的洞察 当创作被 Skill 化:我用 AI 写了一部 320 章的长篇网文 AI第一剑,先斩程序员 AI 也会偷懒?这个 PUA 工具专治“摸鱼式编程” Gstack 深度解析:YC CEO 开源的 AI 工程团队 GitHub Trending霸榜!深度解析AI Coding辅助神器 Superpowers 深度探讨:从 OpenClaw 爆火,看 AI Agent 的真相与程序员的未来 我复刻了NotebookLM的信息图功能 我用AI写了部小说,这里是整个过程 [翻译]我在谷歌14年学到的21堂课 2万字吊打40万字:为什么我的“牛马Agent”比“数字分身”更聪明? 最近AI领域爆火的 Agent Skills 是什么? 从计算机科学的视角来看拖延症 一周改6个库后我悟了:AI时代,程序员正在退化成“甲方” 使用n8n做一个自动同步更新的Github项目问答机器人 Agent设计模式——第 20 章:优先级排序 Agent设计模式——第 1 章:提示词链 Agent设计模式——附录 D - 使用 AgentSpace 构建 Agent Agent设计模式——第 19 章:评估和监控 Agent设计模式——第 10 章:模型上下文协议 (MCP) Agent设计模式——第 21 章:探索和发现 Agent设计模式——智能体设计模式 Agent设计模式——第 11 章:目标设定和监控 Agent设计模式——第 9 章:学习和适应 Agent设计模式——第 16 章:资源感知优化 Agent设计模式——附录 G - 编码 Agent Agent设计模式——第 13 章:人机协同 Agent设计模式——第 17 章:推理技术 Agent设计模式——附录 F - 深入剖析:Agent 推理引擎的内部运作机制 Agent设计模式——章节目录
我让gpt4o给我推荐了一千多次书 得到了这些数据
xindoo · 2024-05-26 · via XINDOO

2024-05-26 分类:工程实践 阅读(2578) 评论(0) 赞(0)

  事情是这样的,我们公司不是有个读书小组嘛,但是今年大家都忙于工作,忽视了读书这件事,所以我就想着搞个群机器人,让它明天定时向群里推荐一本书,用来唤起大家对读书的兴趣。但在调试的过程中就发现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()