LangChain核心组件详解
一、什么是LangChain?
LangChain由Harrison Chase(哈里森*蔡斯)创建于2022年10月, 它是围绕LLMs (大语言模型) 建立的一个框架

LangChain自身并不开发LLMs,它的核心理念是为各种LLMs实现通用的接口,把LLMs相关的组件“链接”在一起,简化LLMs应用的开发难度,方便开发者快速地开发复杂的LMs应用.
LangChain目前有两个语言的实现: python 和 Nodejs.
LangChain主要组件:
- Models: 模型,各种类型的模型和模型集成,比如GPT-4
- Prompts: 提示,包括提示管理、提示优化和提示序列化
- Chains: 链,一系列对各种组件的调用
- Agents: 代理,决定模型采取哪些行动,执行并且观察流程,直到完成为止
- Memory : 记忆,用来保存和模型交互时的上下文状态
- Indexes : 索引,用来结构化文档,以便和模型交互
二、Models组件
LangChain目前支持三种模型类型:LLMs、Chat Models(聊天模型)、Embedings Models(嵌入模型)
- LLMs:大语言模型接收文本字符作为输入,返回的也是文本字符。处理文本生成、对话等任务,如 OpenAI 的 GPT-4、Anthropic 的 Claude。
- 聊天模型:基于LLMs, 不同的是它接收聊天消息(一种特定格式的数据)作为输入,返回的也是聊天消息。专门优化对话场景的模型,以 “对话历史” 为输入,输出下一轮回复,如 ChatGPT。
- 文本嵌入模型:文本嵌入模型接收文本作为输入, 返回的是浮点数列表。将文本转化为数值向量(Embedding),用于后续的语义搜索、相似性对比,如 OpenAI 的 text-embedding-3-small。
2.1.LLMs (大语言模型)
LLMs使用场景最多,常用大模型的下载库:htps:/hugingface.co/models:

第一步:安装必备的工具包:langchain 和 langchain_llama(属于第三方库)
pip install langchain
pip install langchain-ollama
第二步:ollama工具的安装与使用
第三步:代码实现
from langchain_ollama import OllamaLLM llm = OllamaLLM(model="qwen3:0.6b", base_url="http://127.0.0.1:11434", verbose=True) result = llm.invoke("计算30天内,连续7天登录的系统的用户,请写出Hive SQL和pyspark dataframe计算代码?") print(result)
输出:
<think> 嗯,用户的问题是关于计算30天内连续7天登录的用户,并要求写出Hive SQL和Pyspark DataFrame的计算代码。首先,我需要明确用户的需求。他们可能是在处理日志数据,需要找出连续7天的用户登录记录,或者可能是在做一个数据处理任务,比如分析用户行为。 首先,Hive SQL部分需要处理时间序列数据。用户需要计算连续7天的用户登录情况,所以可能需要使用窗口函数,比如ROW_NUMBER(),或者使用日期函数来生成时间戳,然后进行分区,再计算连续时间。例如,可以使用分区和窗口函数来找出连续7天的用户,然后统计其登录次数。 接下来是Pyspark DataFrame的代码部分。用户可能希望用DataFrame来实现,所以需要先加载数据,然后进行必要的数据处理。比如,将日期转换为时间戳,然后应用窗口函数,计算连续时间。需要注意的是,分区可能需要使用group by,但用户可能只需要连续的7天,所以可能不需要分区,而是直接进行窗口操作。 另外,用户可能希望代码能够处理不同的时间范围,比如从当前日期开始,或者固定某个时间范围。需要确保代码正确处理时间范围的计算,比如用start_date和end_date来筛选。可能还需要考虑时间的精度,比如使用datetime类型,或者使用date类型,因为日期和时间的精度可能不同。 还需要考虑用户可能的权限问题,确保Hive环境和Pyspark配置正确。另外,可能需要处理不同的日期格式,比如在SQL中使用不同的日期函数,或者在DataFrame中使用不同的方法。 最后,确保代码示例正确,没有语法错误,并且能够正确运行。可能需要测试一下,比如使用示例数据,验证计算结果是否正确。同时,提醒用户关于分区和窗口函数的应用,确保他们理解这些概念。 </think> 以下是计算30天内连续7天登录用户的Hive SQL和Pyspark DataFrame的实现代码: --- ### **Hive SQL 实现** ```sql -- 从当前时间开始统计连续7天的用户登录情况 SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY) AS login_date, COUNT(*) AS total_login_count FROM ( SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY) AS login_date, COUNT(*) AS total_login_count FROM ( SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY) AS login_date, COUNT(*) AS total_login_count FROM ( SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY) AS login_date, COUNT(*) AS total_login_count FROM ( SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY) AS login_date, COUNT(*) AS total_login_count FROM ( SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY) AS login_date, COUNT(*) AS total_login_count FROM ( SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY) AS login_date, COUNT(*) AS total_login_count ) AS temp_table ) AS temp_df ) AS df ) AS df GROUP BY login_date ) AS result_df GROUP BY login_date; ``` --- ### **Pyspark DataFrame 实现** ```pyspark from pyspark.sql import SparkSession # 创建Spark环境 spark = SparkSession.builder.appName("user_login_analysis").getOrCreate() # 加载用户登录数据 login_data = spark.read.format("parquet").load("path/to/your/parquet/file") # 转换时间并计算连续7天的登录情况 login_data = login_data.withColumn( "login_date", spark.sql("SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY) AS login_date FROM your_table") ).groupBy( "login_date" ).count() # 统计连续7天的登录次数 result_df = login_data.filter( "login_date >= DATE_SUB(CURDATE(), INTERVAL 1 DAY)" ).select( "login_date", login_data.count.as("total_login_count") ) ``` --- ### **关键说明** - **Hive SQL**:通过窗口函数(`ROW_NUMBER()`)计算连续7天的用户,使用`DATE_SUB`生成时间戳。 - **Pyspark DataFrame**:直接使用`withColumn`和`groupBy`计算,避免复杂窗口函数,简化实现。 - **时间范围**:使用`login_date >= DATE_SUB(CURDATE(), INTERVAL 1 DAY)`筛选连续7天的登录记录。 如需处理更复杂的场景(如动态时间范围),可进一步扩展逻辑。
2.2.Chat Models (聊天模型)
Chat Models和LMs效果在某些场景表现基本类似,但是使用时需要按照约定传入合适的值。常用下载库:htps:/hugingface.co/models:

