精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

智能簡歷篩選案例拆解:基于LlamaIndex+LangChain的框架開發(fā)

人工智能
簡歷篩選場景的三大核心痛點、包含數(shù)據(jù)處理流水線、雙層知識存儲引擎,以及基于 LCEL 對話式 RAG 應(yīng)用鏈的核心架構(gòu),最后完整的演示下框架化的開發(fā)流程并進(jìn)行效果驗證。

上一篇文章介紹了使用基礎(chǔ)組件,實現(xiàn)企業(yè)規(guī)章制度 RAG 問答的案例。這種原生開發(fā)方式雖然有助于更直觀的理解 RAG 原理,但在面對更復(fù)雜的業(yè)務(wù)場景時,開發(fā)效率和功能擴展性方面的局限就會很明顯。尤其是包含異構(gòu)文件整合、結(jié)構(gòu)化信息提取和多輪對話交互的綜合性應(yīng)用,引入成熟的開發(fā)框架成為合理選擇。

正本清源:原生RAG入門案例拆解(企業(yè)規(guī)章制度問答)+ 技術(shù)棧全景

這篇基于兩個月前,我給一家獵頭公司做項目咨詢中的簡歷篩選場景,來演示下如何利用 LlamaIndex 和 LangChain 兩大主流框架,構(gòu)建一個智能簡歷篩選系統(tǒng)。

這篇試圖說清楚:

簡歷篩選場景的三大核心痛點、包含數(shù)據(jù)處理流水線、雙層知識存儲引擎,以及基于 LCEL 對話式 RAG 應(yīng)用鏈的核心架構(gòu),最后完整的演示下框架化的開發(fā)流程并進(jìn)行效果驗證。

1、業(yè)務(wù)背景

傳統(tǒng)的簡歷處理方式,無論是人工審閱還是基于關(guān)鍵詞的初步篩選,都存在固有的局限性。這篇以當(dāng)下比較火熱的 AI 產(chǎn)品經(jīng)理崗位招聘為例,從異構(gòu)文件的統(tǒng)一接入、精準(zhǔn)篩選與模糊檢索的平衡,以及信息檢索到?jīng)Q策輔助三個維度,拆解下該場景面臨的三個潛在痛點。

1.1異構(gòu)文件的統(tǒng)一問題

企業(yè)在招聘過程中,收到的簡歷文件格式通常橫跨 PDF、DOCX 等多種類型。這兩種主流格式在內(nèi)部結(jié)構(gòu)上差別很大。PDF 文件注重版式的精確固定,文本內(nèi)容的提取往往伴隨著換行、分頁等格式噪聲;而 DOCX 文件則以內(nèi)容流為核心,結(jié)構(gòu)相對清晰但同樣存在樣式多變的問題。

在不使用框架的情況下,需要給每一種文件格式編寫?yīng)毩⒌慕馕鲞壿?,例如使?PyMuPDF 庫處理 PDF 文件,使用 python-docx 庫處理 DOCX 文件。這將導(dǎo)致數(shù)據(jù)加載模塊的代碼維護起來有些費勁。每次需要支持新的文件格式時,都必須對核心代碼進(jìn)行修改和擴展。

1.2精準(zhǔn)篩選與模糊檢索的平衡

招聘需求(JD)中通常包含必須滿足的硬性指標(biāo),如”工作經(jīng)驗超過 5 年且具備 RAG 項目實戰(zhàn)經(jīng)驗“。智能簡歷篩選系統(tǒng)需要能夠像數(shù)據(jù)庫一樣,對這類條件進(jìn)行精準(zhǔn)識別和邏輯判斷。但是,傳統(tǒng)的關(guān)鍵詞匹配方式嚴(yán)重依賴精確的字符串匹配,無法處理表述方式的差異。當(dāng)候選人簡歷中使用“檢索增強生成技術(shù)”而不是“RAG”的時候,關(guān)鍵詞檢索就會漏掉這部分信息。

同時,許多候選人的能力描述可能與招聘需求的字面表述不完全一致,但語義上高度相關(guān)。例如,招聘需求中要求“LangChain 框架實踐項目經(jīng)驗”,但是候選人簡歷中可能表述為“負(fù)責(zé) RAG 流水線技術(shù)實現(xiàn)”或“主導(dǎo)智能問答系統(tǒng)構(gòu)建”。這些表述在語義上高度關(guān)聯(lián),基于向量的語義檢索能夠有效識別這種潛在匹配。

1.3從信息檢索到?jīng)Q策輔助

招聘決策的關(guān)鍵在于對多個候選人進(jìn)行標(biāo)準(zhǔn)化的橫向?qū)Ρ?。這也就要求智能簡歷篩選系統(tǒng)不僅能找到信息,更能以結(jié)構(gòu)化且一目了然的方式,展示每個候選人的評估檔案。例如,自動生成所有候選人的核心能力對比列表。以及進(jìn)一步支持招聘人員通過連續(xù)的追問,這要求系統(tǒng)具備上下文記憶和深度推理的能力。

2、核心架構(gòu)

整個系統(tǒng)采用分層架構(gòu)設(shè)計,由三個核心模塊構(gòu)成:位于底層的數(shù)據(jù)處理流水線、雙層知識存儲引擎,以及面向用戶的對話式 RAG 應(yīng)用鏈。

2.1數(shù)據(jù)處理流水線

