前言

上上文章介绍了LangChain的概念与其模块组成——一文助你了解Langchain,本篇文章基于上上篇文章的基本概念,来实际开发一下,基于LacngChain搭建一个Agent

项目

项目介绍

本项目包含3大模块:

  • Agent 和工具调用:演示如何创建能够使用工具的智能 Agent
  • 文档处理和向量存储:展示如何加载、处理文档并构建向量数据库
  • 检索增强生成(RAG:实现基于文档的智能问答系统

项目结构

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 包管理器

搭建步骤

1. 创建项目目录

首先,创建项目目录并进入:

mkdir LangChainDemo2
cd LangChainDemo2

2. 创建虚拟环境(推荐)

使用虚拟环境可以隔离项目依赖,避免与其他项目冲突:

# 创建虚拟环境
python -m venv venv

# 激活虚拟环境
# macOS/Linux:
source venv/bin/activate
# Windows:
# venvScriptsactivate

3. 安装项目依赖

项目依赖已定义在 requirements.txt 文件中,包含以下主要包:

  • langchain:LangChain 核心框架
  • langchain-community:社区贡献的组件
  • langchain-openai:OpenAI 兼容的模型接口
  • langchain-core:LangChain 核心功能
  • python-dotenv:环境变量管理
  • chromadb:向量数据库
  • dashscope:阿里云 DashScope API(用于嵌入模型)

安装依赖:

pip install -r requirements.txt

4. 配置环境变量

在项目根目录创建 .env 文件,配置 API 密钥:

# 阿里云 DashScope API Key
DASHSCOPE_API_KEY=your_api_key_here

获取 API Key 的方法:

  1. 访问 阿里云 DashScope 控制台
  2. 注册/登录账号
  3. 创建 API Key
  4. 将 API Key 复制到 .env 文件中

5. 创建项目目录结构

创建必要的目录:

# 创建文档目录
mkdir documents

# 创建工具目录
mkdir tools

6. 创建工具模块

6.1 创建 tools/__init__.py
# tools/__init__.py
# 工具模块初始化文件
6.2 创建 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)}"
6.3 创建 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")

7. 创建主程序文件

7.1 创建 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()
7.2 创建 document_vector_demo.py(文档处理和 RAG 演示)

该文件包含文档处理、向量存储和 RAG 的完整实现,代码较长,请参考项目中的 document_vector_demo.py 文件。

8. 创建示例文档(可选)

项目会自动创建示例文档,但您也可以手动创建:

documents/langchain_intro.txt
LangChain 简介

LangChain 是一个用于构建 LLM 应用的框架。

核心概念:
1. Chains(链):将多个组件连接起来
2. Agents(代理):能够自主决策和执行任务
3. Memory(记忆):维护对话历史
4. Tools(工具):扩展 LLM 的能力
5. Document Processing(文档处理):加载和预处理文档
6. Vector Stores(向量存储):存储和检索文档向量

主要功能:
- 文档加载和预处理
- 向量数据库集成
- 检索增强生成(RAG)
- 工具调用和 Agent 构建

使用场景:
- 构建智能问答系统
- 文档检索和分析
- 自动化任务处理
- 知识库构建
documents/python_basics.txt
Python 基础语法

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 开发、数据科学、人工智能等领域

运行项目

运行 Agent 演示

python main.py

运行后,您可以与 Agent 进行交互,例如:

  • "计算 123 加 456"
  • "现在几点了?"
  • "先计算 10 加 20,然后告诉我现在的时间"

运行文档处理和 RAG 演示

python document_vector_demo.py

该程序会:

  1. 自动创建示例文档
  2. 加载并分割文档
  3. 创建向量数据库
  4. 演示相似度搜索
  5. 演示 RAG 问答

核心功能说明

1. Agent 和工具调用

  • LLM 模型:使用阿里云 DashScope 的 qwen-plus 模型
  • 工具系统:通过 @tool 装饰器定义工具,Agent 可以自动调用
  • 记忆模块:使用 ConversationBufferMemory 维护对话历史
  • ReAct Agent:使用 ReAct 模式,让 Agent 能够思考、行动和观察

2. 文档处理

  • 文档加载:使用 TextLoader 加载文本文件
  • 文本分割:使用 RecursiveCharacterTextSplitter 将长文档分割成小块
  • 参数配置
    • chunk_size=200:每个片段的最大字符数
    • chunk_overlap=50:片段之间的重叠字符数

3. 向量存储

  • 向量数据库:使用 ChromaDB 存储文档向量
  • 嵌入模型:使用阿里云 DashScope 的 text-embedding-v2 模型
  • 持久化存储:向量数据库会保存到 chroma_db_langchain/ 目录

4. RAG(检索增强生成)

  • 检索器:从向量数据库中检索相关文档片段
  • 上下文构建:将检索到的文档片段组合成上下文
  • 提示模板:自定义提示词,指导 LLM 基于上下文回答问题

常见问题

1. API Key 配置错误

问题:提示 "DASHSCOPE_API_KEY 环境变量未设置"

解决

  • 检查 .env 文件是否存在
  • 确认 API Key 配置正确
  • 确保 .env 文件在项目根目录

2. 依赖安装失败

问题pip install 失败

解决

  • 确保 Python 版本 >= 3.8
  • 尝试升级 pip:pip install --upgrade pip
  • 使用国内镜像源:pip install -r requirements.txt -i

3. 向量数据库创建失败

问题:ChromaDB 初始化错误

解决

  • 确保有写入权限
  • 删除旧的 chroma_db_langchain/ 目录后重新运行

扩展建议

  1. 添加更多工具:在 tools/ 目录下创建新的工具模块
  2. 支持更多文档格式:添加 PDF、Word 等文档加载器
  3. 优化 RAG 提示词:根据实际需求调整提示模板
  4. 添加 Web 界面:使用 Streamlit 或 Gradio 创建交互界面
  5. 集成更多向量数据库:尝试 FAISS、Pinecone 等

总结

通过本项目的搭建,您可以学习到:

  • LangChain 框架的基本使用
  • Agent 和工具系统的构建
  • 文档处理和向量存储的实现
  • RAG 系统的搭建
  • 与 LLM API 的集成

希望这个项目能帮助您更好地理解和应用 LangChain 框架!

本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:alixiixcom@163.com