如何在LangChain中部署deepseek(api调用型)

0 LangChain简要介绍

LangChain 是一个基于大型语言模型(LLM)的编程框架,旨在简化开发由语言模型驱动的应用程序。它通过模块化设计和链式结构,将语言模型与其他数据源、计算工具及外部系统连接,从而扩展 LLM 的能力,使其能够处理更复杂的任务。

以下是其核心特点

模块化设计
LangChain 提供了一系列标准化组件,包括模型调用(Models)、提示管理(Prompts)、上下文存储(Memory)、链式逻辑(Chains)、智能代理(Agents)等。这些模块可灵活组合,支持开发者快速构建端到端应用,例如问答系统、聊天机器人或数据分析工具。

数据感知与外部交互
LangChain 强调与外部数据的整合,例如通过文档加载器(Document Loaders)和向量数据库(Vector Stores)实现检索增强生成(RAG),从而突破 LLM 训练数据的时效性和领域局限性。此外,它支持与 Python 编译器、数学计算器等工具交互,扩展功能边界。

支持多模型与异步调用
兼容多种主流 LLM(如 OpenAI、Hugging Face 等),并提供异步接口优化资源利用率,适用于高并发场景。

而博主也是在做智能机器人上部署deepseek时开始接触了解LangChain的。

下面是调用API将deepseek应用到LangChain框架中(生成聊天机器人)的一个示例。


1 安装所必需的库

import os
from typing import List, Dict, Any

from dotenv import load_dotenv
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
from langchain_core.messages import AIMessage, HumanMessage, BaseMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.language_models import BaseChatModel
from langchain_core.outputs import ChatResult, ChatGeneration
import requests

2 定义deepseek聊天模型类

BaseChatModel是langchain中的一个通用模型基类,定义的DeekSeekChat类即是继承自该通用类。api_key在后面会赋值;model直接选去你要调用的deepseek模型即可;temperature参数越小生成的模型回答越准确(创造性越差)。 

# 自定义DeepSeek聊天模型类
class DeepSeekChat(BaseChatModel):
    api_key: str  # API密钥
    model: str = "deepseek-reasoner"  # 默认模型
    temperature: float = 0.1  # 温度参数

2.1 定义实现实际的消息生成逻辑函数

同时也是LangChain模型调用的核心入口

    def _generate(self, messages: List[BaseMessage], **kwargs) -> ChatResult:
        # 转换消息格式,将LangChain的标准消息格式转换为DeepSeek API要求的格式
        formatted_messages = []
        for msg in messages:
            if isinstance(msg, HumanMessage):
                role = "user"
            elif isinstance(msg, AIMessage):
                role = "assistant"
            else:
                role = "system"
            formatted_messages.append({"role": role, "content": msg.content})

定义的函数方法,返回的是一个ChatResult类型的对象

首先定义formatted_messages,为之前的消息列表。

检测消息是用户还是系统生成的,并加上“role”角色名以字典形式添加到消息列表中。

# 构建请求,headers:包含认证令牌,使用Bearer Token形式
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }

        data = {
            "model": self.model,  # 指定使用的模型版本
            "messages": formatted_messages,
            "temperature": self.temperature   # 继承类属性中的设定值
        }

        # 发送API请求
        try:
            response = requests.post(
                "https://api.deepseek.com/v1/chat/completions",
                headers=headers,
                json=data
            )
            # 自动检查HTTP状态码(非2xx会抛异常)
            response.raise_for_status()
            result = response.json()

解析网站构建的请求以及请求操作;

并最后由网页端返回deepseek生成的内容,以json代码形式返回

        except Exception as e:
            raise RuntimeError(f"API请求失败: {str(e)}")

        # 解析响应
        if "choices" not in result or len(result["choices"]) == 0:
            raise RuntimeError("无效的API响应格式")

        # 结果提取:取第一个choice的content内容(默认单回复场景)
        content = result["choices"][0]["message"]["content"]

在这里我们取返回的json代码的对应的“content”内容(仅有回复文本)

        # 返回值:包装为LangChain标准的ChatResult格式,包含AIMessage对象
        return ChatResult(generations=[ChatGeneration(message=AIMessage(content=content))])

并且以langchain标准形式返回(我们之前也以此标准形式构建了历史消息的字典列表)

2.2 定义模型标识变量

    @property
    def _llm_type(self) -> str:
        return "deepseek-chat"

这个_llm_type属性用于标识或描述这个实例所使用的语言模型(LLM)的类型;可以通过以下代码直接获取。

print(model_instance._llm_type) # 输出: deepseek-chat

3 完成主函数

def main():
    # 加载环境变量
    load_dotenv()
    api_key = "YOUR_API"

    # 初始化聊天模型
    model = DeepSeekChat(api_key=api_key)

