LangChain系列文章
- LangChain 实现给动物取名字,
- LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字
- LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄
- LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve
- LangChain 5易速鲜花内部问答系统
- LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型
- LangChain 7 文本模型TextLangChain和聊天模型ChatLangChain
- LangChain 8 模型Model I/O:输入提示、调用模型、解析输出
- LangChain 9 模型Model I/O 聊天提示词ChatPromptTemplate, 少量样本提示词FewShotPrompt
- LangChain 10思维链Chain of Thought一步一步的思考 think step by step
- LangChain 11实现思维树Implementing the Tree of Thoughts in LangChain’s Chain
- LangChain 12调用模型HuggingFace中的Llama2和Google Flan t5
- LangChain 13输出解析Output Parsers 自动修复解析器
- LangChain 14 SequencialChain链接不同的组件
- LangChain 15根据问题自动路由Router Chain确定用户的意图
- LangChain 16 通过Memory记住历史对话的内容
- LangChain 17 LangSmith调试、测试、评估和监视基于任何LLM框架构建的链和智能代理
- LangChain 18 LangSmith监控评估Agent并创建对应的数据库
- LangChain 19 Agents Reason+Action自定义agent处理OpenAI的计算缺陷
- LangChain 20 Agents调用google搜索API搜索市场价格 Reason Action:在语言模型中协同推理和行动
- LangChain 21 Agents自问自答与搜索 Self-ask with search
- LangChain 22 LangServe用于一键部署LangChain应用程序
- LangChain 23 Agents中的Tools用于增强和扩展智能代理agent的功能
- LangChain 24 对本地文档的搜索RAG检索增强生成Retrieval-augmented generation
- LangChain 25: SQL Agent通过自然语言查询数据库sqlite
- LangChain 26: 回调函数callbacks打印prompt verbose调用
- LangChain 27 AI Agents角色扮演多轮对话解决问题CAMEL
- LangChain 28 BabyAGI编写旧金山的天气预报
- LangChain 29 调试Debugging 详细信息verbose
1. 动手用LangChain
LangChain提供许多模块,可用于构建语言模型应用程序。模块可以作为简单应用程序中的独立模块使用,并且它们可以组合用于更复杂的用例。组合由LangChain表达语言LangChain Expression Language(LCEL)提供支持,它定义了许多模块实现的统一可运行接口,从而使得能够无缝地链接组件成为可能。
最简单和最常见的链包含三个要素:
- LLM/Chat Model:语言模型在这里是核心推理引擎。为了使用LangChain,您需要了解不同类型的语言模型以及如何与它们一起工作。
- Prompt Template提示模板:这提供了对语言模型的指令。这控制着语言模型的输出,因此理解如何构建提示和不同的提示策略至关重要。
- Output Parser输出解析器:这些将语言模型的原始响应转换为更易处理的格式,使得可以轻松地在下游使用输出。
在本指南中,我们将分别介绍这三个组件,然后讨论如何将它们组合在一起。了解这些概念将为您使用和定制LangChain应用程序奠定良好基础。大多数LangChain应用程序允许您配置模型和/或提示,因此知道如何利用这一点将是一个重要的促进因素。
2. LLM / Chat Model
有两种类型的语言模型:
- LLM:基础模型将字符串作为输入并返回字符串
- ChatModel:基础模型将消息列表作为输入并返回消息
字符串很简单,但是消息究竟是什么?基本消息接口由BaseMessage定义,其中有两个必需属性:
- content:消息的内容。通常是字符串。
- role:来自BaseMessage的实体。
LangChain提供了几个对象,以便轻松区分不同的角色:
- HumanMessage:来自人类/用户的BaseMessage。
- AIMessage:来自AI /助手的BaseMessage。
- SystemMessage:来自系统的BaseMessage。
- FunctionMessage / ToolMessage:包含函数或工具调用输出的BaseMessage。
如果没有这些角色中的任何一个听起来合适,还有一个ChatMessage类,您可以在其中手动指定角色。
LangChain提供了一个通用接口,被LLM和ChatModel共享。然而,要最有效地构建给定语言模型的提示,了解它们之间的区别是很有用的。
调用LLM或ChatModel的最简单方法是使用.invoke()
,这是LangChain表达语言(LCEL)对象的通用同步调用方法:
LLM.invoke
:接受一个字符串,返回一个字符串。ChatModel.invoke
:接受一个BaseMessage列表,返回一个BaseMessage。
这些方法的输入类型实际上比这更一般化,但为了简单起见,我们可以假设LLMs只接受字符串,而Chat模型只接受消息列表。请查看下面的“深入了解”部分,了解有关模型调用的更多信息。
让我们看看如何处理这些不同类型的模型和这些不同类型的输入。首先,让我们导入一个LLM和一个ChatModel。
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
#llm = OpenAI()
#chat_model = ChatOpenAI()
llm = OpenAI(model_name="gpt-3.5-turbo", temperature=0)
chat_model = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
LLM和ChatModel对象实际上是配置对象。您可以使用温度等参数对它们进行初始化,并将它们传递给其他地方。
from langchain.schema import HumanMessage
text = "制造彩色袜子的公司取什么好名字呢?"
messages = [HumanMessage(content=text)]
response = llm.invoke(text)
print("string >>", response)
# >> Feetful of Fun
response = chat_model.invoke(messages)
print("message >>", response)
# >> AIMessage(content="Socks O'Color")
输出
[zgpeace@zgpeaces-MacBook-Pro langchain-llm-app (develop ✗)]$ python Basic/chat_msg.py
string >> 1. 彩虹袜子公司
2. 绚丽袜子制造厂
3. 艳丽袜业有限公司
4. 缤纷袜子制造商
5. 魅力袜业集团
6. 彩绘袜子制造厂
7. 七彩袜子有限公司
8. 色彩世界袜业
9. 炫彩袜子制造商
10. 色彩缤纷袜业公司
message >> content='1. 彩虹袜子公司\n2. 绚丽袜子制造厂\n3. 艳丽袜业有限公司\n4. 缤纷袜子制造商\n5. 魅力袜业集团\n6. 彩绘袜子制造厂\n7. 时尚彩袜有限公司\n8. 色彩世界袜业\n9. 炫彩袜子制造商\n10. 梦幻袜子公司'
LLM.invoke
和ChatModel.invoke
实际上都支持Union[str, List[BaseMessage]
, PromptValue]
作为输入。PromptValue
是一个定义了自己的返回输入的自定义逻辑的对象,可以将其输入作为字符串或消息。LLMs有逻辑将这些中的任何一个强制转换为字符串,而ChatModels有逻辑将这些中的任何一个强制转换为消息。LLM和ChatModel接受相同的输入意味着你可以在大多数链中直接交换它们,而不会破坏任何东西,尽管重要的是要考虑输入是如何被强制转换以及这可能会影响模型性能。要深入了解模型,请前往语言模型部分。
代码
https://github.com/zgpeace/pets-name-langchain/tree/develop
参考
https://python.langchain.com/docs/get_started/quickstart