想象一下,如果你能让聊天机器人不仅仅回答通用的问题,还能从你自己的数据库或文件中提取信息,并根据这些信息执行具体操作,比如发邮件,那会是什么情况?LangChain正是为了实现这一目标而诞生的。
LangChain:一个语言框架,提供了与语言模型交互的组件和接口。
LangChain旨在让开发者能够运用语言模型的强大功能,创建出不仅仅是调用API的应用程序,而是能够连接其他数据源,与环境交互,实现自主决策的应用程序。
LangChain由几个核心组件组成:
- 模型(Model):LangChain支持多种语言模型和平台,如OpenAI的GPT-3和GPT-3.5,Hugging Face Hub的开源模型,以及自定义或私有模型。
- 提示(Prompt):提示是一种将输入数据转换为适合语言模型处理的格式的技术。LangChain提供了多种提示模板(Prompt Template),如聊天机器人风格的提示,ELI5问答风格的提示等。LangChain还提供了提示优化(Prompt Optimization)的功能,可以根据反馈自动调整提示参数。
from langchain.prompts import (
ChatPromptTemplate,
PromptTemplate,
SystemMessagePromptTemplate,
AIMessagePromptTemplate,
HumanMessagePromptTemplate,
)
from langchain.schema import (
AIMessage,
HumanMessage,
SystemMessage
)
prompt=PromptTemplate(
template="You are a helpful assistant that translates {input_language} to {output_language}.",
input_variables=["input_language", "output_language"],
)
system_message_prompt = SystemMessagePromptTemplate(prompt=prompt)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
chat_prompt.format_prompt(input_language="English", output_language="French", text="I love programming.").to_messages()
[SystemMessage(content='You are a helpful assistant that translates English to French.', additional_kwargs={}),
HumanMessage(content='I love programming.', additional_kwargs={})]
output = chat_prompt.format(input_language="English", output_language="French", text="I love programming.")
output
- 索引(Index):索引是一种将文本数据转换为向量嵌入,并存储在一个可检索的结构中的技术。LangChain提供了多种索引类型(Index Type),如Elasticsearch,Pinecone。Langchain还提供了检索器(Retriever)的功能,可以根据输入的查询,从索引中检索出最相关的文档或向量。
- 代理(Agent):代理是一种使用语言模型来决定应该采取什么行动的技术。LangChain提供了多种代理类型(Agent Type),如ReAct,Conversational Agent等。LangChain还提供了工具包(toolkit)的功能,可以让代理使用一些外部的工具,如Web搜索,计算器,API等。
-
工具:执行特定职责的函数。这可以是诸如:Google搜索、数据库查找、Python REPL、其他链等。工具的接口目前是期望有一个字符串作为输入,一个字符串作为输出的函数。
-
LLM:为代理提供动力的语言模型。
-
代理:要使用的代理。这应该是一个引用支持代理类的字符串。
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI
#首先,让我们加载我们要使用的语言模型来控制代理人。
llm = OpenAI(temperature=0)
#接下来,让我们加载一些要使用的工具。请注意,llm-math工具使用LLM,因此我们需要传递它。
tools = load_tools(["serpapi", "llm-math"], llm=llm)
#最后,让我们使用工具、语言模型和我们想要使用的代理人类型初始化一个代理人。
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
agent.run("Who is Leo DiCaprio's girlfriend? What is her current age raised to the 0.43 power?")
#输出
Camila Morrone is Leo DiCaprio's girlfriend and her current age raised to the 0.43 power is 3.991298452658078.
代理类型:
zreo-shot-react-description:此代理使用ReAct框架,仅基于工具的描述来确定要使用的工具。
react-docstore:使用ReAct框架与文档存储进行交互。必须提供两个工具:一个Search工具和一个Lookup工具(它们必须被命名为这样)。Search工具应该搜索文档,而Lookup工具应该查找最近找到的文档中的一个术语。
self-ask-with-search:这个代理使用一个被命名为Intermediate Answer的工具。这个工具应该能够查到问题的事实性答案。
conversational-react-description:这个代理程序旨在用于对话环境中,提示设计旨在使代理程序有助于对话。它使用ReAct框架来决定使用哪个工具,并使用内存来记忆先前的对话交互。
- 记忆(Memory):记忆是一种将语言模型的输出或历史记录存储起来,并在需要时重新使用的技术。LangChain提供了短期记忆(Short-Term Memory)和长期记忆(Long-Term Memory)的功能,可以让语言模型更好地理解上下文和保持一致性。
- 链(Chain):
LangChain的核心思想是将不同的组件链接在一起,形成一个链式结构,从而实现更复和高级的功能。
Pinecone:一个向量数据库,提供了存储和检索向量嵌入的服务,可以用于相似搜索等功能。
向量嵌入是一种将复杂数据(如文本,图像,视频等)转换为数值向量的机器学习技术,可以用于表示数据的语义和特征。向量数据库是一种专门用于存储和检索向量嵌入的数据库。它可以通过计算向量之间的相似度,实现高效的相似性搜索功能,从而支持语言搜索,推荐系统,异常检测等应用场景。
Pinecone的使用方法是通过创建一个索引(Index)对象,将向量嵌入和元数据写入到索引中,然后调用索引对象的方法来执行相似性搜索或其他操作。