1.2 个人作业:软件案例分析

1.2 个人作业:软件案例分析

项目 内容
这个作业属于哪个课程 2025年春季软件工程(罗杰、任健)
这个作业的要求在哪里 [I.2] 个人作业:软件案例分析
我在这个课程的目标是 学习较为完整基础的软件开发流程,以及如何在软件工程中进行良好的团队协作
这个作业在哪个具体方面帮助我实现目标 帮助我理解RAG的核心组件,让我在后续团队开发的过程中可以更加高效

第一部分 调研与评测

一、选题

我选择的题目是“团队项目选题所针对的软件的案例分析”。主要分析的是由David Smiley开发的txtai,并分析了斯坦福大学开发的STORM,进行对比分析。

二、软件评测

txtai是由David Smiley开发的一款轻量级AI驱动的文本搜索和NLP处理库,主要功能有:语义搜索、向量检索、问答、分类摘要等。由于txtai结合了Faiss、Transformers以及pytorch等技术,适用于本地环境和云端部署。

1.本地环境部署

部署环境要求:
操作系统:
兼容Windows、Linux、macOS,推荐使用Linux服务器进行生产部署。

Python 版本:
支持Python 3.7及以上,推荐Python 3.9+以获得最佳性能。
部署指令:
在python终端,运行pip install txtai即可安装

2.软件使用

由于txtai的主要功能有:语义搜索、向量检索、问答、分类摘要等。所以在使用过程中,我尝试了不同的使用方法。

2.1语义搜索

from txtai import Embeddings

#创建一个索引
embeddings = Embeddings()
#数据
data=["人工智能正在改变世界", "我爱python", "今天是晴天", "荷兰豆喜欢北冰洋"]
#添加数据索引
embeddings.index([(i, text, None) for i, text in enumerate(data)])

question = "人工智能如何影响世界?"
result = embeddings.search(question, 2)
print(result)

这个代码主要使用了txtai的嵌入索引相似性搜索功能。其中,嵌入索引是通过index()方法对文本计算嵌入并存储。语义搜索通过search()方法基于语义相似性查询相关内容。

[(0,0.9434640407562256),(3,0.512606680393219)]

这个结果表示语义检索的匹配情况,具体含义如下:

  • 0和3是数据索引,即在data列表中对应的文本索引位置。
  • 0.9434640407562256和0.512606680393219是相似度分数(越接近1,匹配度越高)。

2.2基于语义检索(RAG)的问答系统

from txtai import Embeddings
from transformers import pipeline

embeddings = Embeddings()
data = [
    "机器学习是一种人工智能技术,它通过数据训练模型。",
    "深度学习是机器学习的一个分支,它使用神经网络。",
    "NLP是自然语言处理,应用包括语音识别、翻译和聊天机器人。",
    ]
embeddings.index([(i, text, None) for i, text in enumerate(data)])

#使用transformer定义的一个问答模型
qa_model = pipeline("question-answering", model="deepset/roberta-base-squad2")
#提出一个问题并进行语义检索
question = "什么是 NLP?"
results = embeddings.search(question, 1)

#获取最相关的文本
context = data[results[0][0]]
#从最相关的文本中提取出答案
answer = qa_model(question=question, context=context)
print(answer["answer"])

这个代码使用了txtai的嵌入索引相似性搜索并结合transformers库的问答模型来实现基于语义检索的问答系统,可以从检索到的最相关文本中提取出精准的答案。

NLP是自然语言处理

这是代码运行结果,得到最符合问题的答案。

2.3文本分类和索引功能

from txtai.embeddings import Embeddings

# 创建嵌入模型
embeddings = Embeddings({"path": "sentence-transformers/all-MiniLM-L6-v2"})

# 确保 embeddings 正常加载
print("嵌入模型加载成功!" if embeddings else "嵌入模型加载失败!")

labels = ["科技", "医学", "金融", "自动驾驶"]

