最近在做一个文档改错系统的项目时,我遇到了一个很现实的问题:Gemini API在国内网络环境下使用非常不稳定。每次调用都要折腾半天,不是连接超时就是返回503错误。后来在技术社区里看到有人推荐清华大学的智普API,试用后发现确实是个不错的替代方案。
智普API有几个明显的优势:首先是网络稳定性,毕竟是国内的服务,调用响应速度很快;其次是中文支持非常好,在处理中文文本时表现比Gemini更自然;最后是文档齐全,清华团队提供了详细的中文文档和示例代码。虽然免费额度有限,但对于个人项目和小型应用来说完全够用。
这里分享一个我在项目中使用的智普API基础调用代码:
python复制import zhipuai
# 配置API密钥
zhipuai.api_key = "你的API密钥"
# 创建对话
response = zhipuai.model_api.invoke(
model="chatglm_pro",
prompt=[{"role": "user", "content": "请解释量子计算的基本原理"}]
)
print(response['data']['choices'][0]['content'])
相比Gemini需要配置transport='rest'和各种代理设置,智普API的接入确实简单多了。我在本地测试时,平均响应时间在1秒以内,这对于需要快速迭代的原型开发来说非常关键。
PyWebIO是我最近发现的一个宝藏库,它让Python开发者不用学习HTML/CSS/JavaScript就能快速构建Web界面。对于需要快速验证想法或者搭建简单管理后台的场景特别实用。
安装PyWebIO非常简单:
bash复制pip install pywebio
下面是一个最基本的PyWebIO应用示例,集成了智普API的问答功能:
python复制from pywebio.input import *
from pywebio.output import *
from pywebio.session import *
import zhipuai
def chat_with_glm():
put_markdown("## 智普API问答演示")
while True:
question = input("请输入你的问题", type=TEXT)
if not question:
break
with put_loading():
response = zhipuai.model_api.invoke(
model="chatglm_pro",
prompt=[{"role": "user", "content": question}]
)
answer = response['data']['choices'][0]['content']
put_markdown(f"**回答**: {answer}")
if __name__ == '__main__':
start_server(chat_with_glm, port=8080)
运行这段代码后,打开浏览器访问localhost:8080就能看到一个简单的问答界面。PyWebIO会自动处理所有的前端渲染和交互逻辑,开发者只需要关注业务代码就行。
结合前面两个技术点,我搭建了一个文档改错系统的原型。这个系统可以接收用户上传的文档,调用智普API进行语法和逻辑检查,然后返回修改建议。
核心功能模块包括:
关键实现代码如下:
python复制from pywebio import start_server
from pywebio.input import file_upload
from pywebio.output import *
import zhipuai
import re
def process_document():
put_markdown("# 文档智能改错系统")
# 文件上传
doc = file_upload("请上传需要检查的文档", accept=".txt,.docx")
# 读取文件内容
if doc['filename'].endswith('.txt'):
text = doc['content'].decode('utf-8')
else:
# 处理docx的逻辑略
pass
# 分块处理
chunks = [text[i:i+1000] for i in range(0, len(text), 1000)]
put_processbar('progress')
corrections = []
for i, chunk in enumerate(chunks):
set_processbar('progress', i/len(chunks))
response = zhipuai.model_api.invoke(
model="chatglm_pro",
prompt=[{
"role": "user",
"content": f"请检查以下文本的语法和逻辑错误,给出修改建议:\n{chunk}"
}]
)
corrections.append(response['data']['choices'][0]['content'])
# 展示结果
put_markdown("## 修改建议")
for correction in corrections:
put_code(correction, language='markdown')
这个原型虽然简单,但完整展示了从API调用到Web界面集成的全流程。在实际项目中,还可以加入用户登录、历史记录、多文档批量处理等功能。
在实际使用过程中,我发现有几个关键点会显著影响系统的稳定性和用户体验:
首先是API调用频率控制。智普API有每分钟调用次数的限制,直接连续调用很容易触发限流。我的解决方案是加入简单的速率限制:
python复制import time
from functools import wraps
def rate_limited(max_per_minute):
interval = 60.0 / max_per_minute
def decorator(func):
last_time = [0.0]
@wraps(func)
def wrapped(*args, **kwargs):
elapsed = time.time() - last_time[0]
wait = interval - elapsed
if wait > 0:
time.sleep(wait)
last_time[0] = time.time()
return func(*args, **kwargs)
return wrapped
return decorator
@rate_limited(30) # 限制每分钟30次调用
def safe_api_call(prompt):
return zhipuai.model_api.invoke(model="chatglm_pro", prompt=prompt)
其次是错误处理。网络请求难免会遇到各种异常,完善的错误处理能让应用更健壮:
python复制def robust_api_call(prompt, max_retries=3):
for attempt in range(max_retries):
try:
response = zhipuai.model_api.invoke(model="chatglm_pro", prompt=prompt)
if response['code'] == 200:
return response
else:
raise Exception(f"API返回错误: {response['msg']}")
except Exception as e:
if attempt == max_retries - 1:
raise
time.sleep(2 ** attempt) # 指数退避
最后是用户体验优化。长时间的操作应该给用户明确的反馈:
python复制with put_loading(shape='grow'):
result = long_running_operation()
put_success("操作完成!")
这些优化措施虽然看起来简单,但在实际项目中能显著提升系统的可靠性和用户体验。特别是在教育场景下,学生们使用系统时遇到错误往往不知道如何解决,完善的错误提示能减少很多支持工作。
为了让系统更加实用,我尝试加入了简单的知识库和对话记忆功能。这需要解决两个关键问题:上下文管理和知识检索。
对于上下文管理,我使用了一个简单的对话历史记录:
python复制from collections import deque
class Conversation:
def __init__(self, max_history=5):
self.history = deque(maxlen=max_history)
def add_exchange(self, question, answer):
self.history.append({
"role": "user",
"content": question
})
self.history.append({
"role": "assistant",
"content": answer
})
def get_context(self):
return list(self.history)
知识检索方面,我实现了一个基于本地文本的简单检索系统:
python复制import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
class KnowledgeBase:
def __init__(self, documents):
self.vectorizer = TfidfVectorizer()
self.documents = documents
self.vectors = self.vectorizer.fit_transform(documents)
def search(self, query, top_k=3):
query_vec = self.vectorizer.transform([query])
scores = cosine_similarity(query_vec, self.vectors)
top_indices = np.argsort(scores[0])[-top_k:][::-1]
return [self.documents[i] for i in top_indices]
结合这两个组件,系统的问答能力得到了明显提升:
python复制def enhanced_chat(question, conv, kb):
# 检索相关知识
related_knowledge = kb.search(question)
context = conv.get_context()
# 构建prompt
prompt = [{
"role": "system",
"content": "你是一个专业助手,请根据以下知识回答问题:" + "\n".join(related_knowledge)
}]
prompt.extend(context)
prompt.append({
"role": "user",
"content": question
})
# 调用API
response = zhipuai.model_api.invoke(model="chatglm_pro", prompt=prompt)
answer = response['data']['choices'][0]['content']
# 更新对话历史
conv.add_exchange(question, answer)
return answer
这个实现虽然简单,但已经能够支持一定程度的上下文相关对话。在实际项目中,可以根据需求进一步扩展,比如加入更复杂的知识图谱或者对接专业的向量数据库。