Langchain相关知识:概念、调用LLM、提示模板、程序部署、Tavily搜索工具、代理Agent

一、Langchain相关概念

1.1 Langchain基本概念

Langchain官网
Langchain是一个开源框架,它允许开发人员将像GPT-4这样的大语言模型与外部的计算和数据源结合起来。
LangChain是一个用于开发由语言模型驱动的应用程序的框架。
LangChain核心组件:Compents组件、Chains链、Agents代理。
模块Components:代理Agents、链Chains、索引Indexes、内存Memory、模型Models、提示Prompt、模式Schema。

1.2 Langchain核心

LangChain 主要由以下六个核心组件组成:

  1. 模型输入/输出(Model I/O)
    与语言模型交互的接口,负责处理输入和输出数据。
  2. 数据连接(Data Connection)
    与特定应用程序的数据进行交互的接口,确保数据流的顺畅。
  3. 链(Chains)
    将各个组件组合实现端到端应用。例如,检索问答链可以完成检索和回答的任务。
  4. 记忆(Memory)
    用于链的多次运行之间持久化应用程序状态,确保上下文的连贯性。
  5. 代理(Agents)
    扩展模型的推理能力,执行复杂任务和流程的关键组件。代理可以集成外部信息源或 API,增强功能。
  6. 回调(Callbacks)
    用于扩展模型的推理能力,支持复杂应用的调用序列。

1.3 Langchain底层原理

  1. 从用户提出的问题(Question)开始,然后通过相似性搜索(Similarity Search)在一个大型数据库或向量空间中找到与之相关的信息。
  2. 得到的信息与原始问题结合后,由一个处理模型分析,以产生一个答案(Answer)。
  3. 这个答案接着被用来指导一个代理采取行动(Action),这个代理可能会执行一个API调用或与外部系统交互以完成任务。

二、调用LLM

// 使用langchain调用GLM
// 指定base_url和model来调用其他模型
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
// 第一步: 创建模型
model = ChatOpenAI(
    model='glm-4-0520',  // 模型名字在官网看,换模型就在这个代码里更改即可
    temperature=0.6,
    api_key='自己的api_key',  # GLM里面的API_KEY
    base_url='https://open.bigmodel.cn/api/paas/v4/'
)
// 第二步: 准备prompt
msg = [
    SystemMessage(content='请将以下的内容翻译为英语'),
    HumanMessage(content='你好,请问你要去哪里?')
]
// 第三步: 创建返回数据的解析器
// 简单的解析响应数据
parser = StrOutputParser()
// 第四步: 得到链chain
chain = model | parser # 链就是把各个组件连起来, 模型组件|解析器组件
// 第五步: 直接使用chain来调用
print(chain.invoke(msg))

在这里插入图片描述

三、提示模板

在上面调用GLM的例子中,直接将问题写入了提示模板中:

msg = [
    SystemMessage(content='请将以下的内容翻译为英语'),
    HumanMessage(content='你好,请问你要去哪里?')
]

这样显然不符合实际使用习惯,因此将重要信息以参数的形式写在提示模板中,在调用时传入参数即可:

prompt_template = ChatPromptTemplate.from_messages([
    ('system', '请将下面的内容翻译成{language}'),  # language是参数,可以定义与修改
    ('user', "{text}")
])
chain = prompt_template | model | parser
print(chain.invoke({'language': 'English', 'text': '你好,请问你要去哪里?'}))

四、Langchain程序部署

把我们的Langchain程序部署成服务,让别人的程序、API可以调用我们的程序。

// 让别人的程序、API调用我的程序
// 把我们的程序部署成服务
// 1.创建fastAPI的应用
app = FastAPI(title='我的LangChain服务', version='v1.0', description='使用LangChain进行翻译')
// 2.添加路由, 启动
add_routes(
    app,
    chain,
    path='/LangchainDemo/LangChain', # 请求路径
)
if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app, host='localhost', port=8000)

部署成功时运行结果如下:
在这里插入图片描述
此时Langchain服务已经部署,可以使用apipost来调用, 也可以使用python代码调用。

  1. apipost
    在apipost传入程序地址与参数:
    在这里插入图片描述
    点击发送,若没有问题则会显示回答结果:
    在这里插入图片描述
  2. 使用python代码调用
    新建一个client.py,调用Langchain程序服务。
// 使用python代码调用langchain服务
from langserve import RemoteRunnable

if __name__ == '__main__':
    client = RemoteRunnable('http://127.0.0.1:8000/LangchainDemo/LangChain/')
    print(client.invoke({'language': 'English', 'text': '你好,请问你要去哪里?'}))

运行结果:
在这里插入图片描述

五、Tavily搜索工具

有的问题大语言模型无法进行回答,比如某地今天的天气怎么样,此时可以使用Langchain内置的Tavily搜索工具解决:

// 没有任何代理
result = model.invoke([HumanMessage(content='北京天气怎么样?')])
print(f'没有任何代理: {result}')

// langchain内置一个工具, 可以轻松地使用Tavily搜索引擎作为工具
search= TavilySearchResults(max_results=1)   // 表示只返回1个结果
print(f'使用Tavily搜索引擎: {search.invoke('北京天气怎么样?')}')

运行结果如下
在这里插入图片描述
模型可以自动推理,是否需要调用工具去完成用户的答案,这里我们分别问模型一个不需要搜索的问题和一个需要搜索的问题,并将工具返回的内容也进行输出:

search= TavilySearchResults(max_results=1)   // 表示只返回1个结果
tools = [search]
model_with_tools = model.bind_tools(tools)  // 让模型绑定工具

resp = model_with_tools.invoke([HumanMessage(content='中国的首都是哪个城市?')])
print(f'Model_Result_Content: {resp.content}')     // 模型返回的内容
print(f'Tools_Result_Content: {resp.tool_calls}')  // 工具返回的内容

resp = model_with_tools.invoke([HumanMessage(content='今天杭州天气怎么样?')])
print(f'Model_Result_Content: {resp.content}')
print(f'Tools_Result_Content: {resp.tool_calls}')

运行结果如下:
在这里插入图片描述
很明显,第一个问题不需要搜索,模型直接回答,而搜索结果为空,第二个问题需要搜索,模型没有直接回答,返回了搜索结果,因此模型可以自动推理是否需要调用工具去完成用户的答案

六、代理Agent

创建Agent,模型会根据问题决定是否使用Agent来调用Tavily搜索工具。

// 构建代理
// 需要代理: question -> LLM -> answer
// 不需要代理: question -> LLM -> 代理 -> LLM -> answer
import os
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import chat_agent_executor

os.environ["TAVILY_API_KEY"] = 'tavily的api_key'  // tavily的api_key

model = ChatOpenAI(
    model='glm-4-0520',
    temperature=0.6,
    api_key='自己的api_key',  // GLM里面的API_KEY
    base_url='https://open.bigmodel.cn/api/paas/v4/'
)

search= TavilySearchResults(max_results=1)
tools = [search]
// 创建代理:工具调用器
agent_executor = chat_agent_executor.create_tool_calling_executor(model, tools)  

resp1 = agent_executor.invoke({'messages': [HumanMessage(content='中国的首都是哪个城市?')]})
print(resp1['messages'])  // 返回HumanMessage、AIMessage
resp2 = agent_executor.invoke({'messages': [HumanMessage(content='今天杭州天气怎么样?')]})
print(resp2['messages'])  // 返回HumanMessage、AIMessage、ToolMessage

print(resp2['messages'][2].content)  // 只获取ToolMessage中的content

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值