在HarmonySmartCoding项目中,需要使用DeepSeek API来实现问答、微调等等操作,用于后续的API文档问答和代码数据集提示词生成。
为了满足这一需求,我开发了DeepSeek API客户端,用于连接和调用不同环境下的DeepSeek大语言模型。本文将详细介绍我的实现过程、技术方案以及关键功能。
我设计了一个灵活的API客户端架构,支持多种环境下的DeepSeek模型调用:
ds_config.py
实现,管理不同环境的API配置ds_oneapi_client.py
实现,提供与标准OpenAI兼容接口的交互ds_ollama_client.py
实现,提供与本地Ollama服务的交互这种架构设计使我能够在不同环境下灵活切换模型,同时保持一致的调用接口。
配置管理模块通过ds_config.py
实现,主要功能是管理不同环境的API配置信息:
# API配置字典,键为API名称,值为配置信息
API_CONFIGS = {
# 学校提供的环境配置
"sdu": {
"api_url": "http://服务器IP地址/v1",
"api_key": "API密钥",
"model": "DeepSeek-R1",
},
}
def get_api_config(api_name=None):
"""获取指定名称的API配置"""
if api_name is None:
api_name = DEFAULT_API
return API_CONFIGS[api_name]
该模块的主要特点:
get_api_config
函数提供统一的配置访问方式由于学校并没有提供服务器API的访问文档,并无法直接得知OneAPI服务器中模型的具体名称,因此可以通过"/models"接口获取可用模型列表。实现代码如下:
def list_models(self) -> None:
"""
获取并打印可用模型列表
"""
try:
url = f"{self.api_url}/models"
response = requests.get(url, headers=self.headers)
response.raise_for_status()
data = response.json()
models = data.get("data", [])
print(f"可用模型列表 (共{len(models)}个):")
print("-" * 50)
for model in models:
model_id = model.get("id", "未知ID")
owner = model.get("owned_by", "未知所有者")
print(f"模型: {model_id}")
print(f"所有者: {owner}")
print("-" * 50)
except requests.exceptions.RequestException as e:
print(f"获取模型列表失败: {str(e)}")
print(f"错误详情: {e.response.text if hasattr(e, 'response') else '无详细信息'}")
可以看到,一共有两个模型:
OneAPI客户端通过ds_oneapi_client.py
实现,提供与标准OpenAI兼容接口的交互:
class DSOneAPIClient:
"""DeepSeek API客户端类"""
def __init__(self, api_name: Optional[str] = None, max_tokens = DEFAULT_MAX_TOKENS):
"""初始化DeepSeek客户端"""
config = get_api_config(api_name)
self.api_url = config["api_url"]
self.api_key = config["api_key"]
self.model = config["model"]
def chat_completion(self,
messages: List[Dict[str, str]],
temperature: float = 0.7,
max_tokens: Optional[int] = None) -> str:
"""进行对话补全"""
payload = {
"model": self.model,
"messages": messages,
"temperature": temperature,
"max_tokens": max_tokens,
"stream": False
}
OneAPI客户端的主要特点:
Ollama客户端通过ds_ollama_client.py
实现,提供与本地Ollama服务的交互:
class DSOllamaClient:
"""Ollama API客户端类"""
def __init__(self, api_name: Optional[str] = "local_ollama_r1_14b"):
"""初始化Ollama客户端"""
config = get_api_config(api_name)
self.api_url = config["api_url"]
self.model = config["model"]
def chat_completion(self,
messages: List[Dict[str, str]],
temperature: float = 0.7,
max_tokens: int = 1000,
stream: bool = False) -> Dict[str, Any]:
"""进行对话补全"""
# Ollama API使用不同的参数名称
payload = {
"model": self.model,
"messages": messages,
"options": {
"temperature": temperature,
"num_predict": max_tokens
},
"stream": stream
}
Ollama客户端的主要特点:
为了支持特定格式的输出(如JSON、Markdown等),我在客户端中实现了格式化输出功能:
def format_output(self,
prompt: str,
format_type: str = "json") -> Any:
"""生成指定格式的输出"""
system_message = f"请以{format_type}格式回答以下问题。只返回{format_type}内容,不要有其他说明。"
messages = [
{"role": "system", "content": system_message},
{"role": "user", "content": prompt}
]
该功能通过设置系统提示词,引导模型生成特定格式的输出,并进行适当的后处理,确保输出符合预期格式。
为了支持代码生成和补全,我实现了专门的代码补全功能:
def code_completion(self,
code_prompt: str,
language: str = "python") -> str:
"""代码补全"""
system_message = f"你是一个专业的{language}开发者。请补全或生成以下代码。只返回代码,不要有其他说明。"
该功能通过设置特定的系统提示词,引导模型生成高质量的代码,并移除不必要的标签和说明文字。
from DeepSeek.ds_oneapi_client import DSOneAPIClient
# 创建客户端实例
client = DSOneAPIClient()
# 进行对话
messages = [
{"role": "user", "content": "请介绍一下HarmonyOS"}
]
response = client.chat_completion(messages)
print(response)
from DeepSeek.ds_ollama_client import DSOllamaClient
# 创建客户端实例
client = DSOllamaClient()
# 生成代码
code_prompt = "编写一个函数,计算斐波那契数列的第n项"
code = client.code_completion(code_prompt, language="python")
print(code)
通过开发DeepSeek API客户端,我成功实现了与多种环境下DeepSeek模型的交互能力,这为HarmonySmartCoding项目的API文档问答和代码生成功能奠定了坚实基础。客户端架构的灵活性使得我能够根据不同场景需求无缝切换模型环境,同时保持统一的调用接口,大大提高了开发效率。在功能方面,不仅实现了基本的对话交互,还支持格式化输出和代码补全等高级特性,满足了项目的多样化需求。
未来的优化方向主要集中在性能和功能扩展上。我计划改进流式输出处理机制,提升实时交互体验;增加对更多模型的支持,扩展应用场景;实现智能缓存策略,提高响应速度;并加强监控和日志功能,便于问题排查和性能分析。这些改进将使客户端更加强大和可靠,为项目的长期发展提供有力支持。
通过这次开发实践,我不仅掌握了大语言模型API调用的技术细节,还深入理解了不同接口规范和参数适配的处理方法。这些经验对于后续开发智能化功能具有重要的参考价值,也为我在AI应用开发领域积累了宝贵的实战经验。