这个作业属于哪个课程 | 2023软件工程 |
---|---|
这个作业要求在哪里 | 软件工程实践总结&个人技术博客 |
这个作业的目标 | 从个人技术学习角度和团队开发技术角度中选择你最擅长的一个相关技术,进行分析描述并总结 |
其他参考文献 | FastAPI官方文档 |
文章目录
一、技术概述
1.1 使用场景
- 在Python端搭建AI服务,通过为Java提供API接口实现AI接口调用。
1.2 学习原因
- 性能:FastAPI基于异步编程模型,利用Python的异步生态系统,提供出色的性能和吞吐量。
- 自动文档生成:FastAPI能够自动为API生成交互式文档,支持自动检测请求参数和响应模型,并生成相应的API文档。
- 快速开发:FastAPI提供了一些快速开发的功能,如自动路由和依赖注入。
1.3 学习难点
- 理解通信协议:Java和Python是两种不同的编程语言,它们有各自独特的编程范式和通信机制。在构建API服务时,需要深入理解HTTP协议、请求和响应格式以及状态码等,确保两端能够正确地进行通信。
- 框架掌握:FastAPI虽然提供了简洁易用的API,但掌握其路由配置、请求处理、数据验证和序列化等核心功能可能需要一定时间。
- 异步编程与性能优化:FastAPI支持异步编程,这对于提高API服务的性能至关重要。
二、技术详述
2.1 搭建FastAPI基础环境
pip install fastapi
安装 uvicorn
uvicorn 是一个用于运行 FastAPI 应用的服务器,它可以将你的 FastAPI 代码部署到生产环境中。
pip install uvicorn
2.1 定义API路由和处理函数
app = FastAPI()
@app.get("/chat")
def chat_stream(chatRequest: ChatRequest):
generate = base_chat(chatRequest.history, chatRequest.input)
async def base_chat(history, input):
prompt = ChatPromptTemplate.from_messages(
[
("system", "You are a helpful assistant."),
MessagesPlaceholder("history"),
("human", "{input}")
]
)
llm=init_llm("kimi")
chain = prompt | llm
async for chunk in chain.astream({"history": history,"input": input}):
token=chunk.content
js_data = {"code": "200", "msg": "ok", "data": token}
yield f"data: {json.dumps(js_data, ensure_ascii=False)}\n\n"
2.2 使用Python类型提示进行数据验证和序列化
class ChatRequest(BaseModel):
history: list = []
input: str
2.3 启动FastAPI服务,监听特定端口
if __name__ == "__main__":
import uvicorn
uvicorn.run(app=app, host="127.0.0.1", port=10088)
三、技术使用中遇到的问题和解决过程
3.1 数据格式与序列化
问题:Java和Python在数据类型和序列化上存在差异,导致数据传输时出现解析错误或数据丢失。(两种都出现过我也是很无力)
解决方法:
- 统一数据格式:推荐使用JSON作为统一的数据交换格式,因为Java和Python都有成熟的JSON库可以方便地进行序列化和反序列化。(刚开始就统一了,但还是错,我也是服)
- 使用正确的DTO:在Java端,定义与FastAPI端点响应结构相匹配的DTO类,确保数据能够正确映射.
3.2 并发问题
问题:在高并发场景下,FastAPI的性能不够。
解决方法:
- 优化FastAPI性能:使用异步编程技术、缓存机制以及合理的请求限流策略来提升FastAPI的性能。
- 负载均衡与水平扩展:部署多个FastAPI实例,并使用负载均衡器来分发请求,实现水平扩展。
四、总结
4.1 跨语言调用的可行性
通过这次实践,我深刻体会到了跨语言调用的可行性。只要双方遵循统一的接口规范和数据格式,不同语言之间的调用完全可以实现无缝对接。
4.2 持续学习与探索
技术是不断发展和更新的,作为开发者,我们需要保持持续学习和探索的态度。在构建FastAPI接口的过程中,我不断查阅文档、学习新技术,并将其应用到实际项目中,从而不断提升自己的技术水平。
4.3 心得体会
通过这个过程,我不仅提升了自己的技术水平,还深刻体会到了跨语言调用的优势和挑战。未来,我将继续探索更多技术领域,为项目的开发和团队的成长贡献更多的力量。