第一种
# 对话模型
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 -
最后修改:2025年11月30日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://blog.grover.top/2025/10/27/%e5%a4%a7%e6%a8%a1%e5%9e%8b%e8%b0%83%e7%94%a8%e7%a4%ba%e4%be%8b/
共有 0 条评论