## Start
让踏入Langchain的学习之旅,时间很短,让我们现在就开始吧!
首先第一步,安装好Langchain相关的依赖。 这一步教程可以参考官方网站
然后,让我们定义一个模型 像下面这样 1
2
3
4
5
6
7
llm=ChatOpenAI(
model="xxxxxx",
base_url="xxxxxxx",
api_key="xxxxx",
temperature=0.3
)1
2parser=StrOutputParser()
1
2
3
4result=llm.invoke("hello")
parser.invoke(result)
print(result)
print(parser.invoke(result))
我们可以将模型与输出解析器 "链
"起来。用模型和解释器绑定在一起,链接起来
,这意味着在这个链中,每次都会调用这个输出解析器。 1
2
3
4
5
chain=llm|parser
print(chain.invoke("how do you think about BYD"))
print(result)
这样再这个链中,我们每次都调用了parse
方法三: 我们可以创建提示模板 1
2
3
4
5
6
7
8
9system_template = "Translate the following into {language}:"
prompt_template = ChatPromptTemplate.from_messages([("system", system_template),("user", "{text}")])
result=prompt_template.invoke({"language":"Chinese","text":"hello"})
print(result.to_messages())
#[SystemMessage(content='Translate the following into Chinese:'), HumanMessage(content='hello')]
chain=prompt_template|llm|parser
print(chain.invoke({"language": "Chinese", "text": "Ciallo"}))
#Ciallo是一个意大利名字,直译可能没有具体含义,但在某些方言中,它可能类似于英语中的"hi"或"alright",是一种非正式的问候或打招呼用语。中文可以翻译为"嗨"或"你好",但在没有更多上下文的情况下,一般译为"嗨"。1
result.to_messages()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45#!/usr/bin/env python
from typing import List
from fastapi import FastAPI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
from langserve import add_routes
# 1. Create prompt template
system_template = "Translate the following into {language}:"
prompt_template = ChatPromptTemplate.from_messages([
('system', system_template),
('user', '{text}')
])
# 2. Create model
model = ChatOpenAI()
# 3. Create parser
parser = StrOutputParser()
# 4. Create chain
chain = prompt_template | model | parser
# 4. App definition
app = FastAPI(
title="LangChain Server",
version="1.0",
description="A simple API server using LangChain's Runnable interfaces",
)
# 5. Adding chain route
add_routes(
app,
chain,
path="/chain",
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="localhost", port=8000)
## Build a Chatbot
在这一节,我们会举例说明如何设计LLM驱动的chatbot
1 | model.invoke([HumanMessage(content="Hi! I'm Bob")]) |
如上图所示,我们可以看到model的回答没有记忆性 如果我们希望model能够有记忆性我们需要将回复传递进去
解决方法
我们可以使用 "消息历史记录
"类来封装我们的模型,使其有状态。这将跟踪模型的输入和输出,并将它们存储在某个数据存储中。未来的交互将加载这些消息,并将它们作为输入的一部分传递到链中。让我们看看如何使用它!
首先我们安装langchain-community
pip install langchain_community
之后,我们就可以导入相关类,并设置我们的链,该链将包裹模型并添加此消息历史记录。
这里的关键部分是我们作为 get_session_history 传入的函数。该函数将接收一个 session_id 并返回一个消息历史对象。该 session_id 用于区分不同的会话,在调用新链时应作为配置的一部分传入(我们将演示如何做到这一点)。
1 | from langchain_core.chat_history import BaseChatMessageHistory |
现在,我们需要创建一个config,每次都将其传递给 runnable。该配置包含的信息不是直接输入的一部分,但仍然有用。在本例中,我们希望包含一个 session_id。这个config应该如下所示
1 |
|
1 |
|
如上图所示,我们使用相同的config可以使得对话连续,而不同的config可以看作是不同的对象。
Prompt templates
提示模板有助于将原始用户信息转化为 LLM 可以使用的格式。在本例中,原始的用户输入只是一条信息,我们要将其传递给 LLM。现在让我们把它变得复杂一些。首先,让我们在系统消息中添加一些自定义指令(但仍以消息作为输入)。接下来,除了信息外,我们还要添加更多输入信息。
首先,让我们添加一条系统消息。为此,我们将创建一个 ChatPromptTemplate。我们将利用MessagesPlaceholder 来传递所有信息。
1 |
|
在对话模型(chat model)中, prompt主要是封装在Message中,LangChain提供了一些MessagePromptTemplate,方便我们直接使用Message生成prompt。
MessagesPlaceholder:该提示模板负责在特定位置添加信息列表。在上面的 ChatPromptTemplate 中,我们看到了如何格式化两条信息,每条信息都是一个字符串。但如果我们想让用户传入一个信息列表,并将其插入特定位置呢?这就是使用 MessagesPlaceholder 的方法。
1 | response = chain.invoke({"messages": [HumanMessage(content="hi! I'm swf")]}) |
咕咕咕, 就快送到了
哎呀,似乎评论系统在您的地区都无法正常工作。
不过不要担心,来看看我们为您准备的备用方案 ——
1. 将您的评论用信封装好
2. 使用信鸽函至1476573945@qq.comexample.com
3. 我们在收到您的评论后将立即审核并更新至网站
评论一经采用,信函恕不退还,信鸽也不退还,请知悉。