Python调用大模型简单聊天机器人

import configparser
import random
import sys
import time
import uuid

from langchain_core.messages import SystemMessage,HumanMessage,ToolMessage
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import StateGraph,START,END
from langgraph.graph.message import add_messages
from typing import Annotated
from typing import TypedDict

#对话结束标志
conversation_over = False

@tool
def exit_conversation():
    '''
    用户不想聊天、结束聊天时调用
    输入参数:
        无
    返回:
        结束成功返回True,否则返回False
    '''
    global conversation_over
    conversation_over = True

    return True


tools = {
    'exit_conversation':exit_conversation
}

class State(TypedDict):
    messages: Annotated[list,add_messages]

class ChatBot:
    def __init__(self,base_url,api_key,model,temperature,name,behavior):
        self.config = {
            'configurable':{
                'thread_id':uuid.uuid4().hex,
                'user_id':uuid.uuid4().hex
            }
        }

        llm = (ChatOpenAI(
            model = model,
            temperature = temperature,
            api_key = api_key,
            base_url = base_url
        ).bind_tools(tools = list(tools.values())))
        chat = 'chat'
        builder = StateGraph(state_schema = State)
        builder.add_node(node = chat,action = lambda state:{'messages':[llm.invoke(state['messages'])]})
        builder.add_edge(start_key = START,end_key = chat)
        builder.add_edge(start_key = chat,end_key = END)
        self.graph = builder.compile(checkpointer = MemorySaver())
        if (behavior):
            for event in self.graph.stream(input = {'messages':[SystemMessage(content = behavior)]},config = self.config):
                for value in event.values():
                    pass

        self.name = name

    def conversation(self,nick):
        while (not conversation_over):
            ask = input(nick + ':')
            if (not ask):
                continue
            for event in self.graph.stream(input = {'messages':[HumanMessage(content = ask)]},config = self.config):
                for value in event.values():
                    if (value['messages'][-1].tool_calls):
                        self.call_tools(value['messages'][-1].tool_calls)
                    else:
                        print(self.name,':',value['messages'][-1].content)
    def call_tools(self,tool_calls):
        messages = []
        for call in tool_calls:
            messages.append(ToolMessage(content = tools[call['name']].invoke(call['args']),tool_call_id = call['id']))
        time.sleep(5)
        for event in self.graph.stream(input = {'messages': messages}, config = self.config):
            for value in event.values():
                if (value['messages'][-1].tool_calls):
                    self.call_tools(value['messages'][-1].tool_calls)
                else:
                    print(self.name,':',value['messages'][-1].content)

if ('__main__' == __name__):
    print('加载机器人配置...',end = '')
    load = True
    config = configparser.ConfigParser()
    config.read(filenames = 'chatbot.ini',encoding = 'utf-8')
    base_url = config.get(section = 'chat_bot',option = 'base_url')
    if (not base_url):
        print('机器人地址为空',end = '')
        load = False
    api_key = config.get(section = 'chat_bot',option = 'api_key')
    if (not api_key):
        print('机器人密码为空',end = '')
        load = False
    model = config.get(section = 'chat_bot',option = 'model')
    if (not model):
        print('机器人模型为空',end = '')
        load = False
    temperature = config.get(section = 'chat_bot',option = 'temperature')
    if (not temperature):
        print('机器人温度为空',end = '')
        load = False
    if (not load):
        print('...失败...')

        sys.exit(10)
    names = ['捧着风的少女','暖南倾绿','百锂汐','三悲未暖']
    print('...成功...')
    
    nick = input('请告诉我你的昵称:')
    behavior = input('很高兴见到你,' + nick + '!请告诉我你喜欢的机器人特色:')
    print('好的,马上安排...',end='')
    name = names[random.randint(a = 0,b = len(names) - 1)]
    bot = ChatBot(base_url = base_url,api_key = api_key,model = model,
                  temperature = temperature,name = name,behavior = behavior)
    print('...机器人 ',name,' 陪你聊天...^^')
    bot.conversation(nick = nick)
 

### 构建基于DeepSeek大模型对话界面 要通过 Python 调用本地安装的 DeepSeek 大型语言模型实现对话界面,可以从以下几个方面入手:加载模型、处理输入输出以及构建 GUI 或命令行交互。 #### 1. 加载 DeepSeek 模型 为了调用 DeepSeek 的 API 并加载模型,首先需要确保已经正确安装了所需的依赖项。可以通过 `pip` 工具安装必要的库[^3]。假设 DeepSeek 提供了一个类似于 Ollama 的接口,则可以按照以下方式加载模型: ```python import ollama # 假设 DeepSeek 使用类似的模块结构 def load_model(model_name="deepseek"): """ 加载指定名称的 DeepSeek 模型。 :param model_name: 模型名称,默认为 'deepseek' :return: 返回加载后的模型对象 """ try: model = ollama.load(model_name) return model except Exception as e: print(f"Error loading the model: {e}") return None ``` 此处假定 DeepSeek 支持通过类似 Ollama 的方式进行加载[^2]。 --- #### 2. 输入输出处理逻辑 定义一个函数用于接收用户输入并将其传递给模型生成响应。以下是具体的实现代码: ```python def generate_response(prompt, model): """ 根据用户的提示词生成模型的回答。 :param prompt: 用户输入的提示词 :param model: 已加载的 DeepSeek 模型实例 :return: 模型生成的响应字符串 """ if not model: return "Model is not loaded." response = model.generate(prompt=prompt)["content"] return response.strip() ``` 该部分利用了 `generate()` 方法来获取模型的推理结果。 --- #### 3. 构建 GUI 对话窗口 如果希望提供图形化用户界面 (GUI),可以使用 `tkinter` 库快速构建一个简单对话框应用。下面是一个完整的示例程序: ```python import tkinter as tk from tkinter import scrolledtext model = load_model() def on_submit(): user_input = input_field.get() output_text.insert(tk.END, f"You: {user_input}\n") response = generate_response(user_input, model) output_text.insert(tk.END, f"AI: {response}\n\n") input_field.delete(0, tk.END) root = tk.Tk() root.title("DeepSeek Chat Interface") input_label = tk.Label(root, text="Enter your message:") input_label.pack(pady=5) input_field = tk.Entry(root, width=80) input_field.pack(pady=5) submit_button = tk.Button(root, text="Send", command=on_submit) submit_button.pack(pady=5) output_text = scrolledtext.ScrolledText(root, wrap=tk.WORD, height=20, width=100) output_text.pack(padx=10, pady=10) output_text.config(state='normal') root.mainloop() ``` 这段代码展示了如何结合 `tkinter` 创建一个具备输入框、发送按钮和滚动文本区域的基础聊天界面[^1]。 --- #### 4. 替代方案——命令行交互 对于更轻量化的场景,可以直接采用命令行形式进行交互。如下所示: ```python if __name__ == "__main__": while True: user_input = input("You: ") if user_input.lower() in ["exit", "quit"]: break response = generate_response(user_input, model) print(f"AI: {response}") ``` 这种简单的方式适合测试阶段或不需要复杂 UI 的场合。 --- ### 总结 以上介绍了两种主要方法来实现与 DeepSeek 模型的互动:一种是基于 GUI 的可视化界面;另一种则是纯命令行模式。无论哪种方式都需先完成模型加载,并合理设计输入输出流程以保障用户体验[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值