本项目基于开源项目 Story Ribbons 进行二次开发和本地化部署,提供完整的中文开发环境和使用说明。
Story Ribbons 是一个基于大语言模型(LLM)的交互式故事线可视化系统。通过 LLM 驱动的数据解析管道,自动从小说和剧本中提取相关信息,帮助文学分析师在多个叙事层面探索详细的角色和主题轨迹。
本项目在原始 Story Ribbons 代码基础上进行了本地化配置和开发环境优化,主要包括:
/workspace/ ├── .cnb.yml # 云原生构建配置文件 ├── Dockerfile # Docker 镜像构建配置 ├── settings.json # VS Code 编辑器配置 ├── README.md # 本文档 └── story-viz/ # Story Ribbons 核心源代码 ├── src/ # 前端 React 源代码 │ ├── components/ # React 组件 │ ├── data/ # 数据文件(JSON 格式) │ ├── stores/ # Zustand 状态管理 │ ├── utils/ # 工具函数 │ └── App.tsx # 主应用组件 ├── backend/ # 后端 Python 服务 │ ├── server.py # Flask 服务器 │ ├── prompts.py # LLM 提示词模板 │ └── helpers.py # 辅助函数 ├── public/ # 静态资源 │ ├── chapters/ # 小说章节文本文件 │ ├── characters/ # 角色图片资源 │ └── covers/ # 书籍封面图片 ├── notebooks/ # Jupyter 数据解析笔记本 │ ├── parsing-data.ipynb # 主要数据解析流程 │ ├── scripts/ # 原始故事文本文件 │ ├── chapters/ # 解析后的章节文件 │ └── json/ # 中间数据文件 ├── package.json # 前端依赖配置 └── Pipfile # Python 依赖配置
后端服务需要 OpenAI API 密钥来进行文本分析和数据解析。
# 复制示例配置文件
cp story-viz/secrets_example.json story-viz/secrets.json
# 使用编辑器打开配置文件
nano story-viz/secrets.json
配置文件格式:
{
"openai_key": "your-openai-api-key-here"
}
注意:请妥善保管你的 API 密钥,不要将 secrets.json 文件提交到代码仓库(已在 .gitignore 中排除)。
首次运行前需要安装前端依赖包:
cd story-viz
yarn install
安装过程可能需要几分钟时间,取决于网络速度。
在 story-viz 目录下运行:
yarn dev
前端服务将在 http://localhost:5200 启动。
在浏览器中访问该地址即可看到 Story Ribbons 的用户界面。
打开新的终端窗口(保持前端服务运行):
cd story-viz
# 首次运行需要安装 Python 依赖(会创建 .venv 虚拟环境)
pipenv install --python 3.12
# 激活 Python 虚拟环境
pipenv shell
# 启动后端服务器
python backend/server.py
后端服务将在 http://127.0.0.1:5000 启动。
现在两个服务都已启动,可以开始使用 Story Ribbons 进行故事可视化了。
使用 Docker 容器进行开发,确保环境一致性。
docker build -t story-ribbons-cn:latest .
docker run -it -p 5200:5200 -p 5000:5000 -v $(pwd):/workspace story-ribbons-cn:latest /bin/bash
按照"方式一"中的步骤在容器内配置并启动服务。
使用 CNB(Cloud Native Build)平台进行自动化构建和部署。
项目已配置 .cnb.yml 文件,支持一键构建和部署到 CNB 平台。
详细操作请参考 CNB 平台文档。
开发模式支持热重载,适合日常开发调试。
cd story-viz
yarn dev
访问 http://localhost:5200 查看开发版本。
生产构建会进行代码压缩和优化,生成可直接部署的静态文件。
cd story-viz
yarn build
构建产物将生成在 dist/ 目录中。
在本地预览生产构建的结果:
cd story-viz
yarn build
yarn preview
要添加新的文学作品到可视化系统,请按照以下步骤操作:
打开数据处理笔记本
打开 story-viz/notebooks/parsing-data.ipynb,运行到 setup 部分的末尾。
确保必要的文件夹存在
确认 notebooks/ 文件夹下已创建以下子文件夹:
notebooks/scripts/ - 存放原始故事文本notebooks/chapters/ - 存放解析后的章节notebooks/json/ - 存放中间数据添加故事文本文件
将故事文本文件(仅支持 .txt 格式)添加到 notebooks/scripts/ 文件夹中。
命名建议:使用简短但具代表性的名称,例如《了不起的盖茨比》命名为 "gatsby.txt"。
在 parsing-data.ipynb 的 split text into chapters 部分的第一个单元格中,设置以下参数:
og_story_name = "gatsby" # 你的故事名称(不含 .txt)
story_name = og_story_name
analysis_type = "character" # "character" 或 "theme"
分析类型说明:
character: 分析角色关系和轨迹theme: 分析主题演变建议先尝试 character 分析类型。
运行此部分的代码,直到 analyze scene 之前停止。
检查生成的章节文本文件,位置:notebooks/chapters/你的故事名/(如 notebooks/chapters/gatsby/)。
重要提示:这是整个流程中唯一可能需要手动干预的步骤。
如果遇到问题:
notebooks/json/ 文件夹中生成的 summary.json 文件从 analyze scene 部分开始运行笔记本的其余代码。
这部分应该运行顺畅,笔记本按语义分段,有助于调试。
在笔记本的最后,运行 generating the final json file 部分后,你应该能在 notebooks/json/你的故事名/ 文件夹中看到 final_data.json 文件。
检查 src/data/ 文件夹,你应该看到对应的 JSON 文件:
你的故事名-new.json(如 "gatsby-new.json")你的故事名-new-themes.json(如 "gatsby-new-themes.json")如果没有看到文件,请将 final_data.json 文件复制到 src/data/ 文件夹,并按照上述说明重命名。
检查 public/chapters/ 文件夹,确认是否存在对应的故事文件夹(如 public/chapters/gatsby/),其中包含章节 .txt 文件。
如果文件夹不存在或为空,请将 notebooks/chapters/ 中你的故事的完整章节文件夹复制到 public/chapters/ 文件夹中。
打开 src/components/Header/PlotOptions.tsx,将你的文件名添加到 storyOptions 列表中:
const storyOptions = [
"gatsby-new",
"gatsby-new-themes",
// 在这里添加你的新故事...
];
保存更改并重新启动前端服务:
cd story-viz
yarn dev
现在你应该能够从下拉菜单中选择你的故事,并看到可视化结果了!
# 进入前端目录
cd story-viz
# 安装依赖
yarn install
# 启动开发服务器
yarn dev
# 构建生产版本
yarn build
# 预览生产构建
yarn preview
# 代码检查
yarn lint
# 进入项目目录
cd story-viz
# 安装依赖(会创建 .venv 虚拟环境)
pipenv install --python 3.12
# 激活虚拟环境
pipenv shell
# 启动服务器
python backend/server.py
# 退出虚拟环境
exit
# 构建镜像
docker build -t story-ribbons-cn:latest .
# 运行容器
docker run -it -p 5200:5200 -p 5000:5000 -v $(pwd):/workspace story-ribbons-cn:latest
# 查看运行中的容器
docker ps
# 停止容器
docker stop <container-id>
问题:运行 yarn dev 时出现端口被占用错误。
解决方案:
# 检查端口占用
lsof -i :5200
# 或者修改端口
# 编辑 story-viz/vite.config.ts,修改 server.port
问题:前端无法连接到后端服务。
解决方案:
http://127.0.0.1:5000)secrets.json 中的 API 密钥是否正确问题:运行 Jupyter Notebook 时出现错误。
解决方案:
问题:Docker 构建过程中出现网络错误。
解决方案:
如果你在研究或项目中使用了 Story Ribbons,请引用原始论文:
@article{yeh2025story, title={Story Ribbons: Reimagining Storyline Visualizations with Large Language Models}, author={Yeh, Catherine and Menon, Tara and Arya, Robin Singh and He, Helen and Weigel, Moira and Vi{\'e}gas, Fernanda and Wattenberg, Martin}, journal={IEEE Transactions on Visualization and Computer Graphics}, year={2025}, publisher={IEEE} }
本项目基于原始 Story Ribbons 项目进行二次开发。原始项目的许可证信息请参考原始仓库。
重要提示:
欢迎对本项目提出建议和改进意见!
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)如有问题或建议,请通过以下方式联系:
感谢原始 Story Ribbons 项目的作者和贡献者!
原始作者:
本项目在原始项目基础上进行了本地化和开发环境优化,旨在为中文用户提供更好的开发体验。
感谢使用 Story Ribbons 本地化开发环境!