星云点击:星空遥控器
120.47M · 2026-02-04
上上文章介绍了LangChain的概念与其模块组成——一文助你了解Langchain,本篇文章基于上上篇文章的基本概念,来实际开发一下,基于LacngChain搭建一个Agent
本项目包含3大模块:
Agent 和工具调用:演示如何创建能够使用工具的智能 AgentRAG):实现基于文档的智能问答系统LangChainDemo2/
├── main.py # Agent 演示主程序
├── document_vector_demo.py # 文档处理和 RAG 演示
├── requirements.txt # 项目依赖
├── .env # 环境变量配置(需自行创建)
├── documents/ # 文档存储目录
│ ├── langchain_intro.txt
│ └── python_basics.txt
├── tools/ # 工具模块
│ ├── __init__.py
│ ├── math_tools.py # 数学工具
│ └── time_tools.py # 时间工具
└── chroma_db_langchain/ # 向量数据库存储目录(自动生成)
Python 3.8 或更高版本pip 包管理器首先,创建项目目录并进入:
mkdir LangChainDemo2
cd LangChainDemo2
使用虚拟环境可以隔离项目依赖,避免与其他项目冲突:
# 创建虚拟环境
python -m venv venv
# 激活虚拟环境
# macOS/Linux:
source venv/bin/activate
# Windows:
# venvScriptsactivate
项目依赖已定义在 requirements.txt 文件中,包含以下主要包:
langchain:LangChain 核心框架langchain-community:社区贡献的组件langchain-openai:OpenAI 兼容的模型接口langchain-core:LangChain 核心功能python-dotenv:环境变量管理chromadb:向量数据库dashscope:阿里云 DashScope API(用于嵌入模型)安装依赖:
pip install -r requirements.txt
在项目根目录创建 .env 文件,配置 API 密钥:
# 阿里云 DashScope API Key
DASHSCOPE_API_KEY=your_api_key_here
获取 API Key 的方法:
.env 文件中创建必要的目录:
# 创建文档目录
mkdir documents
# 创建工具目录
mkdir tools
tools/__init__.py# tools/__init__.py
# 工具模块初始化文件
tools/math_tools.py"""
数学工具模块
用于执行数学运算
"""
from langchain.tools import tool
@tool
def add(a: int, b: int) -> int:
"""
计算两个整数的和。
Agent 会在需要进行加法运算时自动调用此工具。
Args:
a: 第一个整数
b: 第二个整数
Returns:
两个整数的和
"""
try:
# 处理字符串类型的输入(Agent 可能传递字符串格式的数字)
a = int(a) if isinstance(a, str) else a
b = int(b) if isinstance(b, str) else b
return a + b
except (ValueError, TypeError) as e:
return f"计算时发生错误: 无法将输入转换为整数 - {str(e)}"
except Exception as e:
return f"计算时发生错误: {str(e)}"
tools/time_tools.py"""
时间工具模块
用于获取当前日期和时间
"""
from datetime import datetime
from langchain.tools import tool
@tool
def get_current_time() -> str:
"""
获取当前时间。
Agent 会在需要获取当前时间时自动调用此工具。
Returns:
当前时间(格式为 HH:MM:SS)
"""
return datetime.now().strftime("%H:%M:%S")
main.py(Agent 演示)import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain.prompts import PromptTemplate
from langchain.memory import ConversationBufferMemory
from tools.math_tools import add
from tools.time_tools import get_current_time
# 加载环境变量
load_dotenv()
def create_llm(): # 创建 LLM 模型实例
api_key = os.getenv("DASHSCOPE_API_KEY") # 从环境变量中获取 API 密钥
if not api_key: # 如果 API 密钥未设置,则抛出错误
raise ValueError("DASHSCOPE_API_KEY 环境变量未设置")
llm = ChatOpenAI(
model="qwen-plus",
api_key=api_key,
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1", # 阿里云 DashScope API 的兼容模式 URL
temperature=0.7, # 用于控制生成文本的随机性
)
return llm
def create_tools(): # 创建工具列表
tools = [add, get_current_time]
return tools
def create_memory(): # 创建记忆模块
memory = ConversationBufferMemory(
memory_key="chat_history", # 在 prompt 中使用的变量名
return_messages=False, # 返回字符串格式,适合字符串模板
)
return memory
def create_agent_executor(llm, tools, memory): # 创建Agent执行器
prompt_template = """你是一个友好的 AI 助手。你可以使用工具来回答问题。
你可以使用的工具:
{tools}
使用以下格式:
Question: 需要回答的问题
Thought: 你应该思考要做什么
Action: 要采取的行动,应该是 [{tool_names}] 中的一个
Action Input: 行动的输入
Observation: 行动的结果
... (这个 Thought/Action/Action Input/Observation 可以重复 N 次)
Thought: 我现在知道最终答案了
Final Answer: 对原始问题的最终答案
{chat_history}
Question: {input}
Thought: {agent_scratchpad}"""
prompt = PromptTemplate.from_template(prompt_template) # 创建提示模板
agent = create_react_agent(llm=llm, tools=tools, prompt=prompt) # 创建Agent
agent_executor = AgentExecutor(
agent=agent, # Agent实例
tools=tools, # 工具列表
memory=memory, # 记忆模块
verbose=True, # 是否打印详细信息
handle_parsing_errors=True, # 处理解析错误
max_iterations=5, # 最大迭代次数
)
return agent_executor
# 创建主函数
def main():
try:
llm = create_llm() # 创建 LLM 模型实例
tools = create_tools() # 创建工具列表
memory = create_memory() # 创建记忆模块
agent_executor = create_agent_executor(llm, tools, memory) # 创建Agent执行器
while True: # 循环输入问题
prompt = input("请输入问题:")
if prompt.lower() in ["exit", "quit", "退出"]:
print("n再见!")
break
if not prompt.strip():
continue
response = agent_executor.invoke({"input": prompt}) # 执行Agent
print(response["output"]) # 打印响应
except ValueError as e: # 如果创建 LLM 模型实例失败,则抛出错误
print(f"创建 LLM 模型实例失败: {e}")
return
if __name__ == "__main__":
main()
document_vector_demo.py(文档处理和 RAG 演示)该文件包含文档处理、向量存储和 RAG 的完整实现,代码较长,请参考项目中的 document_vector_demo.py 文件。
项目会自动创建示例文档,但您也可以手动创建:
documents/langchain_intro.txtLangChain 简介
LangChain 是一个用于构建 LLM 应用的框架。
核心概念:
1. Chains(链):将多个组件连接起来
2. Agents(代理):能够自主决策和执行任务
3. Memory(记忆):维护对话历史
4. Tools(工具):扩展 LLM 的能力
5. Document Processing(文档处理):加载和预处理文档
6. Vector Stores(向量存储):存储和检索文档向量
主要功能:
- 文档加载和预处理
- 向量数据库集成
- 检索增强生成(RAG)
- 工具调用和 Agent 构建
使用场景:
- 构建智能问答系统
- 文档检索和分析
- 自动化任务处理
- 知识库构建
documents/python_basics.txtPython 基础语法
Python 是一种高级编程语言,具有简洁明了的语法。
变量和数据类型:
- 整数:x = 10
- 浮点数:y = 3.14
- 字符串:name = "Python"
- 列表:numbers = [1, 2, 3]
控制流:
- if/else 语句用于条件判断
- for 循环用于遍历序列
- while 循环用于重复执行
函数定义:
def greet(name):
return f"Hello, {name}!"
Python 的特点:
- 语法简洁,易于学习
- 丰富的标准库和第三方库
- 跨平台支持
- 广泛用于 Web 开发、数据科学、人工智能等领域
python main.py
运行后,您可以与 Agent 进行交互,例如:
python document_vector_demo.py
该程序会:
@tool 装饰器定义工具,Agent 可以自动调用ConversationBufferMemory 维护对话历史TextLoader 加载文本文件RecursiveCharacterTextSplitter 将长文档分割成小块chunk_size=200:每个片段的最大字符数chunk_overlap=50:片段之间的重叠字符数chroma_db_langchain/ 目录问题:提示 "DASHSCOPE_API_KEY 环境变量未设置"
解决:
.env 文件是否存在.env 文件在项目根目录问题:pip install 失败
解决:
pip install --upgrade pippip install -r requirements.txt -i 问题:ChromaDB 初始化错误
解决:
chroma_db_langchain/ 目录后重新运行tools/ 目录下创建新的工具模块通过本项目的搭建,您可以学习到:
希望这个项目能帮助您更好地理解和应用 LangChain 框架!