【项目实训#05】DeepSeek API客户端开发与集成学习实践

【项目实训#05】DeepSeek API客户端开发与集成学习实践

文章目录

  • 【项目实训#05】DeepSeek API客户端开发与集成学习实践
    • 一、背景简介
    • 二、技术方案与实现
      • 2.1 整体架构
      • 2.2 配置管理模块实现
      • 2.3 模型列表获取
      • 2.4 OneAPI客户端实现
      • 2.5 Ollama客户端实现
    • 三、高级功能实现
      • 3.1 格式化输出
      • 3.2 代码补全
    • 四、应用场景与示例
      • 4.1 基本对话示例
      • 4.2 代码生成示例
    • 五、总结与展望

一、背景简介

在HarmonySmartCoding项目中,需要使用DeepSeek API来实现问答、微调等等操作,用于后续的API文档问答和代码数据集提示词生成。
为了满足这一需求,我开发了DeepSeek API客户端,用于连接和调用不同环境下的DeepSeek大语言模型。本文将详细介绍我的实现过程、技术方案以及关键功能。

二、技术方案与实现

2.1 整体架构

我设计了一个灵活的API客户端架构,支持多种环境下的DeepSeek模型调用:

  1. 配置管理模块:通过ds_config.py实现,管理不同环境的API配置
  2. OneAPI客户端:通过ds_oneapi_client.py实现,提供与标准OpenAI兼容接口的交互
  3. Ollama客户端:通过ds_ollama_client.py实现,提供与本地Ollama服务的交互

这种架构设计使我能够在不同环境下灵活切换模型,同时保持一致的调用接口。

2.2 配置管理模块实现

配置管理模块通过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]

该模块的主要特点:

  1. 多环境配置:支持学校提供的DeepSeek-R1和bge-m3模型,以及本地Ollama环境
  2. 统一访问接口:通过get_api_config函数提供统一的配置访问方式
  3. 错误处理:当请求不存在的配置时,提供友好的错误信息

2.3 模型列表获取

由于学校并没有提供服务器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 '无详细信息'}")

改代码输出结果如下:
【项目实训#05】DeepSeek API客户端开发与集成学习实践_第1张图片

可以看到,一共有两个模型:

  • DeepSeek-R1:DeepSeek R1 671B本地部署的大语言模型
  • bge-m3:多语言、长文本和多种检索方式的通用向量嵌入模型

2.4 OneAPI客户端实现

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客户端的主要特点:

  1. 标准接口:遵循OpenAI API规范,便于与其他系统集成
  2. 灵活配置:支持通过配置名称选择不同的模型和环境
  3. 错误处理:提供友好的错误信息,便于调试

2.5 Ollama客户端实现

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客户端的主要特点:

  1. 本地部署支持:专为本地部署的Ollama服务设计
  2. 参数适配:自动适配Ollama API的特殊参数要求
  3. 功能丰富:除基本对话外,还支持格式化输出、代码补全等高级功能

三、高级功能实现

3.1 格式化输出

为了支持特定格式的输出(如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}
    ]
    
    

该功能通过设置系统提示词,引导模型生成特定格式的输出,并进行适当的后处理,确保输出符合预期格式。

3.2 代码补全

为了支持代码生成和补全,我实现了专门的代码补全功能:

def code_completion(self, 
                   code_prompt: str, 
                   language: str = "python") -> str:
    """代码补全"""
    system_message = f"你是一个专业的{language}开发者。请补全或生成以下代码。只返回代码,不要有其他说明。"
    

该功能通过设置特定的系统提示词,引导模型生成高质量的代码,并移除不必要的标签和说明文字。

四、应用场景与示例

4.1 基本对话示例

from DeepSeek.ds_oneapi_client import DSOneAPIClient

# 创建客户端实例
client = DSOneAPIClient()

# 进行对话
messages = [
    {"role": "user", "content": "请介绍一下HarmonyOS"}
]
response = client.chat_completion(messages)
print(response)

4.2 代码生成示例

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应用开发领域积累了宝贵的实战经验。

你可能感兴趣的:(创新项目实践-个人,python,oneapi,llama,语言模型)