# 创建类别索引
embeddings.index([(i, label, None) for i, label in enumerate(labels)])

# 确保索引正确
print("索引中的类别数量:", len(embeddings))  # 用 embeddings.len() 获取索引大小

这段代码通过index()方法将labels中的所有数据转换为向量,并存入索引中,以支持后续的义搜索、文本分类或推荐系统。

3.软件分析

3.1基本使用流程:

  1. 安装txtai并导入相关模块
  2. 构建索引,添加文本数据
  3. 进行相似度搜索、问答或者文本分类等
  4. 解析搜索到的结果,提取出相关性最高的文本

3.2是否解决用户的需求

txtai是一款轻量级AI驱动的文本搜索和NLP处理库,主要是用于自然语言处理任务,如文本搜索、问答系统、分类等相关场景。对于需要高效文本检索和嵌入搜索的用户,txtai可以很好地满足需求。

3.3优缺点分析

分析角度 优点 缺点
数据量 可以支持大规模文本索引 需要手动优化索引参数
界面 提供API供用户调用使用 没有GUI界面,在一定程度上不够便捷
功能 语义搜索、向量检索、问答、分类摘要等 部分功能的依赖可能会冲突,使用过程问题较多
准确度 利用了transformers提高了文本匹配的精确度 受调用模型质量影响大,需要手动调整参数
用户体验 轻量级,部署简单 许多功能学习使用起来较为困难

4.改进意见

针对上述的优缺点分析,我认为可以有一下的改进意见:

  1. 可以提供Web UI,方便用户管理索引
  2. 对于用户文档,可以增加更多简单使用示例,便于初学者快速上手
  3. 在部署环境的过程中较为繁琐复杂,可以提供Docker预构建环境,让初学者可以更快完成环境配置

5.用户调研

在本次用户调研中,我选择采访了同样使用过txtai的zjc同学。

  1. Q:采访对象的背景,为什么选择这个人采访?TA 的需求是什么?
    A:zjc同学是王德庆老师班级的学生,他曾经在某个项目的NLP应用开发上有相应的需求,需要使用文本搜索工具,便因此使用了txtai来解决他自己的需求。
  2. Q:采访对象实际使用的产品栏目
    A:zjc同学只要是使用了txtai的文本搜索和问答系统的功能
  3. Q:采访对象使用软件的过程中会遇到的问题和亮点
    A:zjc同学在使用的过程中,遇到的问题包括:需要手动调整索引参数以及使用txtai缺乏细粒度的权限控制。这和我的体验有着相似之处。同时他也反馈到,在体验过程中的亮点包括:轻量级,易于嵌入现有系统以及处理速度快,适用于大规模数据集。这些都符合txtai的优点。
  4. Q:采访对象觉得从用户体验的角度来说需要改进的地方有哪些?
    A:zjc同学认为改进建议可以有:改进建议:增强索引管理功能,支持动态调整索引参数和提供Web UI,方便非开发者使用。

6.评测结论

评测结果:d) 好,不错
理由:txtai是一个轻量级的NLP解决方案,适用于需要高效文本搜索的开发者,但对于初学者而言,学习曲线较陡,需要改进文档和UI体验。

Bug 量化标准

  • 五星:致命性系统故障、严重安全漏洞、用户体验极度受损,导致系统无法使用或大规模数据泄露。
  • 四星:严重系统故障、服务器鉴权漏洞或重要数据泄露、用户体验较差,但仍可部分运行。
  • 三星:影响功能正常使用,但有可行的绕过方案,不影响安全性。
  • 二星:轻微影响系统功能,可能导致意外行为,但影响有限。
  • 一星:无关紧要的小问题,不影响核心功能,仅影响美观或日志输出。

BUG分析1

测试环境

操作系统:Windows11
Python 版本:Python 3.10

bug现象