以自己申请到的api_key创建一个DeepSeekChat类的模型

    prompt = ChatPromptTemplate.from_messages([
        MessagesPlaceholder(variable_name="chat_history"),
        ("user", "{input}")
    ])

设计定制化输出模板

    # 配置记忆存储
    memory = ConversationBufferMemory(
        memory_key="chat_history",
        return_messages=True
    )

    # 创建对话链
    chain = LLMChain(
        llm=model,
        prompt=prompt,
        memory=memory,
        verbose=True  # 显示详细运行信息(调试时可开启)
    )

配置记忆存储并创建对话链

    print("欢迎使用DeepSeek聊天助手!输入'exit'退出")
    while True:
        try:
            user_input = input("你:")
            if user_input.lower() in ["exit", "quit"]:
                break

            # 运行对话链
            response = chain.invoke({"input": user_input})
            print(f"AI:{response['text']}")

        except KeyboardInterrupt:
            break
        except Exception as e:
            print(f"发生错误:{str(e)}")
            break

进行循环对话 

4 运行主程序

if __name__ == "__main__":
    main()

5 输出结果

......

 

6 完整代码

import os
from typing import List, Dict, Any

from dotenv import load_dotenv
from langchain.chains import LLMChain
from langchain.memory import ConversationBufferMemory
from langchain_core.messages import AIMessage, HumanMessage, BaseMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.language_models import BaseChatModel
from langchain_core.outputs import ChatResult, ChatGeneration
import requests


# 自定义DeepSeek聊天模型类
class DeepSeekChat(BaseChatModel):
    api_key: str  # API密钥
    model: str = "deepseek-reasoner"  # 默认模型
    temperature: float = 0.1  # 温度参数

    # 实现实际的消息生成逻辑,是LangChain模型调用的核心入口
    def _generate(self, messages: List[BaseMessage], **kwargs) -> ChatResult:
        # 转换消息格式,将LangChain的标准消息格式转换为DeepSeek API要求的格式
        formatted_messages = []
        for msg in messages:
            if isinstance(msg, HumanMessage):
                role = "user"
            elif isinstance(msg, AIMessage):
                role = "assistant"
            else:
                role = "system"
            formatted_messages.append({"role": role, "content": msg.content})

        # 构建请求,headers:包含认证令牌,使用Bearer Token形式
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }

        data = {
            "model": self.model,  # 指定使用的模型版本
            "messages": formatted_messages,
            "temperature": self.temperature   # 继承类属性中的设定值
        }

        # 发送API请求
        try:
            response = requests.post(
                "https://api.deepseek.com/v1/chat/completions",
                headers=headers,
                json=data
            )
            # 自动检查HTTP状态码(非2xx会抛异常)
            response.raise_for_status()
            result = response.json()
        except Exception as e:
            raise RuntimeError(f"API请求失败: {str(e)}")

        # 解析响应
        if "choices" not in result or len(result["choices"]) == 0:
            raise RuntimeError("无效的API响应格式")

        # 结果提取:取第一个choice的content内容(默认单回复场景)
        content = result["choices"][0]["message"]["content"]
        # 返回值:包装为LangChain标准的ChatResult格式,包含AIMessage对象
        return ChatResult(generations=[ChatGeneration(message=AIMessage(content=content))])

    @property
    def _llm_type(self) -> str:
        return "deepseek-chat"


# 主程序
def main():
    # 加载环境变量
    load_dotenv()
    api_key = "YOUR_API"
    # api_key = os.getenv("sk-7f60db8ef22f4ca2a16af1e528186c3f")
    # if not api_key:
    #     raise ValueError("请设置DEEPSEEK_API_KEY环境变量")

    # 初始化聊天模型
    model = DeepSeekChat(api_key=api_key)

    # 创建提示模板
    prompt = ChatPromptTemplate.from_messages([
        MessagesPlaceholder(variable_name="chat_history"),
        ("user", "{input}")
    ])

    # 配置记忆存储
    memory = ConversationBufferMemory(
        memory_key="chat_history",
        return_messages=True
    )

    # 创建对话链
    chain = LLMChain(
        llm=model,
        prompt=prompt,
        memory=memory,
        verbose=True  # 显示详细运行信息(调试时可开启)
    )

    # 开始对话循环
    print("欢迎使用DeepSeek聊天助手!输入'exit'退出")
    while True:
        try:
            user_input = input("你:")
            if user_input.lower() in ["exit", "quit"]:
                break

            # 运行对话链
            response = chain.invoke({"input": user_input})
            print(f"AI:{response['text']}")

        except KeyboardInterrupt:
            break
        except Exception as e:
            print(f"发生错误:{str(e)}")
            break


if __name__ == "__main__":
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值