Langchain
一、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 主要由以下六个核心组件组成:
- 模型输入/输出(Model I/O)
与语言模型交互的接口,负责处理输入和输出数据。 - 数据连接(Data Connection)
与特定应用程序的数据进行交互的接口,确保数据流的顺畅。 - 链(Chains)
将各个组件组合实现端到端应用。例如,检索问答链可以完成检索和回答的任务。 - 记忆(Memory)
用于链的多次运行之间持久化应用程序状态,确保上下文的连贯性。 - 代理(Agents)
扩展模型的推理能力,执行复杂任务和流程的关键组件。代理可以集成外部信息源或 API,增强功能。 - 回调(Callbacks)
用于扩展模型的推理能力,支持复杂应用的调用序列。
1.3 Langchain底层原理
- 从用户提出的问题(Question)开始,然后通过相似性搜索(Similarity Search)在一个大型数据库或向量空间中找到与之相关的信息。
- 得到的信息与原始问题结合后,由一个处理模型分析,以产生一个答案(Answer)。
- 这个答案接着被用来指导一个代理采取行动(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代码调用。
- apipost
在apipost传入程序地址与参数:
点击发送,若没有问题则会显示回答结果:
- 使用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