LangChain 基础知识入门
目录
- 什么是 LangChain
- Models 组件
- Prompts 组件
- Chain 组件
- Agents 组件
- Memory 组件
- Indexes 组件
- LangChain 应用场景
什么是 LangChain
LangChain 由 Harrison Chase 创建于 2022 年 10 月,它是围绕 LLMs(大语言模型)建立的一个框架。
LangChain 自身并不开发 LLMs,它的核心理念是为各种 LLMs 实现通用的接口,把 LLMs 相关的组件“链接”在一起,简化 LLMs 应用的开发难度,方便开发者快速地开发复杂的 LLMs 应用。
LangChain 目前有两个语言的实现:python 和 Nodejs.
LangChain 主要组件
Models 模型,各种类型的模型和模型集成,比如 GPT-4
Prompts 提示,包括提示管理、提示优化和提示序列化
Memory 记忆,用来保存和模型交互时的上下文状态
Indexes 索引,用来结构化文档,以便和模型交互
Chains 链,一系列对各种组件的调用
Agents 代理,决定模型采取哪些行动,执行并且观察流程,直到完成为止
Models 组件
LangChain 目前支持三种模型类型:LLMs、Chat Models(聊天模型)、Embeddings Models(嵌入模型)
- LLMs,大语言模型接收文本字符作为输入,返回的也是文本字符。
- 聊天模型,基于 LLMs, 不同的是它接收聊天消息 (一种特定格式的数据) 作为输入,返回的也是聊天消息。
- 文本嵌入模型,文本嵌入模型接收文本作为输入,返回的是浮点数列表。
LLMs (大语言模型)
LLMs 有很多,各种大模型平台,例如 openai、deepseek、qwen、gml 等。
也可以选择平台然后下载需要的 LLMs 模型,例如 ollama、modelscope、huggingface 等。
接下来我们将借助 deepseek 大模型平台,实现该类模型的组件的应用(注意:后续代码的实现均基于该平台):
第一步:安装必备的工具包:langchain 和 langchain_deepseek
shellpip install langchain pip install langchain_deepseek
第二步:选择使用的 大模型
可以选择的大模型有很多,例如 deepseek、openai。也可以使用本地模型,如:ollama 或者 modelscope。
这里以 deepseek 为例,在 deepseek 大模型平台上:申请 API KEY(需要充值)
deepseek API: https://platform.deepseek.com/
第三步:配置环境变量(可选)
如果每次使用 LLMs 时都需要配置 API KEY,如果觉得麻烦就可以选择使用环境变量的方式,将 API KEY 配置在系统环境变量中,然后直接在代码中调用环境变量即可。
又或者可以配置到 .env 文件中,然后在代码中调用即可。
python# .env 文件 DEEPSEEK_API_KEY='sk-****752cf76b4671a66ff0b00b125ce1' # 填入你自己的 API KEY
每次使用前,先加载一下环境变量
pythonfrom dotenv import load_dotenv, find_dotenv # 加载 .env 中的变量到 -> os.environ load_dotenv(find_dotenv())
第四步:代码实现
再执行代码
pythonfrom langchain_deepseek import ChatDeepSeek # 配置为使用 DeepSeek 的 API llm = ChatDeepSeek( model="deepseek-chat", # 根据 DeepSeek 实际模型名称调整 # api_key=os.environ['DEEPSEEK_API_KEY'], # 环境变量中设置为 DEEPSEEK_API_KEY 可以直接省略 ) res = llm.invoke("请给我讲一个笑话") print(res.content)
打印结果:
好的!来一个轻松的笑话:
**程序员买菜**
老婆:“下班买五个包子,如果看到卖西瓜的,买一个!”
程序员老公带回来一个包子。
老婆:“???”
老公:“确实看到卖西瓜的了啊…(严格按照‘if条件’执行)”
(笑点:程序员死磕代码逻辑的耿直😂)
需要换类型或主题的笑话可以告诉我哦!
Chat Models (聊天模型)
Chat Models 和 LLMs 效果在某些场景表现基本类似,但是使用时需要按照约定传入合适的值。
AIMessage
用来保存 LLM 的响应,以便在下次请求时把这些信息传回给 LLM
HumanMessage
发送给 LLMs 的提示信息,比如“实现一个快速排序方法”
SystemMessage
设置 LLM 模型的行为方式和目标。你可以在这里给出具体的指示,比如“作为一个代码专家”,或者“返回 json 格式”
ChatMessage
ChatMessage 可以接收任意形式的值,但是在大多数时间,我们应该使用上面的三种类型
from langchain_deepseek import ChatDeepSeek
from langchain.schema import HumanMessage
# 配置为使用 DeepSeek 的 API
chat = ChatDeepSeek(
model="deepseek-chat",
)
messages = [HumanMessage(content="给我写一首唐诗")]
response = chat.invoke(messages)
print(response.content)
《春暮》
垂杨深巷卖饧天,
紫燕斜飞掠酒帘。
一霎东风花事了,
满城青絮扑人肩。
注:此诗以晚春意象入笔,融市井风情与自然时序于一体。"卖饧""酒帘"点染人间烟火,"紫燕""青絮"勾勒暮春特征。末句"扑人肩"三字使无形春愁具象化,暗合唐人"无计留春住"之思。格律谨守七绝仄起式,韵脚依《平水韵》下平十四盐。
Embeddings Models(嵌入模型)
Embeddings Models 特点:将字符串作为输入,返回一个浮动数的列表。在 NLP 中,Embedding 的作用就是将数据进行文本向量化。
因为 deepseek 官方不提供嵌入模式,openai 如果没有 API 价格不便宜,这里就推荐使用本地的嵌入模型。ollama 或者 modelscope 均可。
ollama 嵌入模型
1、下载模型
ollama pull nomic-embed-text
2、调用嵌入模型
from langchain_ollama.embeddings import OllamaEmbeddings
embeddings = OllamaEmbeddings(model="nomic-embed-text")
query_vector = embeddings.embed_query("这是一个测试文档")
print(query_vector)
# [0.0073293634, 0.066640384, -0.16439122, ...]
query_vector2 = embeddings.embed_documents(["这是一个测试文档", "这是二个测试文档"])
print(query_vector2)
# [[0.0073293634, 0.066640384, -0.16439122, ...], [0.013096787, 0.027176386, -0.14052153,...]
modelscope 嵌入模型
1、安装第三方库
pip install langchain modelscope
2、然后进行调用。调用是需要的 ModelScope 模型会自动下载
from langchain_community.embeddings import ModelScopeEmbeddings
# 选择使用的嵌入模型
model_id = 'yangjhchs/acge_text_embedding'
# 初始化嵌入类
embeddings = ModelScopeEmbeddings(model_id=model_id)
# 使用方式与之前完全一致
query1 = embeddings.embed_query("这是一个测试文档")
print(f'query1-->{query1}...')
print(f'query1 的长度-->{len(query1)}')
query2 = embeddings.embed_documents(["这是一个测试文档", "这是二个测试文档"])
print(query2)
在线平台的嵌入模型
如果使用的是 OpenAi 官方的 APi,可以直接指定嵌入模型进行调用
from langchain_openai import OpenAIEmbeddings
# DeepSeek 官方没有 embedding 模型,openai 有,或者使用本地的 embedding 模型也可以
embed = OpenAIEmbeddings(
model="text-embedding-3-large",
)
query1 = embed.embed_query('这是第一个测试文档')
print(query1)
query2 = embed.embed_documents(['这是第一个测试文档', '这是第二个测试文档'])
print(query2)
Prompts 组件
Prompt 是指当用户输入信息给模型时加入的提示,这个提示的形式可以是 zero-shot 或者 few-shot 等方式,目的是让模型理解更为复杂的业务场景以便更好的解决问题。
提示模板:如果你有了一个起作用的提示,你可能想把它作为一个模板用于解决其他问题,LangChain 就提供了 PromptTemplates 组件,它可以帮助你更方便的构建提示。
zero-shot 提示方式
from langchain_deepseek import ChatDeepSeek
from langchain_core.prompts import PromptTemplate
llm = ChatDeepSeek(model="deepseek-chat")
# 1. 定义模板字符串
template = "我的邻居姓{lastname},他生了个儿子,给他儿子起个名字"
# 2. 创建 PromptTemplate 对象
prompt = PromptTemplate(input_variables=["lastname"], template=template)
# 3. 格式化模板
prompt_text = prompt.format(lastname="李")
print(f'prompt_text:{prompt_text}')
# 4. 送入模型 prompt
result = llm.invoke(prompt_text)
print(f'result--"{result.content}')
few-shot 提示方式
from langchain_deepseek import ChatDeepSeek
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
llm = ChatDeepSeek(model="deepseek-chat")
# 1. 给出示例数据
examples = [
{"word": "开心", "antonym": "难过"},
{"word": "高", "antonym": "矮"}
]
# 2. 设置示例模板
example_template = """
单词:{word}
反义词:{antonym}
"""
example_prompt = PromptTemplate(
input_variables=["word", "antonym"],
template=example_template
)
# 3. 构建 FewShotPromptTemplate
few_shot_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
prefix="给出每个单词的反义词",
suffix="单词:{input}\n反义词:",
input_variables=["input"],
example_separator="\n"
)
# 4. 格式化提示并调用模型
prompt_text = few_shot_prompt.format(input="粗")
print(f"Prompt:\n{prompt_text}")
result = llm.invoke(prompt_text)
print(f"\n模型输出结果:\n{result.content}")
# 细
Chains 组件
在 LangChain 中,Chains 描述了将 LLM 与其他组件结合起来完成一个应用程序的过程。
针对上一小节的提示模版例子,zero-shot 里面,我们可以用链来连接提示模版组件和模型,进而可以实现代码更改:
from langchain_deepseek import ChatDeepSeek
from langchain_core.prompts import PromptTemplate
from langchain.chains import LLMChain
llm = ChatDeepSeek(model="deepseek-chat")
# 1. 定义模板
template = "我的邻居姓{lastname},他生了个儿子,给他儿子起个名字"
prompt = PromptTemplate(input_variables=["lastname"], template=template)
# 2. 构造 Chain
chain = LLMChain(llm=llm, prompt=prompt)
# 3. 执行 Chain
result = chain.invoke({"lastname": "王"})
print(f'result --> {result}')
如果你想将第一个模型输出的结果,直接作为第二个模型的输入,还可以使用 LangChain 的 SimpleSequentialChain, 代码如下:
from langchain_deepseek import ChatDeepSeek
from langchain_core.prompts import PromptTemplate
from langchain.chains import LLMChain, SimpleSequentialChain
llm = ChatDeepSeek(model="deepseek-chat")
# 创建第一条链
prompt = PromptTemplate(
input_variables=["lastname"],
template="我的邻居姓{lastname},他生了个儿子,给他儿子起个名字。最后只输出一个名字,不给其他内容。",
)
# 构造 Chain:第一条链
first_chain = LLMChain(llm=llm, prompt=prompt)
# 创建第二条链
second_prompt = PromptTemplate(
input_variables=["child_name"],
template="邻居的儿子名字叫{child_name},给他起一个小名。最后只输出一个名字,不给其他内容。"
)
# 构造 Chain:第二条链
second_chain = LLMChain(llm=llm, prompt=second_prompt)
# 融合两条链:verbose 为 True 的时候,显示模型推理过程,否则不显示
overall_chain = SimpleSequentialChain(chains=[first_chain, second_chain], verbose=True)
result = overall_chain.invoke("王")
print(result)
Agents 组件
在 LangChain 中 Agents 的作用就是根据用户的需求,来访问一些第三方工具 (比如:搜索引擎或者数据库),进而来解决相关需求问题。
为什么要借助第三方库?
因为大模型虽然非常强大,但是也具备一定的局限性,比如不能回答实时信息、处理数学逻辑问题仍然非常的初级等等。因此,可以借助第三方工具来辅助大模型的应用。
Agent 代理
- 制定计划和思考下一步需要采取的行动
- 负责控制整段代码的逻辑和执行,代理暴露了一个接口,用来接收用户输入,并返回 AgentAction 或 AgentFinish。
Tool 工具
- 解决问题的工具
- 第三方服务的集成,比如计算器、网络搜索(谷歌、bing)等等
Toolkit 工具包
- 一些集成好了代理包,比如
create_csv_agent
可以使用模型解读 csv 文件。
pythonfrom langchain_experimental.agents import create_csv_agent from langchain_deepseek import ChatDeepSeek agent = create_csv_agent( llm=ChatDeepSeek(model="deepseek-chat"), path='data.csv', verbose=True, allow_dangerous_code=True ) print(agent.run("一共有多少行数据?"))
- 一些集成好了代理包,比如
AgentExecutor 代理执行器
- 它将代理和工具列表包装在一起,负责迭代运行代理的循环,直到满足停止的标准。
现在我们实现一个使用代理的例子:假设我们想查询一下中国目前有多少人口?我们可以使用多个代理工具,让 Agents
选择执行。代码如下:
from langchain.agents import load_tools, initialize_agent, AgentType
from langchain_deepseek import ChatDeepSeek
from langchain import PromptTemplate
llm = ChatDeepSeek(model="deepseek-chat")
# 定义工具:这里指定两个工具来选择使用:llm-math 计算,wikipedia
tools = load_tools(["llm-math", "wikipedia"], llm=llm)
# 实例化 agent
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
print(f'agent --> {agent}')
prompt_template = "中国目前有多少人口"
prompt = PromptTemplate.from_template(prompt_template)
print('prompt-->', prompt)
res = agent.run(prompt)
print(res)
查询 langchain 支持的工具。代码如下:
from langchain_community.agent_toolkits.load_tools import get_all_tool_names
results = get_all_tool_names()
print(results)
结果展示:
['sleep', 'wolfram-alpha', 'google-search', 'google-search-results-json', 'searx-search-results-json', 'bing-search', 'metaphor-search', 'ddg-search', 'google-books', 'google-lens', 'google-serper', 'google-scholar', 'google-finance', 'google-trends', 'google-jobs', 'google-serper-results-json', 'searchapi', 'searchapi-results-json', 'serpapi', 'dalle-image-generator', 'twilio', 'searx-search', 'merriam-webster', 'wikipedia', 'arxiv', 'golden-query', 'pubmed', 'human', 'awslambda', 'stackexchange', 'sceneXplain', 'graphql', 'openweathermap-api', 'dataforseo-api-search', 'dataforseo-api-search-json', 'eleven_labs_text2speech', 'google_cloud_texttospeech', 'read_file', 'reddit_search', 'news-api', 'tmdb-api', 'podcast-api', 'memorize', 'llm-math', 'open-meteo-api', 'requests', 'requests_get', 'requests_post', 'requests_patch', 'requests_put', 'requests_delete', 'terminal']
LangChain 支持的搜索工具如下:
工具 | 描述 |
---|---|
Bing Search | Bing 搜索 |
Google Search | Google 搜索 |
Google Serper API | 一个从 Google 搜索提取数据的 API |
Python REPL | 执行 python 代码 |
Memory 组件
大模型本身不具备上下文的概念,它并不保存上次交互的内容,ChatGPT 之所以能够和人正常沟通对话,因为它进行了一层封装,将历史记录回传给了模型。
因此 LangChain 也提供了 Memory 组件,Memory 分为两种类型:短期记忆和长期记忆。短期记忆一般指单一会话时传递数据,长期记忆则是处理多个会话时获取和更新信息。
目前的 Memory 组件只需要考虑 ChatMessageHistory。举例分析:
from langchain_community.chat_message_histories import ChatMessageHistory
# 1.实例对象
history = ChatMessageHistory()
# 2. 添加历史信息
history.add_user_message("在吗")
history.add_ai_message("有什么事吗?")
print(history.messages)
# [HumanMessage(content='在吗?', additional_kwargs={}), AIMessage(content='有什么事?', additional_kwargs={})]
直接使用 ConversationChain:
from langchain_deepseek import ChatDeepSeek
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
llm = ChatDeepSeek(model="deepseek-chat")
# 1. 实例化带默认 memory 的 ConversationChain
conversation_chain = ConversationChain(
llm=llm,
memory=ConversationBufferMemory() # ConversationChain 默认也会使用这个 memory
)
# 2. 执行对话交互
result1 = conversation_chain.predict(input="小明有 1 只猫")
print(f'result1--->{result1}')
result2 = conversation_chain.predict(input="小刚有 2 只狗")
print(f'result2--->{result2}')
result3 = conversation_chain.predict(input="小明和小刚一共有多少只宠物")
print(f'result3--->{result3}')
如果要像 chatGPT 一样,长期保存历史消息,可以使用messages_to_dict
方法
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain.schema import messages_from_dict, messages_to_dict
# 实例化对象
history = ChatMessageHistory()
# 添加历史信息
history.add_user_message("在吗")
history.add_ai_message("有什么事吗?")
# 保存历史信息到字典里
dicts = messages_to_dict(history.messages)
print(dicts)
# [{'type': 'human', 'data': {'content': '在吗', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': None, 'example': False}}, {'type': 'ai', 'data': {'content': '有什么事吗?', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': None, 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}}]
# 重加载历史信息
new_message = messages_from_dict(dicts)
print(new_message)
# [HumanMessage(content='在吗', additional_kwargs={}, response_metadata={}), AIMessage(content='有什么事吗?', additional_kwargs={}, response_metadata={})]
Indexes 组件
Indexes 组件的目的是让 LangChain 具备处理文档处理的能力,包括:文档加载、检索等。注意,这里的文档不局限于 txt、pdf 等文本类内容,还涵盖 email、区块链、视频等内容。
- 文档加载器
- 文本分割器
- VectorStores
- 检索器
文档加载器
文档加载器主要基于 langchain_unstructured
包,langchain_unstructured
是一个 python 包,可以把各种类型的文件转换成文本。
文档加载器使用起来很简单,只需要引入相应的 loader 工具:
from langchain_community.document_loaders import TextLoader
loader1 = TextLoader("./衣服属性.txt", encoding='utf8')
doc1 = loader1.load()
print(f'docs1-->{doc1}')
print(len(doc1))
print(doc1[0].page_content[:10])
print("*" * 80)
from langchain_unstructured import UnstructuredLoader
# 实例话 UnstructuredFileLoader
loader = UnstructuredLoader("./衣服属性.txt", encoding='utf8')
docs = loader.load()
print(f'docs-->{docs}')
print(len(docs))
print(docs[0].page_content[:10])
衣物属性文件
身高:160-170cm, 体重:90-115斤,建议尺码M。
身高:165-175cm, 体重:115-135斤,建议尺码L。
身高:170-178cm, 体重:130-150斤,建议尺码XL。
身高:175-182cm, 体重:145-165斤,建议尺码2XL。
身高:178-185cm, 体重:160-180斤,建议尺码3XL。
身高:180-190cm, 体重:180-210斤,建议尺码4XL。
面料分类:其他
图案:纯色
领型:翻领
衣门襟:单排扣
颜色:黑色 卡其色 粉色 杏色
袖型:收口袖
适用季节:冬季
袖长:长袖
厚薄:厚款
适用场景:其他休闲
衣长:常规款
版型:宽松型
款式细节:假两件
工艺处理:免烫处理
适用对象:青年
面料功能:保暖
穿搭方式:外穿
销售渠道类型:纯电商(只在线上销售)
材质成分:棉100%
LangChain 支持的文档加载器 (部分):
文档加载器 | 描述 |
---|---|
CSV | CSV 问价 |
JSON Files | 加载 JSON 文件 |
Jupyter Notebook | 加载 notebook 文件 |
Markdown | 加载 Markdown 文件 |
Microsoft PowerPoint | 加载 ppt 文件 |
加载 pdf 文件 | |
Images | 加载图片 |
File Directory | 加载目录下所有文件 |
HTML | 网页 |
文档分割器
由于模型对输入的字符长度有限制,我们在碰到很长的文本时,需要把文本分割成多个小的文本片段。
文本分割最简单的方式是按照字符长度进行分割,但是这会带来很多问题,比如说如果文本是一段代码,一个函数被分割到两段之后就成了没有意义的字符,所以整体的原则是把语义相关的文本片段放在一起。
LangChain 中最基本的文本分割器是 CharacterTextSplitter,它按照指定的分隔符(默认\n\n
)进行分割,并且考虑文本片段的最大长度。
我们看个例子:
from langchain.text_splitter import CharacterTextSplitter
# 分割器实例化对象
text_spliter = CharacterTextSplitter(
separator=' ',
chunk_size=5, # 指明每个分割文本块的大小
chunk_overlap=3, # 指明每个分割后的文档之间的重复字符个数
)
# 对一句话进行分割
result1 = text_spliter.split_text("a b c d e f")
print(f'一句话分割的结果{result1}')
# 对多个句子也就是文档切分
texts = text_spliter.create_documents(["a b c d e f", "e f g h"])
print(f'texts-->{texts}')
除了 CharacterTextSplitter 分割器,LangChain 还支持其他文档分割器 (部分):
文档分割器 | 描述 |
---|---|
LatexTextSplitter | 沿着 Latex 标题、标题、枚举等分割文本 |
MarkdownTextSplitter | 沿着 Markdown 的标题、代码块或水平规则来分割文本 |
TokenTextSplitter | 根据 openAI 的 token 数进行分割 |
PythonCodeTextSplitter | 沿着 Python 类和方法的定义分割文本 |
VectorStores
VectorStores 是一种特殊类型的数据库,它的作用是存储由嵌入创建的向量,提供相似查询等功能。
我们使用其中一个 Chroma 组件作为例子(pip install chromadb):
pku.txt 文件
北京大学创办于1898年,是戊戌变法的产物,也是中华民族救亡图存、兴学图强的结果,初名京师大学堂,是中国近现代第一所国立综合性大学,辛亥革命后,于1912年改为现名。
在悠久的文明历程中,古代中国曾创立太学、国子学、国子监等国家最高学府,在中国和世界教育史上具有重要影响。北京大学“上承太学正统,下立大学祖庭”,既是中华文脉和教育传统的传承者,也标志着中国现代高等教育的开端。其创办之初也是国家最高教育行政机关,对建立中国现代学制作出重要历史贡献。
作为新文化运动的中心和五四运动的策源地,作为中国最早传播马克思主义和民主科学思想的发祥地,作为中国共产党最初的重要活动基地,北京大学为民族的振兴和解放、国家的建设和发展、社会的文明和进步做出了突出贡献,在中国走向现代化的进程中起到了重要的先锋作用。爱国、进步、民主、科学的精神和勤奋、严谨、求实、创新的学风在这里生生不息、代代相传。
1917年,著名教育家蔡元培就任北京大学校长,他“循思想自由原则,取兼容并包主义”,对北京大学进行了卓有成效的改革,促进了思想解放和学术繁荣。陈独秀、李大钊、毛泽东以及鲁迅、胡适、李四光等一批杰出人士都曾在北京大学任教或任职。
1937年卢沟桥事变后,北京大学与清华大学、南开大学南迁长沙,共同组成国立长沙临时大学。1938年,临时大学又西迁昆明,更名为国立西南联合大学。抗日战争胜利后,北京大学于1946年10月在北平复员。
中华人民共和国成立后,全国高校于1952年进行院系调整,北京大学成为一所以文理基础教学和研究为主、兼有前沿应用学科的综合性大学,为社会主义建设事业培养了大批杰出人才,在23位“两弹一星”元勋中有12位北大校友。
改革开放以来,北京大学进入了稳步快速发展的新时期,于1994年成为国家“211工程”首批重点建设大学。1998年5月4日,在庆祝北京大学建校一百周年大会上,党中央发出了“为了实现现代化,我国要有若干所具有世界先进水平的一流大学”的号召,之后启动了建设世界一流大学的“985工程”。在这一国家战略的支持和推动下,北京大学的发展翻开了新的一页。
2000年4月3日,北京大学与原北京医科大学合并,组建了新的北京大学。原北京医科大学的前身是创建于1912年10月26日的国立北京医学专门学校, 1903年京师大学堂设立的医学实业馆为这所国立西医学校的诞生奠定了基础。20世纪三、四十年代,学校一度名为北平大学医学院,并于1946年7月并入北京大学。1952年在全国高校院系调整中,北京大学医学院脱离北京大学,独立为北京医学院。1985年更名为北京医科大学,1996年成为国家首批“211工程”重点支持的医科大学。两校合并进一步拓宽了北京大学的学科结构,为促进医学与理科、工科以及人文社会科学的交叉融合,改革创新医学教育奠定了基础。
党的十八大以来,在以习近平同志为核心的党中央坚强领导下,北大加快推进高质量内涵式发展,在建设中国特色世界一流大学的新征程上取得新突破。2018年5月2日,习近平总书记到北大考察,并在北大师生座谈会上指出:“近年来,北大继承光荣传统,坚持社会主义办学方向,立德树人成果丰硕,双一流建设成效显著,服务经济社会发展成绩突出,学校发展思路清晰,办学实力和影响力显著增强,令人欣慰。”在习近平总书记的勉励和指引下,北京大学再接再厉、接续奋斗,坚持当好培养高素质拔尖创新人才的摇篮、创造前沿科技和先进思想文化的重要阵地、服务国家高质量发展的枢纽平台、推动高水平对外开放的桥梁纽带,在新征程上不断谱写建设中国特色世界一流大学的崭新篇章。
现任校党委书记郝平、校长龚旗煌。
from langchain.text_splitter import CharacterTextSplitter
from langchain_ollama.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import Chroma
embeddings = OllamaEmbeddings(model="nomic-embed-text")
# 1. 读取文档里面的内容:pku.txt
pku_str1 = open('./pku.txt', encoding='utf-8').read()
# 2.要切分文档
text_spliter = CharacterTextSplitter(chunk_size=100, chunk_overlap=5)
texts = text_spliter.split_text(pku_str1)
print(len(texts))
print('*' * 80)
# 3.将切分后的文档向量化并保存
db = Chroma.from_texts(
texts,
embeddings,
persist_directory="./embeddings_store" # 指定存放路径
)
query = "1937 年北京大学发生了什么?"
result = db.similarity_search(query)
print(len(result))
for doc in result:
print([doc.page_content])
LangChain 支持的 VectorStore 如下:
VectorStore | 描述 |
---|---|
Chroma | 一个开源嵌入式数据库 |
ElasticSearch | ElasticSearch |
Milvus | 用于存储、索引和管理由深度神经网络和其他机器学习(ML)模型产生的大量嵌入向量的数据库 |
Redis | 基于 Redis 的检索器 |
FAISS | Facebook AI 相似性搜索服务 |
Pinecone | 一个具有广泛功能的向量数据库 |
检索器
检索器是一种便于模型查询的存储数据的方式,LangChain 约定检索器组件至少有一个方法invoke
,
这个方法接收查询字符串,返回一组文档。(pip install faiss-cpu)
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain.text_splitter import CharacterTextSplitter
from langchain_ollama.embeddings import OllamaEmbeddings
embeddings = OllamaEmbeddings(model="nomic-embed-text")
# 1.加载文档
loader = TextLoader('./pku.txt', encoding='utf8')
documents = loader.load()
print('documents:', documents)
# 2.切分文档
text_spliter = CharacterTextSplitter(chunk_size=100, chunk_overlap=5)
texts = text_spliter.split_documents(documents)
print('texts:', texts)
# 3. 实例化 FAISS 对象
db = FAISS.from_documents(texts, embeddings)
retriever = db.as_retriever(search_kwargs={"k": 1})
result = retriever.invoke("北京大学什么时候成立的?")
print(result)
LangChain 支持的检索器组件如下:
检索器 | 介绍 |
---|---|
Azure Cognitive Search Retriever | Amazon ACS 检索服务 |
ChatGPT Plugin Retriever | ChatGPT 检索插件 |
Databerry | Databerry 检索 |
ElasticSearch BM25 | ElasticSearch 检索器 |
Metal | Metal 检索器 |
Pinecone Hybrid Search | Pinecone 检索服务 |
SVM Retriever | SVM 检索器 |
TF-IDF Retriever | TF-IDF 检索器 |
VectorStore Retriever | VectorStore 检索器 |
Vespa retriever | 一个支持结构化文本和向量搜索的平台 |
Weaviate Hybrid Search | 一个开源的向量搜索引擎 |
Wikipedia | 支持 wikipedia 内容检索 |
LangChain 使用场景
- 个人助手
- 输入标题问答系统
- 聊天机器人
- Tabular
- 数据查询
- 文档总结
- API 交互
- 信息提取