V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ligz
V2EX  ›  程序员

开源了 Chatfiles,上传你的文件,然后与之对话!构建自己的语料库!

  •  4
     
  •   ligz · 2023-04-06 09:28:11 +08:00 · 7718 次点击
    这是一个创建于 622 天前的主题,其中的信息可能已经有所发展或是发生改变。

    chatfiles

    目前已实现的功能:

    • 与 GPT-3.5 对话。
    • 与你上传的文件对话。
    • 文件支持 TXT,PDF,Epub...后续陆续加上更多支持。

    目前还没有公开使用的网站,我怕我的账单爆掉。构建语料库比较消耗 token ,大家可以用 5M 以下的文档试试看。

    所以需要大家本地启动,使用起来比较简单,下载仓库,然后修改环境变量,docker compose up 即可!!

    目前项目还在初期,大家可以多多提提 bug 。项目地址: https://github.com/guangzhengli/ChatFiles

    附:不要再聊鸭头的事了....

    66 条回复    2023-04-11 13:22:05 +08:00
    LavaC
        1
    LavaC  
       2023-04-06 09:38:27 +08:00
    第一个想到的用途是把某群友的黑历史记录输进去然后给群机器人自由发挥
    perfectlife
        2
    perfectlife  
       2023-04-06 09:39:34 +08:00 via Android
    @LavaC 那这个就很强了
    LavaC
        3
    LavaC  
       2023-04-06 09:42:01 +08:00
    @perfectlife 上一个注册的账号免费额度 4 月 1 就到期了,想升级 plus 发现不支持澳村的信用卡和借记卡,搞得有点没兴致。
    ligz
        4
    ligz  
    OP
       2023-04-06 09:43:35 +08:00
    @LavaC 能干的还是比较多的,例如上传书籍和文档,让它帮你总结或者你向它提问一些文档的内容。后续打算再加上多个文件构建同一个语料库的功能,看看能不能按照套路写作之类的。
    bkmi
        5
    bkmi  
       2023-04-06 09:45:54 +08:00 via Android
    与文件对话是什么意思,是不是我把某个项目的使用文档喂给它,就可以问他项目相关的问题了
    huyujievip
        6
    huyujievip  
       2023-04-06 09:48:10 +08:00 via iPhone
    鸭头很好看,拿走了。手动狗头🐶
    d873139022
        7
    d873139022  
       2023-04-06 09:49:15 +08:00
    上次看到这个鸭头就觉得很有意思,一眼认出楼主
    ligz
        8
    ligz  
    OP
       2023-04-06 09:56:09 +08:00
    @bkmi 是的,上传文档构建系统创建 embeddings ,然后可以问它文档相关的内容。
    wenjie0032
        9
    wenjie0032  
       2023-04-06 10:01:40 +08:00 via iPhone   ❤️ 1
    借楼贴一下,也搞了个
    https://github.com/daodao97/chatdoc
    Waverly
        10
    Waverly  
       2023-04-06 10:16:00 +08:00
    反馈一下两个问题:
    1. 命令应该是 docker-compose up 不是 docker-compose up
    2. 平台好像有点不兼容:有以下报错
    [+] Running 3/2
    ⠿ Network chatfiles_default Created 0.1s
    ⠿ Container chatfiles Created 0.2s
    ⠋ chatfiles The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64) and no specific platform was requested 0.0s
    ⠿ Container chatfiles-ui Created 0.1s
    ⠋ chatfiles-ui The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64) and no specific platform was requested 0.0s
    Attaching to chatfiles, chatfiles-ui
    chatfiles | standard_init_linux.go:228: exec user process caused: exec format error
    chatfiles exited with code 1
    chatfiles-ui | standard_init_linux.go:228: exec user process caused: exec format error
    chatfiles-ui exited with code 1
    learningman
        11
    learningman  
       2023-04-06 10:41:43 +08:00
    @Waverly
    docker compose up 是 docker-compose v2 的格式,v2 是 go 构建的,作为 docker 的插件。1 是 python 写的。该升级了。

    不过 docker 镜像确实只有 linux/arm64/v8 的格式,op 是在树莓派上写代码吗。。。
    ligz
        12
    ligz  
    OP
       2023-04-06 10:58:23 +08:00
    @learningman 我用的是 MBP m1 pro....晚点我看看镜像格式问题,大家先直接用 npm run dev 起前端,用 python3 server.py 起后端...
    Clash
        13
    Clash  
       2023-04-06 11:03:21 +08:00
    能不能支持上传 markdown 文件?
    能不能支持上传 文件夹?(文件夹下多个 md 、txt……文件)

    这样就可以方便建自己的智能助理了
    changdig
        14
    changdig  
       2023-04-06 11:05:21 +08:00
    手动 build 一个 x64 镜像就行了
    vsitebon
        15
    vsitebon  
       2023-04-06 11:11:48 +08:00
    @Clash #12 这个读取是依赖于 langchain 实现的,它的 Loader 有引入 Markdown 的支持
    FishBoneEK
        16
    FishBoneEK  
       2023-04-06 11:14:42 +08:00 via Android
    Op 可以试试把后端抽出来啊,方便用户自己部署到自己的网站上,和前端适配
    如果把文档和接口弄好点的话,应该会有很多人使用的
    coderunI
        17
    coderunI  
       2023-04-06 11:16:09 +08:00
    输入小说模板啥的, 是不是就可以写小说了
    falcon05
        18
    falcon05  
       2023-04-06 11:17:03 +08:00
    能上传代码文件分析 bug 吗?或者叫它重构
    ligz
        19
    ligz  
    OP
       2023-04-06 11:20:28 +08:00
    @FishBoneEK 后端是独立的,目前是用 flask 暴露了两个接口。可以直接用 docker 打包部署。
    ligz
        20
    ligz  
    OP
       2023-04-06 11:22:30 +08:00
    @falcon05 这种场景已经有专业队伍跑步进场了,github copilot x 或者 cursor: https://www.cursor.so/
    ligz
        21
    ligz  
    OP
       2023-04-06 11:23:51 +08:00   ❤️ 1
    @Clash 这些后续都考虑支持
    NicholasZhan
        22
    NicholasZhan  
       2023-04-06 12:10:56 +08:00
    可以让 chatgpt 基于上传的内容进行二次创作吗?感觉现在基本都是问答的模式
    cheng6563
        23
    cheng6563  
       2023-04-06 12:22:34 +08:00
    请问语料库是什么?有什么资料参考吗?
    justin2018
        24
    justin2018  
       2023-04-06 12:28:37 +08:00
    大佬 请教下 同一文档 后期增加内容了 是不是只用投喂新增的内容就行 还是得重新在喂一次
    ligz
        25
    ligz  
    OP
       2023-04-06 12:32:52 +08:00
    @NicholasZhan 对,因为现在创建出来的 embeddings 还是差点意思,所以大多是问答模式,后续看看怎么优化。
    ligz
        26
    ligz  
    OP
       2023-04-06 12:33:30 +08:00
    @cheng6563 语料库就是你自己的材料,比如你上传一本书的内容,可以问 ChatGPT 这本书写了什么
    ligz
        27
    ligz  
    OP
       2023-04-06 12:34:32 +08:00
    @justin2018 还需要重新投喂,生成新的 embedding 。并且最好换个名字,因为现在是按照文件名创建的 embedding 。后续这个也可以优化。
    metalvest
        28
    metalvest  
       2023-04-06 12:37:06 +08:00
    File: Error: PyPDF2 is required to read PDF files: `pip install PyPDF2`
    metalvest
        29
    metalvest  
       2023-04-06 12:48:50 +08:00
    EPUB 也是要手动安装,是不是都加到 requirements.txt 里比较好?
    ligz
        30
    ligz  
    OP
       2023-04-06 12:59:25 +08:00
    @metalvest 不好意思,应该是我最后清理依赖的时候删掉了,已加。谢谢提醒🙏
    zhengxiaowai
        31
    zhengxiaowai  
       2023-04-06 13:21:58 +08:00
    支持下代理呀!!!!!封号那么严重直接本地跑不是 gg 了
    metalvest
        32
    metalvest  
       2023-04-06 13:36:15 +08:00
    最好加个界面能够加载和管理之前已经上传过的文档
    aapeli
        33
    aapeli  
       2023-04-06 13:42:13 +08:00
    Can it support multiple OPENAIs_ API_ Load balancing between KEY?
    能否支持在多个 OPENAI_API_KEY 之间负载均衡?
    jZH
        34
    jZH  
       2023-04-06 14:16:46 +08:00
    出错了~
    [root@104 ChatFiles]# docker compose up
    [+] Running 2/0
    ✔ Container chatfiles Created 0.0s
    ✔ Container chatfiles-ui Created 0.0s
    Attaching to chatfiles, chatfiles-ui
    chatfiles | exec /usr/local/bin/python3: exec format error
    chatfiles exited with code 1
    chatfiles-ui | exec /usr/local/bin/docker-entrypoint.sh: exec format error
    chatfiles-ui exited with code 1
    huguadao
        35
    huguadao  
       2023-04-06 14:18:07 +08:00 via Android
    其实要是这个能在群晖上跑个自己的小 chatgpt 豆号了,没事儿喂点资料给它慢慢吃,逐渐培训成自己的私人助理
    beiwei2008
        36
    beiwei2008  
       2023-04-06 16:15:53 +08:00
    请教下,这个是什么原理?
    ZSeptember
        37
    ZSeptember  
       2023-04-06 16:51:29 +08:00
    效果咋样,有朋友试过这个思路,好像效果不行
    cheng6563
        38
    cheng6563  
       2023-04-06 17:36:57 +08:00
    > 语料库就是你自己的材料,比如你上传一本书的内容,可以问 ChatGPT 这本书写了什么

    主要问题是 API 接口的 Tokens 不是只有 4097 个吗,直接发一个 PDF 过去肯定不够的吧。一直搞不懂这些分析大文件的场景是怎么完成的。
    B1ock
        39
    B1ock  
       2023-04-06 17:51:07 +08:00
    @cheng6563 之前看到的思路:先把大文件分块做 embedding, 查询的时候本地会先在 embedding 向量数据库里检索,相关的分块内容再带到 GPT 的上下文里提问。
    nyakoy
        40
    nyakoy  
       2023-04-06 18:01:42 +08:00
    先 start ,公司有需求场景。
    Wenbobobo
        41
    Wenbobobo  
       2023-04-06 18:19:04 +08:00 via Android
    @B1ock 那请教下,楼主说的“这本书写了什么” 这样的问题,是怎么检索提问的
    winglight2016
        42
    winglight2016  
       2023-04-06 18:26:56 +08:00
    如果只是问答模式,那种在 context 里有答案的可以不使用 chatgpt 的模型,这就省了一笔

    另外,lz 能支持一下其他模型吗?现在开源了好多 fine-tuning 的 llama 模型,这就再省一笔了
    zeonll
        43
    zeonll  
       2023-04-06 18:42:41 +08:00
    感谢 很有用
    huwenzhe
        44
    huwenzhe  
       2023-04-06 20:11:02 +08:00
    之前看到一个 https://www.chatpdf.com/
    B1ock
        45
    B1ock  
       2023-04-06 20:44:07 +08:00
    @Wenbobobo 可能取决于 embedding 匹配到的分块情况吧...毕竟整本书全文代入上下文也不现实。(我猜有可能匹配到书的“序言”部分
    rui2k
        46
    rui2k  
       2023-04-06 20:45:19 +08:00
    今天把 langchain 的 documents 喂了进去,消耗了 209 万个 token 做 embedding (好在是用 ada 模型,比较便宜,花了 0.8 刀)。尝试问答了一下,感觉效果一般。可能还是跟 embedding 的效果有关系。特别是,它居然给不出任何代码。。。
    rui2k
        47
    rui2k  
       2023-04-06 20:47:58 +08:00
    @rui2k

    text-embedding-ada-002-v2, 57 requests
    1,677,758 prompt + 0 completion = 1,677,758 tokens

    "name": "langchain 文档",
    "messages": [
    {
    "role": "user",
    "content": "langchain 能实现哪些功能?"
    },
    {
    "role": "assistant",
    "content": "langchain 可以实现多种功能,包括模型集成、提示管理、记忆、索引、链式调用和代理。它还支持个人助手、问答、聊天机器人、查询表格数据、与 API 交互、信息提取、摘要和评估等多种应用场景。"
    },
    {
    "role": "user",
    "content": "使用 langchain 搭建个人助手的方法,请给我一个 demo 代码"
    },
    {
    "role": "assistant",
    "content": "很抱歉,我无法提供代码示例,因为您的问题需要更多的上下文和详细信息。请参考 LangChain 的官方文档和示例,以了解如何使用 LangChain 构建个人助手应用程序。"
    },
    ligz
        48
    ligz  
    OP
       2023-04-06 21:33:29 +08:00
    @metalvest 管理之前已经上传过的文档这个需求打算后面加上。感谢建议。
    ligz
        49
    ligz  
    OP
       2023-04-06 21:36:36 +08:00
    @jZH 这个错误应该是我只打包了 arm64 的镜像导致的,目前已经推送了 amd64/arm64 ,你删掉本地镜像重新下载即可。
    ligz
        50
    ligz  
    OP
       2023-04-06 21:49:05 +08:00
    @beiwei2008
    @ZSeptember
    @B1ock

    embedding 的方案会将相关度高的文本给 ChatGPT ,而不是整本书的内容,所以现在如果问的是很模糊的问题,其实效果并不算好,但是问题精确的话,效果就还行。
    ligz
        51
    ligz  
    OP
       2023-04-06 21:50:41 +08:00
    @rui2k 效果确实一般,embedding 的方案限制还是比较明显的。
    closedevice
        52
    closedevice  
       2023-04-06 23:53:38 +08:00
    chatgpt 还能直接塞 embedding 之后的数据?不都是在训练阶段,对特征进行 embedding 么?
    Mixwind
        53
    Mixwind  
       2023-04-07 00:39:01 +08:00
    请问一个 pdf 上下文超过 4097 token 这个是怎么解决的?前面好像也有人问。
    MarlonFan
        54
    MarlonFan  
       2023-04-07 01:07:46 +08:00   ❤️ 1
    @Mixwind 通过文章切句, 拿到非常多的小段文本。再把文本调用 openai 的 embedding 接口, 拿到向量。

    当用户有问题的时候, 把用户的问题转成 embedding, 通过 cosin 之类的函数计算相似的 embedding 语料。然后把相关语料作为上下文传给 chatgpt-turbo-3.5, 然后用自然语言给你返回答案。
    avenger
        55
    avenger  
       2023-04-07 02:20:01 +08:00 via iPhone
    想训练一个自己的电商客服机器人,导入过去 5 年的聊天记录,目前用官方的 fine-tuning 测试,几乎不可用,正准备试 gpt-index ,请问您这个项目适用于这个场景吗?谢谢
    lxxxv5
        56
    lxxxv5  
       2023-04-07 08:04:34 +08:00 via iPhone
    还没细看,想先问问,喂给他的材料是不是都传给了 openai 公司,会有泄漏资料的风险吗,还是说这些资料只是在本地就被消化了
    Wenbobobo
        57
    Wenbobobo  
       2023-04-07 08:34:54 +08:00 via Android
    @lxxxv5 只是在 openai 的模型那里转了两圈,中间环节不出问题就是安全的,embedding 数据的检索是在本地
    Wenbobobo
        58
    Wenbobobo  
       2023-04-07 08:35:50 +08:00 via Android
    @avenger 我一直觉得这种方式最适合的就是电商客服,问题的相关性比较大
    davinci21s
        59
    davinci21s  
       2023-04-07 09:24:19 +08:00
    lhzcl226
        60
    lhzcl226  
       2023-04-07 10:47:50 +08:00
    为什么用 llama_index ,而不是向量数据库?
    metalvest
        61
    metalvest  
       2023-04-07 15:16:30 +08:00
    能不能加个把某网站的树状文档比如软件指南或者编程参考这种按目录递归遍历下载到本地然后拼接成一个文本文件的功能,就可以当互动指南用了
    guiyun
        62
    guiyun  
       2023-04-07 15:31:36 +08:00
    @learningman 额,arm 的开发平台不应该首先想到是苹果的 m 系芯片吗?
    metalvest
        63
    metalvest  
       2023-04-07 16:07:04 +08:00 via Android
    @metalvest 比如
    ```python
    import requests
    from bs4 import BeautifulSoup
    import os

    # 定义已下载的 URL 集合和有序的网页内容列表
    downloaded_urls = set()
    pages = []

    # 定义递归函数来遍历整个网站的树状结构并提取文本内容
    def scrape_website(root_url, url):
    # 检查链接是否以根路径开始或者是否与根路径相同
    if not url.startswith(root_url) or url == root_url:
    return

    # 检查该 URL 是否已经下载过,如果是则跳过下载
    if url in downloaded_urls:
    return

    # 发送请求获取网页内容
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    # 提取网页标题和正文内容
    title = soup.title.text.strip()
    body = soup.body.text.strip()

    # 将该网页的标题和正文内容添加到有序的网页内容列表中
    pages.append((title, body))

    # 将该 URL 添加到已下载的 URL 集合中
    downloaded_urls.add(url)

    # 递归遍历子页面链接
    for link in soup.find_all('a'):
    href = link.get('href')
    if href.startswith('http'):
    scrape_website(root_url, href)
    elif href.startswith('/'):
    scrape_website(root_url, root_url + href)

    # 指定网站根路径
    root_url = 'https://www.example.com/'

    # 发送请求获取根路径的网页内容
    response = requests.get(root_url)
    soup = BeautifulSoup(response.content, 'html.parser')

    # 从根路径的网页标题中提取文件名
    root_title = soup.title.text.strip()
    output_filename = root_title + '.txt'

    # 调用递归函数来爬取整个网站的树状结构并保存文本内容
    scrape_website(root_url, root_url)

    # 遍历有序的网页内容列表并将内容合并为一个线性的文本文件
    with open(output_filename, 'w') as f:
    for title, body in pages:
    f.write(title + '\n\n')
    f.write(body + '\n\n')
    ```
    learningman
        64
    learningman  
       2023-04-07 16:14:30 +08:00
    @guiyun 苹果是 darwin ,这是 linux 啊
    edisonzf2022
        65
    edisonzf2022  
       2023-04-07 22:25:38 +08:00
    语料的格式是什么样子的?
    有没有现成的语料库测试
    karatsuba
        66
    karatsuba  
       2023-04-11 13:22:05 +08:00
    我的一直报 Error fetching models.呀,难搞
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1004 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 20:18 · PVG 04:18 · LAX 12:18 · JFK 15:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.