
代理服务器自动化:实现前所未有的一致性和生产力?
- Rifx.Online
- AI Applications , Software Development , Best Practices
- 16 Feb, 2025
自动化 SRS 创建与代理工作流:解锁无缝一致性和生产力提升
第 4 部分,共 9 部 — 构建 AI 驱动的 SDLC — 实用指南
合著者:Rishi Arora
来源:使用 DALL-E 生成
在“构建 AI 驱动的 SDLC — 实用指南”系列中,我们探讨了多智能体系统如何通过自动化转变软件开发和软件开发生命周期。然后,我们考察了人工智能智能体的协作能力,并详细介绍了智能、基于智能体的 SDLC 系统的架构。如果您错过了这些内容,请使用下面的系列链接查看早期的帖子。现在,我们深入探讨如何使用多智能体系统创建软件需求规格(SRS)。
引言
创建准确且全面的软件需求规格(SRS)是软件开发生命周期(SDLC)的基石。SRS作为一种蓝图,弥合了开发团队、业务利益相关者和最终用户之间的差距,协调了目标和期望。传统上,撰写SRS文档耗时、易出错且不一致,尤其是在大型或复杂项目中。
在本文中,我们介绍了如何通过利用由LangGraph驱动的多智能体系统重新定义这一过程。我们探讨了自动化如何最小化手动工作,提高准确性,并将可扩展性置于首位,将传统工作流程转变为精简的、人工智能驱动的解决方案。
如果您想跳过理论,直接进入实施部分,请直接访问本文的实施部分。
传统SRS创建中的挑战
传统过程创建SRS通常涉及:
- 需求收集:从各个利益相关者(如业务领导、最终用户和技术团队)收集输入。此阶段侧重于收集多样化的输入,以确保系统需求的全面覆盖。利益相关者访谈、研讨会和文档审查是常用的方法。
- 创建草稿:手动组织和记录需求,以结构化格式进行,通常参考预定义模板。此阶段包括确保文档的清晰性和一致性,以使技术和非技术利益相关者都能理解。
- 审核和反馈:此阶段涉及在相关利益相关者之间传阅文档以获取输入。反馈侧重于识别任何被忽视的需求、澄清模糊之处,并使文档与业务目标保持一致。
- 最终确定:将所有反馈纳入文档并获得关键利益相关者的最终批准。批准的SRS是后续开发阶段的权威指南,确保团队的一致性。
虽然这个过程确保了全面的文档记录,但通常会受到以下因素的阻碍:
- 人为错误:对关键细节的误解或遗漏。错误可能源于误读利益相关者的需求、忽视记录特定要求或未能使文档与项目目标保持一致。这些错误往往在软件开发生命周期中传播,导致后期昂贵的修正。
- 低效:手动任务消耗大量时间和精力。转录访谈、将数据整理成模板以及验证一致性等过程需要大量的人力输入,这减缓了项目进度并增加了错过截止日期的风险。
- 沟通不畅:需求中的模糊性或不一致性。没有清晰的文档,利益相关者和开发人员之间的误解可能导致对系统需求的相互冲突的解释,从而导致返工、延误以及团队成员和客户的不满。
自动化如何提供帮助?
想象一个人工智能代理系统,它智能地与利益相关者互动以收集需求,利用示例来最小化重复输入,生成一个具有一致性的初步草稿,且手动干预最小,并根据反馈自动修订文档以确保一致性和速度。人工智能代理利用自然语言处理(NLP)以互动方式收集和完善需求,减少手动工作量,使利益相关者更容易高效地贡献。
LangGraph 提供了实现这种自动化所需的结构,作为一种工作流程,管理整个过程中的任务转换,减少人类在例行任务中的参与,提高整体效率。
让我们探讨一下这样的工作流程可能如何运作。在这种方法中,我们旨在单独自动化软件开发生命周期的各个步骤。一些通常由协调代理处理的职责,例如与利益相关者的互动,由工作流程中的各个代理来管理。虽然在设计阶段将所有协调工作交由路由器或协调代理处理似乎更为整洁,但在工作流程中将某些职责分配给各个代理往往更为实用。
自动化软件需求规格创建 — 需求团队的角色
工作流程概述
说明代理如何相互互动
1. 需求收集
交互式人工智能代理与利益相关者互动,以:
- 通过虚拟访谈、自动调查和聊天机器人收集详细输入。
- 通过根据利益相关者的反馈提问后续问题来澄清模糊之处。
- 通过将利益相关者的输入与知识库中类似项目进行交叉参考,确保需求的完整性。
2. 草拟
使用预定义模板和收集的输入,人工智能代理:
- 通过将需求组织成结构化部分(如功能性和非功能性需求)生成初步软件需求规格草稿。
- 一致地格式化文档,遵循行业标准或项目特定指南。
- 允许迭代改进。
3. 审核和反馈
自动化审核代理:
- 分析软件需求规格草稿中的缺口和不一致之处,例如缺失的依赖关系或矛盾的需求。
- 提供可操作的反馈,包括建议的修订或需要收集的额外数据点。
- 与团队迭代以完善草稿,直到其符合预定义的质量标准。
4. 最终确定
人类监督确保:
- 进行利益相关者审核,以验证软件需求规格与业务目标和技术可行性的一致性。
- 批准工作流程得到简化,针对待审核或待签名的通知会被发送(我们将在未来的帖子中更详细地探讨这一点)。
自动化软件需求规格创建的好处
提高效率
通过代理工作流程的自动化,显著减少了在重复和手动任务上花费的时间。通过处理大量的数据收集、草拟和审核,团队可以更专注于高优先级、价值驱动的活动。这导致项目时间表更快,开发过程更流畅。
一致性
自动化通过利用结构化的工作流程和定义的人工智能交互,确保不同项目之间的一致性结果。从需求收集到审批,每个任务都遵循相同的流程,最小化人为错误,并确保统一的质量,无论项目的复杂性如何。
生产力影响
Automation enhances productivity by streamlining key tasks,加速需求收集通过互动对话,并快速根据模板起草软件需求规格,‘审核代理’确保文档符合期望。这减少了手动工作,快速修订,并最小化延误,使团队能够专注于更高优先级的活动。
风险与缓解
虽然自动化带来了众多好处,但潜在风险包括:
- 职位替代:自动化可能导致某些行业的职位流失。
- 安全漏洞:自动化系统可能成为网络攻击的目标。
- 对技术的依赖:过度依赖自动化系统可能导致人类监督减少。
- 实施成本:自动化系统的初始设置和维护成本可能很高。
- 数据隐私问题:自动化通常涉及处理敏感数据,带来隐私问题。
缓解策略
为了解决这些风险,请考虑以下策略:
- 技能提升与再培训:为员工提供培训,以适应自动化带来的新角色。
- 强有力的安全措施:实施强大的网络安全协议以保护自动化系统。
- 人类监督:保持对自动化过程的人类监督。
- 成本效益分析:在实施前仔细评估自动化的财务影响。
- 遵循数据法规:确保自动化系统遵循相关的数据隐私法律。
结论
通过了解与自动化相关的风险并实施有效的缓解策略,组织可以利用自动化的好处,同时最小化潜在的负面影响。
模型依赖性
生成的 软件需求规格 的准确性和质量在很大程度上依赖于底层模型。选择合适的模型和设计有效的提示对于可靠的输出至关重要。
提示的质量
设计不良的提示可能导致草稿不完整或无关。微调与人工智能的互动对于有效的自动化至关重要。
迭代控制
虽然自动化加速了过程,但需要明确的条件来最终确定软件需求规格,以避免对大型或复杂项目进行无休止的完善。
缓解策略包括:
- 严格的提示工程
- 明确的迭代限制
- 强制性的人类批准
现在让我们深入实施,动手实践。
如何使用 LangGraph 自动化 SRS 创建 101
1. 安装库
安装所需的库以便使用 LangGraph:
pip install --upgrade pip
pip install -U langgraph langchain_openai
2. 配置
配置您的 OpenAI API 密钥和模型名称:
import os
os.environ["OPENAI_API_KEY"] = "your_openai_key"
model_name = "choose_model"
3. 配置本地文件系统以读取输入和写入输出
在本博客中,我们使用了一个 文件管理工具包 来管理 SRS 创建过程中的数据。该工具包帮助读取输入(例如,模板/格式)并保存输出(例如,生成的 SRS 和反馈)。
from tempfile import TemporaryDirectory
from langchain_community.agent_toolkits import FileManagementToolkit
file_stores = FileManagementToolkit(
selected_tools=["read_file", "write_file", "list_directory"],
).get_tools()
read_file, write_file, list_file = file_stores
虽然我们在这里使用基于文件的解决方案以简化操作,但在实际场景中,可以根据用例利用任何持久数据存储。
选项包括:
- 关系数据库(例如,PostgreSQL,MySQL)用于结构化数据存储。
- NoSQL数据库(例如,MongoDB,DynamoDB)用于灵活、可扩展的解决方案。
- 基于文件的存储(例如,JSON,CSV)用于更简单、轻量的用例。
- 内存数据库(例如,Redis)用于更快地访问临时数据。
选择合适的数据存储取决于项目规模、复杂性和所需的访问速度等因素。
4. 定义代理或节点以收集需求
首先,识别需要从用户收集的关键数据点,以有效收集需求。这些数据点构成 SRS 的核心,可以使用结构化格式进行建模。
from pydantic import BaseModel
class Information(BaseModel):
"""如何提示大语言模型的说明。"""
drivers: str
personas: str
functionalities: str
constraints: str
other: str
在这个例子中,我们定义了需要从用户捕获的关键数据点,例如驱动因素、角色、功能、约束等。这些将作为我们希望在 SRS 中包含的信息的基础。
接下来,将实例化 LLM 模型以与用户进行交互。
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model=model_name, temperature=0, max_retries=1)
llm_with_tool = llm.bind_tools([Information])
在这里,我们初始化了 ChatOpenAI
模型并将其绑定到 Information
结构,使模型能够与用户交互并根据预定义字段收集数据点。
创建一个提示,指导 LLM 与用户进行互动对话,以收集必要的信息:
InfoGatherPrompt = <根据您的需求定义提示>
定义一个函数来格式化 LLM 的消息,将初始提示与任何先前的消息结合,以保持对话中的上下文。
def get_messages_info(messages):
return [SystemMessage(content=InfoGatherPrompt)] + messages
创建一个与用户互动并收集所需信息的函数:
def information_gathering(state):
messages = get_messages_info(state["messages"])
response = llm_with_tool.invoke(messages)
return {"messages": [response]}
此函数调用 LLM 并交互式地收集用户的响应。
最后,定义一个函数以确保所有数据已被用户捕获并确认:
def is_clarified(state):
messages = state["messages"]
srs = state.get('srs')
if isinstance(messages[-1], AIMessage) and messages[-1].tool_calls:
return "yes"
else:
return "no"
该代理持续评估是否已收集到足够的数据点,直到收集到所需的信息并得到澄清为止。
5. 定义生成 SRS 草稿的代理
要生成 SRS 草稿,定义一个代理或节点,该节点接受收集到的信息并使用 LLM 来构建和创建文档。该代理还将处理文档的版本控制和保存。
def generate_srs(state):
messages = get_prompt_messages(state)
response = llm.invoke(messages)
iteration = state['iteration']
file_name = "output/srs_v" + str(iteration) + ".md"
write_file.invoke({"file_path": file_name, "text": response.content})
return {
"messages": [response],
"srs": [response]
}
- 写作代理 使用从用户收集的数据和预期的 SRS 格式提示 LLM 生成文档草稿。
- 然后,它将 SRS 以 Markdown格式 保存,以便于参考和版本控制。每个生成的 SRS 草稿都以版本号(例如,
srs_v1.md
,srs_v2.md
)保存,以跟踪进度和修订。 - 该函数返回生成的 SRS 内容和消息,确保文档和交互历史可用于进一步处理或审核。
6. 定义审查生成的 SRS 的代理
要审查生成的 SRS,定义一个代理或节点,该节点评估草稿并提供修订反馈。该代理将与 LLM 交互以分析内容并生成建设性反馈,同时保持反馈的版本控制。
def reviewer(state):
srs = state['srs']
messages = get_feedback_info(srs)
response = llm.invoke(messages)
iteration = state['iteration'] + 1
file_name = "output/srs_feedback_v" + str(iteration) + ".md"
write_file.invoke({"file_path": file_name, "text": response.content})
return {
"messages": [response],
"iteration": iteration
}
- 审核代理 检索生成的 SRS,并根据提示向 ‘写作代理’ 提供反馈。
- 它将反馈以 Markdown格式 保存,附加迭代号以确保适当的版本控制(例如,
srs_feedback_v1.md
,srs_feedback_v2.md
)。 - 该函数更新迭代计数以跟踪修订过程,并返回反馈和新的迭代号以进行进一步的改进。这允许 写作代理 根据收到的反馈相应地修订 SRS。
7. 重复上述审核和更新步骤,直到接受
审核过程应重复进行,以确保生成的 SRS 达到可接受的质量。审核代理 评估文档,提供修订反馈,并检查文档是否令人满意。此过程重复进行,直到达到最大迭代限制或 SRS 被认为可接受。
以下是实现控制修订过程的逻辑:
def is_reviewed(state):
max_iteration = state['max_iteration']
iteration = state['iteration']
last_message = state['messages'][-1].content
if "satisfied" in last_message.lower():
return 'reviewed'
elif iteration > max_iteration:
return 'reviewed'
else:
return 'enhance'
审核代理 在每次迭代后提供反馈,过程将持续进行,只要 SRS 需要改进或直到达到最大迭代计数。
is_reviewed
函数检查:
- 如果反馈消息包含“满意”,则将 SRS 标记为“已审核”,表示不需要进一步修订。
- 如果迭代超过允许的最大值,过程停止,标志着修订的结束。
- 否则,过程继续,如果文档不被认为令人满意,则提示进一步修订。
该系统通过最大迭代限制和反馈检查控制审核和更新周期,确保 SRS 高效地得到精炼,而不进行过多的循环。
8. 定义带有节点(代理)、边和条件边的工作流程
为了构建自动化的 SRS 生成和审核过程,我们定义了一个工作流程,通过边连接所有代理(节点),确保根据前面步骤中建立的条件顺利过渡。该工作流程使用 LangGraph 的 状态图
来管理状态并确定过程的流向。
以下是工作流程的结构:
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import StateGraph, START
from langgraph.graph.message import add_messages
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import END
class State(TypedDict):
messages: Annotated[list, add_messages]
srs: Annotated[list, add_messages]
srs_format: Annotated[list, add_messages]
max_iteration: int
iteration: int
memory = MemorySaver()
workflow = StateGraph(State)
## 工作流程结构
* `State` 类定义了工作流程状态的结构,包括消息、软件需求规格内容、软件需求规格输入的格式、最大迭代次数和当前迭代计数。
* `MemorySaver` 用于存储状态,确保每个节点的操作被保存和跟踪。
* `StateGraph` 创建工作流程,允许管理节点的状态。
* 节点代表个体代理:`information_gathering`、`generate_srs`、`conclude_conversation` 和 `reviewer`。每个节点在软件需求规格生成过程中执行特定任务。
* **边** 定义节点之间的流动。例如,在收集信息后,工作流程转到软件需求规格生成阶段和审核阶段。
* 条件边根据某些检查的结果确定下一个要去的节点:
* 在收集需求(`information_gathering`)后,它检查数据是否已澄清(`is_clarified`)。如果已澄清,工作流程转到 `conclude_conversation` 状态;否则,结束。
* 在审核阶段(`reviewer`),它检查软件需求规格是否已批准(`is_reviewed`)。如果已批准,过程结束;否则,修订软件需求规格。
* 工作流程使用版本控制(例如,`srs_v1.md`、`srs_feedback_v2.md`)来管理软件需求规格和反馈的迭代,确保清晰跟踪更改。
> **_9. 编译工作流程_**
在定义工作流程并添加所有节点、边和条件边后,下一步是编译工作流程。`compile` 方法准备工作流程以便执行,并确保工作流程正确结构化,具有检查点和状态。
```python
graph = workflow.compile(checkpointer=memory)
10. 显示编译后的工作流程
一旦工作流程被编译,我们可以使用图表进行可视化。这将帮助我们理解任务流、条件和代理在软件开发生命周期自动化过程中的互动。draw_mermaid_png()
方法将工作流程渲染为 Mermaid 图表,然后使用 IPython 的 display
函数显示。
from IPython.display import Image, display
display(Image(graph.get_graph().draw_mermaid_png()))
11. 执行和测试工作流程
要执行和测试工作流程,您需要模拟用户交互并启动多智能体系统以处理输入,生成所需输出,并根据前面步骤中定义的工作流程做出决策。用户提供输入,系统通过执行定义序列中的相应代理进行响应。以下是执行过程的分解:
thread = {"configurable": {"thread_id": 1}}
FORMAT = read_file.invoke({"file_path": "input/srs_format.md"})
while True:
user = input("用户 (q/Q 退出): ")
if user.lower() in ["quit", "q", "Q"]:
print("人工智能: 再见")
break
output = None
for output in graph.stream(
{
"messages": [HumanMessage(content=user)],
"srs_format": [HumanMessage(content=FORMAT)],
"iteration": 1,
"max_iteration": 2,
},
config=thread,
stream_mode="updates"):
for key, value in output.items():
print("***** 代理名称: ", key)
try:
last_message = next(iter(output.values()))["messages"][-1]
last_message.pretty_print()
except:
print("使用漂亮打印时出错")
print("***** 来自 %s 的结果" % (value))
该代码设置了一个交互式工作流程,用于自动化创建和审核软件需求规格(SRS),使用多智能体系统。以下是该过程的分解:
初始化:设置线程配置以跟踪用户会话(thread_id
)。输入的 SRS 格式从文件加载,以标准化文档生成。
用户输入:提示用户输入数据或请求。用户可以输入查询或命令,并通过输入“q”或“Q”退出。
工作流程执行:用户输入和 SRS 格式被发送到工作流程,工作流程通过多个代理处理数据(例如,收集需求、起草 SRS 和审核反馈)。
代理交互:工作流程中的每个代理处理输入并提供更新。结果显示哪个代理处理了任务以及生成的输出。该工作流程演示了人工智能驱动的代理如何处理需求收集、文档起草和审核等任务,从而实现高效和迭代的软件需求规格创建过程。
您可以在 这里 找到代码片段。
结论
自动化创建软件需求规格文档可以带来显著的时间节省,减少错误,并增强利益相关者之间的协作。借助像LangGraph和LangChain这样的工具,组织可以利用人工智能的力量来简化需求收集过程,生成准确的文档,并确保高效的修订。
在即将发布的博客中,我们将继续探索各个软件开发生命周期阶段的自动化机会,例如设计和实施,展示人工智能如何进一步提升软件开发实践。
仅供说明目的的生产力分析
请注意,下面提到的分析,包括手动工作和生产力提升,仅供说明目的,应该在特定的自动化需求/用例中进行验证。
免责声明
尽管自动化在软件需求规格创建中提供了相当大的好处,但在最终批准和验证时,必须涉及人工监督。这确保了所有需求都被准确捕获,与业务目标对齐,并符合组织标准。本讨论中包含的代码片段旨在作为自动化过程的示例。这些示例可能需要调整或增强,以满足特定项目的自动化要求。请注意,提到的任何财务利益或投资回报率计算都是粗略估计,而非实际数字。
关键要点
自动化软件需求规格创建过程可以提高效率,减少错误,并增强利益相关者之间的协作。
利用多智能体框架提供了一种系统化的方式来有效管理任务、管理数据以及在任务之间进行转换。
人类监督对于确保需求文档的准确性和完整性仍然至关重要。
在下一期中,我们将探讨多智能体框架/代理工作流如何帮助根据提供的需求自动化高层设计。