在txtai的词向量模块中,当前代码在处理字符串列表进行矢量化时,每一行都会被解析为一个标记token列表。然而,它没有正确处理“没有解析出任何标记”的情况,导致:如果输入字符串没有返回任何标记,原始字符串会被错误地作为标记列表传递。

原因分析

这个bug产生的概率为有可能触发。在文本向量化过程中,系统预期字符串能被拆分成一系列token进行处理。然而,在某些情况下,解析器可能会返回空列表,而现有代码未考虑这一情况,导致原始字符串直接作为token列表传递。
如下代码可能触发此bug:

from txtai.embeddings import Embeddings
import nltk
nltk.download("punkt")
from nltk.tokenize import word_tokenize
# 创建词向量实例
embeddings = Embeddings({"path": "sentence-transformers/all-MiniLM-L6-v2"})
# 修正方法
def tokenize(text):
    tokens = word_tokenize(text)
    return tokens if tokens else ["[UNK]"]  # 处理空 token 情况
# 词向量化方法
def vectorize_texts(texts):
    vectors = []
    for text in texts:
        tokens = tokenize(text)
        vector = embeddings.embed(" ".join(tokens))
        vectors.append(vector)
    return vectors
texts = [
    "Hello, world!",
    "!!!",  # 只包含标点
    "",  # 空字符串
    "       "  # 只有空格
]
vectors = vectorize_texts(texts)
print(vectors)

bug严重性

此Bug并不会导致系统完全崩溃,但会影响模型的稳定性和一致性,尤其是对于依赖文本向量化的任务(如文本搜索、推荐系统等)。用户可能会发现某些文本的向量化结果与预期不符,影响实际使用效果。总体来说三星级别的bug。

为什么软件团队在发布前未能修复此Bug

我认为是因为开发者对用户需求掌握不够精确,默认所有文本输入都能被正确解析成 token,但忽略了空token情况。

bug改进建议

当解析出的token为空时,应给出合理的默认行为,而不是直接将原始字符串作为token处理。例如:抛出异常,提示用户输入无效或者设定一个合理的默认 token。

bug分析2

测试环境

操作系统:Windows11
Python 版本:Python 3.10

bug现象

当将ID作为目标传入时,该NetworkX.hasedge方法会出现问题。当将None或0作为边的目标ID时,程序会报错或返回意外的结果

原因分析

我认为是因为hasedge()可能期望输入的是有效的节点ID(如整数、字符串),但None或0可能未被正确处理。

import networkx as nx
from txtai.embeddings import Embeddings
# 创建向量数据库
embeddings = Embeddings()
embeddings.index([
    (1, "This is a test sentence."),
    (2, "Another test sentence."),
])
G = nx.Graph()
G.add_edge(1, 2)  # 添加正常边
# 正常查询
print(G.has_edge(1, 2))
# **错误案例:传入None作为目标ID**
print(G.has_edge(1, None))
print(G.has_edge(None, 2))
print(G.has_edge(0, 2)) 

bug严重性

可能导致txtai相关功能异常,影响文本检索,影响使用体验。总体来说三星级别的bug。

为什么软件团队在发布前未能修复此Bug

可能未在has_edge()传入None或0的情况下进行充分测试,只在正常ID传递的情况下进行了测试。

bug改进建议

输入检查在txtai代码中,确保has_edge()传入的参数始终是有效ID。

第二部分 分析

1.工作量分析

假设开发团队6人,团队每周工作40h-45h,估算txtai的开发时间:

  • NLP模型集成:3个月
  • API设计与优化:2个月
  • 文档编写与示例:1个月
  • 测试与优化:1个月

2.软件质量分析

与类似软件相比

维度 txtai Elasticsearch FAISS
轻量级 yes no yes
部署难度
适用场景 NLP搜索 通用搜索 向量搜索

软件质量排名(同类产品中)

若仅考虑NLP搜索,txtai处于中上水平。但与Elasticsearch相比,txtai适用于小型项目,不适合大规模分布式环境。总体来说,我认为txtai在同类产品中可以排名到第三名左右。