Chat Models (聊天模型)
- AIMesage:用来保存LLM的响应,以便在下次请求时把这些信息传回给LLM
- HumanMesage:发送给LLMs的提示信息,比如“实现一个快速排序方法”
- SystemMesage:设置LLM模型的行为方式和目标。你可以在这里给出具体的指示,比如“作为一个代码专家”,或者“返回json格式”
- ChatMesage:ChatMesage可以接收任意形式的值,但是在大多数时间,我们应该使用上面的三种类型
代码:
from langchain_core.messages import SystemMessage, HumanMessage from langchain_ollama import ChatOllama # 初始化模型,verbose指的为是否打印日志, verbose=True model = ChatOllama(model="qwen3:0.6b", base_url="http://127.0.0.1:11434", verbose=True) messages = [ SystemMessage(content="现在你是一个旅游攻略指南助手,返回一个详细的旅游攻略。格式是JSON"), HumanMessage(content="毛里求斯怎么去?") ] result = model.invoke(messages) print(result.content)
输出:
<think> 好的,用户问的是“毛里求斯怎么去?”,我需要先确定用户的需求。可能他们想了解从哪里出发去毛里求斯旅游,比如国内游客或者国际游客。首先,我需要考虑用户可能的旅行需求,比如他们计划去毛里求斯,可能需要知道到达的时间、交通方式、景点推荐等。 接下来,我要考虑用户可能的旅行目的。如果是国内游客,可能需要提供国内的交通方式,比如高铁或飞机,以及到达后的住宿和活动建议。如果是国际游客,可能需要考虑航班和租车的选项。另外,还要考虑季节因素,比如旅游旺季和淡季的情况,以及当地特色活动,比如潜水、海滩、庙会等。 还要注意用户可能没有明确提到的需求,比如预算、时间限制、最佳旅游季节等。可能需要提醒用户提前预订,特别是旺季时。另外,检查是否有其他潜在的问题,比如交通是否方便,是否需要提前了解路况等。最后,确保回答结构清晰,分点明确,方便用户快速获取信息。 </think> { "travel_guide": { "destination": "毛里求斯", "departure_methods": [ "国内游客": { "journey": "从国内出发,可通过高铁或飞机抵达毛里求斯。毛里求斯首都墨尔本是主要的旅游中心,建议提前预订高铁或飞机,费用约300-500美元。抵达后可先体验当地文化,如参观圣米歇尔教堂、海滩或参加当地节日活动。", "arrival_activities": [ "游览圣米歇尔教堂", "体验毛里求斯传统舞蹈", "参加当地庙会活动" ], "best_time_to_visit": "旅游季节为11月至2月,避开夏季高温,可享受海滩和自然景观。" }, "international_travelers": { "journey": "可通过航班抵达毛里求斯,建议选择直飞航班。毛里求斯是非洲大陆的旅游热点,可考虑租车体验当地特色路线,如潜水、登山或文化体验。", "arrival_activities": [ "潜水探索海洋与热带雨林", "体验当地传统手工艺", "参加毛里求斯节日庆典" ], "best_time_to_visit": "11月至2月,适合游客体验自然景观和文化活动。" }, "note": "建议提前预订交通和住宿,尤其是旺季时。毛里求斯的旅游旺季在11月至2月,需注意天气变化。" } }
2.3.Embedings Models(嵌入模型)
Embedings Models特点:将字符串作为输入,返回一个浮点数的列表。在NLP中,Embeding的作用就是将数据进行文本向量化。

from langchain_ollama import OllamaEmbeddings # 初始化模型 embeddings = OllamaEmbeddings(model="mxbai-embed-large:335m", base_url="http://127.0.0.1:11434") # 获取嵌入向量,embed_query是将一个字符串转换成嵌入向量 vector_list = embeddings.embed_query("This is a test.") print(vector_list) # [0.020143325, 0.023220235, 0.013053818, 0.033937946, -0.038514312, -0.0052596075, -0.019670874, -0.008066195, 0.01807622, 0.053068224, 0.022862865, 0.019412758, 0.01650531, -0.03063968, -0.019086448, -0.014320244, -0.033478435, 0.03494817, -0.04067661, -0.03344963, -0.02145446, 0.025206223, -0.011009471, -0.0073130224, -0.033535197, 0.017861674, -0.006639512, 0.011971183, 0.030061582, 0.034345105, -0.005912945, -0.0046768244, -0.014351455, -0.054932702, 0.016981892, -0.04387339, 0.07430083, -0.026813893, -0.0073883566, -0.03627902, -0.014150427, 0.025693605, 0.020288276, -0.01004328, -0.05226856, -0.046556726, -0.008970252, -0.028439503, -0.0062502394, 0.0038062232, 0.0033221846, 0.015625214, 0.0029300225, -0.0071346145, 0.011753024, -0.02113847, -0.04119482, -0.012118688, -0.05037154, 0.055872917, 0.051778503, 0.00932968, 0.012412914, -0.06382693, 0.0041515017, -0.02160458, -0.0068894145, -0.004452526, 0.009359618, -0.030992363, -0.009872186, 0.028424792, 2.2344058e-05, -0.020267311, -0.008440836, 0.0117134275, 0.016424777, 0.025128521, -0.020953745, 0.03896601, 0.019284861, 0.012466545, -0.008323315, -0.019412106, -0.06324506, -0.007951374, 0.014380363, 0.04225691, 0.03242358, -0.033539675, 0.01600717, 0.036078796, -0.049439177, 0.00811851, -0.02269708, -0.015218026, 0.018357286, -0.018566156, 0.043064747, -0.002094532, 0.039013185, 0.030634549, 0.00029247082, 0.055216108, -0.0811352, 0.03438414, 0.0014079582, -0.011444335, -0.041888542, -0.040272444, 0.020843038, -0.0016907882, 0.009943282, 0.0059930854, -0.054073624, 0.024714295, -0.018942531, 0.042813264, -0.03299869, -0.008737807, 0.019712085, 0.027161272, -0.013016215, -0.01696696, -0.007273428, 0.008004707, -0.031678643, 0.01046085, -0.03325398, -0.03019386, 0.009167146, 0.01593563, 0.026080793, 0.049709257, -0.012909701, -0.0030995558, 0.040684424, 0.026741855, 0.0054982244, -0.024646912, -0.01445858, 0.06123373, -0.0017711767, 0.07930829, 0.017817995, -2.2475575e-05, -0.010101176, -0.010912175, -0.013503875, 0.035113726, -0.044436183, -0.036937445, 0.010164007, -0.00048382342, -0.02917326, -0.021069482, -0.0005609923, -0.02181281, -0.023270799, 0.0020389555, -0.044649165, 0.03261631, -0.018087253, 0.013312366, -0.026068704, 0.012560936, -0.015174387, -0.00159381, -0.0005762165, -0.020301519, 0.024432482, 0.015590986, -0.007640361, -0.00069454534, 0.023581905, 0.02142747, 0.066636674, -0.01636702, 0.009607007, 0.022317283, -0.040344443, 0.0038075857, 0.0054252665, 0.060542986, -0.013464263, 0.024984317, -0.0061817225, -0.007001407, -0.017481802, -0.010929586, -0.012377779, 0.00045939768, -0.008687432, 0.038026493, 0.0014138197, 0.026626702, -0.030585544, 0.02375157, -0.0039912974, -0.10798682, -0.031437512, 0.03238704, -0.014207423, 0.010387288, -0.006851323, -0.039005104, 0.008729985, 0.019736517, -0.019057877, -0.007981066, 0.022603404, 0.046345353, 0.004896152, 0.016995953, 0.015725916, -0.009230111, -0.012918418, 0.025813106, 0.015174707, -0.00078373495, 0.00047151727, -0.012243688, 0.043944966, 0.012213668, 0.046914108, -0.025303228, -0.01868007, 0.07172996, -0.008728568, -0.008457789, 0.012165393, 0.0502339, 0.0019667717, 0.05587481, 0.024676032, 0.008171268, 0.03332203, 0.0038607602, 0.005661404, 0.03022033, 0.03166193, 0.0497432, 0.07068652, 0.043515064, -0.009979345, 0.014281297, -0.021219427, -0.0116051985, -0.0020230387, 0.014474055, 0.03946128, 0.037462346, 0.05961469, 0.02399133, -0.019871445, -0.005216934, 0.030458836, 0.043531895, -0.0076795733, -0.023443164, -0.011800639, -0.0042177984, -0.0064261267, -0.04426539, -0.0047758515, -0.010480951, 0.007465206, -0.010465361, 0.015305598, -0.03348581, -0.04383406, -0.030785017, -0.08974924, -0.037444204, 0.004800551, -0.00966274, 0.021584013, -0.07751323, -0.010608683, -0.07395826, -0.045040064, -0.026259236, -0.03138268, 0.049011927, -0.011840616, 0.03173154, -0.042899255, 0.0068959845, -0.013383513, 0.025941731, -0.017683644, -0.022221435, -0.023842411, -0.048136584, 0.044657674, -0.041438144, 0.0030248645, 0.025539791, 0.019510869, -0.049336843, 0.026847625, 0.021827549, -0.025475388, 0.012103229, -0.035231963, 0.012643914, 0.058119792, -0.013594329, 0.0033712988, 0.027987996, -0.012171306, 0.018152868, 0.008390013, -0.01035916, -0.03155077, 0.04959407, 0.036874738, -0.0144488765, 0.022282295, 0.014186566, -0.016829373, -0.046046026, -0.018949823, -0.020060025, 0.004404001, 0.022739861, -0.008992826, -0.08810585, 0.012618214, -0.024838457, -0.04680569, 0.012358309, -0.0118515985, 0.063184634, -0.0055377595, -0.026043583, -0.02437279, 0.017143548, 0.00016172444, 0.02185391, 0.0499157, -0.03454525, -0.03901784, 0.06925684, 0.035881992, 0.015450184, -0.031250626, -0.020578353, -0.013530684, -0.026648536, 0.011311943, 0.024996737, -0.03190243, 0.016744684, 0.018035525, 0.02237539, -0.0072537963, -0.0041383086, 0.038735576, -0.011396906, -0.03147794, 0.016341537, 0.037876192, 0.0332699, -0.030573325, -0.06443393, -0.036535393, 0.0070662517, 0.011715552, -0.08957667, 0.031308576, -0.049976565, 0.024610955, -0.017960789, 0.015976114, -0.038257595, 0.024110842, -0.014961996, 0.07875063, -0.07351, -0.04207065, 0.00088368723, -0.024962593, 0.051149163, -0.0045626163, 0.0059442767, 0.027433924, -0.0125776455, -0.04415637, -0.021793194, 0.0220156, 0.01262341, 0.016303707, 0.013330057, -0.066637434, -0.06554766, 0.0382191, 0.023770053, 0.027413642, 0.0044956654, 0.0039458214, -0.029026035, 0.012047465, 0.026439121, -0.06576307, 0.014255979, -0.03530785, 0.022548856, -0.01200157, -0.004264141, -0.054335944, 0.02495486, -0.037193436, -0.030781219, 0.043034263, 0.0064018555, -0.014260216, 0.058386553, -0.018667705, -0.01631809, -0.043733194, -0.026956387, -0.026223676, 0.018866954, 0.026340459, -0.03541614, -0.0008418629, -0.02281758, 0.04098664, 0.052290548, -0.022073807, -0.03807061, -0.016550543, -0.04094805, -0.061555628, -0.0053259265, 0.06347319, 0.0073335087, 0.0058210073, -0.01917171, 0.0034849446, -0.008611753, -0.020078931, -0.03514997, 0.010765197, 0.0041752188, 0.041309476, 0.026329948, -0.02490396, -0.032091066, 0.0023191122, -0.090781465, 0.026243398, -0.03146109, 0.012203933, -0.013890325, 0.004089978, -0.0001048642, 0.032655623, -0.027784735, -0.026894562, 0.0067646196, 0.02887535, -0.03773588, -0.021791046, 0.05546075, -0.010834428, -0.0008467453, 0.04054508, -0.025688559, 0.0036042528, -3.154766e-07, -0.008356512, -0.0078894105, 0.03679161, -0.023588955, 0.012222593, -0.0053776903, 0.001219069, -0.03961468, -0.020351013, 0.026647452, -0.006078098, -0.024154155, -0.07159707, -0.020786641, -0.029639633, -0.02949535, 0.0026978073, 0.029626079, 0.03739388, 0.0157897, -0.010648614, -0.014682804, -0.036677077, 0.014036356, -0.035932694, -0.015568503, -0.008672682, 0.058400173, -0.0058158725, -0.03041405, -0.027427359, -0.0017446106, -0.0153424, 0.0015025915, -0.022186175, 0.022342527, -0.021608606, 0.00998068, 0.002298441, 0.045570996, -0.006646106, 0.045498654, 0.04095529, 0.02307318, -0.006833978, -0.004067739, -0.05810712, 0.03598238, -0.008487437, -0.04107306, -0.03069207, 0.012860998, -0.010268882, 0.03310808, 0.03891558, -0.053953826, -0.02304196, -0.041365765, 0.004053986, -0.0011736032, 0.000348126, -0.06864147, -0.017100561, 0.023241011, 0.027597532, 0.0119317295, 0.005853207, -0.030974677, -0.05067905, 0.02771976, 0.017276386, 0.012237161, -0.0027004336, 0.013958663, -0.02553026, 0.051520046, 0.0065908534, 0.0058277617, 0.0074496395, 0.017750759, 0.0098990295, 0.029005686, -0.0064157816, -0.06745115, 0.013050551, -0.016084297, -0.004213146, 0.018977467, -0.06403837, 0.01673688, -0.025329938, -0.00012656426, -0.01129795, -0.023746468, -0.048427105, -0.019913854, 0.027982682, -0.012041509, -0.010677005, -0.0011879677, 0.03839798, 0.054145172, 0.02819074, -0.050273307, -0.018367674, 0.014881962, -0.062409583, 0.0349597, 0.02361994, -0.02017839, -0.037756685, -0.017102618, 0.060164284, -0.021703783, 0.045416005, 0.07406735, 0.016691212, -0.024396786, -0.010620184, 0.018478494, 0.011351042, 0.007478888, 0.0035084519, -0.05053139, -0.01700212, -0.013536408, -0.031377066, -0.038301326, -0.031945895, 0.002472051, 0.036662184, -0.0021234131, 0.031178987, -0.025919758, -0.046929687, -0.04453927, 0.028532695, 0.043184035, 0.016073056, 0.033818025, 0.032038495, -0.037934452, 0.005084273, -0.013424718, -0.017427452, -0.013873275, 0.027163409, 0.016230846, -0.033423662, 0.042457525, 0.037839536, -0.08011076, -0.027412793, 0.0018787981, -0.0014327382, -0.009434042, -0.02581054, -0.02980918, -0.011142875, -0.011969281, -0.010367627, -0.00081694446, -0.03356138, 0.005811254, -0.035931565, -0.018516677, -0.026561938, -0.019487374, 0.033343997, -0.043278825, 0.032262757, -0.04255039, -0.0009880954, -0.0010620242, -0.012001635, 0.006334314, -0.0031526205, -0.024351854, 0.03486166, 0.0038279209, 0.076858185, -0.02341787, 0.008594377, 0.08248263, -0.03207462, -0.042530805, -0.025519662, 0.012039417, 0.017443705, 0.031774208, -0.048081305, -0.0014355155, 0.04906359, 0.0021204497, 0.04243545, -0.008796671, -0.06471469, -0.014275239, -0.013007635, 0.013467585, -0.020870144, -0.0007071882, 0.048241816, -0.00045942902, 0.015206261, -0.017530398, 0.034945562, -0.0059242113, -0.0048464905, -0.03142097, 0.013639065, 0.016376056, -0.014047061, -0.006175075, -0.036267877, -0.023961265, 0.028545275, -0.035024736, -0.009422118, 0.011901507, 0.038895342, -0.012172891, 0.026009833, -0.018659085, -0.020876322, 0.031182386, 0.014557623, -0.022693546, -0.005849332, 0.019530436, -0.011972534, -0.015880879, -0.018921811, 0.0175993, -0.024750939, 0.03246089, 0.050566442, -0.0028863866, -0.00041078968, -0.042097926, -0.03478429, -0.036631346, -0.010609753, -0.025863055, -0.010712082, 0.021263858, 0.0026233934, 2.0989937e-05, 0.030875962, -8.460444e-05, 0.023299595, -0.013190669, 0.031458214, 0.0249545, 0.008140038, 0.039238278, 0.02001036, -0.008520291, 0.033614613, -0.016984269, -0.026184108, -0.0037708674, 0.0016769865, -0.01517108, 0.0043208404, 0.04905381, 0.037403375, -0.00744715, 0.026793422, 0.021778895, -0.0075496933, 0.058513984, -0.0071230903, -0.06638246, -0.004469809, -0.05418858, -0.040891767, -0.01885323, 0.012427448, -0.012682229, 0.037628863, -0.05895284, -0.0136246, 0.02762708, 0.012630921, -0.01562339, 0.010280317, -0.0037810537, 0.024563763, -0.0011548942, -0.021452487, -0.0001303461, 0.052253902, -0.04796567, -0.037864853, -0.008081065, -0.015079185, 0.034890495, 0.033246126, -0.048703033, -0.00034446627, -0.028627634, -0.012551425, 0.038558163, -0.0042458135, -0.05122522, -0.008914948, -0.014794051, 0.029959323, 0.03906537, 0.029603472, 0.011069885, -0.007732519, -0.03441805, 0.010828263, 0.023084458, -0.01747094, 0.01229966, -0.0024297575, 0.016369008, 0.00772215, -0.003565068, 0.0015697756, 0.05987269, -0.0040656202, 0.045584038, 0.018219344, 0.017683445, 0.063310616, -0.025472324, -0.00760862, 0.0074802656, -0.00348644, 0.029532459, 0.014225529, -0.044296682, 0.021177698, 0.025172906, -0.029286645, 0.0046617263, -0.043891493, -0.017450284, -0.040178917, -0.021624286, 0.054891355, -0.021231545, -0.008145246, -0.0257034, 0.037572846, 0.026247976, 0.028305687, -0.066978075, -0.013698859, 0.03934961, 0.008504729, 0.0008543185, 0.04710698, -0.007994642, 0.0049391426, -0.03168783, 0.013292381, 0.028853895, -0.003966878, 0.003799959, -0.038826045, -0.03890465, 0.04977687, 0.04905491, -0.014755506, 0.048845503, -0.03784776, 0.020983083, -0.044351522, 0.02769421, -0.05550165, 0.0043595075, 0.024720231, 0.0045212004, -0.025763048, 0.040589344, 0.011925344, 0.005811198, 0.015667265, 0.05618185, 0.041979257, 0.084301345, 0.04435149, 0.0057533532, -0.002260898, -0.0035587403, -0.03337722, -0.005215099, -0.000105670544, -0.016332764, 0.040875215, -0.0050035845, -0.015521603, -0.01979027, 0.0049103713, -0.007154977, -0.029835647, -0.015105908, 0.016322838, -0.040663917, -0.0027335049, 0.03235222, 0.054292016, 0.07736596, -0.03013345, -0.013115373, 0.03954663, 0.0053042015, -0.00458153, 0.053492162, 0.0105872825, -0.03443839, -0.03268989, -0.03071161, -0.008130206, -0.0044329227, 0.009896808, -0.04082848, 0.023766099, 0.022230292, 0.012616884, 0.030239414, -0.06565665, -0.010198355, -0.005544431, 0.020431645, -0.018988447, 0.060739055, 0.030312764, 0.0042980737, 0.0075755836, -0.031143885, 0.00094557076, 0.024855616, -0.014756054, -0.006808513, 0.0050944304, -0.020600704, -0.0032406787, 0.016009606, 0.04176066, -0.05004365, 0.01259786, -0.083121344, -0.039690435, -0.020475764, -0.014362742, -0.022842668, 0.061212983, -0.026015913, -0.017418409, -0.003383867, -0.06008828, 0.27428132, -0.018235581, 0.00017172952, -0.015703546, 0.007850405, 0.029397378, 0.025846642, -0.034253735, 0.0047044153, 0.044364605, 0.0149622755, 0.007768065, -0.00033260247, 0.009405263, 0.03419811, 0.01577178, -0.028139023, 0.0036639355, 0.051608108, -0.032496065, -0.017950395, -0.0037522449, -0.0026107624, 0.0214759, 0.004922342, -0.0065724747, 0.03717647, -0.046468336, 0.013082498, -0.011499931, 0.05303171, -0.011231761, 0.012633999, -0.006245356, -0.020334085, 0.027189992, 0.019634048, -0.011503219, -0.025193786, -0.024161017, 0.009778829, 0.027960103, 0.06569908, -0.0076757395, -0.054957975, 0.04682279, -0.036534935, 0.052401897, 0.016611874, -0.020950774, 0.02221372, -0.014021129, 0.06731276, 0.01562236, -0.06766321, 0.011470834, 0.008664225, -0.017722746, -0.031667277, 0.027772168, 0.018274376, -0.011773684, 0.0179706, -0.007749574, -0.0441205, 0.009263652, 0.03484399, 0.0079478845, 0.00276422, -0.005173277, 0.016413495, 0.02270521, -0.034739014, -0.01915334, 0.023859784, 0.015585446, -0.032142647, 0.036271796, -0.009596722, -0.03662757, 0.010487174, -0.025555745, -0.00628393, 0.01888583, 0.025493488, 0.041943744, -0.012095104, -0.0021641878, -0.060083315, 0.018939508, 0.013416366, -0.0012066684, 0.025239615, 0.012234322, -0.028217921] # 获取嵌入向量,embed_documents是批量处理(传入多个文本为列表),embed_query是单句处理,输入为list embedding_vectors = embeddings.embed_documents(["竹杖芒鞋轻胜马,一蓑烟雨任平生", "春江花月夜,西风瘦马,客输西风"]) print(embedding_vectors) # [[-0.016822716, 0.0008631546, 0.02038842, -0.0017873225, -0.059407614, -0.024285058, 0.023787955, 0.023871439, 0.0664984, 0.035049446, 0.02635703, 0.0071434285, 0.016544886, 0.0053953007, -0.028608883, -0.017306726, 0.007090203
三、Prompts组件
Prompt的作用和形式
- Prompt是用户输入信息给模型时加入的提示信息
- 主要形式包括:
- zero-shot:直接给出任务描述,不提供示例
- few-shot:提供少量示例来引导模型理解任务
在Langchain中的应用
Langchain框架提供了完整的Prompt处理工具:
- PromptTemplate:用于创建可重用的提示模板
- FewShotPromptTemplate:专门用于few-shot学习场景
- ChatPromptTemplate:用于聊天模型的提示模板
实际应用价值
- 帮助模型理解复杂的业务场景
- 提升模型解决问题的准确性
- 通过示例展示期望的输出格式
- 在嵌入模型使用中,合适的Prompt可以提升语义理解效果
3.1.zero-shot 示例
zero-shot 是指在提示中只描述任务要求,不提供具体示例:
from langchain_core.prompts import PromptTemplate from langchain_ollama import OllamaLLM # 1.指定模板 zero_shot_prompt = PromptTemplate( input_variables=["input_text"], template="""请将以下英文翻译为中文: {input_text}""", ) # 2.使用模板 prompt_text = zero_shot_prompt.format(input_text="Hello, how are you today?") print(prompt_text) # 3.初始化模型 model = OllamaLLM(model="qwen3:30b", base_url="http://127.0.0.1:11434") # 4.生成结果 output = model.invoke(prompt_text) print(output)
输出:
请将以下英文翻译为中文:Hello, how are you today?
你好,今天怎么样?
3.2.few-shot 示例
few-shot 是指在提示中提供少量示例来引导模型理解任务:
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate from langchain_ollama import OllamaLLM # 1.定义示例 examples = [ {"input": "How are you?", "output": "你好吗?"}, {"input": "I love programming.", "output": "我非常喜欢编程。"}, {"input": "I am a beginner.", "output": "我正在学习。"} ] # 2.定义示例模版 few_shot_prompt = PromptTemplate.from_template("输入:{input}\n输出:{output}") # 3.创建few-shot提示模板 few_shot_template = FewShotPromptTemplate( examples=examples, # 示例 example_prompt=few_shot_prompt, # 示例模版 prefix="请将以下英文翻译为中文:", # 前缀 suffix="输入:{input}\n输出:", # 后缀 input_variables=["input"], # 输入变量 example_separator="\n\n", # 示例分隔符 ) # 4.使用示例 prompt_text = few_shot_template.format(input="Hello, how are you today?") print(prompt_text) # 5.初始化模型 model = OllamaLLM(model="qwen3:30b", base_url="http://127.0.0.1:11434") # 6.生成结果 output = model.invoke(prompt_text) print(output)
3.3.ChatPromptTemplate 使用案例
ChatPromptTemplate 是 LangChain 中用于构建聊天模型提示的模板类,它支持系统消息、人类消息和AI消息等多种消息类型。
from langchain_core.prompts import ChatPromptTemplate from langchain_ollama import OllamaLLM # 1.创建聊天模版 chat_prompt = ChatPromptTemplate.from_messages( [ ("system", "你是一个 helpful 的 AI 助手,擅长{skill}。"), ("human", "你好,我需要帮助。"), ("ai", "你好!我很乐意帮助你。有什么我可以帮你的吗?"), ("human", "请将以下英文翻译为中文:{input_text}") ]) # 2.格式化提示模版 prompt_text = chat_prompt.format(skill="翻译", input_text="Hello, how are you today?") print("生成的提示:", prompt_text) # 3.初始化模型 model = OllamaLLM(model="qwen3:30b", base_url="http://127.0.0.1:11434") output = model.invoke(prompt_text) print("生成的结果:", output)
输出:
生成的提示: System: 你是一个 helpful 的 AI 助手,擅长翻译。
Human: 你好,我需要帮助。
AI: 你好!我很乐意帮助你。有什么我可以帮你的吗?
Human: 请将以下英文翻译为中文:Hello, how are you today?
生成的结果: 你好,今天怎么样?
四、Chain组件
4.1.单个链创建
在LangChain中,Chains组件用于将LLM与其他组件(如提示模板)连接起来构建应用程序。针对上一章节提供的ChatPromptTemplate示例,可以使用LLMChain(新版本已经不推荐,使用 | 管道符即可链接)来连接提示模板和模型。
from langchain_core.prompts import ChatPromptTemplate from langchain_ollama import OllamaLLM # 1.创建聊天模版 chat_prompt = ChatPromptTemplate.from_messages( [ ("system", "你是一个 helpful 的 AI 助手,擅长{skill}。"), ("human", "你好,我需要帮助。"), ("ai", "你好!我很乐意帮助你。有什么我可以帮你的吗?"), ("human", "请将以下英文翻译为中文:{input_text}") ]) # 2.初始化模型 model = OllamaLLM(model="qwen3:30b", base_url="http://127.0.0.1:11434") # 3.创建chain链, 将提示模版和模型连接起来 chain = chat_prompt | model # 4.使用链式生成结果 result = chain.invoke({ "skill": "翻译", "input_text": "Hello, how are you today?"}) # 5.打印结果 print("生成的结果:", result)
4.2.多个链创建
如果你想将第一个模型输出的结果,直接作为第二个模型的输入,还可以使用LangChain的SimpleSequentialChain(新版本不推荐使用,多个链均使用 | 管道符链接), 代码如下:
from langchain_core.prompts import ChatPromptTemplate from langchain_ollama import OllamaLLM # 1.创建第一个链 - 英文翻译为中文 # 1.1 创建聊天模版 translate_prompt = ChatPromptTemplate.from_messages( [ ("system", "你是翻译专家。"), ("human", "请将以下英文翻译为中文:{input_text}") ]) # 1.2 初始化模型 model = OllamaLLM(model="qwen3:30b", base_url="http://127.0.0.1:11434") # 1.3 创建第一个链 translate_chain = translate_prompt | model # 2.创建第二链 - 中文润色 # 2.1 创建聊天模版 correct_prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个中文语言专家。"), ("human", "对以下中文文本进行润色,使其更加流畅自然:{input_text}") ]) # 2.2 第二个链 polish_chain = correct_prompt | model # 3 创建顺序链,如果需要顺序执行两个链,可以通过|链接: 念去去千里烟波,暮霭程程楚天阔,翻译的英文 chain = translate_chain | polish_chain result = chain.invoke({"input_text": "Thinking of the vast expanse of misty waves thousands of miles away, the evening mist gradually clears up the vast expanse of the sky"}) print(result)
输出如下:
遥想千里之外,雾霭弥漫的海天,暮霭渐散,天光乍现。
五、Agents组件
在 LangChain 中 Agents 的作用就是根据用户的需求,来访问一些第三方工具(比如:搜索引擎或者数据库),进而来解决相关需求问题。
后续章节使用会发现有一些方法有警告,这是因为官方一直在调整,未来方向(官方明确)
- ✅ LangChain 核心库(
langchain-core)将持续维护并作为标准接口; - ✅ 新 Agent 开发推荐使用 LangGraph(所以这一块你会发现新版本有很多方法不可用);
- ⚠️ 旧版
AgentExecutor进入维护模式,不推荐新项目使用; - ✅ LangChain 的 Chains、RAG、Document Loaders 等依然广泛使用。
Agents组件有四个如下:
5.1.Agent代理
- 制定计划和思考下一步需要采取的行动
- 负责控制整段代码的逻辑和执行,代理暴露了一个接口,用来接收用户输入,并返回AgentAction或AgentFinish。
5.2.Toolkit工具包
- 一 些 集 成 好 了 代 理 包 , 比 如 create_csv_agent 可以使用模型解读csv文件。
准备data.csv,内容如下:

获取文件内容
from langchain_experimental.agents import create_csv_agent from langchain_ollama import OllamaLLM # 1.初始化模型 llm_model = OllamaLLM(model="qwen3:30b", base_url="http://127.0.0.1:11434") # 2.创建csv代理 agent = create_csv_agent(llm_model, "data.csv", allow_dangerous_code=True) # 3.使用代理 a = agent.invoke("data.csv文件中一共多少行?") print(a)
输出如下:
{'input': 'data.csv文件中一共多少行?', 'output': '5'}
5.3.Tool工具
- 解决问题的工具
- 第三方服务的集成,比如计算器、网络、搜索(谷歌、bing)等等
获取所有的工具包
# 获取所有工具名称 from langchain_community.agent_toolkits.load_tools import get_all_tool_names # 获取所有工具 tools = get_all_tool_names() print(tools)
输出:
['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支持的工具包

5.4.AgentExecutor代理执行器
它将代理和工具列表包装在一起,负责迭代运行代理的循环,直到满足停止的标准。
from langchain_community.agent_toolkits.load_tools import load_tools from langchain.agents import initialize_agent from langchain.agents import AgentType from langchain_ollama import OllamaLLM # 1.初始化大模型 model = OllamaLLM(model="deepseek-r1:32b", base_url="http://127.0.0.1:11434") # 2.设置工具,"serpapi", "llm-math" 分别是搜索API和数学计算工具 tools = load_tools(["serpapi", "llm-math"], llm=model, serpapi_api_key="8b6443709e2655475ff5e3ff3299ff9bb77d16f1931bc4bef9c0107a61f8664e") # 3.实例化代理Agent, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTIONh指的是使用ReAct # ZERO_SHOT: 零样本学习,表示代理可以在没有特定任务训练的情况下直接执行任务 # REACT: 基于 ReAct 框架(Reasoning + Acting),结合推理和行动 agent = initialize_agent(tools, model, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) # 4.准备提示词模版,使其更明确地指导LLM生成正确的数学表达式 prompt_text = "解以下方程:3x + 4(x + 2) - 84= y; 其中x为3,请问y是多少?" # 5.使用代理 result = agent.invoke({"input": prompt_text}) print(result)
输出:
/Users/augus/code/LargeLanguageModelDevelopment/local_knowledge_base/agents_case3.py:17: LangChainDeprecationWarning: LangChain agents will continue to be supported, but it is recommended for new use cases to be built with LangGraph. LangGraph offers a more flexible and full-featured framework for building agents, including support for tool-calling, persistence of state, and human-in-the-loop workflows. For details, refer to the `LangGraph documentation <https://langchain-ai.github.io/langgraph/>`_ as well as guides for `Migrating from AgentExecutor <https://python.langchain.com/docs/how_to/migrate_agent/>`_ and LangGraph's `Pre-built ReAct agent <https://langchain-ai.github.io/langgraph/how-tos/create-react-agent/>`_. agent = initialize_agent(tools, model, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) > Entering new AgentExecutor chain... To find y when x = 3 in the equation 3x + 4(x + 2) -84 = y: 1. Substitute x with 3: 3(3) + 4(3 + 2) - 84 = y 2. Simplify each term: 9 + (4 * 5) - 84 = y → 9 + 20 - 84 = y 3. Combine the numbers: 29 - 84 = y → y = -55 Final Answer: y = \boxed{-55} > Finished chain. {'input': '解以下方程:3x + 4(x + 2) - 84= y; 其中x为3,请问y是多少?', 'output': 'y = \\boxed{-55}'}
但是能明显看到官方已经不在推荐,有警告信息,可以通过langgraph实现
# ✅ 明确使用 LangGraph 的 create_react_agent from langgraph.prebuilt import create_react_agent from langchain_core.tools import tool from langchain_ollama import ChatOllama @tool def calculator(expr: str) -> str: """Evaluate a mathematical expression, e.g., '3*3 + 4*(3+2) - 84'.""" import numexpr try: result = numexpr.evaluate(expr) return str(result.item() if hasattr(result, 'item') else result) except Exception as e: return f"Error: {e}" model = ChatOllama(model="qwen3:30b", base_url="http://127.0.0.1:11434") # ✅ prompt 是字符串(LangGraph 支持) agent = create_react_agent( model, tools=[calculator], prompt="You are a helpful assistant. Always use the calculator tool for math." ) # 调用 result = agent.invoke({"messages": [("human", "计算 3*3 + 4*(3+2) - 84")]}) # 结果 print(result["messages"][2].content)
六、Memory组件
大模型本身不具备上下文的概念,它并不保存上次交互的内容,ChatGPT之所以能够和人正常沟通对话,因为它进行了一层封装,将历史记录回传给了模型。因此 LangChain 也提供了Memory组件, Memory分为两种类型:
- 短期记忆:短期记忆一般指单一会话时传递数据
- 长期记忆:长期记忆则是处理多个会话时获取和更新信息
6.1.ChatMessageHistory
目前的Memory组件只需要考虑ChatMessageHistory。举例分析:
from langchain_community.chat_message_histories import ChatMessageHistory # 创建一个聊天历史对象 history = ChatMessageHistory() # 添加用户消息 history.add_user_message("您好!") # 添加ai消息 history.add_ai_message("我是ai助手,有什么可以帮您的吗?") # 添加用户消息 history.add_user_message("我需要了解今日的市场榴莲的交易价格") # 添加ai消息 history.add_ai_message("您好!今日榴莲均价21.85元") # 获取所有消息 print(history.messages)
输出:
[HumanMessage(content='您好!', additional_kwargs={}, response_metadata={}), AIMessage(content='我是ai助手,有什么可以帮您的吗?', additional_kwargs={}, response_metadata={}), HumanMessage(content='我需要了解今日的市场榴莲的交易价格', additional_kwargs={}, response_metadata={}), AIMessage(content='您好!今日榴莲均价21.85元', additional_kwargs={}, response_metadata={})]
6.2.ConversationChain结合大模型实现
和qwen结合,直接使用 ConversationChain:
from langchain.chains import ConversationChain from langchain_ollama import OllamaLLM # 1.实例化大模型 model = OllamaLLM(model="qwen3:30b", base_url="http://127.0.0.1:11434") # 2.实例化会话链 chain = ConversationChain(llm=model) # 5.使用会话链,添加消息 chain.predict(input="您好!") chain.predict(input="我需要了解今日的市场榴莲的交易价格") # 直接打印会话对象,观察会话记录 print(chain)
输出:

6.3.RunnableWithMessageHistory
LangChain 0.2.7 后推荐使用RunnableWithMessageHistory替代ConversationChain,更灵活且支持更多记忆类型。示例改写:
from langchain_core.chat_history import InMemoryChatMessageHistory from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables.history import RunnableWithMessageHistory from langchain_ollama import OllamaLLM from langchain_core.prompts import MessagesPlaceholder # 1.实例化大模型 model = OllamaLLM(model="qwen3:30b", base_url="http://127.0.0.1:11434") # 2.定义prompt模版(包含对话历史占位符) prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个 helpful 的 AI 助手,擅长{skill}。"), # ("human", "{input}"), # 用户输入 ("ai", "{output}"), # ai输出 MessagesPlaceholder("history") # 会话历史占位符 ]) # 3.创建带历史的可运行对象 chain = prompt | model # 创建链,将提示词和模型链接起来 # 创建带历史的可运行对象 chain_with_history = RunnableWithMessageHistory( chain, lambda session_id: InMemoryChatMessageHistory(), # 创建会话历史对象,内存存储 input_messages_key="input", output_messages_key="output", history_messages_key="history" ) # 4.使用会话链,通过会话ID创建会话进行区分 res1 = chain_with_history.invoke({"input": "您好!我需要了解2022年全年大米价格走势", "skill": "农副产品分析", "output": ""}, config={"configurable": {"session_id": "sid00001"}}) res2 = chain_with_history.invoke({"input": "我需要了解2023年5月的市场榴莲的交易价格", "skill": "农副产品分析", "output": ""}, config={"configurable": {"session_id": "sid00002"}}) print(res1) print(res2)
输出如下:

七、Indexs组件
Indexes组件的目的是让LangChain具备处理文档处理的能力,包括:文档加载、检索等。注意,这里的文档不局限于txt、pdf等文本类内容,还涵盖email、区块链、视频等内容。

7.1.文档加载器
文档加载器主要基于 Unstructured 包,`转换成文本。文档加载器使用起来很简单,只需要引入相应的loader工具:Unstructured是一个python包,可以把各种类型的文件,需要先安装
# 需要安装最新的包 pip install angchain_unstructured
LangChain支持的文档加载器 (部分):

加载文本:
from langchain_unstructured import UnstructuredLoader # 1.创建加载器 loader = UnstructuredLoader("衣服属性.txt", encoding="utf-8") # 2.加载数据 data = loader.load() # 3.打印数据,观察数据,data[0]表示第一个数据,data[0].page_content表示数据内容 res = data[0].page_content[:100] # 只打印前100个字符 print(res)

7.2.文档分割器
LangChain中最基本的文本分割器是CharacterTextSplitter,它按照指定的分隔符(默认“\n\n”)进行分割,并且考虑文本片段的最大长度。
from langchain_text_splitters import CharacterTextSplitter, TextSplitter from langchain_unstructured import UnstructuredLoader # 1.创建加载器 loader = UnstructuredLoader("衣服属性.txt", encoding="utf-8") # 2.加载数据 data = loader.load() # 3.打印数据,观察数据,data[0]表示第一个数据,data[0].page_content表示数据内容 # res = data[0].page_content[:100] # 只打印前100个字符 # print(res) # 4.创建分词器 text_splitter = CharacterTextSplitter( separator="\n", # 分割符,默认为\n\n chunk_size=1000, # 每次分割的字符长度 chunk_overlap=200, # 每次分割的 overlap(前后重叠的字符) 长度,默认为0 length_function=len, # 长度函数 is_separator_regex=False, # 是否使用正则表达式进行分割 ) # 5.分词 all_chunks = [] for document in data: chunks = text_splitter.split_text(document.page_content) # 便利数据,对数据进行分词 all_chunks.extend(chunks) # 将分词结果添加到all_chunks中,列表的extend方法,可以将一个列表中的元素添加到另一个列表中 print(f"总共分割成 {len(all_chunks)} 个文本块") print(all_chunks)
输出:

除了CharacterTextSplitter分割器,LangChain还支持其他文档分割器 (部分):

7.3.VectorStores
VectorStores是一种特殊类型的数据库,它的作用是存储由嵌入创建的向量,提供相似查询等功能。我们使用其中一个 Chroma 组件作为例子(pip install chromadb):
from langchain_community.vectorstores import Chroma from langchain_text_splitters import CharacterTextSplitter from langchain_unstructured import UnstructuredLoader from langchain_ollama import OllamaEmbeddings # 1.创建加载器 loader = UnstructuredLoader("衣服属性.txt", encoding="utf-8") # 2.加载数据 data = loader.load() # 3.打印数据,观察数据,data[0]表示第一个数据,data[0].page_content表示数据内容 # res = data[0].page_content[:100] # 只打印前100个字符 # print(res) # 4.创建分词器 text_splitter = CharacterTextSplitter( separator="\n", # 分割符,默认为\n\n chunk_size=1000, # 每次分割的字符长度 chunk_overlap=200, # 每次分割的 overlap(前后重叠的字符) 长度,默认为0 length_function=len, # 长度函数 is_separator_regex=False, # 是否使用正则表达式进行分割 ) # 5.分词 all_chunks = [] for document in data: chunks = text_splitter.split_text(document.page_content) # 便利数据,对数据进行分词 all_chunks.extend(chunks) # 将分词结果添加到all_chunks中,列表的extend方法,可以将一个列表中的元素添加到另一个列表中 print(f"总共分割成 {len(all_chunks)} 个文本块") print(all_chunks) # 6.实例化嵌入式模型,创建向量数据库 model = OllamaEmbeddings(model="mxbai-embed-large:335m", base_url="http://127.0.0.1:11434") # 7.使用向量数据库Chroma存储 db = Chroma.from_texts( all_chunks, # 文本块 model, # 嵌入模型 collection_name="ollama_chroma_collection" # 向量数据库名称 ) # 8.查询向量数据库 results = db.similarity_search( "衣服所用材质成分是什么?", # 查询内容 k=1 # 返回结果数量 ) print(f"衣服所用材质成分是: {results[0].page_content}")
输出:

LangChain支持的VectorStore如下:VectorStore

7.4.检索器
检索器是一种便于模型查询的存储数据的方式,LangChain约定检索器组件至少有一个方法invoke,这个方法接收查询字符串,返回一组文档。
pip install faiss
Chroma 和 FAISS 都是常用的向量数据库,但它们有以下主要区别:
- Chroma
- 开发背景:专门为AI应用设计的嵌入式向量数据库
- 存储方式:支持内存和磁盘持久化存储
- 查询功能:内置元数据过滤和混合搜索功能
- 易用性:API简单直观,易于上手
- 部署:支持本地和云端部署
- FAISS
- 开发背景:由Facebook AI开发的高效相似性搜索库
- 性能优势:在大规模向量搜索方面性能优异
- 算法支持:支持多种索引类型和搜索算法
- GPU支持:原生支持GPU加速(在支持的平台上)
- 灵活性:提供更多底层控制选项
- 选择建议
- 如果需要简单易用的解决方案,选择 Chroma
- 如果需要处理大规模向量数据或追求极致性能,选择 FAISS
下面的案例讲解检索器,还是之前的案例,只是将向量数据库由Chroma换成了FAISS
from langchain_community.vectorstores import Chroma, FAISS from langchain_text_splitters import CharacterTextSplitter from langchain_unstructured import UnstructuredLoader from langchain_ollama import OllamaEmbeddings # 1.创建加载器 loader = UnstructuredLoader("衣服属性.txt", encoding="utf-8") # 2.加载数据 data = loader.load() # 3.打印数据,观察数据,data[0]表示第一个数据,data[0].page_content表示数据内容 # res = data[0].page_content[:100] # 只打印前100个字符 # print(res) # 4.创建分词器 text_splitter = CharacterTextSplitter( separator="\n", # 分割符,默认为\n\n chunk_size=1000, # 每次分割的字符长度 chunk_overlap=200, # 每次分割的 overlap(前后重叠的字符) 长度,默认为0 length_function=len, # 长度函数 is_separator_regex=False, # 是否使用正则表达式进行分割 ) # 5.分词 chunks = text_splitter.split_documents(data) # split_documents分词因为FAISS,需要的是Document对象 print(f"总共分割成 {len(chunks)} 个文本块") print(chunks) # 6.实例化嵌入式模型,创建向量数据库 model = OllamaEmbeddings(model="mxbai-embed-large:335m", base_url="http://127.0.0.1:11434") # 7.使用向量数据库FAISS存储 db = FAISS.from_documents( chunks, # 文档列表 model # 嵌入模型 ) # 8.保存向量数据库 db.save_local("./data/test") # 9.创建检索器 retriever = db.as_retriever(search_kwargs={"k": 1}) # 10.查询向量数据库 results = retriever.invoke("衣服所用材质成分是什么?") print(f"衣服所用材质成分是: {results[0].page_content}")
输出:

LangChain支持的检索器组件如下:

八、LangChain应用

浙公网安备 33010602011771号