什么是LangChain
langchain 是一个框架, 用于连接大语言模型的框架, 它提供了一整套工具、组件和接口,简化上层应用与大语言模型,聊天模型的的过程,可轻松管理与模型的交互,以及跟多组件链接起来。
在 LangChain 中 提供 5 大模块助力于引用的开发
- 模型(models) : LangChain 支持的各种模型类型和模型集成。
- 提示(prompts) : 包括提示管理、提示优化和提示序列化。
- 内存(memory) : 内存是在链/代理调用之间保持状态的概念。LangChain 提供了一个标准的内存接口、一组内存实现及使用内存的链/代理示例。
- 索引(indexes) : 与您自己的文本数据结合使用时,语言模型往往更加强大——此模块涵盖了执行此操作的最佳实践。
- 链(chains) : 链不仅仅是单个 LLM 调用,还包括一系列调用(无论是调用 LLM 还是不同的实用工具)。LangChain 提供了一种标准的链接口、许多与其他工具的集成。LangChain 提供了用于常见应用程序的端到端的链调用。
- 代理(agents) : 代理涉及 LLM 做出行动决策、执行该行动、查看一个观察结果,并重复该过程直到完成。LangChain 提供了一个标准的代理接口,一系列可供选择的代理,以及端到端代理的示例。
以上内容引用于LangChain 🦜️🔗 中文网
使用 LangChain前期准备
前期准备内容
Python 环境 version>=3.0
OPENAI_API_KEY 自行准备,用于体验与语言模型交互
-
安装 LangChain依赖
pip install langchain openai
简单实用示例
构建简单的 LLM 模型
from langchain import OpenAI
llm = OpenAI(
temperature=0,
openai_api_key='<OPENAI_API_KEY>',
model_name="gpt-3.5-turbo-16k"
)
# --------- 不具备上下文理解能的调用方式
while True:
print("输入问题")
ls = input()
print("\n-----\n")
print(track_tokens_usage(llm, ls))
print("\n 回答结束 \n")
具体的使用结果
[图片上传失败...(image-db2c43-1689201283644)]
<img src="https://blogimg.50xr.com/markdown/202307122158605.png" alt="image-20230712215815549" style="zoom:50%;" />
从以上简单的示例中可以看出,在每次简单调用的时候, 不具备理解上下文的内容, 这个使用我们需要结合使用memory模型了,
memory模式的使用
- ConversationBufferMemory
- ConversationSummaryMemory
以上两个类都是在调用接口的时候使用内存存储上下文内容, 但是存在本质上的区别
区别 | ConversationBufferMemory | ConversationSummaryMemory |
---|---|---|
存储形式 | 使用原始内容进行记录 | 会调用接口生成摘要 |
token消耗 | 与聊天内容成正比 | 整体为正比关系,但是后期消耗 token 比前期少 |
请求次数 | 只有一次请求 | 有两次请求, 其中一次会回去全部聊天内容的摘要 |
使用示例
- 具体代码
from langchain.memory import ConversationBufferMemory, ConversationSummaryMemory
from langchain.chains import ConversationChain
from langchain.chat_models import ChatOpenAI
# 定义 LLM 模型
llm = OpenAI(
temperature=0,
openai_api_key='<OPENAI_API_KEY>',
model_name="gpt-3.5-turbo-16k"
)
# 定义 memory 对象
conversation = ConversationChain(llm=llm, memory=ConversationBufferMemory())
# conversation = ConversationChain(llm=llm, memory=ConversationSummaryMemory(llm=llm))
while True:
print("输入问题")
ls = input()
print("\n-----\n")
# 这里可以去掉空格,标点
print(chain_tokens_usage(conversation, ls))
print("*********************** 打印具体的保存内容 *************************")
print(conversation.memory.buffer)
print("*********************** 打印具体的保存内容 *************************")
print("\n 回答结束 \n")
- 执行结果, 提问与上面相同
[图片上传失败...(image-c58378-1689201283645)]
[图片上传失败...(image-9786b1-1689201283645)]
上图是采用ConversationSummaryMemory 模式进行的问答,从上图中可以看出已经具备一定的上下文理解能力。 采用 ConversationBufferMemory 模式的可以自己尝试一下
统计 token 使用以及费用
具体代码如下
from langchain.callbacks import get_openai_callback
def track_tokens_usage(llm, query):
"""直接使用大模型进行调用openai 接口"""
with get_openai_callback() as cb:
result = llm(query)
# 以下为打印真实的消耗和具体费用
print(f"Total Tokens: {cb.total_tokens}")
print(f"Prompt Tokens: {cb.prompt_tokens}")
print(f"Completion Tokens: {cb.completion_tokens}")
print(f"Successful Requests: {cb.successful_requests}")
print(f"Total Cost (USD): ${cb.total_cost}")
return result
def chain_tokens_usage(chain, query):
"""使用 chain 调用 openai 接口"""
with get_openai_callback() as cb:
result = chain.run(query)
# 以下为打印真实的消耗和具体费用
print(f"Total Tokens: {cb.total_tokens}")
print(f"Prompt Tokens: {cb.prompt_tokens}")
print(f"Completion Tokens: {cb.completion_tokens}")
print(f"Successful Requests: {cb.successful_requests}")
print(f"Total Cost (USD): ${cb.total_cost}")
return result
写在最后
- 这只是一个简单的使用示例, langchain 还有很多强大而有用的内容等待一步步的学习
- 第一次学习 python 相关内容, 如有用词不当,不正确的地方,敬请谅解