提高方面

改进点:用户体验优化

  • 增加Web UI以降低使用门槛。
  • 提供更详细的官方教程,涵盖不同的使用场景。
  • 提供自动化性能评估工具,便于开发者选择合适的参数。

结论

txtai是一个优秀的NLP轻量级文本搜索工具,但仍有改进空间,特别是在UI和索引管理方面。

第三部分 建议和规划

1.市场现状

1.1市场概况:

在github的官网上,txtai源码的star数已经超过10k。它主要面向需要文本搜索、问答和分类的开发者市场。由于其开源性质,txtai 的直接用户主要是全球范围内的开发者和企业。然而,具体的用户数量并未公开,因此无法提供准确的直接用户数量。直接用户包括NLP开发者和数据科学家,潜在用户包括企业IT团队和学术研究人员。

1.2竞争产品:

目前的竞争产品包括STORM、Elasticsearch和FAISS。STORM适用于更大规模的数据处理,Elasticsearch在企业级搜索方面更成熟,而FAISS主要用于高效向量搜索。

1.3产品定位:

txtai 作为轻量级NLP搜索工具,适合小型应用,但缺乏企业级功能,例如权限控制和GUI。

2.市场与产品生态

2.1核心用户群

核心或者典型用户是25-40岁的具有计算机、数据科学相关背景的NLP开发者、数据科学家、企业IT团队或者学术研究人员。他们的潜在需求都是需要使用txtai处理NLP任务,实现检索分类。

2.2联系

首先是NLP开发者,他们会在github等开源社区中共享开源代码,以供其他数据科学家、学术研究人员研究学习。反过来,他们也会为NLP开发者提供一些新的建议和方法,相辅相成。
其次,企业IT团队通常会依赖于NLP开发者和数据科学家提供技术支持和定制化开发。

2.3构建生态

txtai可通过构建开放API和插件生态,支持开发者创建NLP解决方案,拓展应用场景。同时,建立社区支持体系,包括论坛、线上分享会等,提升开发者参与度并增强开源及企业市场影响力。此外,为企业用户提供更完善的UI、权限管理和大规模数据索引支持,以优化使用体验,推动产品在商业化场景中的应用。

3.产品规划

新功能设计

在我使用过程中得到的缺点之一是没有UI界面,所以我想新增的新功能是:增加Web UI界面,降低开发者或者初学者的使用门槛。
NABCD分析

  • N(Need,需求)
    当前txtai通过API进行操作,对于初学者来说门槛较高。同时在管理大规模索引的时候需要手动操作,增加了使用的成本。因此,提供一个Web UI的界面,可以降低门槛,提高工作效率。
  • A(Approach,做法)
    前端:构建Web UI,支持索引管理、查询等功能
    后端:封装API,提供UI交互
  • B(Benefit,好处)
    对于初学者来说,极大地降低了使用门槛,提高管理索引的效率。同时,直观的UI操作,减少代码编写的时间。最后,改进了上手难度大的缺陷,增加了产品的竞争力。
  • C(Competitors,竞争)
    txtai + Web UI = 轻量级 + 可视化,适用于个人开发或者中小型项目或者企业开发。
  • D(Delivery,落地)
    1-2 周:需求分析与界面设计。
    3-6 周:API开发与UI框架搭建。
    7-10 周:功能开发:索引管理、查询测试等。
    11-12 周:权限管理、性能优化。
    13-14 周:内部测试与迭代。
    15-16 周:正式发布与推广。

团队分工

2名后端开发工程师负责后端API开发,提供UI交互
2名前端工程师:构建Web UI
1名测试工程师:负责测试部分
1名项目经理:负责推动管理整个项目有序进行

posted @ 2025-03-16 17:59  荷兰豆喜欢北冰洋  阅读(22)  评论(0)    收藏  举报