本篇使用 LangChain 框架实现几个简单的入门智能体。这里以阿里云百炼的通义千问 API 为例(API 需要付费)。
安装软件包:
pip install langchain langchain-openai
pip install langchain-community
pip install python-dotenv
在文件夹中新建 .env 文件,输入以下内容(API KEY 需要到阿里云百炼获取):
OPENAI_API_KEY=xxx
DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
一、简单对话智能体
在同一个文件夹中,新建 langchain_example.py 文件,内容为:
import langchain_openai
from langchain_core.prompts import ChatPromptTemplate
import dotenv
import os
# 加载环境变量(包含API密钥)
dotenv.load_dotenv()
# 创建聊天模型
llm = langchain_openai.ChatOpenAI(
api_key=os.getenv("OPENAI_API_KEY"), # 从环境变量获取 API 密钥
base_url=os.getenv("DASHSCOPE_BASE_URL"), # 指定 API 端点
model="qwen-plus", # 这里使用通义千问 Plus 模型
temperature=0.7, # 控制回复的随机性(0-1,越高越有创意)
streaming=True, # 启用流式模式
)
# 创建简单的提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个友好的聊天助手。"), # 系统角色设定
("human", "{question}") # 用户输入占位符
])
# 创建处理链
chain = prompt | llm # 使用管道操作符连接组件
# 使用 stream() 实现流式输出
for chunk in chain.stream({"question": "你好"}):
print(chunk.content, end="", flush=True)
print() # 换行
# # 非流式输出
# response = chain.invoke({"question": "你好"})
# print(response.content)
运行结果:
你好呀!✨ 很高兴见到你~今天过得怎么样呀?希望你度过了愉快的一天。我随时准备好陪你聊天、帮你解决 问题,或者就这样轻松愉快地闲聊一会儿。有什么想跟 我分享的吗? 🌟
二、带有记忆的智能体
在同一个文件夹中,新建 langchain_example_with_memory.py 文件,内容为:
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
# 加载 .env 中的 API 密钥等配置
load_dotenv()
# 初始化大模型
llm = ChatOpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("DASHSCOPE_BASE_URL"),
model="qwen-plus",
temperature=0.7
)
# 定义带历史记录的提示模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个乐于助人的助手。"),
MessagesPlaceholder("history"), # 历史消息占位符
("human", "{input}") # 当前用户输入
])
# 创建基础链
chain = prompt | llm
# 内存存储:用字典模拟会话历史(仅用于演示)
store = {}
def get_session_history(session_id: str):
if session_id not in store:
store[session_id] = ChatMessageHistory()
return store[session_id]
# 包装成带记忆的链
chatbot = RunnableWithMessageHistory(
chain,
get_session_history,
input_messages_key="input",
history_messages_key="history",
)
def chat_with_agent(input_message, session_id):
print(f"用户: {input_message}")
print("助手: ", end="", flush=True)
for chunk in chatbot.stream(
{"input": input_message},
config={"configurable": {"session_id": session_id}} # 多轮对话(使用同一个 session_id)
):
print(chunk.content, end="", flush=True)
print("\n\n---\n")
chat_with_agent(input_message='一句话解释下人工智能。', session_id="user_001")
chat_with_agent(input_message='我们都聊了什么?', session_id="user_001")
chat_with_agent(input_message='我们都聊了什么?', session_id="user_002")
chat_with_agent(input_message='我们都聊了什么?', session_id="user_001")
运行结果:
用户: 一句话解释下人工智能。
助手: 人工智能是让机器模拟人类智能行为的技术,比如学习、推理、识别和决策等。
---
用户: 我们都聊了什么?
助手: 我们目前只聊了两个话题:
1. 你让我用一句话解释人工智能,我回答:人工智能是让机器模拟 人类智能行为的技术,比如学习、推理、识别和决策等。
2. 接着你问我“我们都聊了什么?”,我现在正在回答这个问题。
对话内容很简单,仅此而已。
---
用户: 我们都聊了什么?
助手: 你好!我理解你可能想回顾之前的对话,但需要说明的是,我无法记住或查看我们之前的具体聊天内容。每次对话都是独立的,以保护用户的隐私和数据安全。
不过,我很乐意继续和你聊任何你想讨论的话题!你可以告诉我我们之前聊了什么,或者直接开启一个新话题,我会尽力帮助你。😊
我们可以聊聊:
- 你感兴趣的知识或问题
- 生活、工作、学习中的困惑
- 最近的新闻或科技进展
- 或者任何让你好奇的事情
你想聊什么呢?
---
用户: 我们都聊了什么?
助手: 我们目前的对话内容如下:
1. 你让我“一句话解释下人工智能”,我回答:人工智能是让机器模 拟人类智能行为的技术,比如学习、推理、识别和决策等。
2. 你接着问“我们都聊了什么?”,我上一次已经帮你回顾了这段简 短的对话。
现在是你第二次问“我们都聊了什么?”,所以我再次为你总结——目前为止,我们的全部对话就包含这两个问题和我的两次回答。
---
三、使用工具的智能体
在同一个文件夹中,新建 langchain_example_with_tool.py 文件,内容为:
import os
import dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.tools import tool
from langchain.agents import create_openai_tools_agent, AgentExecutor
# 加载环境变量
dotenv.load_dotenv()
# 定义工具(Tool)
@tool
def get_current_time() -> str:
"""获取当前日期和时间"""
from datetime import datetime
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
@tool
def add_numbers(a: float, b: float) -> float:
"""将两个数字相加"""
return a + b
# 注意:你可以添加更多工具,比如天气查询、网络搜索等
tools = [get_current_time, add_numbers]
# 创建 LLM(必须支持 function calling)
llm = ChatOpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
base_url=os.getenv("DASHSCOPE_BASE_URL"),
model="qwen-plus",
temperature=0.7,
streaming=True,
)
# 构建提示模板(LangChain 会自动注入工具信息)
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个智能助手,可以使用工具来回答问题。"),
("human", "{input_message}"),
("placeholder", "{agent_scratchpad}"), # 必须包含这个占位符
])
# 创建 OpenAI 工具型智能体(兼容 function calling)
agent = create_openai_tools_agent(llm, tools, prompt)
# 创建执行器
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True, # 打印中间步骤(可选)
handle_parsing_errors=True,
)
# 非流式调用(AgentExecutor 目前对流式支持有限,尤其在工具调用场景)
response = agent_executor.invoke({"input_message": "现在几点了?然后把 123 和 456 加起来。"})
print('\n---\n')
print(response["output"])
运行结果:
> Entering new AgentExecutor chain...
Invoking: `get_current_time` with `{}`
2025-11-02 04:03:10
Invoking: `add_numbers` with `{'a': 123, 'b': 456}`
579.0现在是2025年11月2日04:03:10,123和456相加的结果是579。
> Finished chain.
---
现在是2025年11月2日04:03:10,123和456相加的结果是579。
【说明:本站主要是个人的一些笔记和代码分享,内容可能会不定期修改。为了使全网显示的始终是最新版本,这里的文章未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com】