數(shù)據(jù)處理流水線的入口是多格式的簡歷文件(PDF、DOCX 等)。系統(tǒng)利用 LlamaIndex 提供的 SimpleDirectoryReader 組件,實現(xiàn)對指定目錄下不同格式文件的自動加載。這個組件統(tǒng)一了底層不同文件類型的解析接口,為上層處理提供了標(biāo)準(zhǔn)化的 Document 對象輸入。

為了更加精準(zhǔn)的實現(xiàn)分塊,這里設(shè)計了一個上下文感知解析器(ResumeNodeParser)。這個解析器專門針對簡歷的結(jié)構(gòu)特點,通過正則表達(dá)式識別“工作經(jīng)歷”、“項目經(jīng)歷”等章節(jié)標(biāo)題,進(jìn)行語義導(dǎo)向的切分。這種方式可以保證切分出的文本塊在語義上的完整性,還能在解析階段就為文本塊賦予類型元數(shù)據(jù)。

2.2雙層知識存儲引擎

這個雙層設(shè)計是這個系統(tǒng)架構(gòu)的重要特點,通過不同的存儲方式,分別支撐 RAG 問答和結(jié)構(gòu)化概覽兩種不同的應(yīng)用需求。

ChromaDB 向量數(shù)據(jù)庫

數(shù)據(jù)處理流水線輸出的語義文本塊,會經(jīng)過向量化處理,即通過嵌入模型將其轉(zhuǎn)換為高維數(shù)學(xué)向量。這些向量與原始文本塊一同存入 ChromaDB 向量數(shù)據(jù)庫。ChromaDB 作為專門的向量數(shù)據(jù)庫,相比上篇文章使用的 FAISS 索引庫,在集成便利性和數(shù)據(jù)管理方面具有優(yōu)勢。

SQLite 結(jié)構(gòu)化數(shù)據(jù)庫

與此同時,數(shù)據(jù)處理流水線輸出的完整簡歷文本,會經(jīng)歷一個結(jié)構(gòu)化提取過程。這個過程調(diào)用大模型,根據(jù)預(yù)定義的 Pydantic 模型(Python 數(shù)據(jù)驗證庫,用于定義結(jié)構(gòu)化數(shù)據(jù)格式),從純文本中抽取出候選人的姓名、工作年限、項目經(jīng)驗、優(yōu)劣勢分析等關(guān)鍵信息,形成一份標(biāo)準(zhǔn)化的結(jié)構(gòu)化檔案。這份檔案最終被存入 SQLite 結(jié)構(gòu)化數(shù)據(jù)庫(一個輕量級的關(guān)系型數(shù)據(jù)庫)。這個數(shù)據(jù)庫的作用是為最后的用戶界面提供即時候選人信息查詢服務(wù),支撐系統(tǒng)的候選人概覽和詳情展示功能。

2.3對話式 RAG 應(yīng)用鏈

這個模塊采用 Streamlit UI 作為前端界面(一個 Python Web 應(yīng)用框架),關(guān)鍵邏輯由基于 LCEL 構(gòu)建的對話鏈驅(qū)動。當(dāng)用戶輸入問題后,系統(tǒng)啟動以下 RAG 流程:

1.檢索上下文:LCEL 對話鏈?zhǔn)紫葘⒂脩魡栴}向量化,并向 ChromaDB 向量數(shù)據(jù)庫發(fā)起檢索請求,獲取與問題語義最相關(guān)的簡歷文本塊作為上下文。

2.整合聊天歷史:為了支持多輪對話,對話鏈會從內(nèi)存歷史記錄中讀取之前的交互內(nèi)容,理解當(dāng)前問題的完整語境。

3.調(diào)用大模型:對話鏈將用戶問題、檢索到的上下文以及聊天歷史,一同組裝成一個結(jié)構(gòu)化的提示,并發(fā)送給大模型進(jìn)行處理。

4.生成回答:大模型在充分理解所有輸入信息的基礎(chǔ)上,生成一個精準(zhǔn)、連貫的回答,并將結(jié)果返回給對話鏈。最終,該回答通過 Streamlit UI 呈現(xiàn)給用戶,完成一次交互。

3、技術(shù)實現(xiàn)

這部分來演示下上述三個模塊背后的一些核心代碼邏輯。整個過程依賴 LlamaIndex 進(jìn)行數(shù)據(jù)處理與索引構(gòu)建,借助 Pydantic 模型實現(xiàn)結(jié)構(gòu)化信息提取,并利用 LCEL 靈活編排帶記憶功能的對話鏈。最終,通過 Streamlit 把所有后端能力封裝成一個直觀的 Web 應(yīng)用界面,并進(jìn)行實戰(zhàn)效果驗證。

3.1數(shù)據(jù)處理引擎

全局模型配置

