大模型调用示例

Ryder 2025-10-27 32 10/27
第一种
# 对话模型
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_ollama import ChatOllama

# 设置本地模型,不使用深度思考
model = ChatOllama(base_url="http://localhost:11434", model="qwen2.5:14b", reasoning=False)
# 构建消息列表
messages = [SystemMessage(content="你叫小亮,是一个乐于助人的人工助手"),
            HumanMessage(content="你是谁")
            ]
# 调用大模型
response = model.invoke(messages)
# 打印结果
print(response.content)
print(type(response))

第二种

# 流式输出
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_ollama import ChatOllama

# 设置本地模型,不使用深度思考
model = ChatOllama(base_url="http://localhost:11434", model="qwen2.5:14b", reasoning=False)
messages = [SystemMessage(content="你是一个乐于助人超级活泼的助手!"),
            HumanMessage(content="你是谁?")]
# 流式调用大模型
response = model.stream(messages)

for chunk in response:
    print(chunk.content, end="", flush=True)

# 打印结果
print("\n")
print(type(response))

第三种

# 批量调用
from langchain_ollama import ChatOllama

# 设置本地模型,不使用深度思考
model = ChatOllama(base_url="http://localhost:11434", model="qwen2.5:14b", reasoning=False)
# 问题列表
questions = [
    "什么是LangChain?",
    "Python的生成器是做什么的?",
    "解释一下Docker和Kubernetes的关系"
]
# 批量调用大模型
response = model.batch(questions)
for q, r in zip(questions, response):
    print(f"问题:{q}\n回答:{r}\n")

第四种

import asyncio
from langchain_ollama import ChatOllama

# 设置本地模型,不使用深度思考
model = ChatOllama(base_url="http://localhost:11434", model="qwen2.5:14b", reasoning=False)


async def main():
    # 异步调用一条请求
    response = await model.ainvoke("解释一下大模型LangChain是什么")
    print(response)


# 运行异步程序的入口点
asyncio.run(main())

聊天机器人案例

项目描述

基于 LangChain 1.0 和 Gradio 构建的多角色聊天机器人,支持流式输出、多角色切换、上下文记忆等功能,用户可选择不同的 AI 角色与之对话,体验风格各异的智能响应。

我们主要理解 LangChain 相关代码即可,在实际工作中 Gradio 代码通常都是 AI 生成,我们无需花费太多精力研究。

实现功能

  • 多角色支持(如通用助手、英语老师、段子手等)
  • 每个角色拥有独立对话上下文(Memory 隔离)
  • 支持流式输出回答,提高响应体验
  • 用户界面美观简洁(Gradio 实现)
  • 支持提示词模板自定义(PromptTemplate)
  • 会话历史记忆与追溯(使用 Memory 模块)
from langchain_core.runnables import RunnableConfig
from langchain_ollama import ChatOllama
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import RedisChatMessageHistory
import gradio as gr

# 定义不同角色的系统提示语
ROLES = {
    "通用助手": "你是无所不知的 AI 助手。",
    "段子手": "你是脱口秀演员,回答必须带 1 个梗。",
    "英语老师": "你是耐心英语老师,先用英文回答,再给中文翻译。",
    "代码审查员": "你是严格的代码审查员,指出代码问题并给出改进建议。",
}

# 初始化大语言模型实例
llm = ChatOllama(model="qwen3:8b", reasoning=False)


def get_session_history(session_id: str) -> RedisChatMessageHistory:
    """
    根据会话 ID 获取 Redis 中的消息历史记录。

    参数:
        session_id (str): 会话唯一标识符。

    返回:
        RedisChatMessageHistory: 与该会话关联的聊天历史对象。
    """
    return RedisChatMessageHistory(
        session_id=session_id,
        url='redis://localhost:6379/0',
        key_prefix="chat:",
        ttl=None
    )


def build_chain(role: str):
    """
    构建一个包含系统提示和用户输入的处理链。

    参数:
        role (str): 当前使用的角色名称。

    返回:
        Chain: 包含提示模板和语言模型的可执行链。
    """
    system = ROLES[role]
    prompt = ChatPromptTemplate.from_messages([
        ("system", system),
        MessagesPlaceholder(variable_name="history"),
        ("human", "{question}")
    ])

    return prompt | llm


def chat_fn(message, history, role):
    """
    处理用户的聊天消息,并流式返回响应结果。

    参数:
        message (str): 用户发送的消息内容。
        history (list): 当前对话的历史记录。
        role (str): 当前使用的角色名称。

    生成:
        tuple: 更新后的聊天记录和清空输入框的内容。
    """
    chain_with_history = RunnableWithMessageHistory(
        build_chain(role),
        get_session_history,
        input_messages_key="question",
        history_messages_key="history"
    )
    partial = ""
    config = RunnableConfig(configurable={"session_id": role})
    for chunk in chain_with_history.stream({"question": message}, config):
        partial += chunk.content
        yield history + [
            {"role": "user", "content": message},
            {"role": "assistant", "content": partial}
        ], ""


def switch_role(new_role):
    """
    切换当前角色,并更新显示信息及清空聊天记录。

    参数:
        new_role (str): 新的角色名称。

    返回:
        tuple: 更新后的角色显示文本、清空聊天记录和新的角色状态。
    """
    return f"**当前角色:{new_role}**", [], new_role


# 使用 Gradio 构建 Web 界面
with gr.Blocks(title="多角色聊天") as demo:
    # 初始化当前角色状态为“通用助手”
    current_role_state = gr.State("通用助手")

    # 页面布局:左侧角色选择区,右侧聊天区域
    with gr.Row():
        # 创建角色选择界面列
        # 该代码块负责构建角色选择的UI界面,包括角色标题显示、当前角色状态显示和角色选择按钮
        with gr.Column(scale=1):
            gr.Markdown("### 选择角色")
            current_role_display = gr.Markdown("**当前角色:通用助手**")
            role_buttons = [gr.Button(role, variant="secondary") for role in ROLES.keys()]

        # 创建聊天界面的主区域布局
        # 该区域包含聊天显示区、消息输入框和发送按钮
        with gr.Column(scale=4, elem_classes=["chat-area"]):
            # 聊天机器人组件,用于显示对话历史
            chatbot = gr.Chatbot(label="聊天区", height='70vh', type="messages")
            # 文本输入框组件,用于用户输入消息
            msg = gr.Textbox(label="输入你的消息", placeholder="请输入...", scale=10)

            # 发送按钮组件,用于提交用户输入的消息
            send_btn = gr.Button("发送", variant="primary")

    # 绑定发送按钮点击事件
    send_btn.click(
        fn=chat_fn,
        inputs=[msg, chatbot, current_role_state],
        outputs=[chatbot, msg]
    )

    # 绑定每个角色按钮的点击事件
    for btn in role_buttons:
        btn.click(
            fn=lambda r=btn.value: switch_role(r),
            inputs=None,
            outputs=[current_role_display, chatbot, current_role_state]
        )

# 启动 Gradio 应用
if __name__ == "__main__":
    demo.launch()

大模型调用示例大模型调用示例

- THE END -

Ryder

11月30日19:19

最后修改:2025年11月30日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论