大模型流式对话返回demo2

代码

可直接调用

复制代码
import asyncio

from langchain.prompts import ChatPromptTemplate,MessagesPlaceholder
from langchain_core.messages import HumanMessage, AIMessage
from langchain_ollama import ChatOllama
from langchain_core.output_parsers import StrOutputParser


class WelcomeAgent:
    def __init__(self):
        self.llm = ChatOllama(
            model="deepseek-r1:8b",
            temperature=0.7,
            repeat_penalty=1.2,  # 抑制重复内容
            top_k=50,  # 限制采样范围
            top_p=0.9,
            base_url="http://localhost:11434"
        )

        # 关键修改:移除模板中的多余空行
        # 更新提示模板以包含对话历史
        self.prompt = ChatPromptTemplate.from_messages([
            ("system",
             "你是一个友好的对话AI机器人。根据用户输入和对话历史生成聪明得体的回复。请用1-10句话回复,保持自然友好的语气,直接给出最终回答,不要包含任何思考过程,回答要简洁直接。"),
            MessagesPlaceholder(variable_name="chat_history"),  # 这里将插入历史消息
            ("human", "{input}"),  # 最新的人类输入
        ])  # 直接连接,无额外空行

        self.chain = self.prompt | self.llm | StrOutputParser()
        # 存储对话历史(在实际应用中应该使用数据库)
        self.conversations = {}  # 格式: {session_id: [messages]}

    def _get_or_create_history(self, session_id: str):
        """获取或创建对话历史"""
        if session_id not in self.conversations:
            self.conversations[session_id] = []
        return self.conversations[session_id]

    def generate_welcome_message_stream(self, input_text: str = "", session_id: str = "default"):
        # 获取当前会话的历史记录
        chat_history = self._get_or_create_history(session_id)

        async def generate_chunks():
            buffer = ""
            think_closed = False
            full_response = ""
            separator_shown = False  # 标记是否已显示分隔线

            # 转换历史消息
            langchain_messages = [
                HumanMessage(content=msg["content"]) if msg["role"] == "user"
                else AIMessage(content=msg["content"])
                for msg in chat_history
            ]

            # 添加用户新消息
            chat_history.append({"role": "user", "content": input_text})

            async for chunk in self.chain.astream({
                "input": input_text,
                "chat_history": langchain_messages
            }):
                full_response += chunk
                buffer += chunk

                # 处理思考块
                if not think_closed and "</think>" in buffer:
                    think_closed = True
                    think_part, response_part = buffer.split("</think>", 1)
                    # 流式输出思考内容
                    for char in think_part:
                        yield char
                        await asyncio.sleep(0.01)
                    # 添加醒目的分割线
                    yield "\n━━━━━━━━━━━━━━━━━━━━\n\n"  # 使用Unicode BOX DRAWINGS字符

                    buffer = response_part.lstrip()
                    separator_shown = True

                # 输出正文部分
                if separator_shown:
                    for char in buffer:
                        if char not in ("\n", "\r"):
                            yield char
                        await asyncio.sleep(0.01)
                    buffer = ""

            # 保存完整记录(包含思考部分和分割线)
            if think_closed:
                chat_history.append({
                    "role": "assistant",
                    "content": full_response  # 包含原始<think>内容和分割线
                })
        return generate_chunks()
相关推荐
小贺儿开发13 分钟前
Unity3D 心理沙盘互动演示
unity·ai·pdf·人机交互·工具·互动·心理沙盘
桃酥40320 分钟前
GPU架构 - 零基础入门
ai·gpu
前端摸鱼匠2 小时前
YOLOv11 在零售领域实战:利用公开的商品检测数据集 (如 SKU110K 的子集),训练一个 YOLOv11 模型,用于识别货架上的各种商品
人工智能·yolo·目标检测·ai·目标跟踪·视觉检测·零售
imbackneverdie2 小时前
分享一些高级感科研绘图配色
图像处理·人工智能·ai·aigc·ai绘画·贴图·科研绘图
linux_map2 小时前
大模型微调实战指南
人工智能·python·ai·策略模式
丁劲犇2 小时前
改造传统Qt6Widgets程序为多会话MCPServer生产力工具-技巧与实现
qt·ai·agent·并发·mcp·mcpserver·widgets
数据知道2 小时前
claw-code 源码分析:爆款开源之后——Star 曲线与长期维护之间,工程上该建立哪些「反幻觉」机制?
ai·开源·claude code·claw code
yuhulkjv3352 小时前
ChatGPT Gemini Claude Grok导出的Excel公式失效
人工智能·ai·chatgpt·excel·豆包·deepseek·ai导出鸭
ofoxcoding3 小时前
Claude 做 AI Agent 实战教程:从零搭建一个能自主执行任务的智能体(2026)
人工智能·ai
CoderJia程序员甲3 小时前
GitHub 热榜项目 - 日榜(2026-04-11)
人工智能·ai·大模型·github·ai教程