You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 45 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006
  1. <!doctype html>
  2. <html lang="en" class="no-js">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1">
  6. <link rel="prev" href="../basic-usages/">
  7. <link rel="next" href="../save-load-session/">
  8. <link rel="icon" href="../../assets/images/favicon.png">
  9. <meta name="generator" content="mkdocs-1.4.3, mkdocs-material-9.1.16">
  10. <title>Transoforms - LLamaSharp Documentation</title>
  11. <link rel="stylesheet" href="../../assets/stylesheets/main.26e3688c.min.css">
  12. <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  13. <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
  14. <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
  15. <script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
  16. </head>
  17. <body dir="ltr">
  18. <script>var palette=__md_get("__palette");if(palette&&"object"==typeof palette.color)for(var key of Object.keys(palette.color))document.body.setAttribute("data-md-color-"+key,palette.color[key])</script>
  19. <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
  20. <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
  21. <label class="md-overlay" for="__drawer"></label>
  22. <div data-md-component="skip">
  23. <a href="#transforms-in-chat-session" class="md-skip">
  24. Skip to content
  25. </a>
  26. </div>
  27. <div data-md-component="announce">
  28. </div>
  29. <div data-md-color-scheme="default" data-md-component="outdated" hidden>
  30. </div>
  31. <header class="md-header md-header--shadow" data-md-component="header">
  32. <nav class="md-header__inner md-grid" aria-label="Header">
  33. <a href="../.." title="LLamaSharp Documentation" class="md-header__button md-logo" aria-label="LLamaSharp Documentation" data-md-component="logo">
  34. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
  35. </a>
  36. <label class="md-header__button md-icon" for="__drawer">
  37. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
  38. </label>
  39. <div class="md-header__title" data-md-component="header-title">
  40. <div class="md-header__ellipsis">
  41. <div class="md-header__topic">
  42. <span class="md-ellipsis">
  43. LLamaSharp Documentation
  44. </span>
  45. </div>
  46. <div class="md-header__topic" data-md-component="header-topic">
  47. <span class="md-ellipsis">
  48. Transoforms
  49. </span>
  50. </div>
  51. </div>
  52. </div>
  53. <label class="md-header__button md-icon" for="__search">
  54. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
  55. </label>
  56. <div class="md-search" data-md-component="search" role="dialog">
  57. <label class="md-search__overlay" for="__search"></label>
  58. <div class="md-search__inner" role="search">
  59. <form class="md-search__form" name="search">
  60. <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
  61. <label class="md-search__icon md-icon" for="__search">
  62. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
  63. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
  64. </label>
  65. <nav class="md-search__options" aria-label="Search">
  66. <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
  67. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
  68. </button>
  69. </nav>
  70. </form>
  71. <div class="md-search__output">
  72. <div class="md-search__scrollwrap" data-md-scrollfix>
  73. <div class="md-search-result" data-md-component="search-result">
  74. <div class="md-search-result__meta">
  75. Initializing search
  76. </div>
  77. <ol class="md-search-result__list" role="presentation"></ol>
  78. </div>
  79. </div>
  80. </div>
  81. </div>
  82. </div>
  83. </nav>
  84. </header>
  85. <div class="md-container" data-md-component="container">
  86. <main class="md-main" data-md-component="main">
  87. <div class="md-main__inner md-grid">
  88. <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
  89. <div class="md-sidebar__scrollwrap">
  90. <div class="md-sidebar__inner">
  91. <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
  92. <label class="md-nav__title" for="__drawer">
  93. <a href="../.." title="LLamaSharp Documentation" class="md-nav__button md-logo" aria-label="LLamaSharp Documentation" data-md-component="logo">
  94. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
  95. </a>
  96. LLamaSharp Documentation
  97. </label>
  98. <ul class="md-nav__list" data-md-scrollfix>
  99. <li class="md-nav__item">
  100. <a href="../.." class="md-nav__link">
  101. Overview
  102. </a>
  103. </li>
  104. <li class="md-nav__item">
  105. <a href="../../GetStarted/" class="md-nav__link">
  106. Get Started
  107. </a>
  108. </li>
  109. <li class="md-nav__item">
  110. <a href="../../Architecture/" class="md-nav__link">
  111. Architecture
  112. </a>
  113. </li>
  114. <li class="md-nav__item">
  115. <a href="../../Tricks/" class="md-nav__link">
  116. Tricks for FAQ
  117. </a>
  118. </li>
  119. <li class="md-nav__item">
  120. <a href="../../ContributingGuide/" class="md-nav__link">
  121. Contributing Guide
  122. </a>
  123. </li>
  124. <li class="md-nav__item md-nav__item--nested">
  125. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
  126. <label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
  127. LLamaModel
  128. <span class="md-nav__icon md-icon"></span>
  129. </label>
  130. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
  131. <label class="md-nav__title" for="__nav_6">
  132. <span class="md-nav__icon md-icon"></span>
  133. LLamaModel
  134. </label>
  135. <ul class="md-nav__list" data-md-scrollfix>
  136. <li class="md-nav__item">
  137. <a href="../../LLamaModel/parameters/" class="md-nav__link">
  138. Model Parameters
  139. </a>
  140. </li>
  141. <li class="md-nav__item">
  142. <a href="../../LLamaModel/tokenization/" class="md-nav__link">
  143. Tokenization
  144. </a>
  145. </li>
  146. <li class="md-nav__item">
  147. <a href="../../LLamaModel/embeddings/" class="md-nav__link">
  148. Get Embeddings
  149. </a>
  150. </li>
  151. <li class="md-nav__item">
  152. <a href="../../LLamaModel/quantization/" class="md-nav__link">
  153. Quantization
  154. </a>
  155. </li>
  156. <li class="md-nav__item">
  157. <a href="../../LLamaModel/save-load-state/" class="md-nav__link">
  158. Save/Load State
  159. </a>
  160. </li>
  161. </ul>
  162. </nav>
  163. </li>
  164. <li class="md-nav__item md-nav__item--nested">
  165. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" >
  166. <label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
  167. LLamaExecutors
  168. <span class="md-nav__icon md-icon"></span>
  169. </label>
  170. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
  171. <label class="md-nav__title" for="__nav_7">
  172. <span class="md-nav__icon md-icon"></span>
  173. LLamaExecutors
  174. </label>
  175. <ul class="md-nav__list" data-md-scrollfix>
  176. <li class="md-nav__item">
  177. <a href="../../LLamaExecutors/parameters/" class="md-nav__link">
  178. Inference Parameters
  179. </a>
  180. </li>
  181. <li class="md-nav__item">
  182. <a href="../../LLamaExecutors/text-to-text-apis/" class="md-nav__link">
  183. Text-to-Text APIs
  184. </a>
  185. </li>
  186. <li class="md-nav__item">
  187. <a href="../../LLamaExecutors/save-load-state/" class="md-nav__link">
  188. Save/Load State
  189. </a>
  190. </li>
  191. <li class="md-nav__item">
  192. <a href="../../LLamaExecutors/differences/" class="md-nav__link">
  193. Differences of Executors
  194. </a>
  195. </li>
  196. </ul>
  197. </nav>
  198. </li>
  199. <li class="md-nav__item md-nav__item--active md-nav__item--nested">
  200. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" checked>
  201. <label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
  202. ChatSession
  203. <span class="md-nav__icon md-icon"></span>
  204. </label>
  205. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="true">
  206. <label class="md-nav__title" for="__nav_8">
  207. <span class="md-nav__icon md-icon"></span>
  208. ChatSession
  209. </label>
  210. <ul class="md-nav__list" data-md-scrollfix>
  211. <li class="md-nav__item">
  212. <a href="../basic-usages/" class="md-nav__link">
  213. Basic Usages
  214. </a>
  215. </li>
  216. <li class="md-nav__item md-nav__item--active">
  217. <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
  218. <label class="md-nav__link md-nav__link--active" for="__toc">
  219. Transoforms
  220. <span class="md-nav__icon md-icon"></span>
  221. </label>
  222. <a href="./" class="md-nav__link md-nav__link--active">
  223. Transoforms
  224. </a>
  225. <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
  226. <label class="md-nav__title" for="__toc">
  227. <span class="md-nav__icon md-icon"></span>
  228. Table of contents
  229. </label>
  230. <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
  231. <li class="md-nav__item">
  232. <a href="#input-transform" class="md-nav__link">
  233. Input transform
  234. </a>
  235. </li>
  236. <li class="md-nav__item">
  237. <a href="#output-transform" class="md-nav__link">
  238. Output transform
  239. </a>
  240. </li>
  241. <li class="md-nav__item">
  242. <a href="#history-transform" class="md-nav__link">
  243. History transform
  244. </a>
  245. </li>
  246. </ul>
  247. </nav>
  248. </li>
  249. <li class="md-nav__item">
  250. <a href="../save-load-session/" class="md-nav__link">
  251. Save/Load Session
  252. </a>
  253. </li>
  254. </ul>
  255. </nav>
  256. </li>
  257. <li class="md-nav__item md-nav__item--nested">
  258. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_9" >
  259. <label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
  260. Non-English Usages
  261. <span class="md-nav__icon md-icon"></span>
  262. </label>
  263. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
  264. <label class="md-nav__title" for="__nav_9">
  265. <span class="md-nav__icon md-icon"></span>
  266. Non-English Usages
  267. </label>
  268. <ul class="md-nav__list" data-md-scrollfix>
  269. <li class="md-nav__item">
  270. <a href="../../NonEnglishUsage/Chinese/" class="md-nav__link">
  271. Chinese
  272. </a>
  273. </li>
  274. </ul>
  275. </nav>
  276. </li>
  277. <li class="md-nav__item md-nav__item--nested">
  278. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_10" >
  279. <label class="md-nav__link" for="__nav_10" id="__nav_10_label" tabindex="0">
  280. High-level Applications
  281. <span class="md-nav__icon md-icon"></span>
  282. </label>
  283. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_10_label" aria-expanded="false">
  284. <label class="md-nav__title" for="__nav_10">
  285. <span class="md-nav__icon md-icon"></span>
  286. High-level Applications
  287. </label>
  288. <ul class="md-nav__list" data-md-scrollfix>
  289. <li class="md-nav__item">
  290. <a href="../../HighLevelApps/bot-sharp/" class="md-nav__link">
  291. BotSharp
  292. </a>
  293. </li>
  294. </ul>
  295. </nav>
  296. </li>
  297. <li class="md-nav__item md-nav__item--nested">
  298. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_11" >
  299. <label class="md-nav__link" for="__nav_11" id="__nav_11_label" tabindex="0">
  300. More
  301. <span class="md-nav__icon md-icon"></span>
  302. </label>
  303. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_11_label" aria-expanded="false">
  304. <label class="md-nav__title" for="__nav_11">
  305. <span class="md-nav__icon md-icon"></span>
  306. More
  307. </label>
  308. <ul class="md-nav__list" data-md-scrollfix>
  309. <li class="md-nav__item">
  310. <a href="../../More/log/" class="md-nav__link">
  311. Logger
  312. </a>
  313. </li>
  314. </ul>
  315. </nav>
  316. </li>
  317. <li class="md-nav__item md-nav__item--nested">
  318. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_12" >
  319. <label class="md-nav__link" for="__nav_12" id="__nav_12_label" tabindex="0">
  320. Examples
  321. <span class="md-nav__icon md-icon"></span>
  322. </label>
  323. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_12_label" aria-expanded="false">
  324. <label class="md-nav__title" for="__nav_12">
  325. <span class="md-nav__icon md-icon"></span>
  326. Examples
  327. </label>
  328. <ul class="md-nav__list" data-md-scrollfix>
  329. <li class="md-nav__item">
  330. <a href="../../Examples/ChatSessionStripRoleName/" class="md-nav__link">
  331. Chat session 1
  332. </a>
  333. </li>
  334. <li class="md-nav__item">
  335. <a href="../../Examples/ChatSessionWithRoleName/" class="md-nav__link">
  336. Chat session 2
  337. </a>
  338. </li>
  339. <li class="md-nav__item">
  340. <a href="../../Examples/GetEmbeddings/" class="md-nav__link">
  341. Get embeddings
  342. </a>
  343. </li>
  344. <li class="md-nav__item">
  345. <a href="../../Examples/InstructModeExecute/" class="md-nav__link">
  346. Instruct executor
  347. </a>
  348. </li>
  349. <li class="md-nav__item">
  350. <a href="../../Examples/InteractiveModeExecute/" class="md-nav__link">
  351. Interactive executor
  352. </a>
  353. </li>
  354. <li class="md-nav__item">
  355. <a href="../../Examples/StatelessModeExecute/" class="md-nav__link">
  356. Stateless exeutor
  357. </a>
  358. </li>
  359. <li class="md-nav__item">
  360. <a href="../../Examples/LoadAndSaveSession/" class="md-nav__link">
  361. Load/Save session
  362. </a>
  363. </li>
  364. <li class="md-nav__item">
  365. <a href="../../Examples/LoadAndSaveState/" class="md-nav__link">
  366. Load/Save state
  367. </a>
  368. </li>
  369. <li class="md-nav__item">
  370. <a href="../../Examples/QuantizeModel/" class="md-nav__link">
  371. Quantize model
  372. </a>
  373. </li>
  374. </ul>
  375. </nav>
  376. </li>
  377. <li class="md-nav__item md-nav__item--nested">
  378. <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_13" >
  379. <label class="md-nav__link" for="__nav_13" id="__nav_13_label" tabindex="0">
  380. API Reference
  381. <span class="md-nav__icon md-icon"></span>
  382. </label>
  383. <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_13_label" aria-expanded="false">
  384. <label class="md-nav__title" for="__nav_13">
  385. <span class="md-nav__icon md-icon"></span>
  386. API Reference
  387. </label>
  388. <ul class="md-nav__list" data-md-scrollfix>
  389. <li class="md-nav__item">
  390. <a href="../../xmldocs/" class="md-nav__link">
  391. index
  392. </a>
  393. </li>
  394. <li class="md-nav__item">
  395. <a href="../../xmldocs/llama.abstractions.ihistorytransform/" class="md-nav__link">
  396. llama.abstractions.ihistorytransform
  397. </a>
  398. </li>
  399. <li class="md-nav__item">
  400. <a href="../../xmldocs/llama.abstractions.illamaexecutor/" class="md-nav__link">
  401. llama.abstractions.illamaexecutor
  402. </a>
  403. </li>
  404. <li class="md-nav__item">
  405. <a href="../../xmldocs/llama.abstractions.itextstreamtransform/" class="md-nav__link">
  406. llama.abstractions.itextstreamtransform
  407. </a>
  408. </li>
  409. <li class="md-nav__item">
  410. <a href="../../xmldocs/llama.abstractions.itexttransform/" class="md-nav__link">
  411. llama.abstractions.itexttransform
  412. </a>
  413. </li>
  414. <li class="md-nav__item">
  415. <a href="../../xmldocs/llama.chatsession/" class="md-nav__link">
  416. llama.chatsession
  417. </a>
  418. </li>
  419. <li class="md-nav__item">
  420. <a href="../../xmldocs/llama.common.authorrole/" class="md-nav__link">
  421. llama.common.authorrole
  422. </a>
  423. </li>
  424. <li class="md-nav__item">
  425. <a href="../../xmldocs/llama.common.chathistory/" class="md-nav__link">
  426. llama.common.chathistory
  427. </a>
  428. </li>
  429. <li class="md-nav__item">
  430. <a href="../../xmldocs/llama.common.fixedsizequeue-1/" class="md-nav__link">
  431. llama.common.fixedsizequeue-1
  432. </a>
  433. </li>
  434. <li class="md-nav__item">
  435. <a href="../../xmldocs/llama.common.illamalogger/" class="md-nav__link">
  436. llama.common.illamalogger
  437. </a>
  438. </li>
  439. <li class="md-nav__item">
  440. <a href="../../xmldocs/llama.common.inferenceparams/" class="md-nav__link">
  441. llama.common.inferenceparams
  442. </a>
  443. </li>
  444. <li class="md-nav__item">
  445. <a href="../../xmldocs/llama.common.llamadefaultlogger/" class="md-nav__link">
  446. llama.common.llamadefaultlogger
  447. </a>
  448. </li>
  449. <li class="md-nav__item">
  450. <a href="../../xmldocs/llama.common.mirostatetype/" class="md-nav__link">
  451. llama.common.mirostatetype
  452. </a>
  453. </li>
  454. <li class="md-nav__item">
  455. <a href="../../xmldocs/llama.common.modelparams/" class="md-nav__link">
  456. llama.common.modelparams
  457. </a>
  458. </li>
  459. <li class="md-nav__item">
  460. <a href="../../xmldocs/llama.exceptions.runtimeerror/" class="md-nav__link">
  461. llama.exceptions.runtimeerror
  462. </a>
  463. </li>
  464. <li class="md-nav__item">
  465. <a href="../../xmldocs/llama.extensions.dictionaryextension/" class="md-nav__link">
  466. llama.extensions.dictionaryextension
  467. </a>
  468. </li>
  469. <li class="md-nav__item">
  470. <a href="../../xmldocs/llama.instructexecutor/" class="md-nav__link">
  471. llama.instructexecutor
  472. </a>
  473. </li>
  474. <li class="md-nav__item">
  475. <a href="../../xmldocs/llama.interactiveexecutor/" class="md-nav__link">
  476. llama.interactiveexecutor
  477. </a>
  478. </li>
  479. <li class="md-nav__item">
  480. <a href="../../xmldocs/llama.llamaembedder/" class="md-nav__link">
  481. llama.llamaembedder
  482. </a>
  483. </li>
  484. <li class="md-nav__item">
  485. <a href="../../xmldocs/llama.llamamodel/" class="md-nav__link">
  486. llama.llamamodel
  487. </a>
  488. </li>
  489. <li class="md-nav__item">
  490. <a href="../../xmldocs/llama.llamaquantizer/" class="md-nav__link">
  491. llama.llamaquantizer
  492. </a>
  493. </li>
  494. <li class="md-nav__item">
  495. <a href="../../xmldocs/llama.llamatransforms/" class="md-nav__link">
  496. llama.llamatransforms
  497. </a>
  498. </li>
  499. <li class="md-nav__item">
  500. <a href="../../xmldocs/llama.native.llamacontextparams/" class="md-nav__link">
  501. llama.native.llamacontextparams
  502. </a>
  503. </li>
  504. <li class="md-nav__item">
  505. <a href="../../xmldocs/llama.native.llamaftype/" class="md-nav__link">
  506. llama.native.llamaftype
  507. </a>
  508. </li>
  509. <li class="md-nav__item">
  510. <a href="../../xmldocs/llama.native.llamatokendata/" class="md-nav__link">
  511. llama.native.llamatokendata
  512. </a>
  513. </li>
  514. <li class="md-nav__item">
  515. <a href="../../xmldocs/llama.native.llamatokendataarray/" class="md-nav__link">
  516. llama.native.llamatokendataarray
  517. </a>
  518. </li>
  519. <li class="md-nav__item">
  520. <a href="../../xmldocs/llama.native.llamatokendataarraynative/" class="md-nav__link">
  521. llama.native.llamatokendataarraynative
  522. </a>
  523. </li>
  524. <li class="md-nav__item">
  525. <a href="../../xmldocs/llama.native.nativeapi/" class="md-nav__link">
  526. llama.native.nativeapi
  527. </a>
  528. </li>
  529. <li class="md-nav__item">
  530. <a href="../../xmldocs/llama.native.safellamacontexthandle/" class="md-nav__link">
  531. llama.native.safellamacontexthandle
  532. </a>
  533. </li>
  534. <li class="md-nav__item">
  535. <a href="../../xmldocs/llama.native.safellamahandlebase/" class="md-nav__link">
  536. llama.native.safellamahandlebase
  537. </a>
  538. </li>
  539. <li class="md-nav__item">
  540. <a href="../../xmldocs/llama.oldversion.chatcompletion/" class="md-nav__link">
  541. llama.oldversion.chatcompletion
  542. </a>
  543. </li>
  544. <li class="md-nav__item">
  545. <a href="../../xmldocs/llama.oldversion.chatcompletionchoice/" class="md-nav__link">
  546. llama.oldversion.chatcompletionchoice
  547. </a>
  548. </li>
  549. <li class="md-nav__item">
  550. <a href="../../xmldocs/llama.oldversion.chatcompletionchunk/" class="md-nav__link">
  551. llama.oldversion.chatcompletionchunk
  552. </a>
  553. </li>
  554. <li class="md-nav__item">
  555. <a href="../../xmldocs/llama.oldversion.chatcompletionchunkchoice/" class="md-nav__link">
  556. llama.oldversion.chatcompletionchunkchoice
  557. </a>
  558. </li>
  559. <li class="md-nav__item">
  560. <a href="../../xmldocs/llama.oldversion.chatcompletionchunkdelta/" class="md-nav__link">
  561. llama.oldversion.chatcompletionchunkdelta
  562. </a>
  563. </li>
  564. <li class="md-nav__item">
  565. <a href="../../xmldocs/llama.oldversion.chatcompletionmessage/" class="md-nav__link">
  566. llama.oldversion.chatcompletionmessage
  567. </a>
  568. </li>
  569. <li class="md-nav__item">
  570. <a href="../../xmldocs/llama.oldversion.chatmessagerecord/" class="md-nav__link">
  571. llama.oldversion.chatmessagerecord
  572. </a>
  573. </li>
  574. <li class="md-nav__item">
  575. <a href="../../xmldocs/llama.oldversion.chatrole/" class="md-nav__link">
  576. llama.oldversion.chatrole
  577. </a>
  578. </li>
  579. <li class="md-nav__item">
  580. <a href="../../xmldocs/llama.oldversion.chatsession-1/" class="md-nav__link">
  581. llama.oldversion.chatsession-1
  582. </a>
  583. </li>
  584. <li class="md-nav__item">
  585. <a href="../../xmldocs/llama.oldversion.completion/" class="md-nav__link">
  586. llama.oldversion.completion
  587. </a>
  588. </li>
  589. <li class="md-nav__item">
  590. <a href="../../xmldocs/llama.oldversion.completionchoice/" class="md-nav__link">
  591. llama.oldversion.completionchoice
  592. </a>
  593. </li>
  594. <li class="md-nav__item">
  595. <a href="../../xmldocs/llama.oldversion.completionchunk/" class="md-nav__link">
  596. llama.oldversion.completionchunk
  597. </a>
  598. </li>
  599. <li class="md-nav__item">
  600. <a href="../../xmldocs/llama.oldversion.completionlogprobs/" class="md-nav__link">
  601. llama.oldversion.completionlogprobs
  602. </a>
  603. </li>
  604. <li class="md-nav__item">
  605. <a href="../../xmldocs/llama.oldversion.completionusage/" class="md-nav__link">
  606. llama.oldversion.completionusage
  607. </a>
  608. </li>
  609. <li class="md-nav__item">
  610. <a href="../../xmldocs/llama.oldversion.embedding/" class="md-nav__link">
  611. llama.oldversion.embedding
  612. </a>
  613. </li>
  614. <li class="md-nav__item">
  615. <a href="../../xmldocs/llama.oldversion.embeddingdata/" class="md-nav__link">
  616. llama.oldversion.embeddingdata
  617. </a>
  618. </li>
  619. <li class="md-nav__item">
  620. <a href="../../xmldocs/llama.oldversion.embeddingusage/" class="md-nav__link">
  621. llama.oldversion.embeddingusage
  622. </a>
  623. </li>
  624. <li class="md-nav__item">
  625. <a href="../../xmldocs/llama.oldversion.ichatmodel/" class="md-nav__link">
  626. llama.oldversion.ichatmodel
  627. </a>
  628. </li>
  629. <li class="md-nav__item">
  630. <a href="../../xmldocs/llama.oldversion.llamaembedder/" class="md-nav__link">
  631. llama.oldversion.llamaembedder
  632. </a>
  633. </li>
  634. <li class="md-nav__item">
  635. <a href="../../xmldocs/llama.oldversion.llamamodel/" class="md-nav__link">
  636. llama.oldversion.llamamodel
  637. </a>
  638. </li>
  639. <li class="md-nav__item">
  640. <a href="../../xmldocs/llama.oldversion.llamaparams/" class="md-nav__link">
  641. llama.oldversion.llamaparams
  642. </a>
  643. </li>
  644. <li class="md-nav__item">
  645. <a href="../../xmldocs/llama.resettablellamamodel/" class="md-nav__link">
  646. llama.resettablellamamodel
  647. </a>
  648. </li>
  649. <li class="md-nav__item">
  650. <a href="../../xmldocs/llama.statefulexecutorbase/" class="md-nav__link">
  651. llama.statefulexecutorbase
  652. </a>
  653. </li>
  654. <li class="md-nav__item">
  655. <a href="../../xmldocs/llama.statelessexecutor/" class="md-nav__link">
  656. llama.statelessexecutor
  657. </a>
  658. </li>
  659. </ul>
  660. </nav>
  661. </li>
  662. </ul>
  663. </nav>
  664. </div>
  665. </div>
  666. </div>
  667. <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
  668. <div class="md-sidebar__scrollwrap">
  669. <div class="md-sidebar__inner">
  670. <nav class="md-nav md-nav--secondary" aria-label="Table of contents">
  671. <label class="md-nav__title" for="__toc">
  672. <span class="md-nav__icon md-icon"></span>
  673. Table of contents
  674. </label>
  675. <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
  676. <li class="md-nav__item">
  677. <a href="#input-transform" class="md-nav__link">
  678. Input transform
  679. </a>
  680. </li>
  681. <li class="md-nav__item">
  682. <a href="#output-transform" class="md-nav__link">
  683. Output transform
  684. </a>
  685. </li>
  686. <li class="md-nav__item">
  687. <a href="#history-transform" class="md-nav__link">
  688. History transform
  689. </a>
  690. </li>
  691. </ul>
  692. </nav>
  693. </div>
  694. </div>
  695. </div>
  696. <div class="md-content" data-md-component="content">
  697. <article class="md-content__inner md-typeset">
  698. <h1 id="transforms-in-chat-session">Transforms in Chat Session</h1>
  699. <p>There's three important elements in <code>ChatSession</code>, which are input, output and history. Besides, there're some conversions between them. Since the process of them under different conditions varies, LLamaSharp hands over this part of the power to the users.</p>
  700. <p>Currently, there're three kinds of process that could be customized, as introduced below.</p>
  701. <h2 id="input-transform">Input transform</h2>
  702. <p>In general, the input of the chat API is a text (without stream), therefore <code>ChatSession</code> processes it in a pipeline. If you want to use your customized transform, you need to define a transform that implements <code>ITextTransform</code> and add it to the pipeline of <code>ChatSession</code>.</p>
  703. <pre><code class="language-cs">public interface ITextTransform
  704. {
  705. string Transform(string text);
  706. }
  707. </code></pre>
  708. <pre><code class="language-cs">public class MyInputTransform1 : ITextTransform
  709. {
  710. public string Transform(string text)
  711. {
  712. return $&quot;Question: {text}\n&quot;;
  713. }
  714. }
  715. public class MyInputTransform2 : ITextTransform
  716. {
  717. public string Transform(string text)
  718. {
  719. return text + &quot;Answer: &quot;;
  720. }
  721. }
  722. session.AddInputTransform(new MyInputTransform1()).AddInputTransform(new MyInputTransform2());
  723. </code></pre>
  724. <h2 id="output-transform">Output transform</h2>
  725. <p>Different from the input, the output of chat API is a text stream. Therefore you need to process it word by word, instead of getting the full text at once.</p>
  726. <p>The interface of it has an <code>IEnumerable&lt;string&gt;</code> as input, which is actually a yield sequence.</p>
  727. <pre><code class="language-cs">public interface ITextStreamTransform
  728. {
  729. IEnumerable&lt;string&gt; Transform(IEnumerable&lt;string&gt; tokens);
  730. IAsyncEnumerable&lt;string&gt; TransformAsync(IAsyncEnumerable&lt;string&gt; tokens);
  731. }
  732. </code></pre>
  733. <p>When implementing it, you could throw a not-implemented exception in one of them if you only need to use the chat API in synchronously or asynchronously.</p>
  734. <p>Different from the input transform pipeline, the output transform only supports one transform.</p>
  735. <pre><code class="language-cs">session.WithOutputTransform(new MyOutputTransform());
  736. </code></pre>
  737. <p>Here's an example of how to implement the interface. In this example, the transform detects wether there's some keywords in the response and removes them.</p>
  738. <pre><code class="language-cs">/// &lt;summary&gt;
  739. /// A text output transform that removes the keywords from the response.
  740. /// &lt;/summary&gt;
  741. public class KeywordTextOutputStreamTransform : ITextStreamTransform
  742. {
  743. HashSet&lt;string&gt; _keywords;
  744. int _maxKeywordLength;
  745. bool _removeAllMatchedTokens;
  746. /// &lt;summary&gt;
  747. ///
  748. /// &lt;/summary&gt;
  749. /// &lt;param name=&quot;keywords&quot;&gt;Keywords that you want to remove from the response.&lt;/param&gt;
  750. /// &lt;param name=&quot;redundancyLength&quot;&gt;The extra length when searching for the keyword. For example, if your only keyword is &quot;highlight&quot;,
  751. /// maybe the token you get is &quot;\r\nhighligt&quot;. In this condition, if redundancyLength=0, the token cannot be successfully matched because the length of &quot;\r\nhighligt&quot; (10)
  752. /// has already exceeded the maximum length of the keywords (8). On the contrary, setting redundancyLengyh &gt;= 2 leads to successful match.
  753. /// The larger the redundancyLength is, the lower the processing speed. But as an experience, it won't introduce too much performance impact when redundancyLength &lt;= 5 &lt;/param&gt;
  754. /// &lt;param name=&quot;removeAllMatchedTokens&quot;&gt;If set to true, when getting a matched keyword, all the related tokens will be removed. Otherwise only the part of keyword will be removed.&lt;/param&gt;
  755. public KeywordTextOutputStreamTransform(IEnumerable&lt;string&gt; keywords, int redundancyLength = 3, bool removeAllMatchedTokens = false)
  756. {
  757. _keywords = new(keywords);
  758. _maxKeywordLength = keywords.Select(x =&gt; x.Length).Max() + redundancyLength;
  759. _removeAllMatchedTokens = removeAllMatchedTokens;
  760. }
  761. /// &lt;inheritdoc /&gt;
  762. public IEnumerable&lt;string&gt; Transform(IEnumerable&lt;string&gt; tokens)
  763. {
  764. var window = new Queue&lt;string&gt;();
  765. foreach (var s in tokens)
  766. {
  767. window.Enqueue(s);
  768. var current = string.Join(&quot;&quot;, window);
  769. if (_keywords.Any(x =&gt; current.Contains(x)))
  770. {
  771. var matchedKeyword = _keywords.First(x =&gt; current.Contains(x));
  772. int total = window.Count;
  773. for (int i = 0; i &lt; total; i++)
  774. {
  775. window.Dequeue();
  776. }
  777. if (!_removeAllMatchedTokens)
  778. {
  779. yield return current.Replace(matchedKeyword, &quot;&quot;);
  780. }
  781. }
  782. if (current.Length &gt;= _maxKeywordLength)
  783. {
  784. if (_keywords.Any(x =&gt; current.Contains(x)))
  785. {
  786. var matchedKeyword = _keywords.First(x =&gt; current.Contains(x));
  787. int total = window.Count;
  788. for (int i = 0; i &lt; total; i++)
  789. {
  790. window.Dequeue();
  791. }
  792. if (!_removeAllMatchedTokens)
  793. {
  794. yield return current.Replace(matchedKeyword, &quot;&quot;);
  795. }
  796. }
  797. else
  798. {
  799. int total = window.Count;
  800. for (int i = 0; i &lt; total; i++)
  801. {
  802. yield return window.Dequeue();
  803. }
  804. }
  805. }
  806. }
  807. int totalCount = window.Count;
  808. for (int i = 0; i &lt; totalCount; i++)
  809. {
  810. yield return window.Dequeue();
  811. }
  812. }
  813. /// &lt;inheritdoc /&gt;
  814. public async IAsyncEnumerable&lt;string&gt; TransformAsync(IAsyncEnumerable&lt;string&gt; tokens)
  815. {
  816. throw new NotImplementedException(); // This is implemented in `LLamaTransforms` but we ignore it here.
  817. }
  818. }
  819. </code></pre>
  820. <h2 id="history-transform">History transform</h2>
  821. <p>The chat history could be converted to or from a text, which is exactly what the interface of it.</p>
  822. <pre><code class="language-cs">public interface IHistoryTransform
  823. {
  824. string HistoryToText(ChatHistory history);
  825. ChatHistory TextToHistory(AuthorRole role, string text);
  826. }
  827. </code></pre>
  828. <p>Similar to the output transform, the history transform is added in the following way:</p>
  829. <pre><code class="language-cs">session.WithHistoryTransform(new MyHistoryTransform());
  830. </code></pre>
  831. <p>The implementation is quite flexible, depending on what you want the history message to be like. Here's an example, which is the default history transform in LLamaSharp.</p>
  832. <pre><code class="language-cs">/// &lt;summary&gt;
  833. /// The default history transform.
  834. /// Uses plain text with the following format:
  835. /// [Author]: [Message]
  836. /// &lt;/summary&gt;
  837. public class DefaultHistoryTransform : IHistoryTransform
  838. {
  839. private readonly string defaultUserName = &quot;User&quot;;
  840. private readonly string defaultAssistantName = &quot;Assistant&quot;;
  841. private readonly string defaultSystemName = &quot;System&quot;;
  842. private readonly string defaultUnknownName = &quot;??&quot;;
  843. string _userName;
  844. string _assistantName;
  845. string _systemName;
  846. string _unknownName;
  847. bool _isInstructMode;
  848. public DefaultHistoryTransform(string? userName = null, string? assistantName = null,
  849. string? systemName = null, string? unknownName = null, bool isInstructMode = false)
  850. {
  851. _userName = userName ?? defaultUserName;
  852. _assistantName = assistantName ?? defaultAssistantName;
  853. _systemName = systemName ?? defaultSystemName;
  854. _unknownName = unknownName ?? defaultUnknownName;
  855. _isInstructMode = isInstructMode;
  856. }
  857. public virtual string HistoryToText(ChatHistory history)
  858. {
  859. StringBuilder sb = new();
  860. foreach (var message in history.Messages)
  861. {
  862. if (message.AuthorRole == AuthorRole.User)
  863. {
  864. sb.AppendLine($&quot;{_userName}: {message.Content}&quot;);
  865. }
  866. else if (message.AuthorRole == AuthorRole.System)
  867. {
  868. sb.AppendLine($&quot;{_systemName}: {message.Content}&quot;);
  869. }
  870. else if (message.AuthorRole == AuthorRole.Unknown)
  871. {
  872. sb.AppendLine($&quot;{_unknownName}: {message.Content}&quot;);
  873. }
  874. else if (message.AuthorRole == AuthorRole.Assistant)
  875. {
  876. sb.AppendLine($&quot;{_assistantName}: {message.Content}&quot;);
  877. }
  878. }
  879. return sb.ToString();
  880. }
  881. public virtual ChatHistory TextToHistory(AuthorRole role, string text)
  882. {
  883. ChatHistory history = new ChatHistory();
  884. history.AddMessage(role, TrimNamesFromText(text, role));
  885. return history;
  886. }
  887. public virtual string TrimNamesFromText(string text, AuthorRole role)
  888. {
  889. if (role == AuthorRole.User &amp;&amp; text.StartsWith($&quot;{_userName}:&quot;))
  890. {
  891. text = text.Substring($&quot;{_userName}:&quot;.Length).TrimStart();
  892. }
  893. else if (role == AuthorRole.Assistant &amp;&amp; text.EndsWith($&quot;{_assistantName}:&quot;))
  894. {
  895. text = text.Substring(0, text.Length - $&quot;{_assistantName}:&quot;.Length).TrimEnd();
  896. }
  897. if (_isInstructMode &amp;&amp; role == AuthorRole.Assistant &amp;&amp; text.EndsWith(&quot;\n&gt; &quot;))
  898. {
  899. text = text.Substring(0, text.Length - &quot;\n&gt; &quot;.Length).TrimEnd();
  900. }
  901. return text;
  902. }
  903. }
  904. </code></pre>
  905. </article>
  906. </div>
  907. </div>
  908. </main>
  909. <footer class="md-footer">
  910. <div class="md-footer-meta md-typeset">
  911. <div class="md-footer-meta__inner md-grid">
  912. <div class="md-copyright">
  913. Made with
  914. <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
  915. Material for MkDocs
  916. </a>
  917. </div>
  918. </div>
  919. </div>
  920. </footer>
  921. </div>
  922. <div class="md-dialog" data-md-component="dialog">
  923. <div class="md-dialog__inner md-typeset"></div>
  924. </div>
  925. <script id="__config" type="application/json">{"base": "../..", "features": [], "search": "../../assets/javascripts/workers/search.208ed371.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script>
  926. <script src="../../assets/javascripts/bundle.a51614de.min.js"></script>
  927. </body>
  928. </html>

C#/.NET上易用的LLM高性能推理框架,支持LLaMA和LLaVA系列模型。

Contributors (1)