<cite id="ffb66"></cite><cite id="ffb66"><track id="ffb66"></track></cite>
      <legend id="ffb66"><li id="ffb66"></li></legend>
      色婷婷久,激情色播,久久久无码专区,亚洲中文字幕av,国产成人A片,av无码免费,精品久久国产,99视频精品3
      網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

      構(gòu)建自己的AI編程助手:基于RAG的上下文感知實現(xiàn)方案

      0
      分享至

      很多人覺得做個AI助手就是調(diào)調(diào)OpenAI的接口,其實這樣智能做出一個通用聊天機器人。

      而代碼助手需要專門為代碼設(shè)計的上下文感知的RAG(Retrieval-Augmented Generation)管道,這是因為代碼跟普通文本不一樣,結(jié)構(gòu)嚴格,而且不能隨便按字符隨便進行分割。

      一般的代碼助手分四塊:代碼解析把源文件轉(zhuǎn)成AST語法樹;向量存儲按語義索引代碼片段而非關(guān)鍵詞匹配;倉庫地圖給LLM一個全局視角,知道文件結(jié)構(gòu)和類定義在哪;推理層把用戶問題、相關(guān)代碼、倉庫結(jié)構(gòu)拼成一個完整的prompt發(fā)給模型。



      代碼解析:別用文本分割器

      自己做代碼助手最常見的坑是直接用文本分割器。

      比如按1000字符切Python文件很可能把函數(shù)攔腰截斷。AI拿到后半截沒有函數(shù)簽名根本不知道參數(shù)等具體信息。

      而正確做法是基于AST分塊。tree-sitter是這方面的標(biāo)準(zhǔn)工具,因為Atom和Neovim都在用。它能按邏輯邊界比如類或函數(shù)來切分代碼。

      依賴庫是tree_sitter和tree_sitter_languages:

      from langchain.text_splitter import RecursiveCharacterTextSplitter, Language
      from langchain_community.document_loaders.generic import GenericLoader
      from langchain_community.document_loaders.parsers import LanguageParser
      # 1. Load the Repository
      # We point the loader to our local repo. It automatically handles extensions.
      loader = GenericLoader.from_filesystem(
      "./my_legacy_project",
      glob="**/*",
      suffixes=[".py"],
      parser=LanguageParser(language=Language.PYTHON, parser_threshold=500)
      )
      documents = loader.load()
      # 2. Split by AST (Abstract Syntax Tree)
      # This ensures we don't break a class or function in the middle.
      python_splitter = RecursiveCharacterTextSplitter.from_language(
      language=Language.PYTHON,
      chunk_size=2000,
      chunk_overlap=200
      )
      texts = python_splitter.split_documents(documents)
      print(f"Processed {len(texts)} semantic code chunks.")
      # Example output: Processed 452 semantic code chunks.

      保持函數(shù)完整性很關(guān)鍵。檢索器拿到的每個分塊都是完整的邏輯單元,不是代碼碎片。

      向量存儲方案

      分塊完成后需要存儲,向量數(shù)據(jù)庫肯定是標(biāo)配。

      embedding模型推薦可以用OpenAI的text-embedding-3-large或者Voyage AI的代碼專用模型。這類模型在代碼語義理解上表現(xiàn)更好,能識別出def get_users():和"獲取用戶列表"是一回事。

      這里用ChromaDB作為示例:

      from langchain_chroma import Chroma
      from langchain_openai import OpenAIEmbeddings
      # Initialize the Vector DB
      # Ideally, persist this to disk so you don't re-index every run
      db = Chroma.from_documents(
      texts,
      OpenAIEmbeddings(model="text-embedding-3-large"),
      persist_directory="./chroma_db"
      )
      retriever = db.as_retriever(
      search_type="mmr", # Maximal Marginal Relevance for diversity
      search_kwargs={"k": 8} # Fetch top 8 relevant snippets
      )

      這里有個需要說明的細節(jié):search_type用"mmr"是因為普通相似度搜索容易返回五個幾乎一樣的分塊,MMR(最大邊際相關(guān)性)會強制選取相關(guān)但彼此不同的結(jié)果,這樣可以給模型更寬的代碼庫視野。

      上下文構(gòu)建

      單純把代碼片段扔給GPT還不夠。它可能看到User類的定義,卻不知道m(xù)ain.py里怎么實例化它。缺的是全局視角。

      所以解決辦法是設(shè)計系統(tǒng)提示,讓模型以高級架構(gòu)師的身份來理解代碼:

      from langchain.chains import create_retrieval_chain
      from langchain.chains.combine_documents import create_stuff_documents_chain
      from langchain_core.prompts import ChatPromptTemplate
      from langchain_openai import ChatOpenAI
      llm = ChatOpenAI(model="gpt-4-turbo-preview", temperature=0)
      # The "Stuff" chain puts all retrieved docs into the context window
      prompt = ChatPromptTemplate.from_template("""
      You are a Senior Software Engineer assisting with a Python legacy codebase.
      Use the following pieces of retrieved context to answer the question.
      If the context doesn't contain the answer, say "I don't have enough context."
      CONTEXT FROM REPOSITORY:
      {context}
      USER QUESTION:
      {input}
      Answer specifically using the class names and variable names found in the context.
      """)
      combine_docs_chain = create_stuff_documents_chain(llm, prompt)
      rag_chain = create_retrieval_chain(retriever, combine_docs_chain)
      # Let's test it on that tricky legacy function
      response = rag_chain.invoke({"input": "How do I refactor the PaymentProcessor to use the new AsyncAPI?"})
      print(response["answer"])

      這樣AI不再編造不存在的導(dǎo)入,因為它現(xiàn)在能看到向量庫檢索出的AsyncAPI類定義和PaymentProcessor類。它會告訴你:"重構(gòu)PaymentProcessor需要修改_make_request方法,根據(jù)上下文,AsyncAPI初始化時需要await關(guān)鍵字……"

      代碼地圖:應(yīng)對大型代碼庫

      上面的方案對中小項目就已經(jīng)夠用了,但是如果代碼的規(guī)模到了十萬行以上,這些工作還遠遠不夠覆蓋。

      Aider、Cursor這類工具采用的進階技術(shù)叫Repo Map,也就是把整個代碼庫壓縮成一棵樹結(jié)構(gòu),塞進上下文窗口:

      src/
      auth/
      login.py:
      - class AuthManager
      - def login(user, pass)
      db/
      models.py:
      - class User

      我們的做法是在發(fā)送查詢前先生成文件名和類定義的輕量級樹狀結(jié)構(gòu),附加到系統(tǒng)提示里。這樣模型能說:"地圖里有個auth_utils.py,但檢索結(jié)果里沒它的內(nèi)容,要不要看看那個文件?"

      總結(jié)

      我們做自己做代碼助手目標(biāo)不是在補全速度上跟Copilot較勁,而是在于理解層面的提升。比如說內(nèi)部文檔、編碼規(guī)范、那些只有老員工才知道的遺留模塊都可以喂進去。從一個靠猜的AI,變成一個真正懂你代碼庫的AI。

      https://avoid.overfit.cn/post/e04b69f27ca841b59679a916781b28c6

      作者:Rahul Kaklotar

      特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關(guān)推薦
      熱點推薦
      獨家消息:西貝創(chuàng)始成員董俊義擔(dān)任CEO,賈國龍退幕后!門店管理層工資延發(fā),店長廚師長全部降薪,“新CEO首要目標(biāo)是讓公司活下來”

      獨家消息:西貝創(chuàng)始成員董俊義擔(dān)任CEO,賈國龍退幕后!門店管理層工資延發(fā),店長廚師長全部降薪,“新CEO首要目標(biāo)是讓公司活下來”

      每日經(jīng)濟新聞
      2026-03-06 18:44:10
      6年了,郭麒麟的反擊幾乎斷送了朱亞文的演藝生涯

      6年了,郭麒麟的反擊幾乎斷送了朱亞文的演藝生涯

      小熊侃史
      2025-12-25 11:24:12
      全軍僅此一例:師長授中將軍銜,軍長和另外3名師長卻被授予少將

      全軍僅此一例:師長授中將軍銜,軍長和另外3名師長卻被授予少將

      史韻流轉(zhuǎn)
      2026-03-07 09:20:08
      字節(jié)跳動啟動最大規(guī)模實習(xí)生招聘:擬招超7000人,轉(zhuǎn)正率超50%,重點傾斜研發(fā)、產(chǎn)品與AI領(lǐng)域

      字節(jié)跳動啟動最大規(guī)模實習(xí)生招聘:擬招超7000人,轉(zhuǎn)正率超50%,重點傾斜研發(fā)、產(chǎn)品與AI領(lǐng)域

      深圳晚報
      2026-03-06 16:38:48
      90年小伙打工被誣陷偷東西,他沒反抗,只讓工廠老板看了眼他的背

      90年小伙打工被誣陷偷東西,他沒反抗,只讓工廠老板看了眼他的背

      牛魔王與芭蕉扇
      2025-11-06 10:09:31
      國防預(yù)算草案公布,大陸24小時內(nèi)促統(tǒng),賴清德面臨兩條路

      國防預(yù)算草案公布,大陸24小時內(nèi)促統(tǒng),賴清德面臨兩條路

      二凱訓(xùn)猛犬
      2026-03-07 11:52:24
      車頂可升降、車內(nèi)可站立,小米YU9最新爆料

      車頂可升降、車內(nèi)可站立,小米YU9最新爆料

      金融界
      2026-03-06 14:23:07
      為什么說要得饒人處且饒人?網(wǎng)友:卡里幾千萬,為了5塊錢命沒了

      為什么說要得饒人處且饒人?網(wǎng)友:卡里幾千萬,為了5塊錢命沒了

      另子維愛讀史
      2026-02-25 23:23:26
      0-2大冷!3月7日一大早,王欣瑜一輪游,鄭欽文比賽對手+時間出爐

      0-2大冷!3月7日一大早,王欣瑜一輪游,鄭欽文比賽對手+時間出爐

      大秦壁虎白話體育
      2026-03-07 08:18:55
      4號秀轟27+4超喬丹,打破塵封41年神紀(jì)錄!難解三球露餡6連勝終結(jié)

      4號秀轟27+4超喬丹,打破塵封41年神紀(jì)錄!難解三球露餡6連勝終結(jié)

      鍋子籃球
      2026-03-07 12:40:41
      2026轉(zhuǎn)運年來了!這4個星座從此告別倒霉,一順到底!

      2026轉(zhuǎn)運年來了!這4個星座從此告別倒霉,一順到底!

      朗威談星座
      2026-03-07 12:29:48
      22年河南女孩高考601分,辦升學(xué)宴遭嫉妒,被親人"設(shè)局"棄尸窯洞

      22年河南女孩高考601分,辦升學(xué)宴遭嫉妒,被親人"設(shè)局"棄尸窯洞

      談史論天地
      2026-03-07 09:05:15
      馬龍:淚目!乒協(xié)副主席只是掛名?龍隊現(xiàn)在處于待業(yè)狀態(tài)?

      馬龍:淚目!乒協(xié)副主席只是掛名?龍隊現(xiàn)在處于待業(yè)狀態(tài)?

      行舟問茶
      2026-03-06 17:03:57
      陳飛宇在巴黎吃麻辣燙被偶遇!衣服破了個大洞,網(wǎng)友:我眼花了?

      陳飛宇在巴黎吃麻辣燙被偶遇!衣服破了個大洞,網(wǎng)友:我眼花了?

      木子愛娛樂大號
      2026-03-06 16:45:32
      火箭106-99戰(zhàn)勝開拓者 球員評價:阿門滿分,6人及格,2人低迷

      火箭106-99戰(zhàn)勝開拓者 球員評價:阿門滿分,6人及格,2人低迷

      籃球資訊達人
      2026-03-07 11:49:29
      又一個10萬億產(chǎn)業(yè),要來了!

      又一個10萬億產(chǎn)業(yè),要來了!

      環(huán)球時報國際
      2026-03-06 17:23:46
      中東變局下的外貿(mào)人:伊朗客戶失聯(lián),迪拜華人敞開家門接待同胞

      中東變局下的外貿(mào)人:伊朗客戶失聯(lián),迪拜華人敞開家門接待同胞

      齊魯壹點
      2026-03-06 21:59:09
      浦東機場凌晨兩點“爆哭”:幾百名中年人防線崩塌,真相太扎心

      浦東機場凌晨兩點“爆哭”:幾百名中年人防線崩塌,真相太扎心

      匹夫來搞笑
      2026-03-06 20:17:30
      61歲雪梨自曝被TVB高層性侵,滿臉驚恐:不能說名字,會死人的!

      61歲雪梨自曝被TVB高層性侵,滿臉驚恐:不能說名字,會死人的!

      潮鹿逐夢
      2026-03-05 22:34:12
      3.7金價預(yù)警!黃金大風(fēng)暴將至,所有人做好心理準(zhǔn)備

      3.7金價預(yù)警!黃金大風(fēng)暴將至,所有人做好心理準(zhǔn)備

      花小貓的美食日常
      2026-03-07 12:02:07
      2026-03-07 13:44:49
      deephub incentive-icons
      deephub
      CV NLP和數(shù)據(jù)挖掘知識
      1940文章數(shù) 1456關(guān)注度
      往期回顧 全部

      科技要聞

      OpenClaw爆火,六位"養(yǎng)蝦人"自述與AI共生

      頭條要聞

      特朗普突然放話"先解決伊朗后解決古巴" 梅西聽懵了

      頭條要聞

      特朗普突然放話"先解決伊朗后解決古巴" 梅西聽懵了

      體育要聞

      塔圖姆歸來:凱爾特人的春之綠

      娛樂要聞

      周杰倫田馥甄的“JH戀” 被扒得底朝天

      財經(jīng)要聞

      針對"不敢休、不讓休"怪圈 國家出手了

      汽車要聞

      逃離ICU,上汽通用“止血”企穩(wěn)

      態(tài)度原創(chuàng)

      本地
      時尚
      親子
      家居
      軍事航空

      本地新聞

      食味印象|一口入魂!康樂烤肉串起千年絲路香

      這些才是適合普通人的穿搭!搭配腰帶、多穿牛仔褲,簡單舒適

      親子要聞

      六個月寶寶查出散光,原因竟是父母長期身旁玩手機,媽媽懵了:我一直以為他閉著眼就沒事

      家居要聞

      暖棕撞色 輕法奶油風(fēng)

      軍事要聞

      伊朗:使用無人機擊中美軍"林肯"號航母

      無障礙瀏覽 進入關(guān)懷版