LangChain 使您能够构建连接外部数据和计算资源到大型语言模型(LLM)的应用程序。下面我们将一步步来演示这个构建过程。

首先,我们将从简单的 LLM 链开始,它仅依赖于提示模板中的信息来响应。

接下来,我们将构建一个检索链,该链从单独的数据库中获取数据,并将这些数据传递给提示模板。

然后,我们将加入聊天历史记录,以创建一个会话检索链。这使您能够以聊天的方式与这个 LLM 互动,让它记住之前的问题。

最后,我们将构建一个代理人,该代理人利用 LLM 来判断是否需要检索数据来回答问题。

一、LLM 链

1.1、基于OpenAI的实现

我们可以通过API来访问LLM,比如OpenAI。在开始之前,需要先安装LangChain x OpenAI 集成包pip install langchain-openai。其次设置环境变量OPENAI_API_KEYexport OPENAI_API_KEY="..."。然后开始初始化。

1
2
3
from langchain_openai import ChatOpenAI

llm = ChatOpenAI() # 也可以通过参数传递openai的api key。 llm = ChatOpenAI(openai_api_key="...")

一旦完成安装并初始化了所选择的 LLM(大型语言模型),我们就可以尝试使用它了!比如让我们问它一些 LangSmith相关的信息。 - 这是一些在训练数据中不存在的内容,所以它可能不会给出一个非常好的回应。

1
llm.invoke("how can langsmith help with testing?")

我们还可以通过提示模板来指导它的回应。提示模板用于将原始用户输入转换为更适合 LLM(大型语言模型)的输入。

1
2
3
4
5
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "You are world class technical documentation writer."),
("user", "{input}")
])

现在我们把llm和prompt组合成一个简单的LLM链。

1
chain = prompt | llm 

现在我们可以调用它并再次提出同样的问题。它仍然不知道答案,但它应该会以更符合技术作家的语气做出回应。

1
chain.invoke({"input": "how can langsmith help with testing?"})

ChatModel 的输出(也就是这个链的输出)是一个消息体。通常来说,与字符串工作要方便得多。让我们添加一个简单的输出解析器,将聊天消息转换为字符串。

1
2
3
from langchain_core.output_parsers import StrOutputParser

output_parser = StrOutputParser()

我们将上面这个输出解析器加到之前的链中。

1
chain = prompt | llm | output_parser

再次调用,将返回一个字符串,而非消息体。

1
chain.invoke({"input": "how can langsmith help with testing?"})

1.2、基于Ollama的本地化模型的实现

Ollama 是一个允许本地化运行开源大语言模型(比如Llama 2)的工具。安装完Ollama之后,可以使用类似命令ollama pull llama2 下载开源模型。但Ollama服务允许后,我们就可以用如下代码载入大语言模型。

1
2
from langchain_community.llms import Ollama
llm = Ollama(model="llama2")

得到llm之后的运行代码跟openai在线实现均相同,此地暂略。