最近字节出了了个coze平台,自己想搭建个人大模型工具来实现如下功能:
- 返回hacker news中的新闻
- 能够总结新闻中的内容
hacker news内容获取
主要使用了如下两个api:
- 获取hacker news中最高排名的文章:hacker-news.firebaseio.com/v0/topstori…
该api中只能获取文章的id,我们拿到文章标题,链接后还要根据id去调用如下api
- 根据id获取hacker news中的文章信息:hacker-news.firebaseio.com/v0/item/${t…
构造过程
首先要给我们的大模型写定义,这个定义就是告诉大模型是什么,该如何回复我们。
该大模型角色的描述如下:
# 角色
你是一个 Hacker news 提供者,每次我向你询问,你要提供新闻给我。
## 技能
### 技能 1:获取 Hacker news 上面内容
- 当用户询问新闻内容时,使用 GetHackerNews 工作流搜索相关新闻
### 技能 2:内容处理
- 当用户询问上面具体内容链接的时候,你要调用 LinkReaderPlugin 来进行分析,type是全文,提取其中的关键信息和主要内容。
### 技能 3: 输出结果
1. 对提取和分析的内容进行总结归纳,生成一个简短的内容概述,让用户快速了解文件或 URL 的主要内容。
2. 根据提取和分析的内容生成一个详细的大纲,包括主要内容、次要内容、细节等,让用户更深入地了解文件或 URL 的内容。
3. 请参考如下格式回复:
**内容概述**:xxx
**详细大纲**:
1.xxx
- xxx
## 限制
- 只提供与 Hacker news 相关的新闻,拒绝回答与 Hacker news 无关的话题。
- 所输出的内容必须按照给定的格式进行组织,不能偏离框架要求。
- 请使用 Markdown 的 ^^ 形式说明引用来源。
上面使用了一个插件 LinkReaderPlugin和自己的创建的工作流 GetHackerNews。
LinkReaderPlugin官方提供的url分析插件:
然后要创建一个工作流,在这个工作流中添加调用hacker news Api的代码,来获取hacker news中的文章。
这里我们把这工作流命名为GetHackerNews。
工作流节点
开始节点
开始节点对应我们的输入内容,这边我对输入内容的限制如下:
- 如果输入的关键词中不包括数字则默认获取10条hacker news新闻,如果有数字A且数字A大于10的话,则默认取数字索引[A - 10, A]之间的内容。
这样的话当我输入10条新闻的时候,大模型就能够去获取前10条内容。当输入20条内容的时候,就可以获取之后的10条内容。
获取内容节点
这一块中要是我们的代码内容,其内容如下:
async function main({ params }: Args){
// 从input中取出数字
const [inputNumber] = params.input.match(/[0-9]+/g) || []
const sliceMaxIndex = (+inputNumber < 10 ? 10 : +inputNumber) || 10
let res = await fetch(
'https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty'
)
let data = await res.json()
const topStoriesArr = data.slice(sliceMaxIndex - 10, sliceMaxIndex);
const ret = await Promise.all(topStoriesArr.map(async topStoryId => {
let topStory = await fetch(
`https://hacker-news.firebaseio.com/v0/item/${topStoryId}.json?print=pretty`
)
return topStory.json()
})
)
// 只取出10条数据
return ret
}
我们获取到文章数组对象,对象中有title,url属性。
结束节点
我们把上一步内容直接返回出来给大模型优化成markdown形式返回。
实际效果
存在的问题:
目前解析链接中的内容做的并不好,优化空间还很大😂
BotID:7330817198195408896