第2章:LangChain大模型工具开发(Agent工具能力)

LangChain_openai实例化大模型

首先我们需要安装LangChain_openai环境

复制代码
uv add langchain_openai 

from langchain_openai import ChatOpenAI
import os

llm=ChatOpenAI(
    model="qwen-max",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    stream = True,
)

print(llm)

提示词模版

复制代码
llm=ChatOpenAI(
    model="qwen-max",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    stream=True,
)

for chunk in llm.stream("你是谁?"):
    print(chunk.content, end="", flush=True)

字符串提示词模版PromptTemplate

适用场景:

  • 用于文本补全模型,输入是纯文本(单字符串);
  • 适用于简单的任务,列如生成一段文本,回答问题或者执行命令。

特点:

  • 输入变量插值:通过{}占位符动态替换变量;
  • 模版格式:支持f-string
  • 输出形式:生成一个完整的字符串作为模型输入。

案例:

复制代码
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
import os

llm=ChatOpenAI(
    model="qwen-max",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

template = PromptTemplate.from_template("今天是{something}")

prompt = template.format(something="晴天")

print(prompt)

聊天提示词模版(ChatPromptTemplate)

复制代码
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
import os

llm=ChatOpenAI(
    model="qwen-max",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

template = ChatPromptTemplate.from_messages([
    ("system", "你是一位{role}专家,擅长回答{domain}领域的问题,简短回答.50个字"),
    ("user", "用户提问{question},请给出一个回答"),
]
)

prompt = template.format_messages(
    role = "编程专家",
    domain = "编程",
    question = "如何使用langchain进行编程"
)

print(prompt)

print(llm.invoke( prompt).content)

消息体的抽象和复用

ChatMessagePromptTemplate可以结合ChatPromptTemplate使用,同时对提示词模版和消息体进行抽象和复用

复制代码
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate,SystemMessagePromptTemplate
import os

llm=ChatOpenAI(
    model="qwen-max",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

system_message = SystemMessagePromptTemplate.from_template(
   template =  "你是一位{role}专家,擅长回答{domain}领域问题,请给出一个回答.50个字以内",
    role = "system"
)
user_message = SystemMessagePromptTemplate.from_template(
    template =  "用户提问{question},请给出一个回答",
    role = "user"
)

template = ChatPromptTemplate.from_messages([
    system_message,
    user_message
]
)


prompt = template.format_messages(
    role = "编程专家",
    domain = "编程",
    question = "如何使用langchain进行编程"
)

print(prompt)

print(llm.invoke( prompt).content)

少样本提示词模版(FewShotPromptTemplate)

使用场景:

  • 用于,在提示中包含示例,帮助模型理解任务;
  • 适用于复杂任务(如翻译,分类,推理),需要通过示例引导模型行为。

特点:

  • 示例嵌入:通过examples参数提供示例输出和输入;

  • 动态示例选择:支持ExampleSelector动态选择最相关的示例;

  • 模版格式:通过包含前缀(Prefix),示例(Examples)和后缀(Suffix)。

    from langchain_openai import ChatOpenAI
    from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, FewShotPromptTemplate,
    PromptTemplate
    import os

    llm=ChatOpenAI(
    model="qwen-max",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    )

    example = [
    {
    "input": "good night",
    "output": "晚上好"
    },
    {
    "input": "good morning",
    "output": "早上好"
    }
    ]
    example_template = "输入:{input}\n 输出:{output}"

    shot_prompt = FewShotPromptTemplate(
    examples=example,
    example_prompt=PromptTemplate.from_template(example_template),
    prefix = "请将输入的英文翻译成中文",
    suffix = "输入:{text}\n输出:",
    input_variables = ["text"],
    )

    prompts = shot_prompt.format(text="Thank")
    print(llm.invoke(prompts).content)

总结对比

常见模版类特性和使用场景对比

|-----------------------|--------|---------|----------------|
| 子类 | 使用模版类型 | 输入类型 | 主要用途 |
| PromptTemplate | 文本补全模型 | 单字符串 | 生成单轮文本任务的提示 |
| ChatPromptTemplate | 聊天模型 | 多消息列表 | 模拟多轮对话或者角色扮演 |
| FewShotPromptTemplate | 所以模型 | 包含示例的模版 | 通过示例引导模型完成复杂任务 |

链式调用大模型

我们可以使用管道符: |进行链式调用大模型

复制代码
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, FewShotPromptTemplate, \
    PromptTemplate
import os

llm=ChatOpenAI(
    model="qwen-max",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

example = [
    {
        "input": "good night",
        "output": "晚上好"
    },
    {
        "input": "good morning",
        "output": "早上好"
    }
]
example_template = "输入:{input}\n 输出:{output}"

shot_prompt = FewShotPromptTemplate(
    examples=example,
    example_prompt=PromptTemplate.from_template(example_template),
    prefix = "请将输入的英文翻译成中文",
    suffix = "输入:{text}\n输出:",
    input_variables = ["text"],
)

chain = shot_prompt | llm
res = chain.invoke({"text": "Thank"})
print(res.content)

自定义工具全流程开发

复制代码
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from app.bailian.common import chain, shot_prompt, llm
from langchain_core.tools import Tool
from langchain_core.messages import HumanMessage

def add(a,b):
    return a+b

add_tool = Tool(
    func=add,
    name="add",
    description="add two numbers"
)

llm_with_tools = llm.bind_tools([add_tool])
chain = shot_prompt | llm_with_tools

input_msg = HumanMessage(content="计算1+1的结果")
res = chain.stream(input=[input_msg])

for chunk in res:
    if hasattr(chunk, 'tool_calls') and chunk.tool_calls:
        for tool_call in chunk.tool_calls:
            print(tool_call)
            args = tool_call["args"]
            print(args)
            func = tool_call["name"]
            print(func)
            if func == "add":
                print(f"计算结果:{add(float(args['a']), float(args['b']))}")
相关推荐
zone77395 小时前
001:简单 RAG 入门
后端·python·面试
F_Quant5 小时前
🚀 Python打包踩坑指南:彻底解决 Nuitka --onefile 配置文件丢失与重启报错问题
python·操作系统
允许部分打工人先富起来6 小时前
在node项目中执行python脚本
前端·python·node.js
IVEN_6 小时前
Python OpenCV: RGB三色识别的最佳工程实践
python·opencv
haosend7 小时前
AI时代,传统网络运维人员的转型指南
python·数据网络·网络自动化
曲幽7 小时前
不止于JWT:用FastAPI的Depends实现细粒度权限控制
python·fastapi·web·jwt·rbac·permission·depends·abac
IVEN_1 天前
只会Python皮毛?深入理解这几点,轻松进阶全栈开发
python·全栈
Ray Liang1 天前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
AI攻城狮1 天前
如何给 AI Agent 做"断舍离":OpenClaw Session 自动清理实践
python
千寻girling1 天前
一份不可多得的 《 Python 》语言教程
人工智能·后端·python