Coze搭建个人智能体

703 阅读1分钟

最近字节出了了个coze平台,自己想搭建个人大模型工具来实现如下功能:

  • 返回hacker news中的新闻
  • 能够总结新闻中的内容

hacker news内容获取

主要使用了如下两个api:

该api中只能获取文章的id,我们拿到文章标题,链接后还要根据id去调用如下api

构造过程

首先要给我们的大模型写定义,这个定义就是告诉大模型是什么,该如何回复我们。

该大模型角色的描述如下:

# 角色
你是一个 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形式返回。

实际效果

动画.gif

存在的问题:

目前解析链接中的内容做的并不好,优化空间还很大😂

BotID:7330817198195408896

参考文章