编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

看 Bolt 与 Cursor 携手,探秘 ChatPDF 智能应用实战开发

wxchong 2025-04-27 16:49:03 开源技术 6 ℃ 0 评论

在经历了cursor的多次反复重新搭建项目的痛苦后,当我先基于bolt生成项目初始版本,再基于cursor做具体细化后,大约2小时内顺利拿到了自己想要的结果,再次记录下主要的过程,供同行参考。

  1. bolt注册,打开官网地址:https://bolt.new/
  1. 描述需求

【提示词】我想做一个类似上面的智能文档问答的web网站,希望采用llamaindex、PyPDF2、vue、openai、Chroma技术栈来实现,请基于此要求,帮我实现,界面效果参考附件图片

在这里我找了一个自己比较喜欢的文档对话参考站,截图后作为附件上传到了这个对话窗口,作为提示词的额外补充。同时由于我本身对文档智能对话有技术背景,所以我直接指定了适合企业级生产的技术栈来限定框架。

【TIPS】对于没有任何开发技术背景的朋友,不用自己设定技术栈,可以让他帮忙推荐最适合的技术栈,也可以拿到自己满意的结果

  1. 下载生成的代码



  1. cursor导入上述代码工程

cursor的安装注册可参考我的上一篇文章,有比较详细的安装注册步骤。



  1. 项目源码分析总结

【提示词】@Codebase 这是一个智能文档问答的web网站模板项目,请在项目根目录下创建 design.md 文件,并将该项目的目录结构和技术要点总结在这个文件中,方便后续我与你讨论需求时供你参考。




  1. 先尝试启动项目

按照他提供的启动步骤,一步步操作,如果有报错,可以将错误信息完整的发到聊天框,按照他给的修复方案执行即可。

【提示词】如何启动该项目


错误修复示范1:

(venv) PS D:\code\cursor_space\qa_chat_doc\backend> uvicorn main:app --reload
INFO:     Will watch for changes in these directories: ['D:\\code\\cursor_space\\qa_chat_doc\\backend']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [15984] using WatchFiles
Process SpawnProcess-1:
Traceback (most recent call last):
  File "E:\soft\anaconda3\Lib\multiprocessing\process.py", line 314, in _bootstrap
    self.run()
  File "E:\soft\anaconda3\Lib\multiprocessing\process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\uvicorn\_subprocess.py", line 78, in subprocess_started
    target(sockets=sockets)
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\uvicorn\server.py", line 62, in run
    return asyncio.run(self.serve(sockets=sockets))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\soft\anaconda3\Lib\asyncio\runners.py", line 194, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "E:\soft\anaconda3\Lib\asyncio\runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\soft\anaconda3\Lib\asyncio\base_events.py", line 687, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\uvicorn\server.py", line 69, in serve       
    config.load()
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\uvicorn\config.py", line 458, in load       
    self.loaded_app = import_from_string(self.app)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\uvicorn\importer.py", line 24, in import_from_string
    raise exc from None
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\uvicorn\importer.py", line 21, in import_from_string
    module = importlib.import_module(module_str)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\soft\anaconda3\Lib\importlib\__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 995, in exec_module
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "D:\code\cursor_space\qa_chat_doc\backend\main.py", line 7, in <module>
    from llama_index import VectorStoreIndex, SimpleDirectoryReader
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\llama_index\__init__.py", line 24, in <module>
    from llama_index.indices import (
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\llama_index\indices\__init__.py", line 4, in <module>
    from llama_index.indices.composability.graph import ComposableGraph
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\llama_index\indices\composability\__init__.py", line 4, in <module>
    from llama_index.indices.composability.graph import ComposableGraph
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\llama_index\indices\composability\graph.py", line 7, in <module>
    from llama_index.indices.base import BaseIndex
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\llama_index\indices\base.py", line 6, in <module>
    from llama_index.chat_engine.types import BaseChatEngine, ChatMode
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\llama_index\chat_engine\__init__.py", line 1, in <module>
    from llama_index.chat_engine.condense_plus_context import CondensePlusContextChatEngine
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\llama_index\chat_engine\condense_plus_context.py", line 7, in <module>
    from llama_index.chat_engine.types import (
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\llama_index\chat_engine\types.py", line 17, in <module>
    from llama_index.memory import BaseMemory
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\llama_index\memory\__init__.py", line 1, in <module>
    from llama_index.memory.chat_memory_buffer import ChatMemoryBuffer
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\llama_index\memory\chat_memory_buffer.py", line 9, in <module>
    from llama_index.storage.chat_store import BaseChatStore, SimpleChatStore
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\llama_index\storage\__init__.py", line 3, in <module>
    from llama_index.storage.storage_context import StorageContext
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\llama_index\storage\storage_context.py", line 26, in <module>
    from llama_index.vector_stores.simple import DEFAULT_PERSIST_FNAME as VECTOR_STORE_FNAME
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\llama_index\vector_stores\__init__.py", line 31, in <module>
    from llama_index.vector_stores.myscale import MyScaleVectorStore
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\llama_index\vector_stores\myscale.py", line 10, in <module>
    from llama_index.readers.myscale import (
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\llama_index\readers\__init__.py", line 20, in <module>
    from llama_index.readers.download import download_loader
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\llama_index\readers\download.py", line 10, in <module>
    from llama_index.download.module import (
  File "D:\code\cursor_space\qa_chat_doc\backend\venv\Lib\site-packages\llama_index\download\module.py", line 12, in <module>
    import pkg_resources
ModuleNotFoundError: No module named 'pkg_resources'



错误修复示范2:

【提示词】
@Codebase 上传完成后,我点击界面会导致pdf消失,而且我看uploads下面没有对应的pdf文件




  1. 大模型key申请

我使用的是openai的模型,由于网络问题,使用了代理站上购买的,链接地址为:https://api.juheai.top,之前也一直在用这个,感觉自己觉得还可以,其它的没怎么尝试过,大家也可以根据自己的渠道来选择。






  1. 替换项目模型秘钥

当前项目模型的秘钥配置是在.env文件中,根据个人的渠道修改即可。



  1. 最终界面效果




最后谈点自己的感受,这个是整个开发过程的大致步骤,总体来说还算顺利,使用ai来编程其实和自己编程最大的区别在于ai编程你要像一个教练,自己编程就是教练和学员融合一体的,整个过程80%的时间是进行bug修复,所以大家要有心理上的准备,刚开始肯定会碰到各种各样的问题,不要慌,你只要负责复制黏贴,具体修复交给ai,可以先从简单的2048、贪吃蛇小游戏开始,可以增强自己的信心。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表