在進(jìn)行任何數(shù)據(jù)處理之前,首先需要為 LlamaIndex 進(jìn)行全局模型配置,指定后續(xù)流程中使用的大模型(用于結(jié)構(gòu)化信息提?。┖颓度肽P停ㄓ糜谙蛄炕?。系統(tǒng)通過 config.py 配置文件統(tǒng)一管理模型參數(shù)和環(huán)境設(shè)置

# config.py 配置示例
def get_config():
   
"""
    提供應(yīng)用程序的配置。
   
"""
   
return {
       
"model": {
           
"llm_model": "qwen3:30b",          # 大模型
           
"ollama_embedding_model": "bge-m3", # 嵌入模型
           
"collection_name": "resume_collection" 
       
},
       
"env": {
           
"ollama_host": "http://localhost:11434",  # Ollama服務(wù)地址
           
"ollama_timeout": 120.0                 # 請求超時時間
       
}
    }

配置字典隨后在 RAGEngine 的初始化過程中被加載,并通過 _setup_llamaindex_settings 方法應(yīng)用到 LlamaIndex 的全局配置中。

# core/rag_engine.py ->_setup_llamaindex_settings 方法
from llama_index.core import Settings
from llama_index.llms.ollama import Ollama
from llama_index.embeddings.ollama import
OllamaEmbedding
# ...
Settings.llm = Ollama(
   
model=self.config['model']['llm_model'], 
   
base_url=self.config['env']['ollama_host'],
   
request_timeout=float(self.config['env']['ollama_timeout'])
)
Settings.embed_model = OllamaEmbedding(
   
model_name=self.config['model']['ollama_embedding_model'],
   
base_url=self.config['env']['ollama_host']
)

通過這種配置與代碼分離的策略,后續(xù)所有 LlamaIndex 組件都會自動調(diào)用此處指定的 Ollama 本地化部署模型,確保了模型調(diào)用的一致性。

數(shù)據(jù)處理流水線

RAGEngine 類的 build_index 方法負(fù)責(zé)編排完整的數(shù)據(jù)處理流水線。這個方法首先使用 SimpleDirectoryReader 統(tǒng)一加載 documents 目錄下的 PDF 和 DOCX 文件,然后調(diào)用自定義解析器 ResumeNodeParser,把原始 Document 對象轉(zhuǎn)換為結(jié)構(gòu)化的 TextNode 對象列表(LlamaIndex 中表示文本塊的標(biāo)準(zhǔn)化數(shù)據(jù)結(jié)構(gòu))。

# core/rag_engine.py -> build_index 方法核心邏輯
from llama_index.core import SimpleDirectoryReader
# ...
# 1. 統(tǒng)一加載異構(gòu)文件
reader =
SimpleDirectoryReader(input_files=files_to_process)
documents = reader.load_data()
# 2. 調(diào)用自定義解析器生成節(jié)點
parser = ResumeNodeParser()
all_nodes =
parser.get_nodes_from_documents(documents)
#
... 后續(xù)的索引構(gòu)建與結(jié)構(gòu)化提取將基于 all_nodes 和 documents 進(jìn)行

3.2簡歷節(jié)點解析器

通用文本分塊策略對于簡歷這類具有明確章節(jié)結(jié)構(gòu)的文檔,往往效果不好。這個系統(tǒng)實現(xiàn)了一個自定義的 ResumeNodeParser,能夠識別簡歷的上下文結(jié)構(gòu),實現(xiàn)更精準(zhǔn)的語義分割。這個組件的實現(xiàn)位于 core/rag_engine.py中,設(shè)計思想包含以下三點。

1.基于章節(jié)標(biāo)題分割:解析器通過正則表達(dá)式識別“核心技能”、“工作經(jīng)歷”等章節(jié)標(biāo)題,把這些標(biāo)題出現(xiàn)的位置作為文本塊的分割點。

2.注入語義元數(shù)據(jù):在創(chuàng)建 TextNode 時,解析器會把識別出的章節(jié)類型(如 work_experience)作為元數(shù)據(jù)附加到節(jié)點上。

3.二次精細(xì)分割:對于內(nèi)容較長的章節(jié)(如“工作經(jīng)歷”),解析器會進(jìn)行二次分割,確保每個文本塊的長度適中。

# core/rag_engine.py ->ResumeNodeParser._parse_nodes 方法
import re
from llama_index.core.node_parser import
NodeParser
from llama_index.core.schema import TextNode
# ...
class ResumeNodeParser(NodeParser):
    def
_parse_nodes(self, documents: List[Document], **kwargs: Any) ->
List[BaseNode]:
all_nodes: List[BaseNode] = []
# ...
# 1. 定義章節(jié)標(biāo)題與類型的映射
section_map = {
"核心技能":
"skills", "工作經(jīng)歷": "work_experience", 
"項目經(jīng)歷":
"projects", "教育背景": "education",
}
# 2. 使用正則表達(dá)式在文本中找到所有章節(jié)標(biāo)題
pattern = r"^\s*(?i)(" +
"|".join(section_map.keys()) + r")[\s\n:]*"
matches = list(re.finditer(pattern, full_text, re.MULTILINE))
# 3. 遍歷匹配結(jié)果,根據(jù)標(biāo)題邊界創(chuàng)建塊
for i, match in enumerate(matches):
# ... 省略邊界計算代碼 ...
chunk_text = full_text[chunk_start:chunk_end].strip()
# 4. 獲取標(biāo)題并分配元數(shù)據(jù)
title = match.group(1)
chunk_type = section_map.get(title, "others")
# 5. 創(chuàng)建并添加帶有元數(shù)據(jù)的TextNode
node = TextNode(text=chunk_text, metadata=doc_parts[0].metadata.copy())
node.metadata["chunk_type"] = chunk_type
all_nodes.append(node)
# ...
        return all_nodes

3.3結(jié)構(gòu)化信息存儲

系統(tǒng)選用輕量級的 SQLite 數(shù)據(jù)庫,實現(xiàn)持久化地存儲從簡歷中提取出的結(jié)構(gòu)化信息,并通過一個專門的數(shù)據(jù)訪問類 StructuredStore 來封裝所有數(shù)據(jù)庫操作,實現(xiàn)業(yè)務(wù)邏輯與數(shù)據(jù)存儲的解耦。這個實現(xiàn)過程可以分為以下兩個主要步驟。

設(shè)計數(shù)據(jù)存儲表

在 core/structured_store.py 的 _create_table 方法中,定義了名為 candidates 的數(shù)據(jù)表結(jié)構(gòu)。這個表將最常用于候選人概覽和排序的字段設(shè)為獨立列,而把完整的候選人檔案序列化為 JSON 字符串后存儲在 profile_json 列中,兼顧了查詢效率與信息完整性。

# core/structured_store.py ->_create_table 方法
import sqlite3
class StructuredStore:
    def
_create_table(self):
       
with sqlite3.connect(self.db_path) as conn:
           
conn.execute("""
                CREATE TABLE IF NOT EXISTS
candidates (
                    name TEXT PRIMARY KEY,
file_name TEXT,
                    overall_score INTEGER,
recommendation TEXT,
                    summary TEXT, profile_json
TEXT
                )
            """)

數(shù)據(jù)的寫入和查詢接口

數(shù)據(jù)表的寫入操作由 save_profile 方法實現(xiàn),接收一個 CandidateProfile Pydantic 對象,序列化后存入數(shù)據(jù)庫。這個方法使用 INSERT OR REPLACE 語句,保證了數(shù)據(jù)攝取流程的冪等性(多次執(zhí)行相同操作產(chǎn)生相同結(jié)果的特性)。

# core/structured_store.py -> save_profile方法
from .schemas import CandidateProfile
class StructuredStore:
    def
save_profile(self, profile: CandidateProfile, file_name: str):
       
with sqlite3.connect(self.db_path) as conn:
           
conn.execute("""
                INSERT OR REPLACE INTO
candidates (...) VALUES (?, ?, ?, ?, ?, ?)
           
""", (
                profile.name, file_name,
profile.overall_match_score,
                profile.recommendation,
profile.summary, profile.json()
            ))

3.4基于 Pydantic 的結(jié)構(gòu)化信息提取鏈

結(jié)構(gòu)化提取的實際效果,在很大程度上取決于提示詞的設(shè)計質(zhì)量。智能簡歷篩選系統(tǒng)在 core/application.py 中構(gòu)建了一個高指令性的提示詞模板,其中包括了角色扮演、動態(tài)注入招聘需求、明確評估規(guī)則以及集成格式指令等關(guān)鍵要素。提示詞模板的示例內(nèi)容如下。

# core/application.py -> _initialize_extraction_chain 提示詞模板
prompt_template_str = """
你是一位極其嚴(yán)格和挑剔的AI招聘專家。你的唯一目標(biāo)是根據(jù)下面提供的"職位描述(JD)",對"簡歷原文"進(jìn)行無情的、差異化的評估。
**職位描述 (JD):**
---
{jd_content}
---
**核心評估指令:**
1. **嚴(yán)格對照**: 嚴(yán)格將簡歷內(nèi)容與JD中的"任職要求"進(jìn)行逐條比對。
2. **RAG經(jīng)驗是關(guān)鍵**: ...
**JSON輸出格式指令:**
{format_instructions}
**簡歷原文:**

最后,系統(tǒng)利用 LCEL 把輸入、提示詞、大模型和輸出解析器優(yōu)雅地串聯(lián)起來,形成一條自動化的處理鏈。其中關(guān)鍵的 _initialize_extraction_chain 方法的代碼實現(xiàn)示例如下。

# core/application.py ->_initialize_extraction_chain 
from langchain_core.prompts import
ChatPromptTemplate
from langchain_core.output_parsers import
PydanticOutputParser
from langchain_core.runnables import
RunnablePassthrough
# ...
parser =
PydanticOutputParser(pydantic_object=CandidateProfile)
prompt =
ChatPromptTemplate.from_template(template=prompt_template_str)
 
self.extraction_chain = (
    {
       
"resume_content": RunnablePassthrough(),
       
"jd_content": lambda x: jd_processor.get_full_jd_text()
    }
    |
prompt.partial(format_instructinotallow=parser.get_format_instructions())
    |
self.llm
    |
parser
)

3.5集成帶記憶的對話式 RAG 鏈

為了提供流暢的多輪對話體驗,智能簡歷篩選系統(tǒng)必須具備管理對話記憶的能力。LangChain 的 RunnableWithMessageHistory 類為此提供了標(biāo)準(zhǔn)化的解決方案。

支持歷史消息的提示詞

與單次提取任務(wù)不同,對話式任務(wù)的提示詞需要包含歷史交互信息。系統(tǒng)在 _initialize_rag_chain_with_history 方法中,使用了 LangChain 的 MessagesPlaceholder 來實現(xiàn)這一點。

# core/application.py ->_initialize_rag_chain_with_history 提示詞模板
from langchain_core.prompts import
ChatPromptTemplate, MessagesPlaceholder
prompt = ChatPromptTemplate.from_messages([
   
("system", "你是一個專業(yè)的AI簡歷篩選助手...職位描述(JD):\n{jd_content}"),
   
MessagesPlaceholder(variable_name="chat_history"),
   
("human", "候選人簡歷上下文:\n{context}\n\n問題: {question}")
])

MessagesPlaceholder(variable_name="chat_history")的作用是在提示詞中預(yù)留一個占位符,LangChain 的記憶機制會自動將歷史對話消息填充到這個位置,從而大模型能夠基于完整的對話上下文生成回答。

基于會話的內(nèi)存管理

為了隔離不同用戶的對話,系統(tǒng)需要為每個獨立的會話維護一份獨立的聊天歷史。ResumeApplication 類通過一個字典 self.chat_histories 和一個輔助方法 get_session_history 來實現(xiàn)此功能。

# core/application.py -> 內(nèi)存管理核心邏輯
from langchain_core.chat_history import
BaseChatMessageHistory
from langchain_community.chat_message_histories
import ChatMessageHistory
# ...
class ResumeApplication:
    def
__init__(self, ...):
       
# ...
       
self.chat_histories: Dict[str, BaseChatMessageHistory] = {}
    def
get_session_history(self, session_id: str) -> BaseChatMessageHistory:
       
"""根據(jù)session_id獲取或創(chuàng)建聊天歷史記錄。"""
       
if session_id not in self.chat_histories:
           
self.chat_histories[session_id] = ChatMessageHistory()
        return self.chat_histories[session_id]

當(dāng)處理請求的時候,系統(tǒng)會傳入一個唯一的 session_id。get_session_history 方法會根據(jù)此 ID 查找或創(chuàng)建一個 ChatMessageHistory 實例,確保每個用戶的對話歷史得到獨立管理。

封裝 RAG 鏈

最后一步是將基礎(chǔ)的 RAG 鏈與內(nèi)存管理機制進(jìn)行綁定。RunnableWithMessageHistory 承擔(dān)了封裝和連接的功能。它封裝了一個基礎(chǔ) RAG 鏈,并自動為其注入了狀態(tài)管理(記憶)能力。

# core/application.py ->_initialize_rag_chain_with_history 核心封裝邏輯
from langchain_core.runnables.history import
RunnableWithMessageHistory
# ...
# 1. 構(gòu)建一個基礎(chǔ)的RAG鏈
(base_rag_chain)
#    此鏈負(fù)責(zé)檢索、格式化文檔、填充提示詞等核心RAG邏輯
base_rag_chain = (
   
{"context": retriever | format_docs, "question":
...}
    |
prompt
    |
self.llm
    |
StrOutputParser()
)
# 2. 使用 RunnableWithMessageHistory 對基礎(chǔ)鏈進(jìn)行封裝
self.conversational_rag_chain =
RunnableWithMessageHistory(
   
base_rag_chain,
   
self.get_session_history,  # 指定獲取歷史記錄的方法
   
input_messages_key="question", # 指定輸入鍵
   
history_messages_key="chat_history", # 指定歷史消息在提示詞中的占位符
)

3.6Streamlit 應(yīng)用與效果驗證

系統(tǒng)選用 Streamlit 框架,把所有后端能力封裝在 app.py 腳本中。前端的具體實現(xiàn)這部分不做贅述了,感興趣的可以后續(xù)在星球查看源碼,這部分直接介紹下測試文檔后進(jìn)行效果演示。

JD 要求

所有篩選和評估邏輯圍繞“AI 產(chǎn)品經(jīng)理”職位展開。該崗位主要負(fù)責(zé) RAG、AI 工作流等前沿技術(shù)在新能源汽車制造領(lǐng)域的產(chǎn)品化應(yīng)用。具體查看下面截圖

四份簡歷

測試使用四份背景各異的候選人簡歷(人名為虛構(gòu)),分別以 PDF 和 DOCX 格式存儲。這四位候選人在關(guān)鍵評估維度上形成了很好的對比樣本。

候選人

工作年限

產(chǎn)品經(jīng)驗

RAG技術(shù)能力

制造業(yè)背景

張偉

8

豐富

實戰(zhàn)經(jīng)驗

高度匹配

李靜

6

轉(zhuǎn)型中(2年)

技術(shù)專家

趙敏

6

豐富

應(yīng)用經(jīng)驗

王磊

10

非常豐富

高度匹配

候選人預(yù)覽

在后臺執(zhí)行 streamlit run app.py 命令啟動應(yīng)用后,在前端界面的側(cè)邊欄點擊“執(zhí)行數(shù)據(jù)攝取”按鈕,系統(tǒng)會自動完成對 documents 目錄下所有簡歷的解析、結(jié)構(gòu)化提取和索引構(gòu)建。候選人概覽標(biāo)簽頁展示了數(shù)據(jù)處理與分析的結(jié)果。

這個頁面直觀地呈現(xiàn)了四個候選人的 AI 評估摘要,包括匹配度評分、推薦等級(強烈推薦、可以考慮、不匹配)和一句話總結(jié)。這體現(xiàn)了結(jié)構(gòu)化信息提取鏈的處理效果,以及 SQLite 結(jié)構(gòu)化存儲引擎的支撐作用。系統(tǒng)通過 1-10 分的量化評分機制,結(jié)合“強烈推薦”、“可以考慮”、“不匹配”等直觀的推薦等級,以及大模型生成的核心能力摘要,實現(xiàn)了候選人的快速篩選和排序。

候選人詳情

在候選人概覽視圖的基礎(chǔ)上,招聘人員可以對感興趣的候選人進(jìn)行進(jìn)一步了解。比如在左側(cè)邊欄的“候選人”下拉列表中選擇“李靜”,并切換到“候選人詳情”標(biāo)簽頁后,系統(tǒng)會呈現(xiàn)一份由 AI 自動生成的完整評估報告。

智能問答頁面

系統(tǒng)側(cè)邊欄的“模型配置”下拉框,允許招聘人員根據(jù)本地 Ollama 服務(wù)中已下載的模型列表,隨時切換驅(qū)動問答的大模型。

單輪問答:“請找出所有具備 RAG 項目實戰(zhàn)經(jīng)驗的候選人,并以表格形式展示他們的姓名、相關(guān)項目名稱、使用的技術(shù)棧和量化成果?!?/span>

系統(tǒng)不僅返回了格式規(guī)整的 Markdown 表格,還在答案上方提供了一個可以折疊的思維鏈。

多輪問答 1:“張偉和李靜哪個更適合這個崗位?”

多輪問答 2:“這個 RAG 架構(gòu)設(shè)計的經(jīng)驗,在她的哪個項目得到了體現(xiàn)?”

系統(tǒng)成功地理解了代詞“她”(指代李靜)和上下文中提及的“RAG 架構(gòu)設(shè)計經(jīng)驗”,并精準(zhǔn)地將這項抽象技能與“智能投研報告分析系統(tǒng)”這一具體項目關(guān)聯(lián)起來。這有力地證明了 RunnableWithMessageHistory 組件的有效性,系統(tǒng)具備了真正連貫、有深度的對話能力。

4、寫在最后

框架的核心價值在于抽象化處理。LangChain 的 RunnableWithMessageHistory 把復(fù)雜的多輪對話狀態(tài)管理抽象成簡單的封裝調(diào)用,很大程度提升開發(fā)效率。但是,高層抽象也帶來調(diào)試挑戰(zhàn)。相比之下,原生開發(fā)雖然繁瑣,但問題定位相對直接。

4.1框架選型

LlamaIndex 在數(shù)據(jù)處理與索引構(gòu)建方面較為專業(yè),豐富的 NodeParser、Reader 等組件可以支持精細(xì)化數(shù)據(jù)處理。LangChain 在應(yīng)用鏈編排、Agent 構(gòu)建等方面更具優(yōu)勢,LCEL 的靈活性和強大組件生態(tài)使其成為構(gòu)建復(fù)雜應(yīng)用邏輯的首選。在復(fù)雜項目中,采用混合模式——使用 LlamaIndex 構(gòu)建高效的數(shù)據(jù)處理引擎,將其作為 LangChain 應(yīng)用鏈中的組件進(jìn)行調(diào)用往往能實現(xiàn)更好的效果。

4.2從問答到自主 Agent

這篇文章定位上還是個面向初學(xué)者的入門案例演示,本質(zhì)上仍是“被動式”系統(tǒng)。對于有基礎(chǔ)的盆友,可以在此基礎(chǔ)上把 LCEL 對話鏈升級為基于 ReAct 思想的 Agent。封裝一系列外部 API 作為 Agent 可調(diào)用的工具,例如 schedule_interview 調(diào)用公司日歷系統(tǒng)安排面試,send_assessment_test 調(diào)用在線測評系統(tǒng)發(fā)送技術(shù)筆試,request_portfolio 調(diào)用郵件系統(tǒng)索要候選人作品集,這樣可以實現(xiàn)更加實用的招聘助理的價值。

責(zé)任編輯:龐桂玉 來源: 韋東東
相關(guān)推薦

2024-07-15 08:31:19

2024-07-12 14:53:42

2019-10-18 16:05:32

框架開發(fā)Java

2025-09-04 07:52:16

2011-08-03 14:49:57

框架

2025-05-22 02:00:00

AI人工智能前端

2009-01-07 11:07:27

AJAXASP.NET.NET

2017-03-02 13:19:43

dubbo分布式框架

2024-05-07 08:45:16

OpenAILlamaIndex大語言模型

2025-04-01 08:38:25

模型上下文協(xié)議MCPLLM

2025-10-29 10:29:03

2010-11-12 11:06:56

招聘

2011-07-27 13:57:36

iPhone 游戲 Cocos2d

2023-05-08 15:59:27

UI自動化腳本鴻蒙

2013-07-22 14:28:07

網(wǎng)絡(luò)安全框架NIST

2025-05-20 04:00:00

Bad CasesDifyRAG

2025-05-22 06:48:50

RAGAI應(yīng)用開發(fā)框架DeepSeek

2015-10-16 09:59:52

SwiftCocoa

2024-05-22 09:38:25

2025-05-15 03:25:00

點贊
收藏

51CTO技術(shù)棧公眾號

精品一区二区三区的国产在线播放 | 亚久久调教视频| 日韩av最新在线观看| 黄色免费网址大全| 在线观看电影av| 久久蜜桃av一区二区天堂| 国产美女被下药99| 一本色道久久88| 136导航精品福利| 色欧美片视频在线观看在线视频| 欧美人xxxxx| 国产又黄又猛又爽| 亚洲免费一区二区| 大量国产精品视频| 一区二区三区在线观看免费视频| 日韩精品三区| 中国色在线观看另类| 国产综合欧美在线看| 一级全黄少妇性色生活片| 亚洲美女色禁图| 日韩高清欧美高清| 一级做a爱视频| 精品网站在线| 黑人巨大精品欧美一区二区免费| 精品亚洲第一| 国产草草影院ccyycom| 日本欧美大码aⅴ在线播放| 久久久影视精品| 日韩三级在线观看视频| 精品国产成人| 精品伊人久久97| 精品久久久久久无码人妻| 欧洲美女精品免费观看视频| 偷偷要91色婷婷| 国产一区二区三区在线免费| 天堂中文а√在线| 国产精品亲子伦对白| 久久久久久国产精品mv| 欧美一区二区在线观看视频| 国产乱色国产精品免费视频| 成人黄色影片在线| 国产做受高潮漫动| 精品白丝av| 久久久久久久久久久久av| 欧美三级黄色大片| 欧美1区二区| 亚洲电影免费观看高清完整版在线| 男人日女人下面视频| 成人高清网站| 国产欧美一区二区精品久导航| 国产精品久久久久久中文字| 欧美性猛交bbbbb精品| 99精品国产一区二区三区| 亚洲性夜色噜噜噜7777| 国产伦理片在线观看| 九九综合在线| 国产亚洲精品成人av久久ww| 69精品无码成人久久久久久| 欧美国产中文高清| 日韩欧美国产不卡| 亚洲美女高潮久久久| 高清电影一区| 欧美性欧美巨大黑白大战| 日本人妻伦在线中文字幕| 怡红院av在线| 香蕉加勒比综合久久 | 西瓜成人精品人成网站| 亚洲精品福利在线| 成人高清在线观看视频| 视频一区中文字幕精品| 日韩三级精品电影久久久| 午夜福利三级理论电影| 欧美自拍一区| 中文字幕精品一区二区精品| 日韩av手机在线免费观看| 国内精品伊人久久久| www.欧美精品| 国产真实的和子乱拍在线观看| 欧美3p在线观看| 欧美另类极品videosbest最新版本 | 中文字幕日本精品| 黄色香蕉视频在线观看| 天天综合网91| 久久免费少妇高潮久久精品99| 日韩三级在线观看视频| 在线观看一区| 国产精品电影观看| 草莓视频18免费观看| 极品少妇一区二区| 国产九色精品| 永久免费在线观看视频| 亚洲综合免费观看高清完整版| 亚洲国产精品一区二区第一页| 日韩av高清在线| 国产精品国产a级| 丰满的少妇愉情hd高清果冻传媒| 伊人精品影院| 欧美在线视频不卡| wwwww在线观看| 凹凸成人在线| 中文字幕成人在线| 国产成人在线播放视频| 久久国产精品99久久人人澡| 国产综合18久久久久久| 黄色成年人视频在线观看| 欧美日韩国产丝袜美女| 久久免费视频3| 国产精品一区免费在线| 欧美一区二区三区视频在线观看| 男人午夜视频在线观看| 日韩在线影视| 欧美激情一级精品国产| 91福利免费视频| 久久久久久久久久看片| 色就是色欧美| 人狥杂交一区欧美二区| 日韩欧美不卡一区| 懂色av粉嫩av浪潮av| 国产亚洲一级| 国产精品欧美一区二区三区奶水| 一级淫片免费看| 国产传媒久久文化传媒| 亚洲图片小说在线| 亚洲性色av| 亚洲第一男人av| 国产日韩欧美在线观看视频| 在线精品观看| av免费精品一区二区三区| 色综合久久影院| 欧洲在线/亚洲| 精品少妇人妻一区二区黑料社区| 色综合天天爱| 国产91在线播放精品91| 国产绿帽刺激高潮对白| 国产·精品毛片| 日本一区二区三区www| 国产一二在线播放| 亚洲成年人影院在线| 麻豆国产尤物av尤物在线观看| 日韩午夜av在线| 国产福利不卡| 久久99亚洲网美利坚合众国| 日韩欧美成人激情| 久久久久久久久久久97| 国产精品资源在线看| 欧洲精品视频在线| 欧美欧美在线| 欧美黑人性生活视频| 黄色三级网站在线观看| 中文字幕的久久| 亚洲激情在线观看视频| 日韩精品免费一区二区在线观看| 欧美黑人性生活视频| 懂色av成人一区二区三区| 一区二区三区不卡在线观看| 91精产国品一二三| 9色精品在线| 欧美精品亚洲精品| 日韩久久一区二区三区| 精品成人在线观看| 欧美bbbbbbbbbbbb精品| 久久亚洲私人国产精品va媚药| 法国空姐在线观看免费| 欧美不卡在线观看| 久久久亚洲精选| 男同在线观看| 欧美日韩性视频在线| 黄瓜视频污在线观看| 欧美日韩精品| 精品国产综合久久| 日本成人三级电影| 日韩中文字幕网址| 亚洲av色香蕉一区二区三区| 亚洲一区二区不卡免费| 午夜一区二区三区免费| 日av在线不卡| 国产精品av免费观看| 欧美自拍一区| 国产中文欧美精品| 96av在线| 色婷婷av一区二区三区在线观看| 69av视频在线观看| 亚洲欧美一区二区三区国产精品| 欧美日韩一区二区三区69堂| 亚洲人成精品久久久| 97碰碰碰免费色视频| 国产大学生校花援交在线播放| 欧美性猛xxx| 醉酒壮男gay强迫野外xx| 奇米色一区二区三区四区| 四虎免费在线观看视频| 欧美黄色录像| 91视频九色网站| 345成人影院| 久久久精品视频成人| 视频一区二区在线播放| 色综合天天综合网天天狠天天| 魔女鞋交玉足榨精调教| 国产一区视频导航| 欧美一级黄色片视频| 欧美一区二区| 国产精品香蕉视屏| 欧美成人福利| 91成人性视频| 日本高清在线观看视频| 在线观看国产精品日韩av| 欧美 日韩 国产 成人 在线 91| 亚洲成av人片一区二区梦乃| 91精品久久久久久久久久久久| 蜜臀av性久久久久av蜜臀妖精| 一区二区视频国产| 成人午夜888| 国产精品扒开腿做爽爽爽男男| yw193.com尤物在线| 日韩成人在线播放| 91青青草视频| 激情成人中文字幕| 亚洲欧美va天堂人熟伦| 成人黄色av网站在线| 久久久福利影院| 日韩精品高清不卡| 国产免费毛卡片| 国内精品福利| 日本三级中文字幕在线观看| 大色综合视频网站在线播放| 91系列在线观看| 成人国产网站| 国产精品电影观看| 一二区成人影院电影网| 26uuu亚洲伊人春色| 国语对白在线刺激| 欧美大片免费观看在线观看网站推荐| 天天操天天干天天爱| 日韩欧美国产精品一区| 成人黄色在线观看视频| 欧美一区二区视频在线观看2022| 成人免费视频毛片| 午夜精品久久久久久久99水蜜桃| 亚洲av无码一区二区三区人| 99国产精品国产精品久久| 中文字幕av专区| 亚洲少妇一区| 国产极品尤物在线| 91九色精品| 欧美h视频在线观看| 天天做天天爱天天综合网| 影音先锋欧美资源| 亚洲高清影视| www.国产在线播放| 亚洲黄色天堂| 国产主播在线看| 久久精品人人| 久青草视频在线播放| 国内精品美女在线观看| 国产一二三在线视频| 日韩午夜一区| 国产精品亚洲a| 热久久一区二区| 午夜视频在线观| 国产91在线观看丝袜| 人体私拍套图hdxxxx| 久久免费国产精品| 成人小视频免费看| 亚洲欧美视频一区| 国产一级特黄aaa大片| 亚洲人成伊人成综合网小说| 久久午夜无码鲁丝片午夜精品| 中文字幕中文字幕中文字幕亚洲无线| 添女人荫蒂视频| 久久精品在这里| 三级黄色在线观看| 亚洲福利视频三区| 国产视频1区2区| 欧美精品一级二级三级| 亚洲精品久久久久久久久久久久久久 | 亚洲婷婷综合网| 欧美性猛交xxxxxx富婆| 97免费观看视频| 亚洲精品成人av| 91在线不卡| 欧美国产极速在线| 日韩成人亚洲| 国产精品电影网| 日韩精品一区二区三区免费视频| 国产精品丝袜一区二区三区| 亚洲精品在线影院| 91丨九色丨国产| 国内亚洲精品| 无码人妻少妇伦在线电影| 欧美a一区二区| 黄色性视频网站| 中文字幕第一区综合| 国产精品成人av久久| 欧美揉bbbbb揉bbbbb| 成人毛片在线精品国产| 欧美成人一区二区| 国产系列在线观看| 在线播放国产一区二区三区| 特级毛片在线| 国产成人综合亚洲| 久久狠狠久久| 穿情趣内衣被c到高潮视频| 媚黑女一区二区| 曰本三级日本三级日本三级| 日本一区二区免费在线观看视频 | 精品黄色一级片| 自拍日韩亚洲一区在线| 久久蜜桃精品| 老熟女高潮一区二区三区| 国产精品久久三区| 色屁屁影院www国产高清麻豆| 欧美性感一区二区三区| 国产乱码精品一区二区| 国产性猛交xxxx免费看久久| 久久久123| 日本中文字幕久久看| 国产精品chinese在线观看| 国产av第一区| 理论电影国产精品| 蜜桃av乱码一区二区三区| 亚洲欧美激情一区二区| 中文区中文字幕免费看| 日韩精品一区二区三区在线观看 | 永久免费毛片在线播放不卡| 国模精品视频| 国产精品一区久久| 女优一区二区三区| 浮妇高潮喷白浆视频| 麻豆91在线观看| 日韩女同一区二区三区| 亚洲免费资源在线播放| 91蜜桃视频在线观看| 欧美xxxxx牲另类人与| 1024在线播放| www日韩av| 欧美私人啪啪vps| 妞干网在线免费视频| 久久亚洲综合色一区二区三区| 婷婷在线精品视频| 91麻豆精品国产91久久久更新时间| 四虎永久在线精品免费网址| 久久99久久久久久久噜噜| 国产精品视频一区二区三区| 国产女主播av| 欧美a一区二区| 成年人免费视频播放| 欧美日韩aaa| 黄色动漫在线| 国产精品成人国产乱一区| 全国精品免费看| 情侣黄网站免费看| 国产视频911| 一级黄色免费片| 久久成人精品电影| 亚洲精品一二三**| 成人一区二区免费视频| 精品一区二区三区免费| 一区视频免费观看| 精品99一区二区三区| 美女福利一区二区| 一区二区三区四区五区视频| 鲁大师影院一区二区三区| 一区二区三区在线观看免费视频| 欧美日韩一区二区三区在线免费观看 | 99在线精品视频在线观看| 亚洲图片 自拍偷拍| 樱花草国产18久久久久| 91成人国产综合久久精品| 久久91精品国产91久久跳| 国产成人福利夜色影视| 欧美国产一二三区| 麻豆一区二区三| 久久黄色免费网站| 亚洲欧美成人精品| 2019中文亚洲字幕| 999在线观看视频| 中文天堂在线一区| 亚洲AV无码精品色毛片浪潮| 欧美一区二区.| 青青一区二区| 羞羞的视频在线| 亚洲成人久久影院| 视频污在线观看| 国产精品久久久久久久久久久新郎 | 美国毛片一区二区| 国产一级久久久| 有码中文亚洲精品| h视频久久久| 国产一二三区av| 一区二区三区不卡在线观看| 国产特黄在线| 国产精品v欧美精品v日韩| 红桃视频亚洲| 在线观看亚洲大片短视频| 精品嫩草影院久久| 成人av色网站| 中文字幕第一页亚洲| 91在线精品一区二区| 国产精品怡红院| 国产精品久久久久久久久久新婚|